Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 15

 
Vitalie Postolache:
Die Zyklen müssen in umgekehrter Reihenfolge gezählt werden, vonOrdersTotal()-1 bis 0.
Beim Schließen in einer Schleife.
 
Vitalie Postolache:
Die Schleifen müssen rückwärts zählen, vonOrdersTotal()-1 bis 0.
Dies sind Kims Funktionen und sie funktionieren ohne Fehler, das Problem ist etwas anderes
 
Sie haben also versehentlich mehrere Berater auf demselben Symbol eingeschaltet, das ist schon vielen Leuten passiert.
 
Neron_76:
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.

 
Renat Akhtyamov:

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.

Diese Beschränkung gilt für offene und schwebende Aufträge. Dies ist der zweite Fall, der mir innerhalb von eineinhalb Monaten begegnet ist; alle anderen Fälle sind korrekt.
 
Neron_76:
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:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  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);
}
 
Vitaly Muzichenko:

Versuchen Sie es auf diese Weise:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  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);
}
Ich habe die Funktionen ersetzt, beim Test funktioniert es gut. Mal sehen, wie es im Handel auf der Demo sein wird. Aber aus irgendeinem Grund scheint es mir, dass in meinem Fall sowohl diese als auch jene Funktionen die gleiche Aufgabe erfüllen, nämlich die Frage zu beantworten, ob es Aufträge und Positionen gibt.
 
Neron_76:
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 ich die doppelte Einstellung der Bestellung wiederhole, dann sollte die Funktion"SetOrder" überdacht werden, vielleicht gibt sie zwei Anfragen, nach der ersten Anfrage gibt es keinen Ausgang aus der Funktion, und sie hat Zeit, die zweite zu senden.
 
Vitaly Muzichenko:
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 dies der Fall ist, warum passiert dann nicht immer etwas zwischen den Ticks? Ich bin nicht sehr gut in diesem Bereich.
 
Neron_76:
Wenn das der Fall ist, warum passiert es dann nicht immer, sozusagen zwischen den Ticks? Ich bin nicht sehr gut in diesem Bereich.
Zwischen den Ticks eines Symbols kann es Ticks eines anderen Symbols geben. Wenn der EA mehrwährungsfähig ist, sieht er Ticks von einem anderen Symbol. Außerdem können Timer-Ereignisse - OnTimer() und OnChartEvent() - zwischen den Ticks auftreten - ich hätte fast "Ereignisereignisse" geschrieben... wäre eine Falle...