Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 15
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
Die Zyklen müssen in umgekehrter Reihenfolge gezählt werden, vonOrdersTotal()-1 bis 0.
Die Schleifen müssen rückwärts zählen, vonOrdersTotal()-1 bis 0.
Hallo! Ich habe meinen Forex-Roboter auf meinem Demokonto installiert und er läuft nun schon den zweiten Monat. Ich öffne das Terminal heute und habe zwei offene Aufträge durch ein Signal, obwohl ich vorher nur einen Auftrag erteilt habe. Ich habe eine Beschränkung für die Anzahl der Aufträge. Was könnte der Grund dafür sein?
Nach dem Code zu urteilen, sieht es so aus, als hätten Sie einen schwebenden Auftrag und nicht einen Marktauftrag.
Die Beschränkung der Anzahl der offenen Aufträge gilt nur für Marktaufträge.
Aus diesem Grund gibt es keinen Fehler und somit auch kein Problem.
Nach dem Code zu urteilen, sieht es so aus, als hätten Sie einen schwebenden Auftrag und nicht einen Marktauftrag.
Die Begrenzung der Anzahl der offenen Aufträge gilt nur für Marktaufträge.
Es liegt also kein Fehler und damit kein Problem vor.
Die Einschränkung gilt für offene und schwebende Aufträge. Dies ist das zweite Mal innerhalb von anderthalb Monaten, alle anderen Fälle sind so, wie sie sein sollten.
Versuchen Sie es auf diese Weise:
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Versuchen Sie es auf diese Weise:
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Die Funktionen wurden ersetzt, der Test läuft gut. Mal sehen, wie es im Handel auf der Demo sein wird. Aber aus irgendeinem Grund scheint es mir, dass in meinem Fall beide Funktionen die gleiche Aufgabe erfüllen, d.h. sie beantworten die Frage, ob es Aufträge und Positionen gibt.
Wenn das doppelte Setzen der Bestellung wiederholt wird, dann sollte die Funktion"SetOrder" überprüft werden, vielleicht gibt es zwei Anfragen, nach der ersten Anfrage gibt es keinen Ausgang aus der Funktion, und schafft es, die zweite zu senden.
Wenn das der Fall ist, warum passiert es dann nicht immer, sozusagen zwischen den Ticks? Ich bin nicht sehr gut in diesem Bereich.