Hallo ,
du musst das Rückgabe Ergebniss der Ordersent Funktion auswerten .
so wie in dieser gebauten Funktion :
(
bool &BUY_Signal, // ôëàã ðàçðåøåíèÿ íà ñäåëêó
const string symbol, // òîðãîâàÿ ïàðà ñäåëêè
const datetime &TimeLevel, // âðåìÿ, ïîñëå êîòîðîãî áóäåò îñóùåñòâëåíà ñëåäóùàÿ ñäåëêà ïîñëå òåêóùåé
double Money_Management, // MM
int Margin_Mode, // ñïîñîá ðàñ÷¸òà âåëè÷èíû ëîòà
uint deviation, // ñëèïïàæ
int StopLoss, // ñòîïëîññ â ïóíêòàõ
int Takeprofit // òåéêïðîôèò â ïóíêòàõ
)
//BuyPositionOpen(BUY_Signal,symbol,TimeLevel,Money_Management,deviation,Margin_Mode,StopLoss,Takeprofit);
{
//----
if(!BUY_Signal) return(true);
ENUM_POSITION_TYPE PosType=POSITION_TYPE_BUY;
//---- Ïðîâåðêà íà èñòå÷åíèå âðåìåííîãî ëèìèòà äëÿ ïðåäûäóùåé ñäåëêè è ïîëíîòû îáú¸ìà
if(!TradeTimeLevelCheck(symbol,PosType,TimeLevel)) return(true);
//---- Ïðîâåðêà íà íà íàëè÷èå îòêðûòîé ïîçèöèè
if(PositionSelect(symbol)) return(true);
//----
double volume=BuyLotCount(symbol,Money_Management,Margin_Mode,StopLoss,deviation);
if(volume<=0)
{
Print(__FUNCTION__,"(): Íåâåðíûé îáú¸ì äëÿ ñòðóêòóðû òîðãîâîãî çàïðîñà");
return(false);
}
//---- Îáúÿâëåíèå ñòðóêòóð òîðãîâîãî çàïðîñà è ðåçóëüòàòà òîðãîâîãî çàïðîñà
MqlTradeRequest request;
MqlTradeResult result;
//---- Îáúÿâëåíèå ñòðóêòóðû ðåçóëüòàòà ïðîâåðêè òîðãîâîãî çàïðîñà
MqlTradeCheckResult check;
//---- îáíóëåíèå ñòðóêòóð
ZeroMemory(request);
ZeroMemory(result);
ZeroMemory(check);
long digit;
double point,Ask;
//----
if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true);
if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true);
if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true);
//---- Èíèöèàëèçàöèÿ ñòðóêòóðû òîðãîâîãî çàïðîñà MqlTradeRequest äëÿ îòêðûâàíèÿ BUY ïîçèöèè
request.type = ORDER_TYPE_BUY;
request.price = Ask;
request.action = TRADE_ACTION_DEAL;
request.symbol = symbol;
request.volume = volume;
//---- Îïðåäåëåíèå ðàññòîÿíèÿ äî ñòîïëîññà â åäèíèöàõ öåíîâîãî ãðàôèêà
if(StopLoss)
{
if(!StopCorrect(symbol,StopLoss))return(false);
double dStopLoss=StopLoss*point;
request.sl=NormalizeDouble(request.price-dStopLoss,int(digit));
}
else request.sl=0.0;
//---- Îïðåäåëåíèå ðàññòîÿíèÿ äî òåéêïðîôèòà åäèíèöàõ öåíîâîãî ãðàôèêà
if(Takeprofit)
{
if(!StopCorrect(symbol,Takeprofit))return(false);
double dTakeprofit=Takeprofit*point;
request.tp=NormalizeDouble(request.price+dTakeprofit,int(digit));
}
else request.tp=0.0;
//----
request.deviation=deviation;
request.type_filling=ORDER_FILLING_FOK;
//---- Ïðîâåðêà òîðãîâîãî çàïðîñà íà êîððåêòíîñòü
if(!OrderCheck(request,check))
{
Print(__FUNCTION__,"(): Íåâåðíûå äàííûå äëÿ ñòðóêòóðû òîðãîâîãî çàïðîñà!");
Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode));
return(false);
}
string comment="";
StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Îòêðûâàåì Buy ïîçèöèþ ïî ",symbol," ============ >>>");
Print(comment);
//---- Îòêðûâàåì BUY ïîçèöèþ è äåëàåì ïðîâåðêó ðåçóëüòàòà òîðãîâîãî çàïðîñà
if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE)
{
Print(__FUNCTION__,"(): Íåâîçìîæíî ñîâåðøèòü ñäåëêó!");
Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));
return(false);
}
else
if(result.retcode==TRADE_RETCODE_DONE)
{
TradeTimeLevelSet(symbol,PosType,TimeLevel);
BUY_Signal=false;
comment="";
StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy ïîçèöèÿ ïî ",symbol," îòêðûòà ============ >>>");
Print(comment);
PlaySound("ok.wav");
}
else
{
Print(__FUNCTION__,"(): Íåâîçìîæíî ñîâåðøèòü ñäåëêó!");
Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));
}
//----
return(true);
}
Hi Christian
Ich mein, dieses gemacht zu haben, bzw. bei den kopierten EAs sollte das ja auch geschehen sein. Oder habe ich eine zu neue build Version beim MT5 und da hat sich wieder was dran geändert?
Hier ein beispiel von einem Autor, wo ich die Fehlermeldung erhalt:
//--- Putting all together
if(Sell_Condition_1 && Sell_Condition_2){
if(Sell_Condition_3 && Sell_Condition_4)
{
// any opened Sell position?
if(Sell_opened)
{
Alert("We already have a Sell position!!!");
return; // Don't open a new Sell Position
}
ZeroMemory(mrequest);
mrequest.action=TRADE_ACTION_DEAL; // immediate order execution
mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // latest Bid price
mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
mrequest.symbol = _Symbol; // currency pair
mrequest.volume = Lot; // number of lots to trade
mrequest.magic = EA_Magic; // Order Magic Number
mrequest.type= ORDER_TYPE_SELL; // Sell Order
mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type
mrequest.deviation=100; // Deviation from current price
//--- send order
OrderSend(mrequest,mresult);
// get the result code
if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Alert("The Sell order request could not be completed -error:",GetLastError());
ResetLastError();
return;
}
}
}
Lesen hilft manchmal!
In der Dok. (markieren OrderSend(..) + F1) steht:
...
Return Value
In case of a successful basic check of structures (index checking) returns true. However, this is not a sign of successful execution of a trade operation. For a more detailed description of the function execution result, analyze the fields of result structure.
Also man muss nur diesen bool-Wert überprüfen:
if ( !OrdeSend(..) ) { // ich hab kein mt5, daher nicht geprüft!!
switch (mresult.retcode) {
case ..: ...
Wäre wahrscheinlich auch schneller und hätte noch andere Vorteile..
Hi Christian
Ich mein, dieses gemacht zu haben, bzw. bei den kopierten EAs sollte das ja auch geschehen sein. Oder habe ich eine zu neue build Version beim MT5 und da hat sich wieder was dran geändert?
Hier ein beispiel von einem Autor, wo ich die Fehlermeldung erhalt:
//--- Putting all together
if(Sell_Condition_1 && Sell_Condition_2){
if(Sell_Condition_3 && Sell_Condition_4)
{
// any opened Sell position?
if(Sell_opened)
{
Alert("We already have a Sell position!!!");
return; // Don't open a new Sell Position
}
ZeroMemory(mrequest);
mrequest.action=TRADE_ACTION_DEAL; // immediate order execution
mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // latest Bid price
mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
mrequest.symbol = _Symbol; // currency pair
mrequest.volume = Lot; // number of lots to trade
mrequest.magic = EA_Magic; // Order Magic Number
mrequest.type= ORDER_TYPE_SELL; // Sell Order
mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type
mrequest.deviation=100; // Deviation from current price
//--- send order
OrderSend(mrequest,mresult);
// get the result code
if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Alert("The Sell order request could not be completed -error:",GetLastError());
ResetLastError();
return;
}
}
}
Das reicht nicht :
//--- send order
OrderSend(mrequest,mresult);
// get the result code
Ordersend wird ungeprüft abgeschickt ....siehe Carls beitrag.
Die Funktion von mir im ersten Post funktioniert ( aber nur in der kompletten Datei ! ) . Ich nutze die angepasst an meine Eas ...
Nur so ein kleiner Tip:
Die Standard Library nimmt dir sehr viel Arbeit ab und ist auch gut dokumentiert.
#include <Trade\Trade.mqh>
und im Verzeichnis Scripts\Examples sind einige Beispiele, die aber für Beginner schwer zu verstehen sind, da sie OOP sind.
Ein sehr umfangreiches Beispiel ist in der Codebase 'TradePanel', ist aber besch... programmiert.
Einfach viel suchen.
Viel Erfolg
Ich scheine gerade einen Knoten im Kopf zu haben...
Danke Carl für deine Antwort, aber ich hätte ich die F1 Hilfe verstanden, hätte ich hier nicht geschrieben.
Nun fehlt mir die Logik, warum ich die Ordersend Funktion in eine IF Schleife einbauen sollte. Vielleicht kann mir Jemand bitte meinen Code korrekt umformulieren und anhand von diesem Beispiel mir kurz erklären, was da nun anders, bzw warum das dann nun korrekt ist? Das wäre mir eine grosse Hilfe!
Lieben Gruss
Nun fehlt mir die Logik, warum ich die Ordersend Funktion in eine IF Schleife einbauen sollte.
Ist die Antwort true, könnte alles in Ordnung sein und Du kannst im 'true-branch' das Ergebnis beurteilen. Ist die Antworte false bist Du gleich in der richtigen 'branche' für eine Fehleranalyse.
Und es ist besserer Programierstil.

- 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.
Hallo Zusammen
Ich arbeite mich gerade in die Programmiersprache MQL5 ein und stosse immer auf das gleiche Problem. Dieses Problem tritt bei allen Expert Advisors auf. Ob die nun selber geschrieben sind oder aus dem I-net / Buch herausgeschrieben, kopiert oder heruntergeladen.
return value of 'OrderSend' should be checked
dies ist die Standart Warnung im MetaEditor und im Metatrader 5 tritt dieser Fehler auf:
error - 4756
Hat Jemand eine zündende Idee, was der Grund ist?