FMIC: Ein Ratschlag: Verwenden Sie nicht "Ask" oder "Bid" - verwenden Sie stattdessen "OrderClosePrice()". Dies ist ein Echtzeitwert, unabhängig davon, ob es sich um einen Kauf- oder Verkaufsauftrag handelt.
Nicht in Echtzeit.
Bei Ask und Bid müssen Sie RefreshRates() nach Verzögerungen, d.h. zwischen mehreren Serveraufrufen, nach Sleep oder einer langen Berechnung aktualisieren.
Bei OrderClosePrice wird der Preis nur bei einem OrderSelectaktualisiert. Daher müssen Sie nach einem Sleep oder einer langen Berechnung (oder wenn Sie eine Order zwischen OnTick-Aufrufen ausgewählt halten) eine neue Auswahl treffen.
Bei Ask und Bid müssen Sie RefreshRates() nach Verzögerungen, d.h. zwischen mehreren Serveraufrufen, nach Sleep oder einer langen Berechnung einsetzen.
Bei OrderClosePrice wird er nur bei einem OrderSelectaktualisiert. Daher müssen Sie nach einem Sleep oder einer langen Berechnung (oder wenn Sie eine Order zwischen OnTick-Aufrufen ausgewählt halten) erneut auswählen.
Vielen Dank für die Information. Ich war mir nicht bewusst, dass "OrderClosePrice()" gepuffert wird. Ich vermute also, dass weder "OrderClosePrice()" noch die "Ask"/"Bid" die ideale Echtzeitlösung sind.
Sind Sie jedoch auch der Meinung, dass "OrderClosePrice()" eine bessere Gesamtlösung ist als die Verwendung von "Ask"/"Bid", nachdem die "OrderSelect()" ausgeführt wurde?
Und für eine Echtzeitlösung, wenn sie tatsächlich benötigt wird, können wir auf die Alternativen zurückgreifen:
Neuauswahl der Order mit "OrderSelect()" (EDIT: ich habe vergessen, dies im ursprünglichen Beitrag aufzuführen, obwohl Sie darauf hingewiesen haben)
"RefreshRate()" mit "Ask"/"Bid"
"MarketInfo()" mit "MODE_ASK"/"MODE_BID" (alter MQL4-Stil)
"SymbolInfoDouble()" mit "SYMBOL_ASK"/"SYMBOL_BID" (neuer Stil MQL4+ und MQL5)
"SymbolInfoTick()" (was ich sowieso schon in den meisten meiner EA's verwende)
Vielen Dank für die bisherige Hilfe. Ich glaube, ich habe jetzt das Problem mit dem Fehler 130 gelöst, aber irgendetwas stimmt mit meiner OrderSelect-Funktion nicht, was wahrscheinlich der Grund dafür ist, dass sie nur manchmal einige der Aufträge ändert. Im Folgenden finden Sie eine Liste der Dinge, die ich ausgedruckt habe. Das OrderTicket # ist völlig falsch. Diese Ticketnummer gehört zu einem Handel, den ich für den EURAUD geöffnet habe. Ich habe zwar nicht alle Ergebnisse einbezogen, aber es gibt tatsächlich mehrere Paare, bei denen die OrderTicket-Nummern nicht mit dem Paar im Handelsterminal übereinstimmen.
Könnte bitte jemand einen Blick darauf werfen und mir mitteilen, was mit OrderSelect nicht in Ordnung ist? Vielen Dank!
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Ich denke, dass ticket den gleichen Wert wie OrdersTotal ausgeben sollte, also scheint es, dass mein Zähler nicht funktioniert.
Hallo zusammen, vielen Dank für die Hilfe. Ich habe den Fehler gefunden und die Probleme sind gelöst. Da ich keinen Stoploss verwende, ist der Wert von OrderStopLoss() immer 0. Das ist kein Problem, wenn ich die Kauforder ändere, weil 0 immer kleiner ist als Bid-TrailingStop*Pip. Aber bei der Verkaufsorder kann 0 nie größer sein als Ask+Trailingstop*Pip. Also musste ich das or(|| OrderStopLoss()) zu dieser Zeile hinzufügen:
Vielen Dank für die Hilfe. Ja, es gibt definitiv ein Problem mit OrderSelect, weil es nur auf einigen Charts funktioniert. Das andere Problem ist, dass ich keine MagicNumber einfügen kann, weil die Trades manuell platziert werden. Ich habe den Teil des Codes verwendet, der meiner Meinung nach relevant ist, aber ich kann ihn nicht kompilieren. Er zeigt diesen Fehler an:
'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13
und Zeile 31 ist diese:
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
Hier ist der gesamte EA:
#property strict;
externint TrailingStart=10;
externint TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int init(){
if(TS<stoplevel){
MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
"\nbe less than the minimum levels required by your broker and the"+
"\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
}
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int deinit(){
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start(){
double Pip=Point*10;
if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
if (!OrderSelect(iWhat, eSelect, ePool)) return (false);
if (OrderSymbol() != _Symbol) return (false);
if (ePool != MODE_HISTORY) return (true);
return(OrderType() <= OP_SELL);
}
for(int i = OrdersTotal()-1; i >= 0; i--)
if (MySelect(i, SELECT_BY_POS)){
for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
int nextTkt = OrderTicket();
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
Print("Buy = ",GetLastError());
return(0);
RefreshRates();
}
}
}
}
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
Print("Sell = ",GetLastError());
return(0);
RefreshRates();
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Ja, es gibt definitiv ein Problem mit OrderSelect, weil es nur auf einigen Charts funktioniert. Das andere Problem ist, dass ich keine MagicNumber einfügen kann, weil die Trades manuell platziert werden. Ich habe den Teil des Codes verwendet, der meiner Meinung nach relevant ist, aber ich kann ihn nicht kompilieren lassen.
Ich habe Ihnen ein perfektes Codegerüst gegeben, auf dem Sie aufbauen können, das Ihre Probleme behebt, und habe sie sogar vorher aufgelistet, aber Sie ignorieren es und fragen sich weiterhin, warum Ihr Code nicht das tut, was Sie wollen!
Und warum? Wollen Sie, dass Ihr Code nicht funktioniert? Verwenden Sie das Beispiel und testen Sie es selbst!
Er denkt, er kann einfach ausschneiden und einfügen und muss nicht lernen zu programmieren. Er kann nicht einmal diesen einfachen Fehler beheben, ohne zu fragen:
'MySelect' - Funktion kann nur im globalen Bereich deklariert werden Trailing_v26.mq4 31 13
Nicht in Echtzeit.
Vielen Dank für die Information. Ich war mir nicht bewusst, dass "OrderClosePrice()" gepuffert wird. Ich vermute also, dass weder "OrderClosePrice()" noch die "Ask"/"Bid" die ideale Echtzeitlösung sind.
Sind Sie jedoch auch der Meinung, dass "OrderClosePrice()" eine bessere Gesamtlösung ist als die Verwendung von "Ask"/"Bid", nachdem die "OrderSelect()" ausgeführt wurde?
Und für eine Echtzeitlösung, wenn sie tatsächlich benötigt wird, können wir auf die Alternativen zurückgreifen:
Warum versuchen Sie, das Rad neu zu erfinden?
Schauen Sie hier - Sie finden alles, was Sie brauchen.
Wenn nicht, fangen Sie an, den Quellcode zu ändern.
Vielen Dank für die bisherige Hilfe. Ich glaube, ich habe jetzt das Problem mit dem Fehler 130 gelöst, aber irgendetwas stimmt mit meiner OrderSelect-Funktion nicht, was wahrscheinlich der Grund dafür ist, dass sie nur manchmal einige der Aufträge ändert. Im Folgenden finden Sie eine Liste der Dinge, die ich ausgedruckt habe. Das OrderTicket # ist völlig falsch. Diese Ticketnummer gehört zu einem Handel, den ich für den EURAUD geöffnet habe. Ich habe zwar nicht alle Ergebnisse einbezogen, aber es gibt tatsächlich mehrere Paare, bei denen die OrderTicket-Nummern nicht mit dem Paar im Handelsterminal übereinstimmen.
Könnte bitte jemand einen Blick darauf werfen und mir mitteilen, was mit OrderSelect nicht in Ordnung ist? Vielen Dank!
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Ich denke, dass ticket den gleichen Wert wie OrdersTotal ausgeben sollte, also scheint es, dass mein Zähler nicht funktioniert.
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true
2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1
2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357
Hallo zusammen, vielen Dank für die Hilfe. Ich habe den Fehler gefunden und die Probleme sind gelöst. Da ich keinen Stoploss verwende, ist der Wert von OrderStopLoss() immer 0. Das ist kein Problem, wenn ich die Kauforder ändere, weil 0 immer kleiner ist als Bid-TrailingStop*Pip. Aber bei der Verkaufsorder kann 0 nie größer sein als Ask+Trailingstop*Pip. Also musste ich das or(|| OrderStopLoss()) zu dieser Zeile hinzufügen:
Vielen Dank für die Hilfe. Ja, es gibt definitiv ein Problem mit OrderSelect, weil es nur auf einigen Charts funktioniert. Das andere Problem ist, dass ich keine MagicNumber einfügen kann, weil die Trades manuell platziert werden. Ich habe den Teil des Codes verwendet, der meiner Meinung nach relevant ist, aber ich kann ihn nicht kompilieren. Er zeigt diesen Fehler an:
'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13
und Zeile 31 ist diese:
Hier ist der gesamte EA:
Ja, es gibt definitiv ein Problem mit OrderSelect, weil es nur auf einigen Charts funktioniert. Das andere Problem ist, dass ich keine MagicNumber einfügen kann, weil die Trades manuell platziert werden. Ich habe den Teil des Codes verwendet, der meiner Meinung nach relevant ist, aber ich kann ihn nicht kompilieren lassen.
Ich habe Ihnen ein perfektes Codegerüst gegeben, auf dem Sie aufbauen können, das Ihre Probleme behebt, und habe sie sogar vorher aufgelistet, aber Sie ignorieren es und fragen sich weiterhin, warum Ihr Code nicht das tut, was Sie wollen!
Und warum? Wollen Sie, dass Ihr Code nicht funktioniert? Verwenden Sie das Beispiel und testen Sie es selbst!