Советник работает некорректно на нескольких парах

 

Доброго времени суток! Пишу советник торгующий по мартингейлу, цикл в 7 ступеней. Если вешать на 1 пару, то все работает идеально. Если вешаю на несколько, то происходят странные вещи, например перескакиваются ступени мартингейла, ордера открываются некорректно и не открываются в нужный момент.

Советник для бинарных опционов. В голову сразу приходит, что некорректно реализовано считывание ордеров из истории, в момент когда советник проверяет был ли последний ордер (WIN, LOSS или DRAW). Но он сверяет Мэджик намбер и и Валютную пару. Мэджики выставляю разные. почему так? Благодарю

Если на одной паре работает идеально, то проблема может быть только в тех местах где советник работает с ордерами. Таких части в советнике всего две. Выкладываю.

 1. Проверяет был ли последний ордер закрыт в прибыль, убыток или ничью

int checkforlosses()
{
    int losses =0;
    int result =0;
    int last_order_type =-1;
    datetime last_order_time=0;
    for(int i=(OrdersHistoryTotal()-1);i>=0;i--)
     {
      result=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderCloseTime()>last_order_time)
            {
            last_order_time=OrderCloseTime();
            last_order_type=OrderType();
            string order_comment =OrderComment();
            if(StringFind(order_comment,"WIN",0)>0) losses =0;
            if(StringFind(order_comment,"DRAW",0)>0) losses =1;
            if(StringFind(order_comment,"LOSS",0)>0) 
            {losses++; losses++;}
            }
        }
     }
    return(losses);
}

 

 2. Проверяет в профите ли открытый ордер

bool orderprofit()
{
double profit;
int result2=0;
int type;
double oop;
for(int i=0;i<OrdersTotal();i++)
{

result2 = OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderMagicNumber()==MagicNumber)
{
type = OrderType();
oop = OrderOpenPrice();
}

}
if (((type == 0) && (oop > Bid)) || ((type == 1) && (oop < Bid)))
{
return(FALSE);
}
else
{
return(TRUE);
}

  Так же пробовал добавлять "светофор" через глобальные переменные. Но не помогло.

Светофор реализовывался следующим образом:

 
int buy()
{
// проверяем, есть ли от других экспертов нам "зеленый свет" для торговли... если есть пытаемся заблокировать торговлю для других
  if(Lock() == -1) return(0);          // если не удалось заблокировать... выходим
OrderSend(Symbol(),OP_BUY,Mylot,Ask,0,0,0,"BO exp:60",MagicNumber,0,Blue);
 UnLock();                           // разблокируем... разрешаем торговлю для других
buycycle = TRUE;
mbars = Bars;
}


int sell()
{
// проверяем, есть ли от других экспертов нам "зеленый свет" для торговли... если есть пытаемся заблокировать торговлю для других
  if(Lock() == -1) return(0);          // если не удалось заблокировать... выходим
OrderSend(Symbol(),OP_SELL,Mylot,Bid,0,0,0,"BO exp:60",MagicNumber,0,Blue);
 UnLock();                           // разблокируем... разрешаем торговлю для других
mbars = Bars;
sellcycle = TRUE;
}
 
Andrey Rakhlin:

Доброго времени суток! Пишу советник торгующий по мартингейлу, цикл в 7 ступеней. Если вешать на 1 пару, то все работает идеально. Если вешаю на несколько, то происходят странные вещи, например перескакиваются ступени мартингейла, ордера открываются некорректно и не открываются в нужный момент.

Советник для бинарных опционов. В голову сразу приходит, что некорректно реализовано считывание ордеров из истории, в момент когда советник проверяет был ли последний ордер (WIN, LOSS или DRAW). Но он сверяет Мэджик намбер и и Валютную пару. Мэджики выставляю разные. почему так? Благодарю

Если на одной паре работает идеально, то проблема может быть только в тех местах где советник работает с ордерами. Таких части в советнике всего две. Выкладываю.

 1. Проверяет был ли последний ордер закрыт в прибыль, убыток или ничью

 

 2. Проверяет в профите ли открытый ордер

  Так же пробовал добавлять "светофор" через глобальные переменные. Но не помогло.

Светофор реализовывался следующим образом:

В orderprofit условие if (OrderMagicNumber()==MagicNumber) не проверяет символ, если Вы укажете для всех инстанций робота один и тот же MagicNumber то будут коллизии.

Без описания логики эксперта и мартингейла, трудно что-то дельное советовать, непонятно зачем нужно разрешение от других инстанций робота, OrderSend будет работать в каждом потоке отдельно...

 
Andrey Rakhlin:

 Прочитайте в справочнике про Symbol() и Ask, Bid

OrderSend(Symbol(),OP_BUY,Mylot,Ask,0,0,0,"BO exp:60",MagicNumber,0,Blue);
 
Благодарю за ответы! Насчет символа я в курсе, но сейчас не об этом. Я устанавливаю разные мээджики. А по поводу документации спасибо. Сейчас погляжу.
 
Andrey Rakhlin:
Благодарю за ответы! Насчет символа я в курсе, но сейчас не об этом. Я устанавливаю разные мээджики. А по поводу документации спасибо. Сейчас погляжу.

Я еще ошибку увидел, чего же все ее делают? Почему вы решили, что терминал непременно вернет вам true на вызов OrderSelect? Даже значение в result сохраняете, но не проверяете. И насчет Symbol() совсем нелогично.

    for(int i=(OrdersHistoryTotal()-1);i>=0;i--)
     {
      result=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
      if(result && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)

//*************** или проще сразу так

    for(int i=(OrdersHistoryTotal()-1);i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
       {
          if(result && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)

// все остальное
       } 
  
 
Alexey Volchanskiy:

Я еще ошибку увидел, чего же все ее делают? Почему вы решили, что терминал непременно вернет вам true на вызов OrderSelect? Даже значение в result сохраняете, но не проверяете. И насчет Symbol() совсем нелогично.

Благодарю, Alexey! Еще вопрос, в случае если OrderSelect вернет FALSE, я должен зациклить OrderSelect до тех пор пока он не вернет TRUE? (через while) Или же просто выйти из функции? Заранее спасибо
 
Andrey Rakhlin:
Благодарю, Alexey! Еще вопрос, в случае если OrderSelect вернет FALSE, я должен зациклить OrderSelect до тех пор пока он не вернет TRUE? (через while) Или же просто выйти из функции? Заранее спасибо
Я бы слелал 3-5 циклов, а потом просто continue; для перехода к следующему ордеру, зачем выходить-то. Ну и сообщение print об ошибке
 
Lilita Bogachkova:

 Прочитайте в справочнике про Symbol() и Ask, Bid

Прочитал справочник, но так и не понял, на что вы намекаете
 

Andrey Rakhlin:

Доброго времени суток! Пишу советник торгующий по мартингейлу, цикл в 7 ступеней. Если вешать на 1 пару, то все работает идеально. Если вешаю на несколько, то происходят странные вещи, например перескакиваются ступени мартингейла, ордера открываются некорректно и не открываются в нужный момент. 


Прочитал справочник, но так и не понял, на что вы намекаете

Так как не сказано что вы используете несколько графиков, но используйте несколько инструментов:

Symbol

Возвращает имя символа текущего графика.

double Ask

Последняя известная цена продажи (запрашиваемая цена) текущего инструмента. 

 
Lilita Bogachkova:

Так как не сказано что вы используете несколько графиков, но используйте несколько инструментов:

Symbol

Возвращает имя символа текущего графика.

double Ask

Последняя известная цена продажи (запрашиваемая цена) текущего инструмента. 

Использую несколько графиков, на каждом графике один и тот же советник с разным мэджик намбером
Причина обращения: