Questions des débutants MQL5 MT5 MetaTrader 5 - page 863

 
Pouvez-vous montrer le code qui imprime le prix du stop d'achat et du stop de vente le plus proche ?
 
ilyav:
Pouvez-vous montrer le code qui imprime le prix du stop d'achat le plus proche et du stop de vente le plus proche ?

Juste le prix ? A quoi ça sert ? Et déchiffrer le mot "le plus proche" - à qui, quoi ...

 
Vladimir Karputov:

Juste le prix ? A quoi ça sert ? Et déchiffrer le mot "le plus proche" - à qui, quoi ...

Juste le prix.

Regardez.

Nous avons maintenant 10 stops d'achat par incréments de 100 pips à partir du prix actuel.

Nous avons maintenant 10 stops de vente à 100 pips du prix actuel.

J'ai besoin d'afficher le prix du stop d'achat le plus proche et du stop de vente le plus proche par rapport au prix actuel dans Print.

J'ai essayé de le faire mais ça n'a pas marché.

Le prix du stop d'achat le plus proche est émis correctement, mais le prix du stop de vente le plus proche est émis pour une raison quelconque.

Cette fonctionm_order.PriceOpen() ; affiche toujours le prix stop d'achat. Bien que je lui demande de me donner le prix du stop de vente après la demande de stop d'achat.

C'est fait pour une logique plus poussée.

Je divise par 2 le prix du stop d'achat le plus proche et le prix du stop de vente le plus proche.

Le conseiller expert continuera son travail sur la base du chiffre obtenu.

La fonction complète est

//+------------------------------------------------------------------+
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);
        }
     }
  }
//+------------------------------------------------------------------+
 

Maintenant, j'ai essayé de changer le code.

//+------------------------------------------------------------------+
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);
        }
     }
  }
//+------------------------------------------------------------------+

Pas de changement. Produit uniquement le prix d'achat stop

 
ilyav:

Maintenant, j'ai essayé de changer le code.

Pas de changement. Il n'affiche que le prix d'achat stop.

Écrivons d'abord le code. Je commencerais par dire que la fonction de recherche des Stop d'achat et Stop de vente doit passer par le prix - sinon comment faire la recherche ? ...

Il faut également préciser : " le plus proche " - au-dessus ou en dessous du prix ? Ou est-ce seulement la différence entre le prix fixé et l'ordre en attente?

 
Vladimir Karputov:

Commençons par l'écrire. Je commencerais par dire que la fonction de recherche des Stop d'achat et Stop de vente doit passer par le prix - sinon, comment faire la recherche ? ...

C'est comme ça que je fais.

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++;

La fonction édite parfaitement le nombre actuel d'arrêts de vente.

Ensuite, nous avons sélectionné le Sell Stop le plus proche. Nous demandons d'afficher son prix et de l'imprimer

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

C'est écrit dans l'aide.

La classe COrderInfo

PrixOuverture

Obtient le prix de la commande.

doublePriceOpen()const

Valeur retournée

Prix d'ouverture de la commande.

Note

L'ordre doit être présélectionné pour l'accès à l'aide des méthodes Select(par ticket) ouSelectByIndex(par index).


Qu'est-ce qui ne va pas ? Nous avons sélectionné la commande. Le prix de l'installation est demandé.

Ou est-ce que je comprends mal quelque chose ? Pourquoi le prix d'achat stop s'affiche-t-il si je ne le fais pas correctement ?

 
Vladimir Karputov:

Il faut également préciser : le "plus proche" est-il le haut ou le bas du prix ? Ou est-ce seulement la différence entre le prix fixé et l'ordre en attente?

Voici le prix dont j'ai besoin pour le stop d'achat et le stop de vente.

 
ilyav:

Voici le prix de quel Buy Stop et Sell Stop j'ai besoin

Cette fonction recherche le Buy Stop supérieur le plus proche du prix "prix" et le Sell Stop inférieur le plus proche du prix "prix" :

//+------------------------------------------------------------------+
//| 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();
                 }
              }
           }
  }
 

Maintenant, un autre problème)

J'avais l'habitude d'appeler ma fonction comme ceci -

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

J'ai inséré votre code et changé ma fonction en

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

Il y a maintenant une erreur lors de la compilation(

'CalculateAllPendingOrders' - wrong parameters count
 
ilyav:

Maintenant, un autre problème)

J'avais l'habitude d'appeler ma fonction comme ceci -

J'ai inséré votre code et changé ma fonction en

Maintenant il y a une erreur lors de la compilation(

Vous devez passer un PRIX à la fonction, autour duquel la recherche des ordres en attente sera effectuée.

Outre ce prix, vous devez passer deux variables:

void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)