Ручное закрытие ордеров в тестере

 

Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.

Подскажите пож. примерчик кода. Если простой способ реализации.

 
peterlogin:

Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.

Подскажите пож. примерчик кода. Если простой способ реализации.

Такого сделать нельзя
 
peterlogin:

Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.

Подскажите пож. примерчик кода. Если простой способ реализации.

Вам нужен советник который реализует визуальный интерфейс (панель с кнопками) который позволяет открывать и закрывать позиции в тестере стратегий. Запускать этот советник в тестере надо с включенной визуализацией.

 

Можно и уже давно имеется. Ищите тренажеры и тому подобное.

Технология проста: добавить на график какой-либо графический объект (удобнее всего кнопку) и проверять его состояние на каждом тике в эксперте. Если объект изменил свое состояние, то выполнить действие (удалить, изменить, открыть ордер).

Вот простой пример:

#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.

 
peterlogin:

Нужно реализовать возможность ручного закрытие ордеров в тестере стратегий.

Подскажите пож. примерчик кода. Если простой способ реализации.

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

Библиотеки: MT4Orders

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();
}


 
Ihor Herasko:

Можно и уже давно имеется. Ищите тренажеры и тому подобное.

Технология проста: добавить на график какой-либо графический объект (удобнее всего кнопку) и проверять его состояние на каждом тике в эксперте. Если объект изменил свое состояние, то выполнить действие (удалить, изменить, открыть ордер).

Вот простой пример:

Эксперт открывает ордер Buy и ему в соответствие ставится горизонтальная линия. Если линию удалить, то ордер будет закрыт. Такой способ управления ордерами реализован в AutoGraf.

С линиями красивый вариант.

Вот тут https://www.mql5.com/ru/articles/1425 решение тоже красивое, думаю лучше уже в MT4 не придумаешь. Смысл в использовании подвального индикатора, где должны отображаться открытые ордера. Ну и соответственно когда удаляем из подвала строку с тикетом ордера, в советнике удаляется сам ордер.
Но то ли код устарел, то ли выложен с ошибками - приведенные пример не работает даже если исправить сам подвальный индикатор vTerminal

Визуализация тестирования. Ручная торговля.
Визуализация тестирования. Ручная торговля.
  • www.mql5.com
В клиентском терминале MetaTrader 4 появилась функция визуализации тестирования. Она позволяет контролировать процесс тестирования экспертов. Но не каждую стратегию можно запрограммировать и не каждый трейдер может написать хорошего эксперта. В этой статье будет описано, как использовать визуализатор для тестирования "ручных", не оформленных в...
 
peterlogin:

С линиями красивый вариант.

Вот тут https://www.mql5.com/ru/articles/1425 решение тоже красивое, думаю лучше уже в MT4 не придумаешь. Смысл в использовании подвального индикатора, где должны отображаться открытые ордера. Ну и соответственно когда удаляем из подвала строку с тикетом ордера, в советнике удаляется сам ордер.
Но то ли код устарел, то ли выложен с ошибками - приведенные пример не работает даже если исправить сам подвальный индикатор vTerminal

Древнее и не самое удобное решение. Есть лучше, нужно поискать.

 
Andrey Khatimlianskii:

Древнее и не самое удобное решение. Есть лучше, нужно поискать.

Самокритично, гуд ))

 
Andrey Khatimlianskii:

Древнее и не самое удобное решение. Есть лучше, нужно поискать.

Вообще странно что тема закрытия ордеров в тестере редко поднимается.

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

Т.е. в идеале на каждом тике надо проверять связку как  Линия -> Ордер. так и Ордер -> Линия, что заметно замедляет работу советника.

Если у котото будут мысли по этому поводу будет интересно выслушать.

Ihor Herasko
Ihor Herasko
  • www.mql5.com
Обновлена утилита Template Switcher (https://www.mql5.com/ru/market/product/25620). Добавлен параметр "Суффикс имени шаблона". При помощи этого параметра можно создавать разные шаблоны для одного и того же символа. Ранее в пределах одного символа действовал только один шаблон. Добавил тему Сарказм ошибки 131 Сегодня один из советников...
 
peterlogin:

Вообще странно что тема закрытия ордеров в тестере редко поднимается.

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

Т.е. в идеале на каждом тике надо проверять связку как  Линия -> Ордер. так и Ордер -> Линия, что заметно замедляет работу советника.

Если у котото будут мысли по этому поводу будет интересно выслушать.

Блин, который раз слышу такое очевидное заблуждение что что-то надо делать на каждом тике, зачем?! :)

Удаление линии - событие OnChartEvent, в нем удаление ордера.

Удаление ордера - если МТ5 OnTrade или если нужно OnTradeTransaction. В МТ4 советник при удалении пусть выставляет флаг, который всего лишь и проверять на тике тогда уж.

З.Ы. Когда искал что-то интересующее в кодо-базе столкнулся с тем, что по ощущениям минимум 80% там лежит программ, выполняющих 80% бесполезных действий, таких как пересчёт всей истории индикатора на каждом тике) возможно ошибаюсь и мне просто не повезло.

 
Ihor Herasko:

Самокритично, гуд ))

За 13 лет много воды утекло... А на то время это был Ламборджини )