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

 
Maxim Kuznetsov:

Welcher Kanon ist das? Es gibt ein offizielles Dokument - es ist genau wie Ihres...alles andere ist nur eine Fälschung.

1. es lohnt sich, die Serialisierung aller verwendeten Arrays in OnCalculate einzustellen

2. bevor Sie in die Schleife einsteigen, geben Sie buff[length]=Bid+size ein; - Sie erhalten dann ungefähr das, was Sie wollen. Eine geschwungene Linie und am Ende ein "Visier" bei Bid+size

3. beobachten Sie die Arraygrenzen. Natürlich ist rates_total < length, aber darüber kann man nicht scherzen :-)

Mit anderen Worten, müssen Sie schreiben ArraySetAsSeries am Anfang und dann tanzen von dort?

Oh ja, ich habe es falsch beschrieben. Diese Linie muss links im Diagramm verlaufen und bei jedem Tick aktualisiert werden

 
YanSay:

Herzlichen Dank für Ihre ausführliche Antwort!

Ihrem Rat folgend habe ich die Zweige geteilt und alles hat funktioniert.

Ich hatte ein Problem mit der gleichzeitigen Eröffnung von 10-15 schwebenden Aufträgen. Ich habe das Problem gelöst, indem ich Ihren Code danach hinzugefügt habe:

Auch das ist keine Lösung. Der Auftrag kann manuell oder durch einen anderen EA eröffnet werden. Infolgedessen wird der zu entwickelnde EA nichts öffnen. Daher müssen wir die Anzahl der vom Expert Advisor eröffneten Aufträge zählen. Mit diesen Daten können Sie entscheiden, ob Sie einen Auftrag eröffnen wollen oder nicht.

Ich bin sicher, dass es einen besseren Weg gibt.

Erläutern Sie bitte in Bezug auf Ihren Code, was 1; i >=0; --i?

Dies ist die Standard-Auftragsschleife. OrdersTotal() - dies ist die Anzahl der Bestellungen. Die Aufträge werden von Null an indiziert. Wenn es also eine Bestellung gibt, ist ihr Index 0, während die Funktion OrdersTotal() 1 zurückgibt. Die Schleife sollte also mit dem Index beginnen, der um 1 kleiner ist als die Anzahl der Bestellungen. Wir erhalten OrdersTotal() - 1. Der zweite Operand ist die Bedingung für die Ausführung des Schleifenkörpers. In diesem Fall wird die Schleife bei i = -1 beendet. Der dritte Operand ist die Ausführung des Schleifensprungs zum nächsten Index (Abnahme um 1).

Über den Schleifenoperator können Sie in der Dokumentation nachlesen.

 
Ihor Herasko:

Auch das ist keine Option. Der Auftrag kann manuell oder durch einen anderen EA eröffnet werden. Infolgedessen wird der zu entwickelnde EA nichts öffnen. Daher müssen wir die Anzahl der vom Expert Advisor eröffneten Aufträge zählen. Anhand dieser Daten müssen wir entscheiden, ob wir einen Auftrag eröffnen wollen oder nicht.

Ich habe es auf diese Weise versucht, aber es begann wieder 10-15 Aufträge pro 1 Signal zu öffnen:

if ((OrdersTotal ()>0) && (OrderMagicNumber() != 100)) return;

Der dritte Operand soll zum nächsten Index gehen (Verringerung um 1).

Es werden also alle Aufträge vom Ende her betrachtet?

 
YanSay:

Dies habe ich versucht, aber es wurden wieder 10-15 Aufträge pro Signal geöffnet:

Es werden also alle Aufträge vom Ende her betrachtet?

Um die Funktion OrderMagicNumber() zu verwenden, sollten Sie zunächst eine Bestellung auswählen. Die Standardschleife zum Sammeln von Informationen über die eigenen Aufträge sieht wie folgt aus (z. B. die Anzahl der eigenen Aufträge zählen):

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (OrderMagicNumber() != <значение ID ордеров эксперта>)
         continue;

      ++nCnt;
   }

Nach Ausführung dieses Codes enthält die Variable nCnt die Anzahl der Arbeitsaufträge des Expert Advisors.

 
Ihor Herasko:

Ich löse das Problem wie folgt...


Ich danke Ihnen.

 
Ihor Herasko:

Um die Funktion OrderMagicNumber() zu verwenden, müssen Sie zunächst eine Bestellung auswählen. Der Standardzyklus für das Sammeln von Informationen über die eigenen Aufträge sieht folgendermaßen aus (z. B. die Anzahl der eigenen Aufträge zählen):

Nachdem dieser Code ausgeführt wurde, enthält die Variable nCnt die Anzahl der Arbeitsaufträge des EA.

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber)
     continue;
  ++nCnt;
  {
   if (nCnt>0)
      return;
  }
 }

Herzlichen Dank! Es hat geklappt!

Könnten Sie angeben, ob ++nCnt eine Substitution der erhaltenen Anzahl von Aufträgen in der Variablen nCnt selbst ist?

 
YanSay:

Herzlichen Dank! Es hat funktioniert.

Können Sie mir sagen, ob ++nCnt die empfangene Anzahl von Aufträgen in der Variablen nCnt selbst ersetzt?

In allen diesen Fällen sollten Sie sofort die Unterlagen einsehen. ))

 
YanSay:

Herzlichen Dank! Es hat funktioniert.

Können Sie mir sagen, ob ++nCnt die Substitution der erhaltenen Anzahl von Aufträgen in die Variable nCnt selbst ist?

Es gibt eine vollständige Dokumentation der Sprache, schauen Sie einfach im oberen Menü der Website nach.

Seien Sie nicht zu faul, es zu lesen, es ist unmöglich, alles im Kopf zu behalten. Fast alle, nicht nur Anfänger, schaffen es immer.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Artyom Trishkin:

Es gibt eine ausführliche Dokumentation über die Sprache, schauen Sie einfach im oberen Menü der Website nach.

Seien Sie nicht zu faul, es zu lesen - Sie können nicht alles im Kopf behalten - es ist immer da, für fast alle - nicht nur für Neulinge.

Ich danke Ihnen. Ich bin mir nicht immer sicher, in welchem Abschnitt ich suchen soll, ich bin noch nicht sehr gut darin und der F1-Editor schickt mich nicht immer an die richtige Stelle)

Ich werde versuchen, Sie nicht mit dummen Fragen zu belästigen, danke für Ihre Geduld)

 
Roman Sharanov:

1. Sie meinen, ArraySetAsSeries am Anfang zu schreiben und dann von dort zu gehen?

Oh ja, ich habe es falsch beschrieben. Sie möchten, dass diese Linie im Diagramm nach links verläuft und bei jedem Tick aktualisiert wird

Ziehen Sie also eine horizontale Linie.

Wozu braucht man Puffer und deren Neuberechnung? ObjectSetDoubke(0,myHLine,OBJPROP_PRICE,concrete_price_value);

der Benutzer sieht die Zeile, Sie verschwenden keine Zeit mit der Neuberechnung der Puffer, alle sind zufrieden und gehen fröhlich auseinander

PS: Der Indikatorpuffer dient dazu, die Ergebnisse der durchgeführten Berechnungen zu übertragen (gemeinsam zu nutzen). Das Zeichnen einer horizontalen Linie der Länge N ist anders