Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В общем я разобрался - сервера не всегда возвращают правильные значения, поэтому происходит мешанина и это никак не исправить, только вручную менять тип заполнения, да. Здесь уже на форуме были подобные проблемы у людей.
Спасибо за найденную ошибку!
Для исправления в коде везде, где есть эти две строки
Request.type_filling = ORDER_FILLING_RETURN;
добавить еще две, чтобы получилось так
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;
Спасибо за найденную ошибку!
Для исправления в коде везде, где есть эти две строки
Request.type_filling = ORDER_FILLING_RETURN;
добавить еще две, чтобы получилось так
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, похоже там вообще все поперепутано.. или у меня в голове )
На реале какой смысл кэширования? Вы в MT4 кэшировали историю? Ускорение нужно там, где важна производительность - тестер.
Производительность может быть нужна и в реале. То, что у нас нет таких экспертов, потенциальной необходимости не отменяет.
Я больше не понимаю, почему было в принципе сказано, что для тестера можно будет сделать кеширование, а для реала - нельзя. Как так нельзя? Алгоритм один и тот же должен быть, и работать как в тестере, так и в реале.
Производительность может быть нужна и в реале. То, что у нас нет таких экспертов, потенциальной необходимости не отменяет.
Я больше не понимаю, почему было в принципе сказано, что для тестера можно будет сделать кеширование, а для реала - нельзя. Как так нельзя? Алгоритм один и тот же должен быть, и работать как в тестере, так и в реале.
Потому что кэшированные данные в реале могут в определенный момент перестать соответствовать истории - брокер ручками подкорректировал. А вот в тестере гарантированно никто ручками шевелить не будет. Более того, на реале даже без брокерских коррекций возникают проблемы. Т.к. можно отправить два асинхронных запроса и получить ответ от первого - закэшировали историю, а затем получить ответ от второго, который в таблице истории влезет раньше, чем предыдущий - изменении истории. Поэтому кэш не годится для реала.
Для тестера кэш делается очень просто, только руки еще не дошли. Однако, сделано следующее (не опубликовано)
// Add: Полная синхронизация OrderSend с торговым окружением (реал-тайм и история) - как в MT4.
// Fix: Filling-флаги задаются верно.
Это значит, что OrderSend гарантирует за минимальное возможное время синхронизацию с торговым окружением.
Некоторые на форуме жаловались, что после MT5-OrderSend BUY не могут прочитать параметры открытой позиции - торговое окружение запаздывало на ~1 мс. Теперь же никаких проблем с этим и подобным не будет, если использовать данную библиотеку. Возможно, пока это единственная публичная библиотека, делающая такое.
Например, это теперь не актуально
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как правильно работать в MT5 с OrderSend
fxsaber, 2016.11.10 10:00
Как узнать размер комиссии не открывая позицию по инструменту?
fxsaber, 2016.11.08 20:30
void OnStart()
{
const int Ticket = OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0);
OrderClose(Ticket, 0.3, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0, clrNONE);
Sleep(1000); // ждем обновления истории
if (OrderSelect(Ticket, SELECT_BY_TICKET))
Alert(OrderCommission());
}
Наверное, такой пример показателен.
Если не делать Sleep, то часто возникает ситуация, что история не успела обновиться после OrderClose и OrderCommission возвращает значение, будто OrderClose не делался.
Заметьте, что это скрипт и никаких Event-ов быть не может. Единственный выход - тупой Sleep.
Если переписать этот скрипт с помощью СБ, ничего не поменяется.
Теперь никаких тупых слипов с неопределенным задержками. Тот же СБ этого делать не умеет.
Сдам на публикацию, когда историю для тестера ускорю.
После проверки модератором будет доступно обновление
// 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-моментов.
Преимущества перед СБ
После проверки модератором будет доступно обновление
Вы молодец! Ждём обновления!
И, очень надеюсь на реализацию CloseBy в ближайшем будущем!
После проверки модератором будет доступно обновление
Доступно.
Преимущества перед СБ
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как правильно работать в MT5 с OrderSend
fxsaber, 2016.11.15 14:14
Попробуйте написать следующую функцию в советнике
#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 (видимо с Мака), что отличается от прочих исходников.
Я слабый юзер (и только винда), поэтому не могу сказать, как так получилось. Посмотрел, что в основном строки заканчиваются на два байта 0x0D. Есть и на 0x0D 0x0A. Есть и на один - 0x0D.
Все редакторы исходник показывают нормально, так что мешать не должно, вроде.