Wie eröffne ich einen Marktauftrag richtig? - Seite 5

 
Gennady Mazur:

Vor kurzem habe ich ein Thema über die Wiederaufnahme von Aufträgen angesprochen. Ich dachte, ich hätte das Problem gelöst, da eine Woche lang alles reibungslos funktionierte. Aber heute bin ich nur beim Öffnen auf ein ähnliches Problem gestoßen.
Viele Aufträge wurden bei Finam eröffnet, und 9 bei Otkritie... obwohl in allen Fällen nur ein Auftrag hätte eröffnet werden dürfen.

Hier ist ein Codeausschnitt aus dem EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

D.h. wir können aus dem Code ersehen, dass bei erfolgreicher Operation die VariableOpenOrders steigt, die anfangs gleich 0 ist

Ist er größer als 0, sollte der Auftrag nicht weiter geöffnet werden, sondern der gesamte Auftragsstapel wird mit dem Kommentar Order1 geöffnet.

Ich überprüfe, ob es eine positive Antwort in der Funktion zum Öffnen der Bestellung gibt und ob das Bestellungs-Ticket empfangen wurde, aber aus irgendeinem Grund gibt diese Funktion false zurück, obwohl die Bestellung tatsächlich gesetzt ist.

Erläutern Sie, was falsch ist und wie man dieses Problem lösen kann.

Außerdem können Sie prüfen, ob eine Position geöffnet ist, indem Sie versuchen, sie auszuwählen. Und es ist besser, es mehrmals zu versuchen.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Es gibt sowohl eine Verzögerung als auch eine Bestätigung, dass die Stelle bereits besetzt ist.

Mir ist auch aufgefallen, dass es keine Prüfung OrderCheck(Request, checkResult) gibt, was schlecht ist.
 

Oh, und auch in der Marktordnung - Preis = 0

Anfrage.Preis=SymbolInfoDouble(_Symbol,SYMBOL_BID); vergessen Sie es

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
Außerdem können Sie die Öffnung der Position überprüfen, indem Sie versuchen, sie auszuwählen. Und es ist besser, es mehrmals zu versuchen

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Es gibt sowohl eine Verzögerung als auch eine Bestätigung, dass die Position bereits eröffnet wurde.

Mir ist auch aufgefallen, dass es keine Prüfung OrderCheck(Request, checkResult) gibt, was schlecht ist.

Was wäre, wenn die Stelle bereits existierte?

Oder wenn es bereits eine Position gibt, aber der Auftrag nicht vollständig ausgeführt wird?

 
Alexey Viktorov:
Außerdem kann man die Öffnung der Position überprüfen, indem man versucht, sie auszuwählen. Und mehrere Versuche sind besser.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Es gibt sowohl eine Verzögerung als auch eine Bestätigung, dass die Stelle bereits besetzt ist.

Außerdem ist mir aufgefallen, dass es keine Prüfung OrderCheck(Request, checkResult) gibt, und das ist schlecht.

Nun, vielleicht werde ichOrderCheck(Request, checkResult) einfügen
Danke

Aber eine solche Schleife gefällt mir nicht besonders

 
prostotrader:

Oh, und auch in der Marktordnung - Preis = 0

Anfrage.Preis=SymbolInfoDouble(_Symbol,SYMBOL_BID); vergessen Sie es

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
Vielen Dank für die ausführliche Beschreibung...und die Erklärung....
Und über den Preis.... ja, mehr verwendet, um MT4, und dort haben Sie immer den Preis zu setzen...
 
Sergey Chalyshev:

Wiederholen Sie

Außerdem sollten Sie den Status der Bestellung überprüfen und feststellen, ob sie bereits in der Historie erschienen ist oder nicht.

Die Börse arbeitet nicht mit Positionen, sondern nur mit Aufträgen.

Wirklich?
 
Gennady Mazur:
Sie hätten Recht, wenn ich Pending Orders platzieren würde, aber ich arbeite nach Markt, und hier wird das Ticket mitResults.deal erworben
Dennoch wird der Auftrag zuerst gesendet und dann ausgeführt.
 
Sergey Chalyshev:

Ich verstehe nicht, was Ihr Lächeln bedeutet?

Ich hatte nicht erwartet, dass Sie das sagen. Welche Pausen, oder machen Sie Witze?

Pause nach OrderSend(), damit Marktinformationen und Historie aktualisiert werden können.
 
Sergey Chalyshev:

Schlechtes Forex-Erbe.

...

Sie sollten vielleicht vorsichtig sein, wie Sie es formulieren. Andernfalls könnten wir genauso gut über die genetische Mutation der FOORTS-Anhänger sprechen.
 
Sergey Chalyshev:

Was wäre, wenn die Stelle bereits existierte?

Oder gibt es bereits eine Position, aber der Auftrag wird nicht vollständig ausgeführt?

Ja. Und mir geht es nur um meine Hecke. Ich gebe zu, dass ich nicht ganz richtig lag. Oder völlig falsch. :-)
Grund der Beschwerde: