Советники: Cidomo

 

Cidomo:

Работа отложенными Buy stop и Sell stop ордерами.

Cidomo

Автор: Vladimir Karputov

 

Хочу доработать советник под себя, но чтобы это сделать нужно во многом разобраться! (многое не понимаю). Буду спрашивать по частям.

Есть код:

   if(m_need_delete_buy_stop || m_need_delete_sell_stop)
     {
      int count_buy_stops=0,count_sell_stops=0;
      CalculateAllPendingOrders(count_buy_stops,count_sell_stops);

      if(m_need_delete_buy_stop)
        {
         if(count_buy_stops>0)
           {
            DeleteOrders(ORDER_TYPE_BUY_STOP);
            return;
           }
         else
           {
            m_need_delete_buy_stop=false;
            return;
           }
        }
      if(m_need_delete_sell_stop)
        {
         if(count_sell_stops>0)
           {
            DeleteOrders(ORDER_TYPE_SELL_STOP);
            return;
           }
         else
           {
            m_need_delete_sell_stop=false;
            return;
           }
        }
     }

Что он делает?

 
Sysmart:

Хочу доработать советник под себя, но чтобы это сделать нужно во многом разобраться! (многое не понимаю). Буду спрашивать по частям.

Есть код:

Что он делает?

Если взведён флаг 'm_need_delete_buy_stop' ('необходимо удалить отложенные ордера buy stop') или m_need_delete_sell_stop' ('необходимо удалить отложенные ордера sell stop')

   if(m_need_delete_buy_stop || m_need_delete_sell_stop)
     {

приступаем к удалению.


Подсчитываем - сколь-же у нас советник разместил отложенных ордеров на данный момент:

      int count_buy_stops=0,count_sell_stops=0;
      CalculateAllPendingOrders(count_buy_stops,count_sell_stops);


Если 'необходимо удалить отложенные ордера buy stop':

      if(m_need_delete_buy_stop)
        {
         if(count_buy_stops>0)
           {
            DeleteOrders(ORDER_TYPE_BUY_STOP);
            return;
           }
         else
           {
            m_need_delete_buy_stop=false;
            return;
           }
        }

и количество размещённых buy stop больше нуля ('count_buy_stops') - удаляем их. Если же количество равно нулю - сбрасываем флаг 'm_need_delete_buy_stop'.


Аналогично поступаем если 'необходимо удалить отложенные ордера sell stop' ...

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 

Спасибо!

Еще код, который не понимаю:

//--- we work only at the time of the birth of new bar
   static datetime PrevBars=0;
   datetime time_0=iTime(m_symbol.Name(),InpWorkTimeFrame,0);
   if(time_0==PrevBars)
      return;
   PrevBars=time_0;
   if(!RefreshRates())
     {
      PrevBars=0;
      return;
     }
 
Sysmart:

Спасибо!

Еще код, который не понимаю:

Этот код делает следующее: работает только один раз - в момент рождения нового бара.

 
Vladimir Karputov:

Этот код делает следующее: работает только один раз - в момент рождения нового бара.

Спасибо. Вот что я понял в итоге:

//--- we work only at the time of the birth of new bar
   // в статической переменной будем помнить время открытия последнего бара
   static datetime PrevBars=0;
   // текущее время (iTime - возвращает значение времени открытия бара)
   datetime time_0=iTime(m_symbol.Name(),InpWorkTimeFrame,0);
   if(time_0==PrevBars)
      return;
   // если время отличается, т.к. прошли условие if(time_0==PrevBars)
   // запомним время
   PrevBars=time_0;
   // если котировки не обновляли, то обнуляем время открытия последнего бара
   if(!RefreshRates())
     {
      PrevBars=0;
      return;
     }
   // дошли до этого места - значит бар не новый

Без вашей ссылочки я бы не разобрался)

 
Sysmart:

Спасибо. Вот что я понял в итоге:

Без вашей ссылочки я бы не разобрался)

Небольшая поправка. Это

 // дошли до этого места - значит бар не новый

неверно. Правильно так:

 // дошли до этого места - значит бар новый
 

Кстати сразу ниже идет код:

   if(!RefreshRates() || !m_symbol.Refresh())
     {
      PrevBars=0;
      return;
     }

Мне кажется он частично дублирует код, который обсуждали выше:

   if(!RefreshRates())
     {
      PrevBars=0;
      return;
     }

Мне кажется его можно удалить

 
Vladimir Karputov:

Небольшая поправка. Это

неверно. Правильно так:

Спасибо)!
 

Далее код:

//--- check Freeze and Stops levels
/*
   Type of order/position  |  Activation price  |  Check
   ------------------------|--------------------|--------------------------------------------
   Buy Limit order         |  Ask               |  Ask-OpenPrice  >= SYMBOL_TRADE_FREEZE_LEVEL
   Buy Stop order          |  Ask                   |  OpenPrice-Ask  >= SYMBOL_TRADE_FREEZE_LEVEL
   Sell Limit order        |  Bid                   |  OpenPrice-Bid  >= SYMBOL_TRADE_FREEZE_LEVEL
   Sell Stop order            |  Bid                |  Bid-OpenPrice  >= SYMBOL_TRADE_FREEZE_LEVEL
   Buy position            |  Bid                   |  TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL 
                           |                    |  Bid-StopLoss   >= SYMBOL_TRADE_FREEZE_LEVEL
   Sell position           |  Ask                   |  Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL
                           |                    |  StopLoss-Ask   >= SYMBOL_TRADE_FREEZE_LEVEL
                           
   Buying is done at the Ask price                 |  Selling is done at the Bid price
   ------------------------------------------------|----------------------------------
   TakeProfit        >= Bid                        |  TakeProfit        <= Ask
   StopLoss          <= Bid                          |  StopLoss          >= Ask
   TakeProfit - Bid  >= SYMBOL_TRADE_STOPS_LEVEL   |  Ask - TakeProfit  >= SYMBOL_TRADE_STOPS_LEVEL
   Bid - StopLoss    >= SYMBOL_TRADE_STOPS_LEVEL   |  StopLoss - Ask    >= SYMBOL_TRADE_STOPS_LEVEL
*/
   if(!RefreshRates() || !m_symbol.Refresh())
     {
      PrevBars=0;
      return;
     }
//--- FreezeLevel -> for pending order and modification
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   freeze_level*=1.1;

Здесь не понятны расчеты:

freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;

freeze_level*=1.1;

Для чего? И зачем умножили *3.0 и *=1.1

 
Sysmart:

Далее код:

Здесь не понятны расчеты:

freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;

freeze_level*=1.1;

Для чего? И зачем умножили *3.0 и *=1.1

Главная задача - отсечь скальперов и любителей пипсовки.