Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 887

 
tuner:
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.
 
rapid_minus:
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 die Ursache ist
 
tuner:
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;
}
}

 
rapid_minus:


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...

 
evillive:

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

 
rapid_minus:

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());

 
rapid_minus:

Igor Kim hat unsere als Beispiel:

...

Der Compiler verlangt jedoch, dass der Rückgabewert von OrderClose überprüft wird

Das liegt daran, dass zu der Zeit, als Igor seine Funktionen schrieb, der Compiler keine Überprüfung des Rückgabewerts verlangte, während der heutige Compiler flucht, wenn er das nicht tut
 
evillive:

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?

 
rapid_minus:

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)))