Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 887
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
do void start() und es wird kein Fehler auftreten
Ich danke Ihnen! Der Fehler ist verschwunden, aber die Position lässt sich immer noch nicht schließen.
Nicht genug Code, um genau zu sagen, was der Grund ist
Auszug:
void CritCloseBuy()
{
if (((Gelb_0-Rot_0)<(Gelb_1-Rot_1) && ((MA_0<MA_1)&&(MA_1>MA_2)) || ((Gelb_0-Rot_0)>(Yellow_1-Red_1)&& ((MB_0<MB_1)&&(MB_1>MB_2))))
while(true)
{
ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
if (ord_close = false)
{
Comment(" BAYposition closing failed with error #",GetLastError());//Mitteilung des Fehlers
break;
}
sonst
{
Ord=0;
break;
}
}
Das könnte der Grund für die Öffnung sein:
void CritOpen()
{
if (///Bedingung für das Öffnen//)
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,NULL,10011,0,clrNONE); //Offener Auftrag BAY, MAGIC 10011
if(ticket<=0)
{
Comment("Die Eröffnung der Position BAY-10011 ist mit Fehler #",GetLastError()) fehlgeschlagen;
break;
}
else
{
Comment("BAY-10011 Position eröffnet mit Lot 0.1,Preis", Ask);
Ord=(Ord+1);
break;
}
}
Auszug:
before ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
Es wäre schön, wenn Sie die Bestellung mit der Funktion OrderSelect() auswählen könnten. Ich verstehe den Zweck einer solchen Schleife um die Schließfunktion nicht...
before ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
Es wäre schön, wenn Sie die Bestellung mit der Funktion OrderSelect() auswählen könnten.
Ich habe die einzige. Nun, anfangs war es tatsächlich so. Ich begann, nach der Ursache zu suchen, indem ich die Fühlmethode anwendete. Ich verstehe den Sinn der Schleife nicht.
Ich schummle einfach analog: wenn ich mit der Schleife geöffnet habe, sollte ich auch schließen...
Igor Kim hat unser Beispiel:
void start() {
ManagePositions();
}
//+----------------------------------------------------------------------------+
//| Positionen zum Marktpreis schließen |
//| Parameter:|
//| sym - Instrumentenname ("" - aktuelles Symbol)|
//| op - Betrieb(-1 - beliebige Position)|
//| mn - MagischeZahl(-1 - beliebige Magie) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sym="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sym=="") sym=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderType()==OP_BUY) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
}
if (OrderType()==OP_SELL) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
}
}
}
}
}
}
Der Compiler verlangt jedoch die Überprüfung des Rückgabewerts von OrderClose
Igor Kim hat unser Beispiel:
Der Compiler verlangt jedoch, dass der Rückgabewert von OrderClose überprüft wird
Dann machen Sie es wie im Beispiel - erst auswählen und dann schließen. Dabei spielt es keine Rolle, ob es sich um den einzigen Auftrag oder um eine Million Aufträge handelt, denn jeder Auftrag muss zuerst ausgewählt werden.
Die Prüfung ist sehr einfach if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Abschlussfehler #", GetLastError());
Igor Kim hat unsere als Beispiel:
...
Der Compiler verlangt jedoch, dass der Rückgabewert von OrderClose überprüft wird
Gehen Sie also wie im Beispiel vor - erst auswählen und dann schließen. Es spielt keine Rolle, ob es nur einen Auftrag oder eine Million Aufträge gibt, jeder einzelne muss zuerst ausgewählt werden.
Die Prüfung ist sehr einfach if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Abschlussfehler #", GetLastError());
Ich habe folgendes gemacht: if (!OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red))
{
Comment("Der Abschluss der BAY-Position ist mit Fehler #",GetLastError()) fehlgeschlagen;
break;
}
sonst
{
Ord=0;
break;
}
Fordert immer wieder "Rückgabewert sollte geprüft werden .
Ich habe es so gemacht:
ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if (ord_close = false)
{
Comment("BAY position closing failed with error #",GetLastError()); //Fehlermeldung
break;
}
else
{
Ord=0;
break;
}
Stumm. Aber in beiden Fällen wird die Position nicht geschlossen
ZS: Ich glaube, es gibt einen Fehler bei der Definition der Schließ- und Öffnungsbedingungen
Der obige Beitrag zeigt ein Beispiel für eine enge Bedingung. Was könnte da falsch sein?
Es ist still. Aber in beiden Fällen wird die Position nicht geschlossen
ZS: Ich glaube, es gibt einen Fehler in der Definition der Bedingungen für das Schließen und Öffnen von Positionen
Im obigen Beitrag finden Sie ein Beispiel für eine enge Bedingung. Was könnte da falsch sein?
Wenn sich die Datei ohne Fehler nicht schließen lässt, ist die Abschlussbedingung nicht richtig. Wir müssen genau diese Bedingung überdenken und neu formulieren.
Die Klammern sind hier irgendwie falsch angeordnet:
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))
Wie wäre es damit?
if (((Yellow_0-Red_0<Yellow_1-Red_1) && (MA_0<MA_1 && MA_1>MA_2)) || ((Yellow_0-Red_0>Yellow_1-Red_1) && (MB_0<MB_1 && MB_1>MB_2)))