![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
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}
Genauere Angaben wären:
{
//действия с тикетом
}
OrderSend - "Gibt die Ticketnummer zurück, die dem Auftrag vom Handelsserver zugewiesen wurde, oder -1, falls der Auftrag fehlgeschlagen ist ."
Auch im Testgerät ist die erste Ticketnummer 1, nicht 0.
Genauer gesagt, wird es das sein:
{
//действия с тикетом
}
OrderSend - "Gibt die Ticketnummer zurück, die dem Auftrag vom Handelsserver zugewiesen wurde, oder -1, falls der Auftrag fehlgeschlagen ist ."
Auch im Testgerät ist die erste Ticketnummer 1, nicht 0.
So froh, die fehlende Oksana zu sehen ))
Ja, die Tickets beginnen mit 1 im Tester und auf dem DC-Server, aber Sie werden nie 1 im DC erwischen. Ihre Version funktioniert nicht ganz, es ist nicht korrekt, Ungleichheit mit -1 zu vergleichen. Was ist, wenn das echte Konto 1234567 zurückgibt?
{
//действия с тикетом
}
// так верно
Im Tester kann ein Ticket also nicht kleiner als eins sein, erst recht nicht in der realen Welt
Null kleiner als eins ist, sind beide Bedingungen korrekt, nur eine für den Vergleich, die andere für den Ausschluss.
Obwohl ich mich daran gewöhnt habe:
int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
if(ticketbuy<0)
Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
else
Print(sy," OpenPosition. OrderSend Buy successfully");
Aber bei mir sind die Bedingungen alle korrekt, nur die Logik ist anders)
{
bool ret;
int error=0;
double price=0.0;
int total=OrdersTotal();
if(!disabled(_Symbol))
{
Print(rezult);
return;
}
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderType()>1)continue;
if(OrderType()!=type)continue;
int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);
if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
if(!ret)
{
error=GetLastError();
rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
Print(rezult);
}
else
{
rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
Print(rezult);
}
}
}
Ich wünsche Ihnen ein frohes neues Jahr! Könnten Sie mir bitte sagen, was an diesem Code falsch ist?
Ich rate dazu, die Logik an der Wurzel zu ändern
Mit anderen Worten, ich muss den Überblick über offene Aufträge behalten - wie viele Verkäufe und wie viele Käufe sind offen.
Und auf der Grundlage dieser Überlegungen sollten wir Aufträge verwalten - sie öffnen und schließen
Ich weiß nicht, warum der EA eine Menge von Aufträgen öffnet, wenn die Bedingung nicht für die Eröffnung einer Position sein sollte, aber nach dem Öffnen öffnet er wieder.
Ich kann nicht verstehen, warum meine EA öffnet eine Menge von Aufträgen, wenn ich nicht will, dass es eine Position zu öffnen, aber es öffnet wieder, nachdem ich es öffnen, ich vermute, etwas ist falsch mit der Schleife, ich weiß nicht wirklich verstehen Zyklen
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS))
if(OrderMagicNumber()==magisch) // wenn unsere Magie
{
if(OrderType()==OP_BUY) sdel_b++; // bai zählen
if(OrderType()==OP_SELL) sdel_s++; // Verkäufe zählen
if(OrderType()==OP_BUYSTOP) otl_b++; // Anzahl der anstehenden Bystops
if(OrderType()==OP_SELLSTOP) otl_s++; // Zählung der anstehenden Sellstops
}
// jetzt offene Aufträge
if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Wenn es Zeit ist und keine offenen Aufträge vorhanden sind
{
OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); // eine Pending Order aufgeben
OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //
}
Ich weiß nicht, warum der EA eine Menge von Aufträgen öffnet, wenn die Bedingung nicht für die Eröffnung einer Position sein sollte, aber nach dem Öffnen öffnet er wieder.
Ich kann nicht verstehen, warum meine EA öffnet eine Menge von Aufträgen, wenn ich nicht will, dass es eine Position zu öffnen, aber es öffnet wieder, nachdem ich es öffnen, ich vermute, etwas ist falsch mit der Schleife, ich weiß nicht wirklich verstehen Zyklen
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS))
if(OrderMagicNumber()==magisch) // wenn unsere Magie
{
if(OrderType()==OP_BUY) sdel_b++; // bai zählen
if(OrderType()==OP_SELL) sdel_s++; // Verkäufe zählen
if(OrderType()==OP_BUYSTOP) otl_b++; // Anzahl der anstehenden Bystops
if(OrderType()==OP_SELLSTOP) otl_s++; // Zählung der anstehenden Sellstops
}
// jetzt offene Aufträge
if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Wenn es Zeit ist und keine offenen Aufträge vorhanden sind
{
OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //eine Position einnehmen
OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //
}
Versuchen Sie dies
sdel_s=0;
otl_b=0;
otl_s=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderMagicNumber()==magic) // Если наш Меджик
{
if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
}
}
}
Versuchen Sie dies
sdel_s=0;
otl_b=0;
otl_s=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderMagicNumber()==magic) // Если наш Меджик
{
if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
}
}
}
Eröffnet immer noch eine Menge Aufträge
Grüße. Ein frohes neues Jahr für alle!
Wenn ich versuche, einen EA zu optimieren, nachdem er ausgeführt wurde, sind die Ergebnisse und das Optimierungsdiagramm leer und das Protokoll wird in das Protokoll geschrieben:
Während der Optimierung wurden 2Durchgängedurchgeführt, 2 Ergebnisse wurden als unbedeutend verworfen
Die Deaktivierung der Option"Genetischer Algorithmus" ist nicht hilfreich. Ich verstehe, dass die Ergebnisse für den Prüfer unbedeutend erscheinen, aber wie können wir sehen, was da ist? Und dies trotz der Tatsache, dass der Expert Advisor nicht verlieren Geld für den gleichen Zeitraum (ein Jahr) während der Prüfung, aber es ist +/- 20%.