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

 
Вы можете показать код который выводит в принт цену ближайшего бай стопа и ближайшего селл стопа ?
 
ilyav:
Вы можете показать код который выводит в принт цену ближайшего бай стопа и ближайшего селл стопа ?

Только цену? Для чего это нужно? И расшифруйте слово "ближайшего" - кому, чего ...

 
Vladimir Karputov:

Только цену? Для чего это нужно? И расшифруйте слово "ближайшего" - кому, чего ...

Да только цену .

Смотрите.

У нас сейчас размещено 10 бай стопов с шагом 100 пунктов от текущей цены.

У нас сейчас размещено 10 селл стопов с шагом 100 пунктов от текущей цены.

Мне нужно вывести в Принт цену ближайшего бай стопа и ближайшего селл стопа относительно текущей цены. 

Что я и пытался сделать , но не выходит.

Принт цены ближайшего бай стопа у меня выводит корректно , а вот принт ближайщего селлстопа у меня выводит почему то цену ближайшего бай стопа

Вот в этой функции m_order.PriceOpen(); почему то всегда лежит цена бай стопа . Хотя я её прошу дать мне цену селл стопа после запроса бай стопа.

Это делается для дальнейшей логики-

Я разделю на 2 цену ближайшего бай стопа и цену ближайшего селл стопа.

На основании полученной цифры будет продолжение работы советника

Полностью функция -

//+------------------------------------------------------------------+
void TradeMode3()
  {
   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);

      int TotalGridSellOrders=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_SELL_STOP)
               TotalGridSellOrders++;
      Print("Количество sell ордеров grid ",TotalGridSellOrders);
      if(TotalGridSellOrders>=1)
        {
         grid_sell_price_memory=m_order.PriceOpen();
         Print("Цена ближайшего sell grid ордера: ",grid_sell_price_memory);
        }
     }
  }
//+------------------------------------------------------------------+
 

Сейчас попробывал изменить код

//+------------------------------------------------------------------+
void TradeMode3()
  {
     {
      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)
        {
         double grid_buy_price_memory=m_order.PriceOpen();
         Print("Цена ближайшего buy grid ордера: ",grid_buy_price_memory);
        }
     }
     {
      int TotalGridSellOrders=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_SELL_STOP)
               TotalGridSellOrders++;
      Print("Количество sell ордеров grid ",TotalGridSellOrders);
      if(TotalGridSellOrders>=1)
        {
         double grid_sell_price_memory=m_order.PriceOpen();
         Print("Цена ближайшего sell grid ордера: ",grid_sell_price_memory);
        }
     }
  }
//+------------------------------------------------------------------+

Без изменений. Выводит только цену бай стопа

 
ilyav:

Сейчас попробывал изменить код

Без изменений. Выводит только цену бай стопа

Давайте сначала напишем. Я бы начал с того, что в функцию поиска Buy Stop и Sell Stop нужно передавать цену - иначе как искать? ...

Также нужно уточнить: "ближайший" - сверху или снизу от цены? Или берётся просто модуль разницы заданной цены и отложенного ордера?

 
Vladimir Karputov:

Давайте сначала напишем. Я бы начал с того, что в функцию поиска Buy Stop и Sell Stop нужно передавать цену - иначе как искать? ...

Вот так ищю

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_SELL_STOP)
               TotalGridSellOrders++;

Функция отлично выводит текущее количество селл стопов.

Далее у нас выбран ближайший селл стоп. Просим выдать его цену и вывести принт

double grid_sell_price_memory=m_order.PriceOpen();    
Print("Цена ближайшего sell grid ордера: ", grid_sell_price_memory);

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

Класс COrderInfo

PriceOpen

Получает цену ордера.

double  PriceOpen() const

Возвращаемое значение

Цена установки ордера.

Примечание

Ордер должен быть предварительно выбран для доступа методом Select (по тикету) или SelectByIndex (по индексу).


Что не так ? Ордер у нас выбран . Цену установки просим.

Или я чего то не понимаю? Почему тогда я получаю цену установки бай стопа если я делаю не правильно?

 
Vladimir Karputov:

Также нужно уточнить: "ближайший" - сверху или снизу от цены? Или берётся просто модуль разницы заданной цены и отложенного ордера?

Вот цена которого бай стопа и селл стопа мне нужна

 
ilyav:

Вот цена которого бай стопа и селл стопа мне нужна

Эта функция ищет ближайший сверху Buy Stop от цены "price" и ближайший снизу Sell Stop от цены "price":

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)
  {
   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()-price>0.0 && m_order.PriceOpen()-price<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }
              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price-m_order.PriceOpen()>0.0 && price-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
              }
           }
  }
 

Теперь другая проблема)

Я раньше свою функцию вызывал так -

//|  Выбран режим торговли 3 ? Тогда торгуем его    
      if(РежимТорговли==3)
        {
         TradeMode3();
        }

Вставил ваш код и изменил свою функцию на

 //|  Выбран режим торговли 3 ? Тогда торгуем его    
      if(РежимТорговли==3)
        {
        CalculateAllPendingOrders();
        }
     

Теперь ошибка при компиляции(

'CalculateAllPendingOrders' - wrong parameters count
 
ilyav:

Теперь другая проблема)

Я раньше свою функцию вызывал так -

Вставил ваш код и изменил свою функцию на

Теперь ошибка при компиляции(

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

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

void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)
Причина обращения: