Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.
Подскажите пож. примерчик кода. Если простой способ реализации.
Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.
Подскажите пож. примерчик кода. Если простой способ реализации.
Вам нужен советник который реализует визуальный интерфейс (панель с кнопками) который позволяет открывать и закрывать позиции в тестере стратегий. Запускать этот советник в тестере надо с включенной визуализацией.
Можно и уже давно имеется. Ищите тренажеры и тому подобное.
Технология проста: добавить на график какой-либо графический объект (удобнее всего кнопку) и проверять его состояние на каждом тике в эксперте. Если объект изменил свое состояние, то выполнить действие (удалить, изменить, открыть ордер).
Вот простой пример:
#property strict #define ORDER_LINE_NAME "ORDER_LINE" bool g_bIsClose = false; int g_nTicket = -1; int OnInit() { g_bIsClose = false; g_nTicket = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 0, 0.0, 0.0); if (g_nTicket > 0 && OrderSelect(g_nTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0) ShowHLine(ORDER_LINE_NAME, OrderOpenPrice(), clrBlue, "Order #" + IntegerToString(g_nTicket)); return(INIT_SUCCEEDED); } void OnTick() { if (ObjectFind(0, ORDER_LINE_NAME) >= 0) return; if (g_nTicket > 0 && OrderSelect(g_nTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0) if (OrderClose(g_nTicket, OrderLots(), OrderClosePrice(), 0)) g_nTicket = -1; } void ShowHLine(const string sName, const double fPrice, const color clr, const string sTooltip, const int nWidth = 1, const ENUM_LINE_STYLE eStyle = STYLE_SOLID) { if (ObjectFind(0, sName) < 0) { ObjectCreate(0, sName, OBJ_HLINE, 0, 0, fPrice); ObjectSetInteger(0, sName, OBJPROP_COLOR, clr); ObjectSetInteger(0, sName, OBJPROP_STYLE, eStyle); ObjectSetInteger(0, sName, OBJPROP_WIDTH, nWidth); ObjectSetString(0, sName, OBJPROP_TOOLTIP, sTooltip); ObjectSetInteger(0, sName, OBJPROP_BACK, true); ObjectSetInteger(0, sName, OBJPROP_HIDDEN, true); return; } ObjectMove(0, sName, 0, 1, fPrice); }
Эксперт открывает ордер Buy и ему в соответствие ставится горизонтальная линия. Если линию удалить, то ордер будет закрыт. Такой способ управления ордерами реализован в AutoGraf.
Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.
Подскажите пож. примерчик кода. Если простой способ реализации.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2018.12.05 19:43
// Демонстрация способа ручной отправки торговых приказов в Визуализатор. #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006 #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID) #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) bool IsModify() { static long PrevTime = 0; const long NewTime = FileGetInteger(__FILE__, FILE_MODIFY_DATE); const bool Res = (PrevTime != NewTime); if (Res) PrevTime = NewTime; return(Res); } bool CreateFile() { uchar Bytes[]; return(FileSave(__FILE__, Bytes) && IsModify()); } string GetCommand() { uchar Bytes[]; FileLoad(__FILE__, Bytes); return(CharArrayToString(Bytes)); } bool OrdersScan( const int Type ) { for (int i = ::OrdersTotal() - 1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS) && (OrderType() == Type)) return(true); return(false); } bool SendCommand( const string Command, const double Lot = 1, const int Offset = 100 ) { bool Res = false; if (Command == "open buy") Res = (OrderSend(_Symbol, OP_BUY, Lot, Ask, 0, 0, 0) > 0); else if (Command == "open sell") Res = (OrderSend(_Symbol, OP_SELL, Lot, Bid, 0, 0, 0) > 0); else if (Command == "open buylimit") Res = (OrderSend(_Symbol, OP_BUYLIMIT, Lot, Ask - Offset * _Point, 0, 0, 0) > 0); else if (Command == "open selllimit") Res = (OrderSend(_Symbol, OP_SELLLIMIT, Lot, Bid + Offset * _Point, 0, 0, 0) > 0); else if (Command == "close buy") Res = OrdersScan(OP_BUY) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); else if (Command == "close sell") Res = OrdersScan(OP_SELL) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); else if (Command == "close buylimit") Res = OrdersScan(OP_BUYLIMIT) && OrderDelete(OrderTicket()); else if (Command == "close selllimit") Res = OrdersScan(OP_SELLLIMIT) && OrderDelete(OrderTicket()); return(Res); } bool TesterManual() { static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE) && CreateFile(); return(IsVisual && IsModify() && SendCommand(GetCommand())); } void OnTick() { TesterManual(); }
Можно и уже давно имеется. Ищите тренажеры и тому подобное.
Технология проста: добавить на график какой-либо графический объект (удобнее всего кнопку) и проверять его состояние на каждом тике в эксперте. Если объект изменил свое состояние, то выполнить действие (удалить, изменить, открыть ордер).
Вот простой пример:
Эксперт открывает ордер Buy и ему в соответствие ставится горизонтальная линия. Если линию удалить, то ордер будет закрыт. Такой способ управления ордерами реализован в AutoGraf.
С линиями красивый вариант.
Вот тут https://www.mql5.com/ru/articles/1425 решение
тоже красивое, думаю лучше уже в MT4 не придумаешь. Смысл в использовании подвального индикатора, где должны отображаться открытые
ордера. Ну и соответственно когда удаляем из подвала строку с тикетом ордера, в советнике удаляется сам ордер.
Но то ли код устарел, то ли выложен с ошибками - приведенные пример не работает даже если исправить сам подвальный индикатор vTerminal
- www.mql5.com
С линиями красивый вариант.
Вот тут https://www.mql5.com/ru/articles/1425 решение тоже красивое,
думаю лучше уже в MT4 не придумаешь. Смысл в использовании подвального индикатора, где должны отображаться открытые ордера. Ну и
соответственно когда удаляем из подвала строку с тикетом ордера, в советнике удаляется сам ордер.
Но то ли код устарел, то ли выложен с ошибками - приведенные пример не работает даже если исправить сам подвальный индикатор vTerminal
Древнее и не самое удобное решение. Есть лучше, нужно поискать.
Древнее и не самое удобное решение. Есть лучше, нужно поискать.
Самокритично, гуд ))
Древнее и не самое удобное решение. Есть лучше, нужно поискать.
Вообще странно что тема закрытия ордеров в тестере редко поднимается.
На данный момент реализовал механизм по
принципу предложенному
Ihor
Herasko с линиями. Причем линии сделал невидимыми.
Но есть существенный недостаток в алгоритме. Т.к. кроме
удаления самого ордера после удаления линии руками, приходиться проверять и удалять сами линии в случае закрытия ордера советником.
Т.е. в идеале на каждом тике надо проверять связку как Линия -> Ордер. так и Ордер -> Линия, что заметно замедляет работу советника.
Если у котото будут мысли по этому поводу будет интересно выслушать.
- www.mql5.com
Вообще странно что тема закрытия ордеров в тестере редко поднимается.
На данный момент реализовал механизм по
принципу предложенному
Ihor Herasko с линиями. Причем линии сделал
невидимыми.
Но есть существенный недостаток в алгоритме. Т.к. кроме удаления самого ордера после удаления линии руками, приходиться проверять
и удалять сами линии в случае закрытия ордера советником.
Т.е. в идеале на каждом тике надо проверять связку как Линия -> Ордер. так и Ордер -> Линия, что заметно замедляет работу советника.
Если у котото будут мысли по этому поводу будет интересно выслушать.
Блин, который раз слышу такое очевидное заблуждение что что-то надо делать на каждом тике, зачем?! :)
Удаление линии - событие OnChartEvent, в нем удаление ордера.
Удаление ордера - если МТ5 OnTrade или если нужно OnTradeTransaction. В МТ4 советник при удалении пусть выставляет флаг, который всего лишь и проверять на тике тогда уж.
З.Ы. Когда искал что-то интересующее в кодо-базе столкнулся с тем, что по ощущениям минимум 80% там лежит программ, выполняющих 80% бесполезных действий, таких как пересчёт всей истории индикатора на каждом тике) возможно ошибаюсь и мне просто не повезло.
Самокритично, гуд ))
За 13 лет много воды утекло... А на то время это был Ламборджини )
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.
Подскажите пож. примерчик кода. Если простой способ реализации.