Решил протестировать новые возможности МТ5, а именно хэдж-торговлю.
Есть в MQL5 аналогичная MQL4 функция OrdersTotal(). Почему в тестере она всегда возвращает 0? Часть лога:
Решил протестировать новые возможности МТ5, а именно хэдж-торговлю.
Есть в MQL5 аналогичная MQL4 функция OrdersTotal(). Почему в тестере она всегда возвращает 0? Часть лога:
Из высказанного можно сделать вывод, что данная функция в целях учёта ордеров (рыночных) на хэдж-счетах бесполезна. И всё, что связано с вызовом позиций придётся "майстырить" типа такой конструкции:
bool CMyTrade::MoveSL() { SymbolInfoTick (symbol, LastTick); double CurrentSL = 0.; double CurrentTP = 0.; if (AccountInfoInteger (ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) { ulong li_Ticket, li_N = 0, li_IND; for (int li_ORD = PositionsTotal() - 1; li_ORD >= 0; li_ORD--) { li_Ticket = PositionGetTicket (li_ORD); if (li_Ticket <= 0) continue; li_IND = fGet_INDInArray (PositionGetString (POSITION_SYMBOL), bsa_SMB); if (li_IND < 0) continue; if (li_IND != fGet_INDInArray ((int) PositionGetInteger (POSITION_MAGIC), bia_MG)) continue; CurrentSL = PositionGetDouble (POSITION_SL); CurrentTP = PositionGetDouble (POSITION_TP); if (PositionGetInteger (POSITION_TYPE) == OP_SELL) { cTrade.SetExpertMagicNumber (MagicNr); if (NormalizeDouble ((CurrentSL - LastTick.ask) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.) if (cTrade.PositionModify (li_Ticket, NormalizeDouble ((CurrentSL - TrailingStopLossStep * Pip), Dig), CurrentTP)) { li_N++; Comment (__FUNCTION__, ": ", symbol, "[", li_Ticket, "] Sell MoveSL!"); } } else if (PositionGetInteger (POSITION_TYPE) == OP_BUY) { cTrade.SetExpertMagicNumber (MagicNr); if (NormalizeDouble ((LastTick.bid - CurrentSL) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.) if (cTrade.PositionModify (li_Ticket, NormalizeDouble ((CurrentSL + TrailingStopLossStep * Pip), Dig), CurrentTP)) { li_N++; Comment (__FUNCTION__, ": ", symbol, "[", li_Ticket, "] Buy MoveSL!"); } } } if (li_N > 0) return (true); } else if (PositionSelect (symbol)) { if (PositionGetInteger (POSITION_MAGIC) == MagicNr) { if (PositionGetInteger (POSITION_TYPE) == OP_BUY) { CurrentSL = PositionGetDouble (POSITION_SL); CurrentTP = PositionGetDouble (POSITION_TP); cTrade.SetExpertMagicNumber (MagicNr); if (NormalizeDouble ((LastTick.bid - CurrentSL) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.) if (cTrade.PositionModify (symbol, (CurrentSL + TrailingStopLossStep * Pip), CurrentTP)) return (true); } if (PositionGetInteger (POSITION_TYPE) == OP_SELL) { cTrade.SetExpertMagicNumber (MagicNr); CurrentSL=PositionGetDouble(POSITION_SL); CurrentTP=PositionGetDouble(POSITION_TP); if (NormalizeDouble ((CurrentSL - LastTick.ask) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.) if (cTrade.PositionModify (symbol, (CurrentSL - TrailingStopLossStep * Pip), CurrentTP)) return (true); } } } return(false); }
Или есть другие варианты? Повторюсь, что интересует в первую очередь хэдж-торговля.
P.S. Спасибо всем откликнувшимся.
Вывод неверный.
Перебор открытых позиций идет через PositionXXX функции, а отложенных ордеров через OrderXXX.
Почитайте раздел документации про торговые функции, пожалуйста.
Вывод неверный.
Перебор открытых позиций идет через PositionXXX функции, а отложенных ордеров через OrderXXX.
Почитайте раздел документации про торговые функции, пожалуйста.
Приказ на открытие отложенного ордера - это ордер [разобрались]. А приказ на открытие рыночной позиции - это не ордер?
Насколько я помню, это последовательно ордер-сделка-позиция.
Для неттинга такая последовательность понятна (с учётом того, что позиция - это результат нескольких сделок\ордеров по одному инструменту, и понятие "торговый ордер" теряет смысл). А для хэджа? Когда каждую позицию можно приравнять к "торговому ордеру"?
Ладно, в философию работы с торговыми приказами в МТ5 я немножко "въехал". :)
Может кто подскажет нормальный класс\библиотеку работы с торговыми приказами? Чтобы правильно обрабатывались исключения (реквоты, занятость сервера, MODE_STOPLEVEL, MODE_FREEZELEVEL, ERR = 130 [модификация СТОПОВ одним и тем же значением - как в МТ4] и т.д. и т.п.)?
...а ещё, чтобы хэдж учитывала... ;)
Насколько я помню, это последовательно ордер-сделка-позиция.
Это для неттинга. Для хеджа, как я понимаю в терминологии, позиция (совокупная) не существует. А вообще, надо бы составить Краткий Терминологический Словарь ))
А то и правда имеет место быть путаница.
народ выдает предупреждение implicit conversion from 'number' to 'string' в этой строке:
ObjectSetText(name_8, "Ордеров в работе: " + OrdersTotal(), 10, "Courier New", Seashell);
помогите исправить
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Решил протестировать новые возможности МТ5, а именно хэдж-торговлю.
Есть в MQL5 аналогичная MQL4 функция OrdersTotal(). Почему в тестере она всегда возвращает 0? Часть лога:
И в OnTimer() и в OnTick() один и тот же результат. Что не так?