Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 864

 
Vladimir Karputov:

Вы должны передавать в функцию ЦЕНУ, возле которой и будет происходить поиск отложенных ордеров.

Кроме этой цены нужно передавать две переменные:

Все я сдаюсь.У вас нет готового советника который бы выводил принт цены тех отложек что я показал стрелками на скриншоте?

И вообще не понимаю почему эта функция работает без передачи всяких ЦЕН

int TotalGridBuyOrders=0;
         Print(__FUNCTION__);
         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()==m_magic && m_order.OrderType()==ORDER_TYPE_BUY_STOP)
                  TotalGridBuyOrders++;
         Print("Количество buy ордеров grid ",TotalGridBuyOrders);
         if(TotalGridBuyOrders>=1)
           {
            grid_buy_price_memory=m_order.PriceOpen();
            Print("Цена ближайшего buy grid ордера: ",grid_buy_price_memory);

??? 

 
ilyav:

Все я сдаюсь.У вас нет готового советника который бы выводил принт цены тех отложек что я показал стрелками на скриншоте?

Я Вам дал готовую функцию. Вам нужно передать в нее:

  • текущую цену
  • переменную в которую будет записана цена ближайшего Buy stop
  • переменную в которую будет записана цена ближайшего Sell stop

Что непонятно?

 
Все понятно. Видимо это не мое
 
ilyav:

Все я сдаюсь.У вас нет готового советника который бы выводил принт цены тех отложек что я показал стрелками на скриншоте?

И вообще не понимаю почему эта функция работает без передачи всяких ЦЕН

??? 

Вы показываете неработоспособный код - как минимум он не компилируется - так как в нём несоответствие открывающих и закрывающих скобок. А во-вторых = поломанная логика.

 
Vladimir Karputov:

Вы показываете неработоспособный код - как минимум он не компилируется - так как в нём несоответствие открывающих и закрывающих скобок. А во-вторых = поломанная логика.

Переписал ваш код

Но он у меня выдает дальние от цены отложенники

void TradeMode3()
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   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()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 
                 }
               Print("buy : ",price_nearest_buy_stop);
                return;  
              }
              
               
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
                 Print("sell : ",price_nearest_sell_stop);
                 return;
              }
           }
  }
  
 
 
ilyav:

Переписал ваш код

Но он у меня выдает дальние от цены отложенники

Принты должны стоять после цикла OrdersTotal.

И что такое price1? Как Вы её получаете?
 

А в таком варианте вообще Выводит на принт все имеющиеся

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void TradeMode3()
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   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()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }
                 Print("buy : ",price_nearest_buy_stop);
                 
              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
                 Print("sell : ",price_nearest_sell_stop);
                 
              }
           }
  }
 
Vladimir Karputov:

Принты должны стоять после цикла OrdersTotal.

И что такое price1? Как Вы её получаете?
//|  Выбран режим торговли 3 ? Тогда торгуем его    

      if(РежимТорговли==3)

        {

        price1=m_symbol.Bid();

        TradeMode3();

И в заголовке советника прописал

double price1;
double price_nearest_buy_stop;
double price_nearest_sell_stop;

И если все верно вот заключительный вариант

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void TradeMode3()
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   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()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }

              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }

              }

           }
   Print("Цена ближнего SELL_STOP : ",price_nearest_sell_stop);
   Print("Цена ближнего BUY_STOP : ",price_nearest_buy_stop);
  }
//+------------------------------------------------------------------+

Вроди все работает. Если есть ошибки скажите. Спасибо вам огромное.

 

Прошу помощи в решении такой задачи.

Допустим у меня есть текущий тайм фрейм - M1, мне надо знать время последнего бара N заданного бара любого верхнего TF, при этом час может быть не 60 минут, а 45 или иное любое время, а кроме того есть выходные, а надо узнавать с любого TF дату последнего бара текущего TF.

Как это реализовать?

 
ilyav:

И в заголовке советника прописал

И если все верно вот заключительный вариант

Вроди все работает. Если есть ошибки скажите. Спасибо вам огромное.

Перед строкой

price1=m_symbol.Bid();

нужно обновлять котировки:

if(!RefreshRates())
   return;
Причина обращения: