Хороший пример работы с лимитными ордерами в советнике

 

Добрый день!

Подскажите хороший пример советника использующего в работе лимитные ордера.

Интересует следующее:

1. Выставление лимитного ордера близко к рынку 

2. Модификация ордера и выставление в рынок

3. Удаление и экспирация ордера 

4. Обработка ошибок 

Буду очень признателен, если пример советника будет ориентриован на HFT или хотя бы большое количество сделок внутри дня.

Спасибо! 

 
hold_fast:

Добрый день!

Подскажите хороший пример советника использующего в работе лимитные ордера.

Интересует следующее:

1. Выставление лимитного ордера близко к рынку 

2. Модификация ордера и выставление в рынок

3. Удаление и экспирация ордера 

4. Обработка ошибок 

Буду очень признателен, если пример советника будет ориентриован на HFT или хотя бы большое количество сделок внутри дня.

Спасибо! 

1)

Близкое выставление BuyLimit и SellLimit (но это очень упрощённо, без проверок)

//+------------------------------------------------------------------+
//|                                        Stop Loss Take Profit.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input ushort   InpIndent=2;         // Indent (in pips)
//---
double         ExtIndent;
bool           FirstStart=true;              // true - first start
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }

   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;

   ExtIndent=InpIndent  *digits_adjust*m_symbol.Point();

   FirstStart=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(FirstStart)
     {
      if(!RefreshRates())
         return;

      m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.Ask()-ExtIndent);

      m_trade.SellLimit(m_symbol.LotsMin(),m_symbol.Bid()+ExtIndent);

      FirstStart=false;
     }
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+


И результат:

BuyLimit and SellLimit

Файлы:
 
Vladimir Karputov:

1)

Близкое выставление BuyLimit и SellLimit (но это очень упрощённо, без проверок)

//+------------------------------------------------------------------+
//|                                        Stop Loss Take Profit.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input ushort   InpIndent=2;         // Indent (in pips)
//---
double         ExtIndent;
bool           FirstStart=true;              // true - first start
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }

   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;

   ExtIndent=InpIndent  *digits_adjust*m_symbol.Point();

   FirstStart=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(FirstStart)
     {
      if(!RefreshRates())
         return;

      m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.Ask()-ExtIndent);

      m_trade.SellLimit(m_symbol.LotsMin(),m_symbol.Bid()+ExtIndent);

      FirstStart=false;
     }
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+


И результат:


Спасибо, Владимир. Но это слишком упрощенный случай, в реальности все сложнее выходит.
 
Ну так это пример. Как конструктор. Потом ещё добавить, потом ещё добавить...
 
Vladimir Karputov:
Ну так это пример. Как конструктор. Потом ещё добавить, потом ещё добавить...

толково, даже смешно [местами] -- но мне тоже хотелось бы посмотреть на хороший пример работы с отложками -- "ваше мнение очень ценно для нас" [слоган]

 
Andrey F. Zelinsky:

толково, даже смешно [местами] -- но мне тоже хотелось бы посмотреть на хороший пример работы с отложками -- "ваше мнение очень ценно для нас" [слоган]

Торгую только через отложки тучу времени. Никакой обработки не делаю. OrderSend вернул -1 (MT4 или MT5+MT4Orders) - не получилось и ладно, потому что на следующем шаге все равно полностью просматривается торговое окружение. И если отложки/позы нет, а должна быть, то идет синхронизация с тем состоянием, которое должно быть - отправляется соответствующий OrderSend.

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

Асинхронные варианты не пробовал, тут не видится сильно сложнее, но утверждать не возьмусь. 

 
fxsaber:

Асинхронные варианты не пробовал, тут не видится сильно сложнее, но утверждать не возьмусь. 

Сам хочу попробовать для построения сеток, для отложенников должно быть самое то по скорости
 
Vladimir Karputov:

@Vladimir Karputov Карпутов, всё хочу вас спросить. Ваших примеров на форуме становится всё больше и больше. Вы переводите кодабазу mql4 на mql5 как это делает Годзилла. Но кода Годзиллы читаемые и на уровне. Их при всей критике полезности можно смело использовать новичками для образца. В вашем случае трудно сказать насколько ваши кода востребованы, т.к. как по мне, обоснованность использования СБ сомнительна, особенно новичками. И как по мне, такая популяризация как делаете вы -- только вредит, т.к. сводить в ноль понимание того что вы поясняете и зачем. Но это моё мнение.

Тем не менее в каждом своём коде вы пишите:

//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;

   ExtIndent=InpIndent  *digits_adjust*m_symbol.Point();

Вы можете пояснить зачем?

В вашем примере:

input ushort   InpIndent=2;         // Indent (in pips)

-- целое

Может вообще отменить пятизнак, если в каждом коде его преимущества, с вашего "совета", не играют никакой роли. 

 
fxsaber:

потому что на следующем шаге все равно полностью просматривается торговое окружение.

+ -- просто и неубиваемо.