некорректно работает MODE_HISTORY (возможно)

 

Коллеги, простой вопрос. Нужно определить, есть ли закрывшийся ордер определенного типа на предыдущем баре.

На открытии бара делаю примерно так:

nlTTotal=OrdersHistoryTotal()-1;
for (nlCnt=nlTTotal; nlCnt>=0; nlCnt--)
{ blOrderSelect=OrderSelect(nlCnt, SELECT_BY_POS, MODE_HISTORY);
  { if (blOrderSelect && OrderType()==OP_BUY) dtlBuyCloseTime=OrderCloseTime(); 
    if (dtlBuyCloseTime>=Time[1]) // ордер закрыт на предыдущем баре или позже
    { fSetArrow(Time[0],High[0]+100*Point,TimeToStr(Time[0]),254,Orange); // ставим галку
    }
  }
}

Но штука в том, что тестер почти всегда находит ордер только ЧЕРЕЗ бар:

  

 Модель в тестере пробовал и все тики и контрольные точки - одинаково.

И то, это работает если поставишь  if (dtlBuyCloseTime>=Time[2])  

Что это - глюки тестера, неправильная работа MODE_HISTORY или у меня баг ??

Причем ведь бывают и нормальные срабатывания, но реже!

Как победить, кто подскажет?

 

На вид по коду всё правильно, возможно стрелку перерисовывает другая часть кода.

Перезагрузи терминал, если останется то же самое то причина в коде. Делай распринтовку, смотри время закрытия ордеров в результатах и сравнивай с временем баров.

ЗЫ: скорее всего где-то в коде идёт перерисовка стрелочки.

 
sanyooooook: На вид по коду всё правильно, возможно стрелку перерисовывает другая часть кода.
Исключено. Код написан так, что стрелочки могут нарисоваться многократно, но НЕ перерисоваться.
sanyooooook: Перезагрузи терминал, если останется то же самое то причина в коде. Делай распринтовку, смотри время закрытия ордеров в результатах и сравнивай с временем баров.

Перезагрузил терминал, перезагрузил историю котировок, включая минутки, посмотрел в Результатах тестера времена закрытия ордеров, сверил их с сохраненными в примечаниях к стрелкам. Времена закрытия совпадают. В общем дело похоже в том, что в пул history ордер попадает как-то странно. Иногда "вовремя", иногда только через бар!

sanyooooook, не мог бы написать свой код чтобы проверить этот баг?

И еще кто может подключится. 

 

Ошибка в коде.

Вначале стрелка рисуется где надо. Но на следующем баре перерисовывается на бар дальше, т.к. все подходит по условиям.

 
mt4trade:

Коллеги, простой вопрос. Нужно определить, есть ли закрывшийся ордер определенного типа на предыдущем баре.

Предыдущий бар можно отследить так: 

    if (iBarShift (NULL, 0, dtlBuyCloseTime) == 1) // ордер закрыт на предыдущем баре
 
TheXpert: Ошибка в коде. Вначале стрелка рисуется где надо. Но на следующем баре перерисовывается на бар дальше, т.к. все подходит по условиям.
Код написан так, что стрелочки могут нарисоваться многократно, но НЕ перерисоваться. Попробуйте сами.
 
Мне вообще абсолютно по барабану. Я ошибку сказал. Дальше делай что хочешь, фикси, упирайся, обвиняй разработчиков.
 

вот так попробуй

nlTTotal=OrdersHistoryTotal()-1;
for (nlCnt=nlTTotal; nlCnt>=0; nlCnt--)
{ blOrderSelect=OrderSelect(nlCnt, SELECT_BY_POS, MODE_HISTORY);
  { if (blOrderSelect && OrderType()==OP_BUY) 
    {
       dtlBuyCloseTime=OrderCloseTime(); 
       if (dtlBuyCloseTime>=Time[1]) // ордер закрыт на предыдущем баре или позже
       { fSetArrow(Time[0],High[0]+100*Point,TimeToStr(Time[0]),254,Orange); // ставим галку
       }
    }
  }
}
 
TarasBY: Предыдущий бар можно отследить так: if (iBarShift (NULL, 0, dtlBuyCloseTime) == 1) // ордер закрыт на предыдущем баре"
Это не поможет, так как пока в пуле OrderSelect`а как бы нет самого ордера, хоть он и закрылся на предыдущем баре. Соответственно, время его закрытия неизвестно.
 

в твоей версии переменная

dtlBuyCloseTime

держит значение и так как условие подходит стрелка перерисовывается.

 
mt4trade:
Код написан так, что стрелочки могут нарисоваться многократно, но НЕ перерисоваться. Попробуйте сами.

TheXpert  прав.

Когда время закрытия ордера попадает в 0-й бар, стрелка рисуется правильно. После появления нового бара, время закрытия попадает на 1ый бар, и стрелка переносится с 1-го на 0-ой бар.  А после этого движется вместе с графиком.

Причина обращения: