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

 
Maxim Dmitrievsky:
В общем я разобрался - сервера не всегда возвращают правильные значения, поэтому происходит мешанина и это никак не исправить, только вручную менять тип заполнения, да. Здесь уже на форуме были подобные проблемы у людей.

Спасибо за найденную ошибку! 

Для исправления в коде везде, где есть эти две строки

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;

добавить еще две, чтобы получилось так

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;
      else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
        Request.type_filling = ORDER_FILLING_IOC;
 
fxsaber:

Спасибо за найденную ошибку! 

Для исправления в коде везде, где есть эти две строки

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;

добавить еще две, чтобы получилось так

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;
      else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
        Request.type_filling = ORDER_FILLING_IOC;

Там проблема в другом, при маркет исполнении заполнение IOC :) а сервер возвращает REQUEST при запросе, т.е. на уровне сервера проблема и это никак не отследить, выносить только в настройки эксперта возможность поменять самостоятельно, если не работает

Хотя.. работает... спасибо, но исполнение пишется MARKET в логах, не EXCHANGE, похоже там вообще все поперепутано.. или у меня в голове )

 
fxsaber:
На реале какой смысл кэширования? Вы в MT4 кэшировали историю? Ускорение нужно там, где важна производительность - тестер.

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

Я больше не понимаю, почему было в принципе сказано, что для тестера можно будет сделать кеширование, а для реала - нельзя. Как так нельзя? Алгоритм один и тот же должен быть, и работать как в тестере, так и в реале.

 
Stanislav Korotky:

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

Я больше не понимаю, почему было в принципе сказано, что для тестера можно будет сделать кеширование, а для реала - нельзя. Как так нельзя? Алгоритм один и тот же должен быть, и работать как в тестере, так и в реале.

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

 

Для тестера кэш делается очень просто, только руки еще не дошли. Однако, сделано следующее (не опубликовано)

// 10.11.2016:
//   Add: Полная синхронизация OrderSend с торговым окружением (реал-тайм и история) - как в MT4.
//   Fix: Filling-флаги задаются верно.

Это значит, что OrderSend гарантирует за минимальное возможное время синхронизацию с торговым окружением.

Некоторые на форуме жаловались, что после MT5-OrderSend BUY не могут прочитать параметры открытой позиции - торговое окружение запаздывало на ~1 мс. Теперь же никаких проблем с этим и подобным не будет, если использовать данную библиотеку. Возможно, пока это единственная публичная библиотека, делающая такое.

Например, это теперь не актуально

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

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

fxsaber, 2016.11.10 10:00

 

Как узнать размер комиссии не открывая позицию по инструменту?

fxsaber, 2016.11.08 20:30

#include <MT4Orders.mqh>

void OnStart()
{
  const int Ticket = OrderSend(_SymbolOP_BUY1SymbolInfoDouble(_SymbolSYMBOL_ASK), 000);
  
  OrderClose(Ticket, 0.3SymbolInfoDouble(_SymbolSYMBOL_BID), 0clrNONE);

  Sleep(1000); // ждем обновления истории 
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    Alert(OrderCommission());
}

Наверное, такой пример показателен. 

Если не делать Sleep, то часто возникает ситуация, что история не успела обновиться после OrderClose и OrderCommission возвращает значение, будто OrderClose не делался.

Заметьте, что это скрипт и никаких Event-ов быть не может. Единственный выход - тупой Sleep.

Если переписать этот скрипт с помощью СБ, ничего не поменяется. 

Теперь никаких тупых слипов с неопределенным задержками. Тот же СБ этого делать не умеет.

Сдам на публикацию, когда историю для тестера ускорю.

 

После проверки модератором будет доступно обновление

// 13.11.2016:
//   Add: Полная синхронизация OrderSend, OrderModify, OrderClose, OrderDelete с торговым окружением (реал-тайм и история) - как в MT4.
//        Максимальное время синхронизации можно задать через MT4ORDERS::OrderSend_MaxPause в мкс. Среднее время синхронизации в MT5 ~1 мс.

//        По-умолчанию максимальное время синхронизации равно одной секунде. MT4ORDERS::OrderSend_MaxPause = 0 - отсутствие синхронизации.
//   Add: Поскольку параметр SlipPage (OrderSend, OrderClose) влияет на исполнение маркет-ордеров только в Instant-режиме,
//        то через него теперь при желании можно задавать тип исполнения по остатку - ENUM_ORDER_TYPE_FILLING:
//        ORDER_FILLING_FOK, ORDER_FILLING_IOC или ORDER_FILLING_RETURN.
//        В случае ошибочного задания или не поддержки символом заданного типа исполнения автоматически будет выбран рабочий режим.
//        Примеры:
//          OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_FOK, SL, TP) - отправить соответствующий ордер с типом исполнения ORDER_FILLING_FOK
//          OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_IOC, SL, TP) - отправить соответствующий ордер с типом исполнения ORDER_FILLING_IOC
//          OrderClose(Ticket, Lots, Price, ORDER_FILLING_RETURN) - отправить соответствующий маркет-ордер с типом исполнения ORDER_FILLING_RETURN
//   Add: OrdersHistoryTotal() и OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY) закешированы - работают максимально быстро.
//        В библиотеке не осталось медленных реализаций.

Осталось только два шага для полного завершения и безоговорочного превосходства над СБ.

// Что не реализовано:
//   CloseBy-моменты - пока было не до этого. Возможно, в будущем, когда понадобится.
//   Определение TP и SL закрытых позиций - на данный момент (build 1470) MQL5 этого делать не умеет.
//   Учет DEAL_ENTRY_INOUT и DEAL_ENTRY_OUT_BY сделок.

На данный момент MT4Orders позволяет делать все на Netting-счетах (биржа), за исключением чтения истории с DEAL_ENTRY_INOUT-сделками. И все на Hedge-счетах, за исключением closeBy-моментов.

Преимущества перед СБ

  • MQL4-синтаксис. Самое быстрое чтение и написание торговой логики. Быстрый перенос MT4 торгового и статистического кода.
  • Возможность частичного закрытия позиции.
  • Синхронизация с торговым окружением всех Order-функций.
  • Удобное задание ORDER_FILLING_* и гарантированная корректность задания Request.filling-поля в торговом приказе.
  • История торгов кешируется - быстрее работа.
Не исключается добавление асинхронных вариантов Order-функций (OrderSendAsync, OrderCloseAsync, OrderDeleteAsync и OrderModifyAsync) все в том же MQL4-синтаксисе.
 
fxsaber:

После проверки модератором будет доступно обновление

Вы молодец! Ждём обновления!

И, очень надеюсь на  реализацию CloseBy в ближайшем будущем!

 
fxsaber:

После проверки модератором будет доступно обновление

Доступно.

Преимущества перед СБ

  • Синхронизация с торговым окружением всех Order-функций.
Для понимания важности этого пункта привожу пример кода, выполнение которого на MT5 будет теперь полностью соответствовать MT4

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

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

fxsaber, 2016.11.15 14:14

Попробуйте написать следующую функцию в советнике

  1. i = 0.
  2. Открываем позицию на symbol[i].
  3. Если i++ >= 5 - выходим.
  4. Если новая позиция не имеет проскальзывания, то возвращаемся на п.2. Если же есть проскальзывание, выходим.
// MQL4&5-code

#property strict

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

void Func( const string &Symbols[] )
{
  const int Total = ArraySize(Symbols);
  
  for (int i = 0; i < Total; i++)
  {
    const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
    const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
    
    if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
        (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // если не получилось открыть или есть проскальзывание - выходим
      break;
  }
}

void OnStart() // OnTick
{
  const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
  
  Func(Symbols);
}

Написать в качестве примера даже такую простую торговую логику на MT5 с помощью СБ или чистого MQL5 крайне проблематично. То, что в MT4 всегда делается без проблем, на MT5 довольно не просто безошибочно реализовать. Данная библиотека позволяет это делать так же, как в MT4. Синтаксис библиотеки и ее возможности изучать не нужно - это MT4 по поведению и MQL4 по синтаксису.

 

Может быть полезно ознакомление с результатами портирования под пятерку (через СБ) MT4-советников здесь, чтобы самим оценить, в каком стиле реализация одной и той же торговой логики Вам ближе.

 
безусловно,плюс к карме! ))
 
В новом файле почему-то переносы строк одним символом CR (видимо с Мака), что отличается от прочих исходников.
 
Stanislav Korotky:
В новом файле почему-то переносы строк одним символом CR (видимо с Мака), что отличается от прочих исходников.

Я слабый юзер (и только винда), поэтому не могу сказать, как так получилось. Посмотрел, что в основном строки заканчиваются на два байта 0x0D. Есть и на 0x0D 0x0A. Есть и на один - 0x0D.

Все редакторы исходник показывают нормально, так что мешать не должно, вроде.