Ниже будет затронута тема, которая касается не только MT4, но и MT5 с другими платформами. Но для удобного восприятия логика будет написана на MQL4, поэтому в этой ветке.
На форуме еще до появления в MQL5 Reason-флагов был выложен триггер SL/TP. Его логика четко показывала, что при акцептировании SL/TP/SO уровней открытой позиции торговым сервером порождается соответствующий маркет-ордер, который находится в MT5-таблице открытых ордеров до тех пор, пока не исполнится.
Поэтому в MT5 даже на чистом MQL5 модификация/удаление таких ордеров невозможна и торговая логика в MT5 требует проверки, является ли открытый ордер фактически замороженным или нет.
Ниже показано условие идентификации таких ордеров при написании торговой логики на MT4Orders и пример его срабатывания
// Триггер SL/TP/SOvoidOnTradeTransaction ( constMqlTradeTransaction &Trans, constMqlTradeRequest &Request, constMqlTradeResult &Result )
{
if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD) && OrderSelect(Trans.order))
{
constENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderGetInteger(ORDER_REASON);
if (Reason == ORDER_REASON_TP)
Print("Position #" + (string)Trans.position + " - triggered TP.");
elseif (Reason == ORDER_REASON_SL)
Print("Position #" + (string)Trans.position + " - triggered SL.");
elseif (Reason == ORDER_REASON_SO)
Print("Position #" + (string)Trans.position + " - triggered StopOut.");
}
}
#include <MT4Orders.mqh>
#define BidSymbolInfoDouble(_Symbol, SYMBOL_BID)
#define AskSymbolInfoDouble(_Symbol, SYMBOL_ASK)
voidOnInit()
{
EventSetMillisecondTimer(1);
OrderSend(_Symbol, OP_BUY, 1, Ask, 100, Bid - _Point, Ask + _Point);
}
// Показываем, что SL/TP/SO-ордера присутствуют в текущей таблице открытых MT5-ордеровvoidOnTimer()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) &&
(OrderCloseReason() >= (int)ORDER_REASON_SL)) // При срабатывании этого условия модифицировать/удалять ордер нельзя!
{
OrderPrint();
constlong Position = OrderGetInteger(ORDER_POSITION_ID); // Возможно, т.к. MT4Orders настроен на параллельную работу с торговым API MQL5constENUM_ORDER_REASON Reason = (ENUM_ORDER_REASON)OrderCloseReason();
if (Reason == ORDER_REASON_TP)
Print("Position #" + (string)Position + " - in the process of execution TP.");
elseif (Reason == ORDER_REASON_SL)
Print("Position #" + (string)Position + " - in the process of execution SL.");
elseif (Reason == ORDER_REASON_SO)
Print("Position #" + (string)Position + " - in the process of execution StopOut.");
}
}
Результат
2017.09.1409:35:11.565 Position #1060283- triggered TP.
2017.09.1409:35:11.575#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.575 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.595#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.595 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.607#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.607 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.617#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.617 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.637#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.637 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.657#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.657 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.667#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.667 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.680#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.680 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.700#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.700 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.710#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.710 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.730#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.730 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.757#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.757 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.760#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.760 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.780#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.780 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.790#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.790 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.810#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.810 Position #1060283- in the process of execution TP.
2017.09.1409:35:11.820#10602842017.09.1409:36:14 sell 1.00 EURUSD 1.188380.000000.000001.188380.000.000.00 [tp 1.18838] 02017.09.1409:35:11.820 Position #1060283- in the process of execution TP.
Видно, что больше четверти секунды TP-ордер висел среди открытых. Любые попытки его модификации/удаления вызывали бы ошибки.
Учитывайте данную особенность MT5 (не только при работе с MT4Orders).
На форуме еще до появления в MQL5 Reason-флагов был выложен триггер SL/TP. Его логика четко показывала, что при акцептировании SL/TP/SO уровней открытой позиции торговым сервером порождается соответствующий маркет-ордер, который находится в MT5-таблице открытых ордеров до тех пор, пока не исполнится.
Поэтому в MT5 даже на чистом MQL5 модификация/удаление таких ордеров невозможна и торговая логика в MT5 требует проверки, является ли открытый ордер фактически замороженным или нет.
Ниже показано условие идентификации таких ордеров при написании торговой логики на MT4Orders и пример его срабатывания
Видно, что больше четверти секунды TP-ордер висел среди открытых. Любые попытки его модификации/удаления вызывали бы ошибки.
Учитывайте данную особенность MT5 (не только при работе с MT4Orders).
Проверка данного условия теперь встроена в библиотеку, работать можно, как и в MT4
// Список изменений:// 14.09.2017:// Fix: Теперь библиотека не видит текущие MT5-ордера, которые не имеют состояние ORDER_STATE_PLACED.// Чтобы библиотека видела все открытые MT5-ордера нужно ДО библиотеки прописать строку//// #define MT4ORDERS_SELECTFILTER_OFF // Обязываем MT4Orders.mqh видеть все текущие MT5-ордера
Maxim Dmitrievsky: Этож надо было столько понаворотить с этими позициями\ордерами в мт5, ни в одной другой платформе не встречал такого многообразия )
Еще большУю роль играет ORDER_STATE-параметр. Для SL/TP-ордеров он ORDER_STATE_STARTED. Но игнорить все ORDER_STATE_STARTED ни в коем случае нельзя (долго объяснять). Поэтому на ORDER_STATE рассчитывать неправильно, а нужен именно ORDER_REASON.
С ORDER_STATE другая история. Допустим, позиция открылась частично от отложенного ордера, а оставшаяся часть ордера еще висит. Тогда есть сделка в Истории, но там еще нет самого Ордера. Если же ордер потом зафиллится полностью, то чтобы понять, что первая порожденная им сделка была открыта частично, нельзя смотреть на ORDER_STATE ордера, от которого она произошла.
В общем, там столько ситуаций с этим STATE на самом деле... Надо вводить человеческие OrderOpenState() и OrderCloseSate(), но это голову сломать (да и единицы использовать будут). И, конечно, это еще простая головоломка. Там их много и позаковырестей, а о некоторых даже нет подозрений. В общем, хорошо, что удалось частично распутать до рабочего состояния и человеческого вида почти без потерь в производительности. Больше половины потребностей, думаю, библиотека удовлетворяет.
Еще большУю роль играет ORDER_STATE-параметр. Для SL/TP-ордеров он ORDER_STATE_STARTED. Но игнорить все ORDER_STATE_STARTED ни в коем случае нельзя (долго объяснять). Поэтому на ORDER_STATE рассчитывать неправильно, а нужен именно ORDER_REASON.
С ORDER_STATE другая история. Допустим, позиция открылась частично от отложенного ордера, а оставшаяся часть ордера еще висит. Тогда есть сделка в Истории, но там еще нет самого Ордера. Если же ордер потом зафиллится полностью, то чтобы понять, что первая порожденная им сделка была открыта частично, нельзя смотреть на ORDER_STATE ордера, от которого она произошла.
В общем, там столько ситуаций с этим STATE на самом деле... Надо вводить человеческие OrderOpenState() и OrderCloseSate(), но это голову сломать (да и единицы использовать будут). И, конечно, это еще простая головоломка. Там их много и позаковырестей, а о некоторых даже нет подозрений. В общем, хорошо, что удалось частично распутать до рабочего состояния и человеческого вида почти без потерь в производительности. Больше половины потребностей, думаю, библиотека удовлетворяет.
Использую в ботах, ни в тестере ни на реале ни одной ошибки пока не возникало вроде как, на Фортс в окрытии и на форексе. Была проблема когда дц вдруг начал медленно приказы исполнять (воткнул плагин против арбитража), уже не помню, по моему не успевала либа посчитать есиь ли позиция уже в рынке или нет, (проблема с синхронизацией истории, насколько помню) и подряд наштамповал много ордеров, но потом вы сделали обновление и стало как часы. Так что больше половины как минимум :)
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql4, тонкости и приёмы работы
fxsaber, 2017.09.11 20:29
Ниже будет затронута тема, которая касается не только MT4, но и MT5 с другими платформами. Но для удобного восприятия логика будет написана на MQL4, поэтому в этой ветке.
Дискуссия, напрямую касающаяся библиотеки.
На форуме еще до появления в MQL5 Reason-флагов был выложен триггер SL/TP. Его логика четко показывала, что при акцептировании SL/TP/SO уровней открытой позиции торговым сервером порождается соответствующий маркет-ордер, который находится в MT5-таблице открытых ордеров до тех пор, пока не исполнится.
Поэтому в MT5 даже на чистом MQL5 модификация/удаление таких ордеров невозможна и торговая логика в MT5 требует проверки, является ли открытый ордер фактически замороженным или нет.
Ниже показано условие идентификации таких ордеров при написании торговой логики на MT4Orders и пример его срабатывания
Результат
Видно, что больше четверти секунды TP-ордер висел среди открытых. Любые попытки его модификации/удаления вызывали бы ошибки.
Учитывайте данную особенность MT5 (не только при работе с MT4Orders).
На форуме еще до появления в MQL5 Reason-флагов был выложен триггер SL/TP. Его логика четко показывала, что при акцептировании SL/TP/SO уровней открытой позиции торговым сервером порождается соответствующий маркет-ордер, который находится в MT5-таблице открытых ордеров до тех пор, пока не исполнится.
Поэтому в MT5 даже на чистом MQL5 модификация/удаление таких ордеров невозможна и торговая логика в MT5 требует проверки, является ли открытый ордер фактически замороженным или нет.
Ниже показано условие идентификации таких ордеров при написании торговой логики на MT4Orders и пример его срабатывания
Видно, что больше четверти секунды TP-ордер висел среди открытых. Любые попытки его модификации/удаления вызывали бы ошибки.
Учитывайте данную особенность MT5 (не только при работе с MT4Orders).
Проверка данного условия теперь встроена в библиотеку, работать можно, как и в MT4
Этож надо было столько понаворотить с этими позициями\ордерами в мт5, ни в одной другой платформе не встречал такого многообразия )
Еще большУю роль играет ORDER_STATE-параметр. Для SL/TP-ордеров он ORDER_STATE_STARTED. Но игнорить все ORDER_STATE_STARTED ни в коем случае нельзя (долго объяснять). Поэтому на ORDER_STATE рассчитывать неправильно, а нужен именно ORDER_REASON.
С ORDER_STATE другая история. Допустим, позиция открылась частично от отложенного ордера, а оставшаяся часть ордера еще висит. Тогда есть сделка в Истории, но там еще нет самого Ордера. Если же ордер потом зафиллится полностью, то чтобы понять, что первая порожденная им сделка была открыта частично, нельзя смотреть на ORDER_STATE ордера, от которого она произошла.
В общем, там столько ситуаций с этим STATE на самом деле... Надо вводить человеческие OrderOpenState() и OrderCloseSate(), но это голову сломать (да и единицы использовать будут). И, конечно, это еще простая головоломка. Там их много и позаковырестей, а о некоторых даже нет подозрений. В общем, хорошо, что удалось частично распутать до рабочего состояния и человеческого вида почти без потерь в производительности. Больше половины потребностей, думаю, библиотека удовлетворяет.
Еще большУю роль играет ORDER_STATE-параметр. Для SL/TP-ордеров он ORDER_STATE_STARTED. Но игнорить все ORDER_STATE_STARTED ни в коем случае нельзя (долго объяснять). Поэтому на ORDER_STATE рассчитывать неправильно, а нужен именно ORDER_REASON.
С ORDER_STATE другая история. Допустим, позиция открылась частично от отложенного ордера, а оставшаяся часть ордера еще висит. Тогда есть сделка в Истории, но там еще нет самого Ордера. Если же ордер потом зафиллится полностью, то чтобы понять, что первая порожденная им сделка была открыта частично, нельзя смотреть на ORDER_STATE ордера, от которого она произошла.
В общем, там столько ситуаций с этим STATE на самом деле... Надо вводить человеческие OrderOpenState() и OrderCloseSate(), но это голову сломать (да и единицы использовать будут). И, конечно, это еще простая головоломка. Там их много и позаковырестей, а о некоторых даже нет подозрений. В общем, хорошо, что удалось частично распутать до рабочего состояния и человеческого вида почти без потерь в производительности. Больше половины потребностей, думаю, библиотека удовлетворяет.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники: Quantum 103
fxsaber, 2017.09.26 09:55
Кроссплатформенный вариант советникаРезультат бэктеста по реальным тикам на MT5
Прикрепил MT4-стиль отчета MT5-бэктеста, потому как стандартный отчет читается с трудом - см. оба в прицепе.
Хорошо видно величины влияния на результат MT5-бэктеста данного советника проскальзываний и комиссии.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники: Квант 103
fxsaber, 2017.09.26 09:55
Кроссплатформенная версия советникаРезультат бэктеста на реальных тиках на МТ5
Прикрепил отчет MT4-стиля MT5-backtest, так как стандартный отчет читается с трудом - смотрите оба в аттаче.
Вы можете наглядно увидеть влияние на результат MT5-бэктеста проскальзывания и комиссии этого советника.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники: Display orders
fxsaber, 2017.10.09 13:22
Кроссплатформенный вариантФорум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники: Xarax
fxsaber, 2017.10.11 13:44
Кроссплатформенный вариант