Правильный расчет дистанции отступа, для установки лимитных ордеров на рынке ФОРТС

 

Ребят, нужен совет по исполнению установки лимитников на фортс, есть код, при появлении позиции, робот выше и ниже цены ставит лимитные ордера с отступом

void PutNewLimit()
{  
   if(CheckMoney()==false)return; // Если нет денег, выходим.
    
   int    TotalSellLimit=0,  TotalBuyLimit  =0;
    
   double PriceBuy_Big  =0,  PriceSell_Big  =0,
          Price,             PriceBuy_Small=0,  PriceSell_Small=0;
//+------------------------------------------------------------------------------------++
   TotalSellLimit   = MyOrderCount(ORDER_TYPE_SELL_LIMIT);                                         // Считаем кол-во SELL_LIMIT
   TotalBuyLimit    = MyOrderCount(ORDER_TYPE_BUY_LIMIT);                                          // Считаем кол-во BUY_LIMIT   
   Price            = CurrentPositionLastDealPrice();                                              // Цена последней сделки текущей позиции

//++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
   PriceSell_Big = m_symbol.NormalizePrice(Price+StepBig*m_symbol.Point());                        // определяем отступ от цены открытой позиции Buy
   if(m_position.PositionType()==POSITION_TYPE_BUY && TotalSellLimit==0 ){                         // если позиция Buy и нет селл лимитки                                                                                
   m_ordersend.PendingOrderLimit(m_symbol.Name(),LotBig,ORDER_TYPE_SELL_LIMIT,PriceSell_Big,0,0,"- Big -");} // установка лимиток
//---------                                                                                           ниже по аналогии
   PriceBuy_Small  = m_symbol.NormalizePrice(Price-StepSmall*m_symbol.Point()); 
   if(m_position.PositionType()==POSITION_TYPE_BUY && TotalBuyLimit==0){  
   m_ordersend.PendingOrderLimit(m_symbol.Name(),LotSmall,ORDER_TYPE_BUY_LIMIT,PriceBuy_Small,0,0,"- Small -");} 
 }  
//++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Интересует собственно правильно ли у меня нормализована цена самого отступа для лимитников, стоит ли использовать встроенную библиотеку или же лучше нормализовать цену отдельно.

Спасибо.
 
Konstantin Seredkin:

Ребят, нужен совет по исполнению установки лимитников на фортс, есть код, при появлении позиции, робот выше и ниже цены ставит лимитные ордера с отступом

Интересует собственно правильно ли у меня нормализована цена самого отступа для лимитников, стоит ли использовать встроенную библиотеку или же лучше нормализовать цену отдельно.

Спасибо.

Проверка на максимальную/минимальную цену здесь

//+------------------------------------------------------------------+
//| Expert Check price range function                                |
//+------------------------------------------------------------------+
bool CheckPriceRange(const string a_symbol, const double price)
{
  double min_price = SymbolInfoDouble(a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN);
  double max_price = SymbolInfoDouble(a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX);
  if((price >= min_price) && (price <= max_price)) return(true);
  return(false);
}

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

Если же вы как-то высчитываете цену установки ордера, то нужно к известной цене (наример LAST_PRICE) просто прибавить (вычесть) шаг(несколько шагов) цены инструмента  


double  step_price = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);

double my_price = SymbolInfoDouble(Symbol(), SYMBOL_LAST) + 2 * step_price;
    if(CheckPriceRange(Symbol(), my_price) == true)
    {
      //устанавливаем ордер
    }
 

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

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

void DeleteAllOrders()
  {
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==MagicNumber)
            if(!m_trade.OrderDelete(m_order.Ticket()))
             {

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

 
Konstantin Seredkin:

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

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

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

Выбирать Вам, что использовать, но я никогда не использовал стандартную библиотеку.

 
prostotrader:

Проверка на максимальную/минимальную цену здесь

Проверка на максимальную/минимальную цену здесь

//+------------------------------------------------------------------+
//| Expert Check price range function                                |
//+------------------------------------------------------------------+
bool CheckPriceRange(const string a_symbol, const double price)
{
  double min_price = SymbolInfoDouble(a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN);
  double max_price = SymbolInfoDouble(a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX);
  if((price >= min_price) && (price <= max_price)) return(true);
  return(false);
}



пробую

#property copyright ""
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

  double min_price = SymbolInfoDouble(_Symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN);
  double max_price = SymbolInfoDouble(_Symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX);
  printf(" %f  %f",DoubleToString(min_price,8) , DoubleToString(max_price,8) );
  }

ответ
2020.06.22 13:07:45.158 yyy_MaxLimit (TATN,H4)   0.000000  0.000000
 
Yuriy Zaytsev:



пробую

Это вы на акциях пробуете (фондовый рынок), на акциях нету никаких лимитов

 
Sergey Chalyshev:

Это вы на акциях пробуете (фондовый рынок), на акциях нету никаких лимитов

Верно на акциях. Но вообще то выставить лимитник допусти по TATN на уровень 20.0 биржа  НЕ позволяет.

Cегодня удается выставить только на 530.4 на 530.3 уже нельзя

 
Yuriy Zaytsev:

Верно на акциях. Но вообще то выставить лимитник допусти по TATN на уровень 20.0 биржа  позволяет , сегодня удается выставить только на 530.4 на 530.3 уже нельзя

не позволяет?

кто вам не позволяет, почему нельзя, какие отговорки (ошибки) ?

 
Sergey Chalyshev:

не позволяет?

кто вам не позволяет, почему нельзя, какие отговорки (ошибки) ?

2020.06.22 20:00:05.570    Trades    '51035': modify #127898237 buy limit 400 TATN -> price: 530.4, sl: 0.0, tp: 610.0) done in 13.665 ms
2020.06.22 20:00:05.638    Notifications    notification 'order #127898237 buy limit 400 TATN modified: 530.4 sl: 0.0 tp: 0.0 -> 530.4 sl: 0.0 tp: 610.0' sent to '29BF50EE'

Выставил 530.4

2020.06.22 20:02:11.386    Trades    '51035': modify order #127898237 buy limit 400 TATN at 530.4 sl: 0.0 tp: 610.0 -> 530.3, sl: 0.0 tp: 610.0 placed for execution
2020.06.22 20:02:11.396    Trades    '51035': rejected modify order #127898237 buy limit 400 TATN at 530.4 sl: 0.0 tp: 610.0 -> 530.3, sl: 0.0 tp: 610.0 ((99)ERROR: (579) For this instr)

модифицирую 530.3  в ответ ((99)ERROR: (579) For this instr

---

ну или если просто ставлю - без попытки поставить на 530.4



2020.06.22 20:05:26.313    Notifications    notification 'added order #127898677 buy limit 500 TATN at 530.3' sent to '29BF50EE'
2020.06.22 20:05:26.378    Notifications    notification 'rejected order #127898677 buy limit 500 TATN at 530.3, Err(579): price less 530.4' sent to '29BF50EE'

повторяю попытку поставить на 530.4


2020.06.22 20:07:26.644    Trades    '51035': buy limit 500 TATN at 530.4
2020.06.22 20:07:26.658    Trades    '51035': accepted buy limit 500 TATN at 530.4
2020.06.22 20:07:26.659    Trades    '51035': buy limit 500 TATN at 530.4 placed for execution
2020.06.22 20:07:26.671    Trades    '51035': order #127898861 buy limit 500 / 500 TATN at 530.4 done in 27.931 ms
2020.06.22 20:07:26.723    Notifications    notification 'added order #127898861 buy limit 500 TATN at 530.4' sent to '29BF50EE'

все прекрасно, ставит

но на 530.3 отказ

 

Потому и возникает вопрос как узнать максимально возможные отступы при торговле на акциях

 

то же самое касается  sell limit

2020.06.22 20:13:41.445    Trades    '51035': sell limit 1 TATN at 835.5
2020.06.22 20:13:41.460    Trades    '51035': accepted sell limit 1 TATN at 835.5
2020.06.22 20:13:41.461    Trades    '51035': sell limit 1 TATN at 835.5 placed for execution
2020.06.22 20:13:41.477    Trades    '51035': rejected sell limit 1 TATN at 835.5 (Err(580): price greater 631.2)
2020.06.22 20:13:41.526    Notifications    notification 'added order #127899154 sell limit 1 TATN at 835.5' sent to '29BF50EE'
2020.06.22 20:13:41.596    Notifications    notification 'rejected order #127899154 sell limit 1 TATN at 835.5, Err(580): price greater 631.2' sent to '29BF50EE'

возможно 631.2

вот и вопрос - как заранее понимать что максимальная цена для sell limit сегодня 631.2 а для buy limit 530.4

Причина обращения: