Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#6401

Добрый день,  подзабыл за 2 года вплотную mql4( объясните пожалуйста  почему алерт не работает

#property copyright "Copyright © 2013"
#property link      "http://www.google.com"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red

extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalEMA = 9;
extern int       SoundON=1;                        // 0 = false    1 = true
static datetime lastbar;
bool NewBar;
double g_ibuf_88[];
double g_ibuf_92[];
double g_ibuf_96[];
double g_ibuf_100[];

int init() {
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS) + 1.0);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(0, g_ibuf_88);
   SetIndexDrawBegin(0, SlowEMA);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
   SetIndexBuffer(1, g_ibuf_92);
   SetIndexDrawBegin(1, SignalEMA);
   SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID);
   SetIndexBuffer(2, g_ibuf_96);
   SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID);
   SetIndexBuffer(3, g_ibuf_100);
   IndicatorShortName("MACD(" + FastEMA + "," + SlowEMA + "," + SignalEMA + ")");
   SetIndexLabel(0, "MACD");
   SetIndexLabel(1, "Signal");
   SetIndexLabel(2, "HistogramUP");
   SetIndexLabel(3, "HistogramDOWN");
   return (0);
}

int start() {
   double ld_4;
   int li_12 = IndicatorCounted();
   if (li_12 < 0) return (-1);
   if (li_12 > 0) li_12--;
   int li_0 = Bars - li_12;
   for (int li_16 = 0; li_16 < li_0; li_16++) g_ibuf_88[li_16] = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, li_16) - iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, li_16);
   for (li_16 = 0; li_16 < li_0; li_16++) g_ibuf_92[li_16] = iMAOnArray(g_ibuf_88, Bars, SignalEMA, 0, MODE_EMA, li_16);
   for (li_16 = 0; li_16 < li_0; li_16++) {
      g_ibuf_96[li_16] = 0;
      g_ibuf_100[li_16] = 0;
      ld_4 = g_ibuf_88[li_16] - g_ibuf_92[li_16];
      if (ld_4 >= 0.0) g_ibuf_96[li_16] = ld_4;
      else g_ibuf_100[li_16] = ld_4;
   }
   return (0);
       bool NewBar=isNewBar();
    if (SoundON==1 && g_ibuf_96[1] != 0 &&  g_ibuf_100[2] != 0 && NewBar)
    {
     PlaySound("alert..wav");
    }
    if (SoundON==1 && g_ibuf_100[1] != 0 && g_ibuf_96[2] != 0 && NewBar) 
    {
     PlaySound("alert.wav");
    }
    return(0); 
}
bool isNewBar()
{
  
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
}  

MACD 2Line.mq41 скач.

#6402
21 минуту назад, d1w4m3 сказал:

( объясните пожалуйста  почему алерт не работает

int start() 
{
   double ld_4;
   int li_12 = IndicatorCounted();
   if (li_12 < 0) return (-1);
   if (li_12 > 0) li_12--;
   int li_0 = Bars - li_12;
   
   for (int li_16 = 0; li_16 < li_0; li_16++) 
      g_ibuf_88[li_16] = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, li_16) - iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, li_16);
   
   for (li_16 = 0; li_16 < li_0; li_16++) 
      g_ibuf_92[li_16] = iMAOnArray(g_ibuf_88, Bars, SignalEMA, 0, MODE_EMA, li_16);
   
   for (li_16 = 0; li_16 < li_0; li_16++) 
   {
      g_ibuf_96[li_16] = 0;
      g_ibuf_100[li_16] = 0;
      ld_4 = g_ibuf_88[li_16] - g_ibuf_92[li_16];
      if (ld_4 >= 0.0) g_ibuf_96[li_16] = ld_4;
      else g_ibuf_100[li_16] = ld_4;
   }
   return (0); // здесь всегда происходит предывание функции start()
   
    bool NewBar=isNewBar();
     
    if (SoundON==1 && g_ibuf_96[1] != 0 &&  g_ibuf_100[2] != 0 && NewBar)
    {
     PlaySound("alert..wav");
    }
    if (SoundON==1 && g_ibuf_100[1] != 0 && g_ibuf_96[2] != 0 && NewBar) 
    {
     PlaySound("alert.wav");
    }
    return(0); 
}

