{
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);
}
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
{
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.
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.
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 :-))
{
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);
}
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 :-))
{
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);
}
Sie müssen alle Handelsgeschäfte protokollieren. Zum Beispiel so:
Zunächst verbinden wir im "Header" die Handelsklasse CTrade
CTrade m_trade; // trading object
und hier ist ein Beispiel für den Vorgang "Kaufen":
{
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.
Sie müssen alle Handelsgeschäfte protokollieren. Zum Beispiel so:
Zunächst verbinden wir im "Header" die Handelsklasse CTrade
CTrade m_trade; // trading object
und hier ist ein Beispiel für den Vorgang "Kaufen":
{
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.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
Sie müssen alle Handelsgeschäfte protokollieren. Zum Beispiel so:
Zunächst verbinden wir im "Header" die Handelsklasse CTrade
CTrade m_trade; // trading object
und hier ist ein Beispiel für den Vorgang "Kaufen":
{
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.
Das ist genau das, was ich getan habe.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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
{
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.