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

 
Alexey Volchanskiy:

Во, а то fxsaber расстраивается, что я один эту ошибку заметил, значит, никому либа не нужна )) Просто народ у нас ну очень наблюдательный. 

Анекдот из жизни - вел вебинар, раз 10 повторил, что запись будет. В конце говорю еще раз, запись будет завтра, если есть вопросы - задавайте. А теперь угадайте первый вопрос ))) 

А почитай А. Галича. "Как я выступал на митинге в защиту мира". (Надеюсь правильно помню название).
 
// Список изменений:
// 03.08.2016:
//   Релиз - писался и проверялся только на оффлайн-тестере.
// 29.09.2016:
//   Add: возможность работы на бирже (SYMBOL_TRADE_EXECUTION_EXCHANGE). Учитывайте, что биржа - Netto(не Hedge)-mode.
//   Add: Требование  "если есть #include <Trade/Trade.mqh>, вставить эту строчку ПОСЛЕ"
//        заменено на "если есть #include <Expert/Expert.mqh>, вставить эту строчку ПОСЛЕ".
//   Fix: OrderSend маркет-ордеров возвращает тикет позиции, а не сделки.
 
Такое поведение не реализовано в библиотеке

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как правильно работать в MT5 с OrderSend

fxsaber, 2016.10.13 07:10

Самостоятельно пишется очень простая перегрузка OrderSend: пока OnTrade не возвратит ответ, все последующие OrderSend возвращают false. Как ответ получен - принудительный false отменяется.

ЗЫ Если хочется совсем полноценно (не для СБ), то в OnTrade по приходу соответствующей синхронизации вызывать самостоятельно OnTick и OnTimer.

Учитывайте это MT5-обстоятельство при работе с привычными MT4-Order-функциями: OrderSend, OrderModify, OrderClose, OrderDelete.

Добавить в MT5 гарантированную (как в MT4) синхронизацию истории после торговых приказов возможно самостоятельно по алгоритму в цитате. 

 
Идея интересная. Однако, конвертированный МТ4 эксперт на МТ5 работает медленно
 
Aliaksandr Kryvanos:
Идея интересная. Однако, конвертированный МТ4 эксперт на МТ5 работает медленно

Медленно работает только реализация OrderSelect(index, SELECT_BY_POS, MODE_HISTORY). Можно было бы ускорить, но тогда не было бы определенной сортировки истории, которая есть в MT4 и которую некоторые используют. Если бы не использовали, можно было бы сделать работу этого режима не медленней, чем в MT4. Все остальное работает точно не медленней. Поэтому, если не используете вышеназванный режим OrderSelect, ищите тормоза вне MT4Orders.

Если же касаться таймсерий и других вещей, то в описании подчеркнута эта тема - не затрагивалась. Скорее всего, там у Вас тормоза.

 
В MT5 build 1455 присутствует баг

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.10.20 08:24

СБ на всех торговых серверах
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING"                      |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
  {
   return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
  }

ВСЕГДА в тестере возвращает ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN.

Поэтому если в OrderModify filling задать через COrderInfo::TypeFilling(), то на том же RoboForexEU-MetaTrader 5 будет логичная ошибка [Unsupported filling mode]. Однако, на MetaQuotes-Demo этой ошибки не возникает - криво настроен сервер разработчиков?


это может вызвать ошибку [Unsupported filling mode] на некоторых торговых серверах при попытке модификации через OrderModify отложенных ордеров.

Если столкнулись с такой проблемой, то следующим образом этот баг можно обойти

  1. Найти в MT4Orders.mqh строчку
          Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);

  2. Заменить ее на эти строчки
          Request.symbol = ::OrderGetString(ORDER_SYMBOL);
          
          // https://www.mql5.com/ru/forum/1111/page1759#comment_2906850
          if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)      
            Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);

 
Стандартная библиотека MT5 VS кроссплатформенный MT4-ОЯС

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.10.20 15:54

Изучил Стандартную Библиотеку и написал проверочный советник
#define SLTP (10 * _Point)

#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>

// Через MT5-Стандартную Библиотеку - only MT5
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT5Order( const double Price )
{
  CTrade Trade;
  
  if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
    Trade.SetTypeFilling(ORDER_FILLING_RETURN);

  Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);

  const ulong Ticket = Trade.ResultOrder();
  
  if (Ticket > 0)
  {
    COrderInfo Order;
    
    if (Order.Select(Ticket))
      Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
  }      
}

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

// Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT4Order( const double Price )
{
  const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
  
  if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
    
    MT5Order(Price); // Через MT5-Стандартную Библиотеку - only MT5
    MT4Order(Price); // Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
    
    FirstRun = false;
  }
}

можно сравнить код функций MT4Order и MT5Order.

 
Да, вы правы, медленная работа из-за OrdersHistoryTotal()
 
Aliaksandr Kryvanos:
Да, вы правы, медленная работа из-за OrdersHistoryTotal()

Возможно, стоит сделать ускоренный вариант этой функции. Будет работать без какого-либо промедления, но не на 100% соответствовать MT4.

Посмотрел код сейчас. Есть несколько способов ускорения. Например, в тестере можно наплевать на синхронизацию с MT5-историей, т.к. в тестере все прямолинейно.

Но, честно говоря, ни в тестере, ни на реале не приходилось сталкиваться с задачами, когда ТС требовалось анализировать историю.

Поэтому подобное ускорение, сомневаюсь, что буду делать. 

 
fxsaber:

Возможно, стоит сделать ускоренный вариант этой функции. Будет работать без какого-либо промедления, но не на 100% соответствовать MT4.

Посмотрел код сейчас. Есть несколько способов ускорения. Например, в тестере можно наплевать на синхронизацию с MT5-историей, т.к. в тестере все прямолинейно.

Но, честно говоря, ни в тестере, ни на реале не приходилось сталкиваться с задачами, когда ТС требовалось анализировать историю.

Поэтому подобное ускорение, сомневаюсь, что буду делать. 

Я использую анализ истории, мой ММ подразумевает торговлю ситуации, на протяжении которой происходит закрытие и открытие позиций, а риск учитывается с использованием финансового результата с начала возникновения ситуации.

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