Библиотеки: MT4Orders - страница 13

 
fxsaber:

Обновление

// Список изменений:
// 14.06.2017:
//   Add: Включена изначально заложенная реализация определения SL/TP закрытых позиций (закрытых через OrderClose).

Пример, как это работает

Forum on trading, automated trading systems and testing trading strategies

MT5 versus MT4 Terminal Screens - Disappointed with changes in MT 5

fxsaber, 2017.07.07 08:46

First run this script

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define SLIPPAGE 100
#define OFFSET (SLIPPAGE * _Point)

void OnStart()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, SLIPPAGE, 0, 0), SELECT_BY_TICKET))
  {
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - OFFSET, OrderOpenPrice() + OFFSET, 0);
    
    if (OrderSelect(OrderTicket(), SELECT_BY_TICKET))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), SLIPPAGE);
  }
}

Result:

'6145767': instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': accepted instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': deal #140159795 buy 1.00 EURUSD at 1.14156 done (based on order #156755661)
'6145767': order #156755661 buy 1.00 / 1.00 EURUSD at 1.14156 done in 252.283 ms
'6145767': modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': accepted modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': modify #156755661 buy 1.00 EURUSD -> sl: 1.14056, tp: 1.14256 done in 109.586 ms
'6145767': instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': accepted instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': deal #140159796 sell 1.00 EURUSD at 1.14147 done (based on order #156755662)
'6145767': order #156755662 sell 1.00 / 1.00 EURUSD at 1.14147 done in 219.817 ms


Then run this

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    OrderPrint();
}

Result

#140159796 2017.07.07 09:38:31 buy 1.00 EURUSD 1.14156 1.14056 1.14256 2017.07.07 09:38:32 1.14147 0.00 0.00 -7.88 0


In this way it is possible to learn the SL/TP of closed positions.

 

MT4 содержит меньше информации, чем MT5. Но ничто не мешает одновременно использовать MT4/5 торговые API

// Скрипт показывает Reason-поле всех закрытых позиций
#include <MT4Orders.mqh>

void OnStart()
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OrderPrint();
      
      Print(EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(OrderTicket(), DEAL_REASON)));
    }      
}


Результат

#141705115 2017.07.18 15:02:37 sell 0.01 EURUSD 1.15508 0.00000 0.00000 2017.07.19 13:04:05 1.15309 0.00 -0.01 1.99 0
DEAL_REASON_CLIENT

#140517682 2017.07.11 12:06:48 buy 0.01 EURUSD 1.13941 1.13926 0.00000 2017.07.11 12:07:10 1.13926 0.00 0.00 -0.15 [sl 1.13926] 0 DEAL_REASON_SL

#137746488 2017.06.20 01:22:26 sell 2.00 EURUSD 1.11474 0.00000 0.00000 2017.06.20 01:22:41 1.11484 0.00 0.00 -20.00 0 DEAL_REASON_EXPERT
 

Когда OrderSend был не синхронизирован с торговым окружением терминала, в MT4Orders была встроена автоматическая синхронизация.

Через некоторое время разработчики встроили синхронизацию и в библиотеке старый код синхронизации был оставлен с небольшим исключением - он стал не только синхронизировать, но и  проверять, правильно ли работает синхронизация OrderSend от разработчиков. В случае ошибки, должен выскакивать алерт

    if (MT4ORDERS::OrderSendBug)
    {
      Alert("BUG!!!!!!");


Появились сообщения, что этот Alert в редких случаях (похоже, когда ЦП загружен) срабатывает, сигнализируя о том, что OrderSend разработчиков бажит в вопросах синхронизации с торговым окружением. Как сообщить об этом разработчиком в СД - не знаю, т.к. воспроизвести не могу. Но факт остается фактом.


Поэтому есть два варианта.

  1. Оставить, как есть - алерт будет рапортовать о баге разработчиков.
  2. Отказаться от Алерта.
В обоих случаях библиотека принудительно синхронизирует OrderSend за мин. время.
 
// Список изменений:
// 03.08.2016:
//   Релиз - писался и проверялся только на оффлайн-тестере.
// ....
// 03.08.2017:
//   Add: Добавлена OrderCloseBy.
//   Add: Ускорена работа OrderSelect в MODE_TRADES-режиме. Теперь есть возможность получать данные выбранного ордера через
//        соответствующие MT4-Order-функции, даже если MT5-позиция/ордер(не в истории) выбраны не через MT4Orders.
//        Например, через MT5-PositionSelect*-функции или MT5-OrderSelect.
//   Add: Добавлены OrderOpenPriceRequest() и OrderClosePriceRequest() - возращают цену торгового запроса при открытии/закрытии позиции.
//        С помощью данных функций возможно вычислять соответствующие проскальзывания ордеров.

Библиотеке год...

 
fxsaber:

Библиотеке год...

Мои поздравления! Замечательная обертка.

 
fxsaber:

Библиотеке год...


Поздравляю!

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

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

 

Спасибо за поздравления, благодарен всем за замечания! Они всегда учитываются.

Aleksey Vyazmikin:

советник стал жутко тормозить - забирает все ресурсы ядра, но компиляция прошла успешно.

Хотелось бы увидеть код. Можно в ЛС.

 
fxsaber:

Спасибо за поздравления, благодарен всем за замечания! Они всегда учитываются.

Хотелось бы увидеть код. Можно в ЛС.


Выслал код в ЛС.

 
Aleksey Vyazmikin:

Выслал код в ЛС.

К сожалению, изначально библиотека совершенно не отвечала за все переводы MT4->MT5, где используются не только торговые функции MQL4.

В Вашем случае медленная работа советника вызвана не данной библиотекой, а частной реализацией перевода MT4->MT5, затрагивающей работу с таймсериями, индикаторами и т.д.

 
fxsaber:

К сожалению, изначально библиотека совершенно не отвечала за все переводы MT4->MT5, где используются не только торговые функции MQL4.


А сейчас отвечает?

fxsaber:

В Вашем случае медленная работа советника вызвана не данной библиотекой, а частной реализацией перевода MT4->MT5, затрагивающей работу с таймсериями, индикаторами и т.д.

Частной - это моей или другой библиотеки?  

Всё делал согласно известной всем статье, да и особых там индикаторов то нет...

Сомневаюсь, что этот код может приводить к сверх загрузке ядра:

double iMAMQL4(string symbol,
               int tf,
               int period,
               int ma_shift,
               int method,
               int price,
               int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_MA_METHOD ma_method=MethodMigrate(method);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMA(symbol,timeframe,period,ma_shift,
                  ma_method,applied_price);
   if(handle<0)
     {
      Print("Объект iMA не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,shift));
  }

Или в нём причина?