Wie eröffne ich einen Marktauftrag richtig?

 

Ich habe kürzlich 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.

 
Ich gehe davon aus, dass die Informationen über das Geschäft noch nicht eingetroffen sind. Hier ( in rot hervorgehoben) verlassen Sie sich auf Ihr Glück. Und sie ist eine kapriziöse Dame :-))

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);
}
 
Gennady Mazur:

Vor kurzem habe ich die Frage der Wiedereröffnung von Aufträgen angesprochen. Ich dachte, ich hätte das Problem gelöst, denn eine Woche lang funktionierte alles sehr gut. Aber heute bin ich auf ein ähnliches Problem gestoßen, nur beim Öffnen.
Bei Finam wurde eine sehr große Anzahl von Aufträgen eröffnet, bei Otkritie 9... 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.

Können Sie erklären, was falsch ist und wie das Problem behoben werden kann?

Schlechtes Forex-Erbe.

Sie sollten dieErgebnisse überprüfen.bestellen.

Wenn der Auftrag erteilt wird, bedeutet das nicht, dass das Geschäft bereits abgeschlossen ist.

 
Sergey Chalyshev:

Schlechtes Forex-Erbe.

Wir müssen das überprüfen.bestellen.

Wenn ein Auftrag erteilt wird, bedeutet dies nicht, dass ein Geschäft bereits ausgeführt worden ist.

Sie hätten Recht, wenn ich schwebende Aufträge erteilen würde, aber ich arbeite nach Märkten und hier wird das Ticket mitResults.deal erworben
 
Dennis Kirichenko:
Ich gehe davon aus, dass die Informationen über das Geschäft noch nicht eingetroffen sind. Hier ( in rot hervorgehoben) verlassen Sie sich auf Ihr Glück. Und sie ist eine kapriziöse Dame :-))

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);
}
Nein, dieses Ergebnis ist vorhanden, es handelt sich nicht um eine Ticketbestellung auf dem Server, sondern um einen temporären Ticketvorgang, der später durch eine Ticketposition ersetzt wird
 
Dennis Kirichenko:
Ich gehe davon aus, dass die Informationen über das Geschäft noch nicht eingetroffen sind. Hier ( in rot hervorgehoben) verlassen Sie sich auf Ihr Glück. Und sie ist eine kapriziöse Dame :-))

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);
}
Und mir wurde in einem früheren Thread versichert, der Guru dieses Forums, dass diese Info immer kommt ... fast sofort ... und wenn der Server positiv reagiert das Ticket nicht ausgestellt wird, hat die Bestellung fehlgeschlagen
 

Sie müssen alle Handelsgeschäfte protokollieren. Zum Beispiel so:

Zunächst verbinden wir im "Header" die Handelsklasse CTrade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

und hier ist ein Beispiel für den Vorgang "Kaufen":

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

Sie können also zwei Fehler erhalten: auf der ersten Ebene - der Vorgang hat die Grundprüfung nicht bestanden - und auf der zweiten Ebene - die Prüfung des Tickets für den Handel.

Wenn es dann ein Problem gibt, können Sie es anhand der Protokolle herausfinden.

Hinzugefügt: Das oben Gesagte gilt für die Betriebsart SYNC.

 

Jetzt werden die Gurus hier auch dich unterrichten ))

Объясните что не так, как решить данную проблему? 

Angesichts Ihrer Erfahrung ist es unangebracht, hier solche Fragen zu stellen.

 
Vladimir Karputov:

Sie müssen alle Handelsgeschäfte protokollieren. Zum Beispiel so:

Zunächst verbinden wir im "Header" die Handelsklasse CTrade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

und hier ist ein Beispiel für den Vorgang "Kaufen":

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

Sie können also zwei Fehler erhalten: auf der ersten Ebene - der Vorgang hat die Grundprüfung nicht bestanden - und auf der zweiten Ebene - die Prüfung des Tickets für den Handel.

Wenn es dann ein Problem gibt, können Sie es anhand der Protokolle herausfinden.

Hinzugefügt: Das oben Gesagte gilt für die Betriebsart SYNC.

Genau so habe ich es gemacht.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
nur mit meinem eigenen Code
 
Vladimir Karputov:

Sie müssen alle Handelsgeschäfte protokollieren. Zum Beispiel so:

Zunächst verbinden wir im "Header" die Handelsklasse CTrade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

und hier ist ein Beispiel für den Vorgang "Kaufen":

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

Sie können also zwei Fehler erhalten: auf der ersten Ebene - der Vorgang hat die Grundprüfung nicht bestanden - und auf der zweiten Ebene - die Prüfung des Tickets für den Handel.

Wenn es dann ein Problem gibt, können Sie es anhand der Protokolle herausfinden.

Hinzugefügt: Dies gilt für die Betriebsart SYNC.

Ach ja, und noch etwas: Unterstützt die Standardfunktion die Ausführung von Aufträgen, also deren Einreichung, denn ich habe SeaTrade zur Eröffnung verwendet, bis ich an eine Börse kam, an der Aufträge nicht ausgeführt werden wollten, weil es unmöglich war, die Einreichung zu bestimmen.
 
Gennady Mazur:
Das ist genau das, was ich getan habe.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
aber mit meinem eigenen Code.
Und der Holzeinschlag? Sie müssen sowohl den erfolgreichen Abschluss des Vorgangs als auch insbesondere den Misserfolg mit einem Fehlercode ausgeben.