Где ошибка советника ? - страница 2

 
Alexey Viktorov:

О нём я и говорил. Было-бы это адресовано мне реакция была-бы не такая.

На ваш комментарий я не давал никакого ответа, а задал вопрос. В этом и вся разница, я задал вопрос, а вы навязывали человеку своё мнение с оценкой его способностей.

:) Хорошо, я принял к сведению.
 

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

Добрые люди, отзовитесь!

Пытаюсь написать советник на внешнем индикаторе.

никак не могу понять, чего же все таки ему не хватает.

вот фрагмент

double Gap=1.0;
      int Period_1=15;
      int Period_2=30;
      int Period_3=60;
      int Period_4=240;
      int CCI_1=34;
      int CCI_2=34;
      int CCI_3=14;
      int CCI_4=14;
      bool AutoDisplay=false;
      int M5=0;
      int M15=0;
      int M30=0;
      int H1=0;
      if (iCustom(NULL, 0, "ForexFreedomBars", Gap, Period_1, Period_2, Period_3, Period_4, CCI_1, CCI_2,CCI_3,CCI_4, AutoDisplay, 6, 1)!= EMPTY_VALUE) M5=1;
      if (iCustom(NULL, 0, "ForexFreedomBars", Gap, Period_1, Period_2, Period_3, Period_4, CCI_1, CCI_2,CCI_3,CCI_4, AutoDisplay, 4, 1)!= EMPTY_VALUE) M15=1;
      if (iCustom(NULL, 0, "ForexFreedomBars", Gap, Period_1, Period_2, Period_3, Period_4, CCI_1, CCI_2,CCI_3,CCI_4, AutoDisplay, 2, 1)!= EMPTY_VALUE) M30=1;
      if (iCustom(NULL, 0, "ForexFreedomBars", Gap, Period_1, Period_2, Period_3, Period_4, CCI_1, CCI_2,CCI_3,CCI_4, AutoDisplay, 0, 1)!= EMPTY_VALUE) H1=1;
      // ввод переменной, если все 4 индикатора больше 0, то значение 2
      int FF=0;
      if (M5!=0 && M15!=0 && M30!=0 && H1!=0) FF=2;
      if (M5==0 && M15==0 && M30==0 && H1==0) FF=1; 

почему то кажется, что не правильно задаю/извлекаю значения индикатора.

заранее спасибо  

 

У вас под массив bodyPoint память не выделена.

Где-нибудь перед циклом:

ArrayResize(bodyPoint, 10);
 

evgenykei:

 

Вопрос - Почему данная конструкция всегда корректно отрабатывает на тестере и никогда не отрабатывает на реале, а конкретно - никогда не заходит в Условие 2 если до этого было выполненно Условие 1 ? Т.е. другими словами почему не выполняется условие отсутствия позиции сразу же после ее закрытия путем trade.PositionClose(_Symbol) ?. Подозреваю что проблема в том что приказ не успевает исполниться к моменту проверки, но как в этом случае простроить данную конструкцию с тем же смыслом ?

Разобрались, нет? Подозреваете почти правильно: приказ-то исполняется (если он синхронный), но в МТ5 торговые функции завершаются, не дожидаясь синхронизации результата сделки с торговым окружением. Один из вариантов решения - дождаться, когда результат закрытия позиции отобразится в истории:

CTrade  trade;

CPositionInfo myposition; 

void OnTick()
{
   if(IsNewBar()) 
   {
      if(myposition.Select(_Symbol) == true)  //Условие 1
      {
         trade.PositionClose(_Symbol);
         
         // дождёмся появления результата сделки в истории
         if(trade.ResultOrder() > 0)
         {
            while(!IsStopped())
            {
               if(HistoryOrderSelect(trade.ResultOrder()) == true)
                  break;
                        
               Sleep(10);
            }
         }
      }
      
      if (myposition.Select(_Symbol) == false)  //Условие 2
      {
         // Открытие сделки
      }
   } 
}
 
Сергей Таболин:

Огромное спасибо )))

Получается массиву нужно указывать размерность... Не очень удобно. 

По-моему не обязательно. Просто не надо массиву насильно ставить размерность 0.

ArrayFree(bodyPoint);
Причина обращения: