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

 

Es gibt einen Expert Advisor, mit dem Sie feststellen können, wann ein schwebender Auftrag ausgelöst wurde

https://www.mql5.com/ru/code/17610

Ich verwende es, um ein Ticket für einen SELL_STOP-Auftrag zu erhalten

Ich habe den Code geändert in

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      Print("Attempt number ",counter);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error#",GetLastError());
        }
      counter++;
     }
  }

Bis zu einem bestimmten Zeitpunkt ist alles in Ordnung. Bis eine andere Auftragsart in der Historie erscheint.

Zum Beispiel: SELL_LIMIT.

BEISPIEL

Sobald SELL_LIMIT in der Historie erscheint, kann ich kein Ticket für den letzten SELL_STOP bekommen.

Der Expert Advisor löst einen Fehler aus.

Der Auftrag 9 ist nicht anhängig

Obwohl es SELL_STOP in der Historie gibt

Warum muss ich den Auftrag Nr. 9 erhalten, wenn ich das Ticket Nr. 7 brauche?

Es scheint so, als würde der Expert Advisor nicht die gesamte Historie nach der benötigten Order durchsuchen, sondern nur die letzte
TypePendingOrderTriggered
TypePendingOrderTriggered
  • Stimmen: 21
  • 2017.02.14
  • Vladimir Karputov
  • www.mql5.com
()   {    (bln_find_order)      {        counter=;       (,counter);       ();         {          (type_order== || type_order== ||             type_order== ||type_order==)            {             (,ul_find_order,,                   (()(ul_find_order,)));             bln_find_order=;                     counter=;             ;            }...
 

Hallo. Ich erhalte einen Fehler, wennStopLoss_=0

failed modify #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Invalid stops]


 if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     if(StopLoss_<=0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }

                     if(StopLoss_>0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }
                    }
                 }
wennich Null anstelle vonm_position.StopLoss() einsetze, tritt der gleiche Fehler auf. Was ist los?
 
Sile Si:

Hallo. Ich erhalte einen Fehler, wennStopLoss_=0

failed modify #2 sell 3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Invalid stops]

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
        {
         if(StopLoss_<=0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_position.StopLoss(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }

         if(StopLoss_>0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }
        }
     }

wennich Null anstelle vonm_position.StopLoss() einsetze, tritt der gleiche Fehler auf. Was ist das?

Fehlerhafte Logik beim Schreiben des Programms.

Wenn StopLoss_=0, wird die obere Bedingung ausgelöst - ein Versuch, TakeProfit zu ändern. Der Fehler liegt darin, dass Sie vom OFFENEN PREIS abziehen - in diesem Fall kann das TakeProfit-Niveau höher sein als der AKTUELLE PREIS, und das ist ein Fehler.

In Ihrem Fall subtrahieren Sie vom RIGHT PRICE (m_position.PriceCurrent).

 
Vladimir Karputov:

Eine Verkaufsposition wurde eröffnet und das Verkaufslimit wurde aktiviert. Ich muss das Tp relativ zum neuen Preis der Position verschieben, nicht relativ zum aktuellen Preis.

Welche Art von Prüfung sollte ich durchführen, um zu vermeiden, dass ich versuche, einen ungültigen Preis zu ändern?

 
Sile Si:

Eine Verkaufsposition wurde eröffnet und das Verkaufslimit wurde aktiviert. Ich muss das tp relativ zum neuen Preis der Position verschieben, nicht relativ zum aktuellen Preis.

Welche Art von Prüfung sollte ich durchführen, damit ich nicht versuche, einen ungültigen Preis zu ändern?

Prüfen:

if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent()
   {
    m_trade.PositionModify(m_position.Ticket(),
                           m_position.StopLoss(),
                           m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                           );
...
 
Vladimir Karputov:

Prüfen:

Danke, aber der Fehler bleibt bestehen.

aqa

Es könnte unannehmbar nahe am aktuellen Preis liegen. Wie kann ich das überprüfen?

 
Sile Si:

Danke, aber der Fehler bleibt bestehen.

Es könnte unannehmbar nahe am aktuellen Preis liegen. Wie kann man das überprüfen?

Ich habe keinen Zugang zu einer Börse, also machen Sie es entweder selbst oder arbeiten Sie mit Forex-Instrumenten. Entschuldigung.


Hinzugefügt: Einführung einer weiteren Prüfung - für eine Verkaufsposition darf der neue TakeProfit (berechneter Wert) nicht höher oder gleich dem aktuellen TakeProfit der Position sein.

 
Vladimir Karputov:

Ich habe keinen Zugang zu einer Börse, also machen Sie es entweder selbst oder arbeiten Sie mit Forex-Instrumenten. Entschuldigung.


Hinzugefügt: Einführung einer weiteren Prüfung - für eine Verkaufsposition darf der neue TakeProfit (berechneter Wert) nicht HÖHER oder GLEICH dem aktuellen TakeProfit der Position sein.

Wahrscheinlich der Eröffnungspreis (POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

Wahrscheinlich der Eröffnungspreis (POSITON_PRICE_OPEN) ?

Diese Option wurde oben genannt. Siehe die obigen Beiträge. Sie haben mitten im Gespräch geantwortet.

 
Vladimir Karputov:...geben Sie eine weitere Prüfung ein - für eine Verkaufsposition darf der neue TakeProfit (berechneter Wert) nicht HOCH oder GLEICH dem aktuellen TakeProfit der Position sein.

Does not fit, modify by ATR Welche weiteren Prüfungen können bei diesem Fehler durchgeführt werden? Alles möglich. In mt4 gibt esSTOPLEVEL, aber hier was?

Grund der Beschwerde: