Wie man im MT5 mit OrderSend korrekt arbeitet - Seite 2

 
fxsaber:
Dies ist bereits ein terminologisches Argument. Die schlechte Situation wurde oben ausführlich beschrieben. Die Standardbibliotheken berücksichtigen das nicht einmal.

Nein.

Aber bleiben Sie hartnäckig. Ich werde das nicht weiter erläutern.

 
Renat Fatkhullin:

Nein.

Aber bleiben Sie hartnäckig. Ich werde das nicht weiter erläutern.

Die Leute schreiben darüber im Forum. Und das mehr als einmal. Die Reaktion ist genau das.

 
fxsaber:

Die Leute schreiben darüber im Forum. Und das mehr als einmal. Die Reaktion ist genau so.

Die Menschen wollen nicht selbst denken, sondern wollen, dass andere es für sie tun... Leider ist dies der Fall.
 
prostotrader:

Möchten Sie, dass ich Ihnen helfe, diese Pannen zu umgehen (aus persönlicher Erfahrung beim Handel mit MT5-Robotern auf einem echten Konto)?

Hinzugefügt

Völlig kostenlos :)

Fügen Sie dem Sparschwein auch Ihr eigenes hinzu.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Warten auf Serverantwort nach dem Senden von OrderSend()

Denis Sartakov, 2016.10.08 15:43

Die Funktion ist synchron, nur der Verlauf wird nicht synchron mit der Beendigung dieser Funktion aktualisiert,

Ich mache es so, weil ich denke, dass es einfacher ist, als mit OnTrade() und anderen Dingen herumzubasteln:

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
Die Menschen wollen nicht selbst denken, sondern wollen, dass andere es für sie tun... Leider ist dies der Fall.

Die Menschen denken nicht nur nach, sondern teilen auch ihre Lösungen. Leider schweigen die Entwickler dazu.

In der Dokumentation findet sich kein einziges Beispiel zu diesem Thema. Und das ist bei der Hauptfunktion.

 
fxsaber:

Die Menschen denken nicht nur nach, sondern teilen auch ihre Lösungen. Leider schweigen die Entwickler dazu.

In der Dokumentation findet sich kein einziges Beispiel zu diesem Thema. Und das ist nur die Hauptfunktion.

Das Beispiel, das Sie oben angeführt haben, ist, entschuldigen Sie bitte, völliger Unsinn.

Das ist nicht der richtige Ort, um damit anzufangen!

 
prostotrader:

Das Beispiel, das Sie oben angeführt haben, ist, entschuldigen Sie bitte, völliger Unsinn.

Das ist nicht der richtige Ort, um damit anzufangen!

Meine Variante

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

fxsaber, 2016.10.09 09:39

Wenn ein OrderSend gesendet wird, müssen Sie sich daran ERINNERN (hier liegt die potenzielle Schwachstelle), dass dies geschehen ist. Dann ignorieren Sie die aktuelle Historie (Handelsumgebung), bis die entsprechende OnTrade-Nachricht eintrifft. Sobald es ankommt, VERGESSEN Sie es nicht mehr.

Wenn es kein REMEMBER gibt, können Sie sich auf die Historie wie in MT4 verlassen.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

Profitieren Sie davon.

 
prostotrader:

Verwenden Sie es.

Worin besteht also der Unterschied zu dem, was ich oben geschrieben habe? Ein guter Mann hat mir sogar eine ernsthafte Bibel zu diesem Thema geschickt.

Die Menschen finden Lösungen. Es ging um die Tatsache, dass die Entwickler selbst es nicht einmal in der SB haben.

 
fxsaber:

Was ist der Unterschied zu dem, was ich oben geschrieben habe? Ich hatte sogar einen guten Mann, der mir eine ernsthafte Bibel zu diesem Thema schickte.

Die Menschen finden Lösungen. Es ging um die Tatsache, dass die Entwickler selbst es nicht einmal in der SB haben.

Wenn es Ihnen nicht gefällt, verwenden Sie es nicht.