Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
mt4trade
399
mt4trade 2012.11.24 13:34 

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

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

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 или у меня баг ??

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

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

Alexandr Bryzgalov
27374
Alexandr Bryzgalov 2012.11.24 13:51  

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

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

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

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

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

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

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

Комбинатор
15918
Комбинатор 2012.11.24 14:48  

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

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

TarasBY
1739
TarasBY 2012.11.24 14:49  
mt4trade:

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

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

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

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

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); // ставим галку
       }
    }
  }
}
mt4trade
399
mt4trade 2012.11.24 15:00  
TarasBY: Предыдущий бар можно отследить так: if (iBarShift (NULL, 0, dtlBuyCloseTime) == 1) // ордер закрыт на предыдущем баре"
Это не поможет, так как пока в пуле OrderSelect`а как бы нет самого ордера, хоть он и закрылся на предыдущем баре. Соответственно, время его закрытия неизвестно.
Alexandr Bryzgalov
27374
Alexandr Bryzgalov 2012.11.24 15:00  

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

dtlBuyCloseTime

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

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

TheXpert  прав.

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий