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

 
MakarFX #:

Wenn Sie "-1" nicht mögen, können Sie dies tun.

Nein, das können Sie nicht - das Programm stürzt ab, wenn Sie auf diese Weise auf Ihr Array zugreifen.

Wenn Sie auf Ihre internen Arrays zugreifen, verpassen Sie bestenfalls die benötigten Daten oder erreichen sie in der Schleife einfach nicht.

 
Nikolay Ivanov #:

Im Grunde ist es ganz einfach: Ihr Unikat fasst alle nicht übereinstimmenden Aufträge zwischen verschiedenen Magiern zusammen...

Zum Beispiel gibt es 3 Aufträge

Die erste Iteration von magic=1 unique=0, am Ende der Iteration wird unique=2 sein.

Die zweite Iteration magik=2unique=2, am Ende der Iterationwird unique=3 sein

Da 3>=Anzahl aller Aufträge, wird die while-Schleife unterbrochen... Und Magie =3 wurde nie überprüft... Also wieder Magie =2 und so weiter mit allen...

Die erste Ordnung wird standardmäßig mit magisch =1 angegeben.
Dann tritt die Schleife in Aktion:

Beginn der Iteration magic = 1 unique = 0, am Ende (wenn es bereits einen Auftrag mit magic = 1 gibt) ist magic = 1 immer noch 1 und unique = 0
Zweite Iteration magic = 2 unique = 0, am Ende magic = 2 und unique = 1 (keine Übereinstimmung) und der Retorn wird an den 2.

Ich wollte den gesamten Prozess ausdrucken, aber irgendetwas ging schief:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

Die erste Ordnung wird standardmäßig mit magic = 1 angegeben. Dann wird eine Schleife gestartet:

Beginn der Iteration magic = 1 unique = 0, am Ende (wenn es schon einen Auftrag mit magic = 1 gibt) ist magic immer noch 1 und unique = 0
Zweite Iteration magic = 2 unique = 0, am Ende ist magic = 2 und unique = 1 (keine Übereinstimmung) und der Retorn wird dem 2. Auftrag magic = 2 zugewiesen.
Die dritte sollte genauso sein...

Ich wollte den gesamten Prozess ausdrucken, aber irgendetwas ging schief:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

Streben Sie nachmehr- ALLE Programmiersprachen.

Es ist ganz einfach: In Programmiersprachen beginnt die Zählung bei Null. Die erste Zelle eines Arrays hat einen Index von 0. Daher müssen Sie eine umgekehrte Schleife machen, BEVOR Sie die Null einbeziehen. D.h. >=0

OrdersTotal() gibt z. B. den Wert 10 aus. Und Sie beginnen eine Schleife bei 10, während der letzte Index des Arrays 9 ist (Sie erinnern sich, wir beginnen bei Null?). Und was passiert, wenn Sie auf eine nicht existierende Array-Zelle zugreifen? Das ist richtig - das Programm stürzt bei einem kritischen Fehler ab, weil Sie in einen nicht zugewiesenen Speicherbereich eingedrungen sind und die Grenzen des Arrays überschritten haben.

Das sind auf jeden Fall solide Krücken. Lies, lerne und alles wird zu dir kommen.

Ich danke Ihnen. Das ist nicht das, was ich meinte. Man könnte mql alles verzeihen, wenn es unter einer offenen Lizenz stünde. Andernfalls hacke ich auf Ihnen herum. Nun, mir scheint, wir hätten zum Beispiel ein Flag in die Funktion NormalizeDouble setzen können und eine Platztrimmung oder arithmetische Rundung verwenden können. Oder wir könnten zum Beispiel die Funktionen der Positionsverwaltung erweitern, zum Beispiel die Anzahl der offenen Positionen nur für Verkauf oder Kauf zurückgeben. Außerdem könnte eine ausführlichere Hilfe geschrieben werden. Aber das ist nur die Meinung eines Amateurs. Und bitte verzeihen Sie mir, wenn mir die vorangegangene Aussage hart vorkam.
 

Es gibt eine Vielzahl von kostenlosen und guten Kursen zu C/C++.

Mql ist in ihrer Nähe, und Sie können frei lernen. Zum Glück sind dafür keine tiefgreifenden Kenntnisse erforderlich. Zumindest aber die Syntax der Sprache und die Grundlagen der Algorithmen.

Andernfalls wird das Thema unsinnig, und anstelle von Konsultationen über die Plattform und die Algorithmen werden Dialoge auf Grundschulniveau geführt - wohin soll man setzen, was ist eine Schleife und warum sind Indizes 0.

Es gibt zum Beispiel eine Website intuit.ru - dort werden Kurse über C und Algorithmen angeboten, die höchstens ein paar Wochen dauern. Gleichzeitig können Sie eine Zeitung kaufen :-)

 
Maxim Kuznetsov die Syntax der Sprache und die Grundlagen der Algorithmen.

Andernfalls wird das Thema unsinnig, und anstelle von Konsultationen über die Plattform und die Algorithmen werden Dialoge auf Grundschulniveau geführt - wohin soll man setzen, was ist eine Schleife und warum sind Indizes 0.

Es gibt zum Beispiel eine Website intuit.ru - dort werden Kurse über C und Algorithmen angeboten, die höchstens ein paar Wochen dauern. Vielleicht bekommst du gleichzeitig eine Zeitung:-)

Etwa so?


 
Artyom Trishkin #:

OrdersTotal() ergibt zum Beispiel 10. Und Sie beginnen die Schleife bei 10. Der letzte Index des Arrays ist 9 (Sie erinnern sich, wir beginnen bei Null?). Und was passiert, wenn Sie auf eine nicht existierende Array-Zelle zugreifen? Das ist richtig - das Programm stürzt bei einem kritischen Fehler ab, weil Sie in einen nicht zugewiesenen Speicherbereich eingedrungen sind und die Grenzen des Arrays überschritten haben.

Ich nehme alles zurück... Es wird kein kritischer Fehler auftreten, nur der boolesche Wert von OrderSelect wird false zurückgeben... und das ist alles... Aber natürlich ist es besser, das zu vermeiden... Denn wenn Sie falsche Code-Merkmale verwenden, ist es schwierig, mögliche Fehler vorherzusagen...


Nerd Trader#:

Die erste Ordnung wird standardmäßig mit magic = 1 angegeben. Dann wird eine Schleife gestartet:

Start Iteration magic = 1 unique = 0, am Ende (wenn es bereits eine Ordnung mit magic = 1 gibt) magic = 1 und unique = 0
Zweite Iteration magic = 2 unique = 0, am Ende magic = 2 und unique = 1 (keine Übereinstimmung) und die Retorn wird der 2. Ordnung magic = 2 zugeordnet.
Die dritte sollte die gleiche sein...

Ich sehe nur, dass das Auffüllen von Unique sehr schnell geht und die Grenze erreicht, und Magie wächst kaum... Generell war es falsch, dieselbe Variable sowohl für die Schleifensteuerung als auch für die Logik innerhalb der Schleife zu verwenden, wo diese Variable sich aufbläht...

Drucken, um eine Lösung in diesem Zusammenhang zu finden, aber ich würde vorschlagen, das Problem einfach neu zu formulieren... Zum Beispiel die maximale Magie in Aufträgen durch die Schleife zu finden und sie mit +1 zurückzugeben, das wäre die richtige einfache Lösung.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Sie können es so machen, der Code wird nach Bedarf aufgerufen, daher ist sein Gewicht kein Problem

Für den Test habe ich Buy/Sell

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von Neulingen zu MQL4 und MQL5, Tipps und Diskussionen zu Algorithmen und Codes

Vitaly Muzichenko, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


Semjon Semjonych.
Nikolay Ivanov #:

Ich werde sie ein wenig korrigieren. Es wird kein kritischer Fehler auftreten, nur der boolesche Wert OrderSelect wird false zurückgeben ... und das ist alles... Aber natürlich ist es besser, das zu vermeiden... Denn wenn die Code-Funktionen nicht richtig genutzt werden, ist es schwer, die möglichen Fallstricke vorherzusehen...


Ich sehe nur, dass sich das Unique sehr schnell füllt und an seine Grenzen stößt, während die Magie kaum wächst... Generell war es falsch, dieselbe Variable sowohl für die Schleifensteuerung als auch für die Logik innerhalb der Schleife zu verwenden, wobei diese Variable...

Drucken, um eine Lösung in diesem Zusammenhang zu finden, aber ich würde vorschlagen, das Problem einfach neu zu formulieren... Zum Beispiel die maximale Magie in Aufträgen durch die Schleife zu finden und sie mit +1 zurückzugeben, das wäre die richtige einfache Lösung.

Dies ist der letzte Ausweg, falls diese Option nicht funktioniert. In der Zwischenzeit hat sich der Druck folgendermaßen entwickelt.

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

Sie können es so machen, der Code wird nach Bedarf aufgerufen, daher ist sein Gewicht kein Problem

Für den Test habe ich Buy/Sell

Ich werde mir das morgen ansehen, ich habe jetzt nicht die Energie, mich damit zu befassen.