Ошибка выделена комментарием
п.с.
1. код нужно оформлять через тэги код:
image.png.f4633097d7449555205b55927d36c6d8.png


2. у Вас переменная bool NewBar объявлена на глобальном уровне и на локальном.
3. Самого не напрягает разбираться с декомпилированным кодом, где переменные обозваны абы как?

#6403

Спасибо, это все от невнимательности, просто опять решил залезть в код, с нес винду и забыл скопировать все наработки( еще раз спасибо

#6404
6 минут назад, d1w4m3 сказал:

Спасибо, это все от невнимательности,

"А для этого у нас есть багор и ведро с песком"(с) День радио
image.png.d66855379750c0a7748ec11857675daf.png

#6405

Помогите разобраться:

 

#property copyright "My"
#property link      "https://www"
#property version   "1.00"
#property strict

struct Sign {
int         Period_MA;
double   Step;
double   Delta;
};

Sign Signal[15];

input Sign Signal[1].Period_MA = 150;
input Sign Signal[1].Step         = 10;
input Sign Signal[1].Delta        = 20;

input Sign Signal[2].Period_MA = 300; и т.д.

 

Объявляю структуру Sign, затем массив Signal с типом Sign. Данный массив надо заполнить вручную при запуске советника.

При компиляции выдает ошибку: '.'  - semicolon expected, на строках, где идет присвоение input Sign Signal[1].Period_MA = 150; и т.д.

 

Если делаю так:

input int       Period_MA1 = 150;
input double Step1          = 10;
input double Delta1         = 20;

input int       Period_MA2 = 300;


А затем в функцииOnInit():

 Signal[1].Period_MA = Period_MA1;

 Signal[1].Step = Step1;  и т.д.

 

То все работает, ошибок нет. Как можно не используя лишних переменных, присвоить значения массиву Signal?


 

#6406
1 час назад, VitChel сказал:

Как можно не используя лишних переменных, присвоить значения массиву Signal?

можете в OnInit() непосредственно задать значения всех переменных массива.
А если все таки нужно в input- переменных задавать, то попробуйте объявить три переменные, типа:
input string MA_period = "150,300,.....";

Далее в OnInit() через функцию StringSplit()  преобразовать строку в массив значений. 
И в цикле заполнить массив структур

#6407

Всем доброго времени!

Вопрос, функция OrdersTotal() возвращает кол-во открытых и отложенных ордеров у конкретной валютной пары? Или же если один и тот же советник на одном счете торгует несколькими парами, то зацепятся все ордера суммарно этой функцией? И так и так работает?

#6408
3 часа назад, diodio сказал:

Вопрос, функция OrdersTotal() возвращает кол-во открытых и отложенных ордеров у конкретной валютной пары? 

ХЕЛП:

Цитата

OrdersTotal

Возвращает общее количество открытых и отложенных ордеров.

int  OrdersTotal();

Возвращаемое значение

Общее количество открытых и отложенных ордеров.

какое место из справки вызывает сомнение?

#6409

Как сделать так, чтобы и в тесте можно было прогнать и на графике посмотреть? В данный момент Close All в тесте не работает 

80C5EC89-E785-4E2B-9A19-FDF2C05C84C4.jpeg

AA204191-54A0-47F3-B5B1-D1B60BBD26E4.png

6BCA22D9-9C0E-401B-AAAD-6370EE68A7E4.png

#6410

+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   //--- обработка нажатия кнопки "CLOSE ALL"
   if(sparam=="CLOSE_ALL")
      {
      Sleep(50);
      //--- удаление графических объектов
      ObjectDelete(0,"CLOSE_ALL");
      //--- создание графических объектов
      CreateButton("CLOSE_YES",156,17,30,20,ColorYES,BORDER_RAISED,"YES",
                  "Arial",8,clrBlack,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //----
      CreateButton("CLOSE_NO",187,17,30,20,ColorNO,BORDER_RAISED,"NO",
                  "Arial",8,clrBlack,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //----
      return;
      }
   //--- обработка кнопки завершена
   //--- обработка нажатия кнопки "CLOSE NO"
   if(sparam=="CLOSE_NO")
      {
      Sleep(50);
      //--- удаление графических объектов
      ObjectDelete(0,"CLOSE_YES");
      ObjectDelete(0,"CLOSE_NO");
      //--- создание графических объектов
      CreateButton("CLOSE_ALL",156,17,61,20,ButtonColorBack,BORDER_RAISED,"Close All",
                  "Arial",8,ButtonColorText,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //----
      return;
      }
   //--- обработка кнопки завершена
   //--- обработка кнопки удаления/закрытия всех ордеров
   if(sparam=="CLOSE_YES")
      {
      Sleep(50);
      //--- удаление графических объектов
      ObjectDelete(0,"CLOSE_YES");
      ObjectDelete(0,"CLOSE_NO");
      //--- создание графических объектов
      CreateButton("CLOSE_ALL",156,17,61,20,ButtonColorBack,BORDER_RAISED,"Close All",
                  "Arial",8,ButtonColorText,CORNER_LEFT_UPPER,false,false,false,true,1,false);
      //--- удаление и закрытие ордеров
      while(true)
         {
         bool find_order=false;
         int slipp;
         //----
         for(int pos=OrdersTotal()-1;pos>=0;pos--)
         if(OrderSelect(pos,SELECT_BY_POS)==true)
         if(OrderSymbol()==_Symbol)
            {
            find_order=true;
            //----
            if(OrderType()==OP_BUY)
               {
               RefreshRates(); slipp=(int)(((Ask-Bid)/Point)*2);
               if(OrderClose(OrderTicket(),OrderLots(),Bid,slipp,clrBlue)==false){}
               }
            //----
            if(OrderType()==OP_SELL)
               {
               RefreshRates(); slipp=(int)(((Ask-Bid)/Point)*2);
               if(OrderClose(OrderTicket(),OrderLots(),Ask,slipp,clrRed)==false){}
               }
            //----
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
            if(OrderDelete(OrderTicket(),clrRed)==false){}
            //----
            if(OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)
            if(OrderDelete(OrderTicket(),clrBlue)==false){}
            }
            if(find_order==false)
            {
            Alert("Все ордера закрыты!");break;
            }
         } 
      }
   //--- обработка кнопки завершена
//----
  }
//+------------------------------------------------------------------+
//| Создает объект кнопка                                            |
//+------------------------------------------------------------------+
void CreateButton(string name,int xd,int yd,int xs,int ys,color color_back,
                  ENUM_BORDER_TYPE border_type,string text,string font,
                  int font_size,color color_text,int corner,bool back,
                  bool selectable,bool selected,bool hidden,int zorder,bool state)
   {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,xd);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,yd);
   ObjectSetInteger(0,name,OBJPROP_XSIZE,xs);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,ys);
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,color_back);
   ObjectSetInteger(0,name,OBJPROP_BORDER_TYPE,border_type);
   ObjectSetString(0,name,OBJPROP_TEXT,text);
   ObjectSetString(0,name,OBJPROP_FONT,font);
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_text);
   ObjectSetInteger(0,name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,name,OBJPROP_BACK,back);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,selectable);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,selected);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(0,name,OBJPROP_ZORDER,zorder);
   ObjectSetInteger(0,name,OBJPROP_STATE,state);
   Loop
сама кнопка

#6411
20 часов назад, usver73 сказал:

какое место из справки вызывает сомнение?

Счет один, пары разные, вот в чем сомнение. По всем парам возвращает общее кол-во? На каждую пару стоит один и тот же советник и в нем присутствует эта функция. Так вот вопрос, эта функция вернет общее кол-во позиций по одному счету или для каждой пары будет возвращено то кол-во которое открыто на данной паре?

Изменено 15 сентября, 2021 пользователем diodio

#6412
Только что, diodio сказал:

По всем парам возвращает общее кол-во?

ведь в справке не оговорено про пары?
Значит все ордера в рынке.
Ведь в функции подсчета "своих" ордеров советника практически всегда откидываем ордера "чужого" инструмента и "чужого" магика.
А цикл идет по всем OrdersTotal()

#6413
2 минуты назад, usver73 сказал:

ведь в справке не оговорено про пары?
Значит все ордера в рынке.
Ведь в функции подсчета "своих" ордеров советника практически всегда откидываем ордера "чужого" инструмента и "чужого" магика.
А цикл идет по всем OrdersTotal()

ну значит нужно сделать проще, не использовать эту функцию для подсчета по конкретной паре, заменяем ее на свой подсчет

#6414
1 минуту назад, diodio сказал:

ну значит нужно сделать проще, не использовать эту функцию для подсчета по конкретной паре, заменяем ее на свой подсчет

помнится в личке мы об этом говорили. И типовую функцию подсчета ордеров я тоже давал

#6415
1 час назад, Lexa000 сказал:

В данный момент Close All в тесте не работает

После нажатия на кнопку происходит ее удаление и рисование кнопок "CLOSE_YES" и "CLOSE_NO".
А потом происходит выход из функции.
image.png.497a9ff7a83f5d7a5863d64d5ba63fb8.png

Вынесите код закрытия ордеров в отдельную функцию, типа CloseAllOrders() и вставьте ее вызов перед return.
Читать код и искать ошибки будет легче

#6416
11 минут назад, usver73 сказал:

помнится в личке мы об этом говорили. И типовую функцию подсчета ордеров я тоже давал

Да, я все исправил по твоим правкам, работает, мне само определение в справке было не понятно. Сейчас попробовал сделать мультивалютник по той же стратегии и снова использовал эту функцию, а теперь сомневаюсь будет ли корректно работать.

#6417

Всем доброго времени суток!!!

Подскажите пожалуйста в коде сеточного советника прописал отображение средней цены на графике. Всё бы ничего но не корректно удаляется линия после закрытия сетки то есть средой цены нет. пожалуйста подскажите что я сделал не так. Вот код и картинка. 

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
    double avg_price, AveragePriceBuy, AveragePriceSell, order_lots = 0;
    price = 0;
   
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots() ;
         }
       }
    }
    avg_price = NormalizeDouble(price / order_lots, Digits);
    AveragePriceBuy = NormalizeDouble(avg_price + Spread, Digits);
    AveragePriceSell = NormalizeDouble(avg_price - Spread, Digits);
     {
     ObjectDelete(0, "AveragePriceLine");
     ObjectCreate("AveragePriceLine" ,OBJ_HLINE, 0, 0 ,AveragePriceBuy);
      ObjectCreate("AveragePriceLine" ,OBJ_HLINE, 0, 0 ,AveragePriceSell);
     ObjectSet("AveragePriceLine",OBJPROP_COLOR,Blue);
     }
    if ((otype == OP_BUY) && (Drawdown <= DrawdownClosingTakeprofitZero)) 
    tp = NormalizeDouble (AveragePriceBuy + TakeProfitGroupOrder*Point, Digits);
    if ((otype == OP_SELL) && (Drawdown <= DrawdownClosingTakeprofitZero))
    tp = NormalizeDouble (AveragePriceSell - TakeProfitGroupOrder*Point, Digits);
    if ((otype == OP_BUY) && (Drawdown > DrawdownClosingTakeprofitZero)) 
    tp = NormalizeDouble (AveragePriceBuy, Digits);
    if ((otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero))
    tp = NormalizeDouble (AveragePriceSell, Digits);
    
    for(int i = OrdersTotal()-1; i>=0; i--) 
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
                else Print("Ошибка модификации ордеров!");
           }
       }
    }
}   

image.thumb.png.75ade9cacd9b5398c3d3d9202d3d5b4c.png

 

#6418
54 минуты назад, Евгений72 сказал:

Подскажите пожалуйста в коде сеточного советника прописал отображение средней цены на графике.

У Вас наверняка есть функция подсчета ордеров в сетке.
В конце можно дописать

   if(countBUY+countSELL==0 && ObjectFind("AveragePriceLine")!=-1) ObjectDelete("AveragePriceLine");

 

#6419
21 час назад, usver73 сказал:

У Вас наверняка есть функция подсчета ордеров в сетке.
В конце можно дописать

   if(countBUY+countSELL==0 && ObjectFind("AveragePriceLine")!=-1) ObjectDelete("AveragePriceLine");

 

Спасибо за ответ но это не помогло

#6420
42 минуты назад, Евгений72 сказал:

Спасибо за ответ но это не помогло

почему не помогло? Разбирались?
п.с. описанный способ сам применял в сеточнике.
Валяется в ветке Spring, поищите, если не лень разбираться

#6421

Еще заинтересовал такой вопрос. Из статьи https://tlap.io/zapazdyvayushhie-indikatory/:

 

ris108.jpg

На рисунке выше к StDev добавлена скользящая средняя с периодом 20; чтобы ее отобразить, перетащите Moving Average «в подвал» и выберите пункт расчета «Previous Indicator’s Data».

Как можно получить в MQL4 показания такого индикатора: StdDev(18) -> MA(20) ?

Изменено 17 сентября, 2021 пользователем VitChel

#6422
53 минуты назад, VitChel сказал:

Как можно получить в MQL4 показания такого индикатора: StdDev(18) -> MA(20) ?

Вам нужно получить 20 последних значений индикатора StdDev, поместить их в массив и передать в функцию расчета МА.
У меня в тереме в папке Inqlude есть MovingAverages.mqh, в нем есть эти функции. Думаю, это из стандартной поставки
 

/+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=period-1 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position-i];
      result/=period;
     }
//---
   return(result);
  }

 

#6423

Доброго времени всем. Возник вопрос правильного написания торговой валютной пары:

например я объявляю символ

extern string       Symbol1          = "AUDCAD";

и в дальнейшем название этого символа должно попасть в функцию OrderSymbol()

Правильно ли будет такое представление написания торгового инструмента, или же лучше писать как

extern string       Symbol1          = "audcad";

т.е. я меняю регистр написания чтоб советник понял какую пару брать.

В справочнике ничего про регистр не сказано.

#6424
26 минут назад, diodio сказал:

Доброго времени всем. Возник вопрос правильного написания торговой валютной пары:

например я объявляю символ

extern string       Symbol1          = "AUDCAD";

и в дальнейшем название этого символа должно попасть в функцию OrderSymbol()

Правильно ли будет такое представление написания торгового инструмента, или же лучше писать как

extern string       Symbol1          = "audcad";

т.е. я меняю регистр написания чтоб советник понял какую пару брать.

В справочнике ничего про регистр не сказано.

Регистр имеет значение.

Поэтому в данном случае либо строчные преобразуете в прописные, либо оставляете вариант с прописными буквами, т.е. AUDCAD.

 

И пару функций в помощь:

 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // а-я -> А-Я
    if (c==184) n=168;            //  ё  ->  Ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}

 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в нижнем регистре                            |
//+----------------------------------------------------------------------------+
string StringLower(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>64 && c<91) n=c+32;     // A-Z -> a-z
    if (c>191 && c<224) n=c+32;   // А-Я -> а-я
    if (c==168) n=184;            //  Ё  ->  ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}

 

Изменено 20 сентября, 2021 пользователем Ent

#6425

Доброго времени суток!!!

Подскажите пожалуйста 

Вот счетчик и идентификатор ордеров 

//+----------------------------------------------------------------------------+
//| Счетчик ордеров                                                            |
//+----------------------------------------------------------------------------+
int CountTrade()
{
    int count = 0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
              if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              count++;  
            }
         }
    }
    return(count);
}

Далее эта функция всплывает в начале советника 

 if (CountTrade() == 0)

И далее идут условия для открытия первого ордера.

Вопрос заключается в том что нужно написать в коде чтобы выполнялось условие

"Если в терминале есть хоть один ордер, любого символа, любого типа. любого магика) то тогда ордер не открывать!

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025