Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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
{
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.
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
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
{
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);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
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
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
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?
Außerdem kann man die Öffnung der Position überprüfen, indem man versucht, sie auszuwählen. Und mehrere Versuche sind besser.
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
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
Oh, und auch in der Marktordnung - Preis = 0
Anfrage.Preis=SymbolInfoDouble(_Symbol,SYMBOL_BID); vergessen Sie es
{
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);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
Und über den Preis.... ja, mehr verwendet, um MT4, und dort haben Sie immer den Preis zu setzen...
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.
Sie hätten Recht, wenn ich Pending Orders platzieren würde, aber ich arbeite nach Markt, und hier wird das Ticket mitResults.deal erworben
Ich verstehe nicht, was Ihr Lächeln bedeutet?
Ich hatte nicht erwartet, dass Sie das sagen. Welche Pausen, oder machen Sie Witze?
Schlechtes Forex-Erbe.
...
Was wäre, wenn die Stelle bereits existierte?
Oder gibt es bereits eine Position, aber der Auftrag wird nicht vollständig ausgeführt?