Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 863

 
Können Sie den Code zeigen, der den Preis des nächstgelegenen Kaufstopps und des nächstgelegenen Verkaufsstopps ausgibt?
 
ilyav:
Können Sie den Code zeigen, der den Preis des nächstgelegenen Kaufstopps und des nächstgelegenen Verkaufsstopps ausgibt?

Nur der Preis? Wozu dient es? Und entschlüsseln Sie das Wort "nächstgelegen" - für wen, was ...

 
Vladimir Karputov:

Nur der Preis? Wozu dient es? Und entschlüsseln Sie das Wort "nächstgelegen" - für wen, was ...

Nur der Preis.

Sehen Sie.

Wir haben jetzt 10 Kaufstopps, die 100 Pips vom aktuellen Kurs entfernt sind.

Wir haben jetzt 10 Verkaufsstopps, die 100 Pips vom aktuellen Kurs entfernt sind.

Ich muss den Preis des nächstgelegenen Kaufstopps und des nächstgelegenen Verkaufsstopps relativ zum aktuellen Kurs in Print anzeigen.

Ich habe es versucht, aber es hat nicht funktioniert.

Der Preis des nächstgelegenen Kaufstopps wird korrekt ausgegeben, aber der Preis des nächstgelegenen Verkaufsstopps wird aus irgendeinem Grund nicht ausgegeben.

Diese Funktionm_order.PriceOpen(); zeigt immer den Stoppkurs des Kaufs an. Obwohl ich ihn bitte, mir den Preis des Verkaufsstopps nach der Kaufstopp-Anforderung zu nennen.

Dies geschieht für weitere Logik-

Ich teile den Preis des nächstgelegenen Kaufstopps und den Preis des nächstgelegenen Verkaufsstopps durch 2.

Der Expert Advisor wird seine Arbeit auf der Grundlage der erhaltenen Zahl fortsetzen.

Die vollständige Funktion lautet

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

Jetzt habe ich versucht, den Code zu ändern.

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

Keine Änderung. Gibt nur den Kaufstoppkurs aus

 
ilyav:

Jetzt habe ich versucht, den Code zu ändern.

Keine Änderung. Es wird nur der Kaufstoppkurs angezeigt.

Lassen Sie uns zuerst den Code schreiben. Ich würde damit beginnen, dass die Suchfunktion für den Kauf- und Verkaufsstopp den Preis passieren muss - wie soll man sonst suchen? ...

Außerdem müssen wir klären: "am nächsten" - über oder unter dem Preis? Oder handelt es sich nur um die Differenz zwischen dem festgelegten Preis und dem schwebenden Auftrag?

 
Vladimir Karputov:

Lassen Sie uns das zuerst aufschreiben. Ich würde damit beginnen, dass die Suchfunktion Buy Stop und Sell Stop den Preis passieren muss - wie soll man sonst suchen? ...

So mache ich es.

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

Die Funktion gibt perfekt die aktuelle Anzahl der Verkaufsstopps aus.

Als nächstes haben wir den nächstgelegenen Verkaufsstopp ausgewählt. Wir bitten darum, den Preis anzuzeigen und zu drucken

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

Dies ist in der Hilfe beschrieben.

Die Klasse COrderInfo

PreisÖffnen

Ermittelt den Preis der Bestellung.

doublePriceOpen()const

Zurückgegebener Wert

Offener Preis der Bestellung.

Hinweis

Die Bestellung sollte für den Zugriff mit den Methoden Select(nach Ticket) oderSelectByIndex(nach Index) vorausgewählt werden.


Was ist los? Wir haben den Auftrag ausgewählt. Der Preis für die Installation wird angefragt.

Oder habe ich etwas missverstanden? Warum bekomme ich einen Kaufstoppkurs, wenn ich es nicht richtig mache?

 
Vladimir Karputov:

Außerdem ist zu klären, ob der "nächstgelegene" Preis der höchste oder der niedrigste ist. Oder handelt es sich nur um die Differenz zwischen dem festgelegten Preis und dem schwebenden Auftrag?

Hier ist der Preis für den Kauf- und Verkaufsstopp, den ich benötige

 
ilyav:

Hier ist der Preis für den Buy Stop und Sell Stop, den ich benötige

Diese Funktion sucht den nächstgelegenen Kaufstopp oberhalb des Preises "Preis" und den nächstgelegenen Verkaufsstopp unterhalb des Preises "Preis":

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

Jetzt ein anderes Problem)

Ich habe meine Funktion wie folgt aufgerufen -

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

Ich habe Ihren Code eingefügt und meine Funktion geändert in

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

Jetzt gibt es einen Fehler beim Kompilieren (

'CalculateAllPendingOrders' - wrong parameters count
 
ilyav:

Jetzt ein anderes Problem)

Ich habe meine Funktion wie folgt aufgerufen -

Ich habe Ihren Code eingefügt und meine Funktion geändert in

Jetzt tritt beim Kompilieren ein Fehler auf(

Sie müssen der Funktion einen PRICE übergeben, um den die Suche nach ausstehenden Aufträgen durchgeführt wird.

Neben diesem Preis müssen Sie zwei Variablen angeben:

void CalculateAllPendingOrders(const double price,double &price_nearest_buy_stop,double &price_nearest_sell_stop)
Grund der Beschwerde: