Ваши вопросы по языку MQL4

vladradon

Программист
особенно непонятно
PHP код:
_Symbol
можете пояснить что это за переменная и почему перед ней знак подчеркивания?
В этой переменной хранится имя символа текущего графика - аналог Symbol(). А подчеркивание - это фенька из 5-го языка и если в старых билдах не работает, то замени на аналог.
еще вопрос - если мне не важно(в данном случае) какой символ и какой тип ордера, важен только магик и количество открытых позиций по каждому магику, то мне кажется строка должна иметь вид
PHP код:
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)
Не совсем: нужно еще учитывать тип открытых и выставленных ордеров и если при подсчете не нужно учитывать отложки, то вводим проверку типа ордера (0 - бай и 1 - селл, а 2-5 уже отложки) -
PHP:
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderType()<2)
и количество скобок должно быть четным (у тебя не хватает скобки в конце этой строки)!;)
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
В этой переменной хранится имя символа текущего графика - аналог Symbol(). А подчеркивание - это фенька из 5-го языка и если в старых билдах не работает, то замени на аналог.

Не совсем: нужно еще учитывать тип открытых и выставленных ордеров и если при подсчете не нужно учитывать отложки, то вводим проверку типа ордера (0 - бай и 1 - селл, а 2-5 уже отложки) -
PHP:
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderType()<2)
и количество скобок должно быть четным (у тебя не хватает скобки в конце этой строки)!;)
Имелось ввиду не правильное расположение одной из скобок
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES && OrderSymbol()==_Symbol) && OrderType()<=1)
потому и осталось непарное количество скобок.
Если этот код был написан не "на коленке", то странно что компилятор это пропустил.
 

vladradon

Программист
Если этот код был написан не "на коленке", то странно что компилятор это пропустил.
Я код писал не в редакторе, а здесь в сообщении и поспешил не проверив. Кстати, закинул сейчас в редактор - компилирует без проблем, при чем в режиме strict.:D Проверил на графике с ордерами другого сова - тоже работает!!! Сам в шоке...o_o
Только проверка на символ не работает...
 
Последнее редактирование:

Milord

Местный знаток
Не совсем: нужно еще учитывать тип открытых и выставленных ордеров и если при подсчете не нужно учитывать отложки, то вводим проверку типа ордера (0 - бай и 1 - селл, а 2-5 уже отложки) -
PHP:
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderType()<2)
и количество скобок должно быть четным (у тебя не хватает скобки в конце этой строки)!;)
спасибо за скобку, снова не нарисовал одну, бывает не сразу вижу ошибку, но компилятор не компилирует с ошибками, так что скобки в итоге "находятся" лишние или недостающие!)))
на счет того, что нужно проверять какой тип ордера, снова неясно - зачем?:please: если в моей(данной) ТС как раз это не важно!;)
 
Последнее редактирование:

vladradon

Программист
на счет того, что нужно проверять какой тип ордера, снова неясно - зачем? если в моей(данной) ТС как раз это не важно!
На промежуточном этапе написания кода это может и не важно. Главное, чтобы в будущем из-за отсутствия этой проверки не возникло сбоев, особенно если на одном символе будет вестись торговля совом и скриптом, выставляющим отложки и т.п. Задача была подсчитать рыночные ордера, поэтому проверка на тип.
 

AlexeyVik

Программист mql4 mql5
Я код писал не в редакторе, а здесь в сообщении и поспешил не проверив. Кстати, закинул сейчас в редактор - компилирует без проблем, при чем в режиме strict.:D Проверил на графике с ордерами другого сова - тоже работает!!! Сам в шоке...o_o
Только проверка на символ не работает...
Это и называется "писать "на коленке".
Дальше у меня только эмоции... как может компилироваться??? Странно...
Видимо это остатки необязательности языка, которых совсем недавно, было немереное количество.
 

Anna89

Новичок форума
Подскажите, пожалуйста. Как правильно описать перекрещение двух линий? И сразу выставлялась линия на определенное расстояние ( после пересечение ценой этой линии ставилась сделка)?
У меня ставится много линий, а надо одно пересечение одна линия.
Кусок кода. Пример на покупку.

Код:
MagDO=iCustom(Symbol(),0,"__MAcanals2",MA_Period,MA_Shift,MA_Method,Channel1,Channel2,Channel3,1,0);
   MagUP=iCustom(Symbol(),0,"__MAcanals2",MA_Period,MA_Shift,MA_Method,Channel1,Channel2,Channel3,2,0);

   BlDO=iCustom(Symbol(),0,"superprkanal",dll_period,Rc_fast,Rc_slow,Rc_slope_trend,SL_distance_pips,DisplayAlert,
                ShowCurrentCandle,Rast,2,0);
   YelUP=iCustom(Symbol(),0,"superprkanal",dll_period,Rc_fast,Rc_slow,Rc_slope_trend,SL_distance_pips,DisplayAlert,
                 ShowCurrentCandle,Rast,3,0);

   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        {
         if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY) pos++;
            if(OrderType()==OP_SELL) pos++;
           }
        }
     }

         if(MagUP<=YelUP)
           {
            ObjectCreate("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJ_HLINE,0,0,High[0]+Punkt*Point);
            LinePrice1=ObjectGet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_PRICE1);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_COLOR,Blue);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_STYLE,STYLE_SOLID);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_WIDTH,1);
            ObjectSet("BS"+TimeToStr(Time[i],TIME_DATE|TIME_MINUTES),OBJPROP_RAY,false);
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    79,8 КБ · Просмотры: 27

vladradon

Программист
Rep Report
Подскажите, пожалуйста. Как правильно описать перекрещение двух линий? И сразу выставлялась линия на определенное расстояние ( после пересечение ценой этой линии ставилась сделка)?
У меня ставится много линий, а надо одно пересечение одна линия.
Привет! Приведу пример для 2-х переменных (данных индикаторов). Всю стратегию не знаю, поэтому что-то нужно будет подправить (смещение красной линии, наверное, нужно вычитать и т.п.). Сам вход не делал - там все просто - сравнение текущего Bid (Ask) с LinePrice1 (LinePrice2), затем сам вход по OrderSend и (если нужно) удаление пересеченной линии функцией ObjectsDelete, и обнуление триггерной переменной MagUPYelUP, которая фиксирует направление последнего пересечения. Если появилось новое пересечение, то старая линия удаляется. Я ввел 2 базовых имени для линий BS1 и BS2 - их можно везде поменять, конечно. Это просто заготовка для корректного встраивания в код. Продублированные переменные в конце кода нужно удалить.
PHP:
if(MagUPYelUP==0 && MagUP<YelUP) MagUPYelUP=1;
 if(MagUPYelUP==0 && MagUP>YelUP) MagUPYelUP=2;
 if(MagUP<=YelUP && MagUPYelUP==2 && ObjectFind(0,"BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES))<0)
   {
    ObjectsDelete("BS1");
    ObjectCreate("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJ_HLINE,0,0,High[0]+Punkt*Point);
    LinePrice1=ObjectGet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_PRICE1);
    ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_COLOR,clrBlue);
    ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_STYLE,STYLE_SOLID);
    ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_WIDTH,1);
    ObjectSet("BS1"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_RAY,false);
    MagUPYelUP=1;
   }
 if(MagUP>=YelUP && MagUPYelUP==1 && ObjectFind(0,"BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES))<0)
   {
    ObjectsDelete("BS2");
    ObjectCreate("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJ_HLINE,0,0,High[0]+Punkt*Point);
    LinePrice2=ObjectGet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_PRICE1);
    ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_COLOR,clrRed);
    ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_STYLE,STYLE_SOLID);
    ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_WIDTH,1);
    ObjectSet("BS2"+TimeToStr(Time[0],TIME_DATE|TIME_MINUTES),OBJPROP_RAY,false);
    MagUPYelUP=2;
   }

//------ 
  }//Конец функции OnTick

void ObjectsDelete(string name="")
  {
   for(int i=ObjectsTotal()-1; i>=0; i--)
      if(StringFind(ObjectName(i),name,0)>=0) ObjectDelete(ObjectName(i));
  }

double LinePrice1=0,LinePrice2=0,MagUP=0,YelUP=0,Punkt=0;
int pos=0;
int MagUPYelUP=0;
Цикл в предоставленном коде не знаю зачем нужен. К тому же он либо с ошибкой, либо специально выключен. Я его не использовал. Строки со считыванием данных индикаторов я не вписывал, т.к. у меня нет этих индюков, но они так и остаются перед моим кодом, естественно.
 
Последнее редактирование:

vladradon

Программист
Спасибо большое.
Забыл добавить: переменные LinePrice1 и LinePrice2 после открытия соответствующих ордеров следует обнулять и перед каждым открытием и проверкой на пересечение проверять их значения и только если они не нулевые разрешать открытие по пересечению. Получится следующее: если переменная равна 0, то либо нет линии, либо по этой линии уже выставлен ордер и не будет выставляться куча ордеров по одному пересечению. А ненулевое значение переменная получает только при выставлении новой линии.
 

vladradon

Программист
У меня ставится много линий, а надо одно пересечение одна линия.
Еще одно замечание: если сов будет параллельно работать на нескольких парах, то в имена линий нужно добавить имена символов типа "BS1"+_Symbol+... и функцию удаления объектов запускать ObjectsDelete("BS2"+_Symbol); , чтобы однотипные линии на соседних графиках не удалялись.
 

Milord

Местный знаток
На промежуточном этапе написания кода это может и не важно. Главное, чтобы в будущем из-за отсутствия этой проверки не возникло сбоев, особенно если на одном символе будет вестись торговля совом и скриптом, выставляющим отложки и т.п. Задача была подсчитать рыночные ордера, поэтому проверка на тип.
ну это да, согласен если два пашут на счете и сова и скрипт..кстати тут вопросик у меня новый возник, может чего подскажите, суть такая, нужно в коде прописать запрет открывать ордера, если на счете уже открыты рыночные ордера с Magic2 от второго советника,кусок кода ниже для ясности,куда нужно втиснуть запрет на торговлю, если на счете будут открыты ордера с магиком2:

PHP:
extern int       Magic1=123;
 extern int       MaxOrdersMagic1=1;
--------------------------------------------- 
int start() 
{ 
//------------------------------- 
double OrdersMagic1=0;
for(int i=0;i<OrdersTotal();i++)
 if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
 {
  if(OrderMagicNumber()==Magic1) OrdersMagic1++;
 }
//------
if(OrdersMagic1<MaxOrdersMagic1)
 {  
  if(A>B) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }
//-------
 if(A<B) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
 }
 
Последнее редактирование:

vladradon

Программист
нужно в коде прописать запрет открывать ордера, если на счете уже открыты рыночные ордера с Magic2 от второго советника
Такие легкости уже сам должен писать ;):
PHP:
extern int       Magic1=123;
 extern int       Magic2=234;
 extern int       MaxOrdersMagic1=1;
--------------------------------------------- 
int start() 
{ 
//------------------------------- 
double OrdersMagic1=0;
double OrdersMagic2=0;
for(int i=0;i<OrdersTotal();i++)
 if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
 {
  if(OrderMagicNumber()==Magic1) OrdersMagic1++;
  if(OrderType()<2 && OrderMagicNumber()==Magic2) OrdersMagic2++;
 }
//------
if(OrdersMagic1<MaxOrdersMagic1 && OrdersMagic2<1)
 {  
  if(A>B) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }
//-------
 if(A<B) 
   { 
   OrderSend(Symbol(),OP_SELL,...,Magic1,...); 
   } 
 }
Опять учет только рыночных ордеров, поэтому вписал проверку OrderType()<2 и если она не нужна, то удали.
 

Milord

Местный знаток
Такие легкости уже сам должен писать ;):
PHP:
if(OrdersMagic1<MaxOrdersMagic1 && OrdersMagic2<1)
 {  
  if(A>B) 
   { 
   OrderSend(Symbol(),OP_BUY,...,Magic1,...); 
   }
 }
вот в чем и дело, что самое трудное прописать в коде самые простые вещи!;)
спасибо вам за помощь,может глянете свежим взглядом на код трала,какие в нем есть ошибки и как в нем прописать дополнительно TrailingStart и TrailingStep,так как сам потерял малость форму в кодировании, половину позабыл что знал из-за большого перерыва,остальную половину по сей день осваиваю..;)

PHP:
for(int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol()||OrderMagicNumber()==Magic)
       if(OrderType()==OP_BUY)
         {
          if(TrailingStop>0)  
            {                 
              if(Bid-OrderOpenPrice()>TrailingStop*Point)
               {
                 if(OrderStopLoss()<Bid-TrailingStop*Point)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
         
        if(OrderType()==OP_SELL)
         {
           if(TrailingStop>0)  
            {                 
              if((OrderOpenPrice()-Ask)>TrailingStop*Point)
               {
                 if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }   
   }
 

MrGreen86

Гуру форума
может глянете свежим взглядом на код трала,какие в нем есть ошибки и как в нем прописать дополнительно TrailingStart и TrailingStep

Ошибки:
1) перебор ордеров следует делать с конца. В случае если на счете работает 2+ советника и второй советник в момент перебора закроет один из ордеров в списке - у вас может случится пропуск ордера
2) у вас ордер проверяется или по инструменту, или по меджику что не корректно. нужно не ИЛИ а И. так как он заденет ордера другого советника на том же инструменте и другого советника с тем же меджиком.
3) if(TrailingStop>0) это лучше ставить в самое начало, нет смысла проверять ордера если трала вообще нет.
4) отстусвует зазор при модификации стоп лоса. По вашим условиям стоп лосс может ползти каждый 1 тик. Многие брокеру ругаются на это на 5 знаке. рекомендую ставить зазор в 10 тиков для 5 знака. что как бы соответствует 1 пункту.
5) отсутсвует округление расчеткой цены в функции модификации ордера, не все брокеры такое пропустят.
6) отсутсвует проверка исполнения. Если ошибка серьезная он будет долбить брокера приказами пока не получит бан.

Вот правильныq вариант сразу со степом и стартом

PHP:
if(TrailingStop>0) {
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()!=Magic) continue;
      if(OrderType()==OP_BUY && Bid-OrderOpenPrice() >= TrailingStart*Point) {
         if(OrderStopLoss() <= Bid-(TrailingStop+TrailingStep)*Point) {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               // тут надо проверить ошибку
            }
         }
      }
      if(OrderType()==OP_SELL && OrderOpenPrice()-Ask >= TrailingStart*Point) {
         if(OrderStopLoss() >= Ask+(TrailingStop+TrailingStep)*Point || OrderStopLoss()==0) {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               // тут надо проверить ошибку
            }
         }
      }
   }
}
 

vladradon

Программист
Вот правильныq вариант сразу со степом и стартом
Есть еще один существенный недочет - нет проверки на стоп уровень:
PHP:
void TrailingStop()
  {
   double newstop=0;
   int stoplevel=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   if(TrailingStart<=stoplevel) TrailingStart=stoplevel+1;
   if(TrailingStep<=stoplevel) TrailingStep=stoplevel+1;
   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)
              {
               if(OrderStopLoss()<=0 || OrderStopLoss()<OrderOpenPrice())
                  if(Bid>(OrderOpenPrice()+(TrailingStart+TrailingStep)*_Point))
                     newstop=Bid-TrailingStep*_Point;
               if(OrderStopLoss()>0.0 && Bid>(OrderStopLoss()+TrailingStep*_Point))
                  newstop=Bid-TrailingStep*_Point;
               if(newstop>OrderStopLoss() && newstop<Bid-stoplevel*_Point)
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(newstop,_Digits),OrderTakeProfit(),OrderExpiration()))
                     Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
              }
            //-----------------------------------------------------------
            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()<=0.0 || OrderStopLoss()>OrderOpenPrice())
                  if(Ask<(OrderOpenPrice()-(TrailingStart+TrailingStep)*_Point))
                     newstop=Ask+TrailingStep*_Point;
               if(OrderStopLoss()>0.0 && Ask<(OrderStopLoss()-TrailingStep*_Point))
                  newstop=Ask+TrailingStep*_Point;
               if(newstop>0 && newstop>Ask+stoplevel*_Point)
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(newstop,_Digits),OrderTakeProfit(),OrderExpiration()))
                     Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
              }
           }
  }
 
Последнее редактирование:

MrGreen86

Гуру форума
Есть еще один существенный недочет - нет проверки на стоп уровень:
можно его сделать так. но:
1. корректней проверять настройки на старте и вообще не запускаться советнику если пользователь накосячил. Это все в OnInit потому и не писал это тут.
2. у многих брокеров стоп левел плавающий. Серверная часть MT не позволяет на лету менять параметр стоп левела. В этом случае функция MarketInfo(_Symbol,MODE_STOPLEVEL) возвращает 0 или вообще некорректное значение. Обычно при плавающем стоп левеле он равен двум спредам. т.е. если MarketInfo(_Symbol,MODE_STOPLEVEL) == 0, то stoplevel = ((Ask-Bid)*2)/_Point;

PHP:
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
там нужна полноценная проверка на ошибки а не эта заглушка которая рано или поздно приведет к бану.
 

vladradon

Программист
там нужна полноценная проверка на ошибки а не эта заглушка которая рано или поздно приведет к бану.
Если новый стоплосс не проходит, то какую проверку ни делай, все равно придется либо лезть в настройки, либо в код. А я предпочитаю вообще в таком случае переключаться на виртуал. И проверку стоп уровня вообще желательно делать отдельно на случай, если несколько ордеров в рынке и новый стоплосс может подойти текущему ордеру для модификации, но влезть в стоп уровень другого ордера. А если стоп уровень плавающий, то лучше ставить на ВПС и с виртуальным тралом или с автоматическим переходом на виртуал при первой же ошибке модификации.
 

Milord

Местный знаток
Вот правильныq вариант сразу со степом и стартом
PHP:
if(TrailingStop>0) {
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()!=Magic) continue;
      if(OrderType()==OP_BUY && Bid-OrderOpenPrice() >= TrailingStart*Point) {
         if(OrderStopLoss() <= Bid-(TrailingStop+TrailingStep)*Point) {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               // тут надо проверить ошибку
            }
         }
      }
      if(OrderType()==OP_SELL && OrderOpenPrice()-Ask >= TrailingStart*Point) {
         if(OrderStopLoss() >= Ask+(TrailingStop+TrailingStep)*Point || OrderStopLoss()==0) {
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),OrderTakeProfit(),0,Green)) {
               // тут надо проверить ошибку
            }
         }
      }
   }
}
спасибо за ваш вариант трала,прикрутил его к советнику, прогнал в тестере,в итоге прибыльность упала почти в 2 раза,как потом выяснил по причине уменьшения числа открытых ордеров,а сейчас факты, без трала:
depo =1000,
profit=2905,
sell -97
buy-43
---------------
а теперь с тралом:
depo=1000
profit=1929
sell -57
buy-2
странно как он влияет на число открытых ордеров, сигнал то на открытие не изменился,по истории сделок тоже видно ,что с тралом он "тянет" только sell ордера,buy -почти нет,лишь 2 штуки..:please:
 

MrGreen86

Гуру форума
Если новый стоплосс не проходит, то какую проверку ни делай, все равно придется либо лезть в настройки, либо в код.

зависит от причины почему не проходит, т.е. от кода ошибки.
в каких то ситуация нужно вообще советнику самому себе запретить торговые операции на какое то время (например если рынок закрыт). в каких то обновить цену, в каких то можно долбить дальше если брокер шлет реквоты.
 
Верх