Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 33

 
Artyom Trishkin:

Hervorgehoben kann 0 zurückgeben. BCS begegnete.

Ja, korrupte Makler. Sie würden dort auch negative Zahlen eingeben.

Es wäre gut, wenn die Entwickler einen Grenzwert für den Wertebereich der einzelnen Parameter festlegen würden, wenn die Makler Symbole setzen.

 
Artyom Trishkin:

Was genau ist falsch? Das war die Frage - was mache ich falsch, um Indikatordaten aus einem nicht nativen Zeitrahmen zu erhalten?

Beispiel: Der Indikator wird auf M1 ausgeführt, und die Daten von AO sollen von M5 bezogen werden. Während wir also einen Grenzwert>1 haben (die Historie muss neu berechnet werden), liefert AO von M5 Nullen, ohne dass ein Datenfehler vorliegt. Sobald die Historie berechnet ist (Limit==0), beginnen die Daten von AO mit M5 zu kommen.

Zunächst einmal brauchen Sie solche Einträge nicht vorzunehmen:

periodForWork=PeriodForWork;

Zuerst dachte ich, Sie würden einer Variablen ihren eigenen Wert zuweisen.

Nächste:

size_ao=CopyBuffer(handle_ao,0,0,count,array_ao);

Während der Initialisierung ist das Kopieren nicht erforderlich. Die Initialisierung ist nicht für diesen Zweck gedacht. Außerdem ist dieser Datensatz nicht aussagekräftig, wenn Daten von älteren TFs angefordert werden, die zum Zeitpunkt der Anforderung von OnInit() noch nicht berechnet sind.

ArraySetAsSeries(BufferAO,true);

Dieser Eintrag muss jedoch nur einmal bei der Initialisierung vorgenommen werden.

Außerdem... ähm... Subjektiv würde ich das nicht so machen.

Ich unterteile das Programm gerne in:

1. Erster Lauf (historische Analyse);

2. Nachfolgende Läufe:

2.1. jedes Häkchen;

2.2 Der gebildete Balken;

D.h:

if( prev_calculated > 0 )             // Не первый запуск
{
 if( rates_total <= prev_calculated ) // Новый бар не сформирован
  {
  }
 else                                 // Новый бар сформирован
  {
  }
}
else                                  // Первый запуск
{
}

Und erst danach - Hauptberechnungszyklus (Funktion).

Ihre Kopierfunktionen liefern uninformative Fehler. Der Code ist nicht sehr gut.

Es gibt keine Überprüfung der Synchronisierung der Daten der älteren TF.

Und das Wichtigste dabei ist, die Reihenfolge zu verstehen. Ich rate dazu, einen Testindikator zu erstellen, der nur die Daten des Haupt-TF beim ersten Start abfragt, um zu verstehen, wie das Kopieren erfolgt. D.h., dass dies vom Anfang des Codes entfernt werden sollte:

ArraySetAsSeries(array_ao,true);

Und heben Sie das erste und das letzte Element des Arrays auf. Und erst dann, wenn nötig, ändern Sie die Richtung der Indizierung.

 
Wie auch immer, fangen Sie dort an:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input   ENUM_TIMEFRAMES inpTimeframe=PERIOD_M5;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int _handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   _handle=iAO(_Symbol,inpTimeframe);
   if(_handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),"! Хэндл индикатора iAO ТФ "+EnumToString(inpTimeframe)+" не получен!");
      return( INIT_FAILED );
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Массив-приемник значений индикатора
   double ao[];
//---
   if(prev_calculated>0)
     {

     }
   else                                        // Если первый запуск
     {
      //--- Количество просчитанных баров старшего ТФ
      int bars;
      if(( bars=BarsCalculated(_handle))<0 || !(bool)SeriesInfoInteger(_Symbol,inpTimeframe,SERIES_SYNCHRONIZED))
         return( 0 );
      //--- 
      int num=CopyBuffer(_handle,0,0,bars,ao);
      //---
      if(num<0)
        {
         Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Запрашиваемая таймсерия еще не построена!");
         return( 0 );
        }
      else if(num!=bars)
        {
         Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Скопированы не все данные (",num," из ",bars,")");
         return( 0 );
        }
      //---
      Print(__FUNCTION__,": Успех! Скопировано ",num," из ",bars," значение индикатора АО ТФ "+EnumToString(inpTimeframe));
     }
//---
   return( rates_total );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn:

Erstens brauchen Sie solche Einträge nicht vorzunehmen:

Ich dachte zuerst, Sie würden einer Variablen einen eigenen Wert zuweisen.

Nächste:

Während der Initialisierung ist das Kopieren nicht erforderlich. Die Initialisierung ist nicht für diesen Zweck gedacht. Außerdem ist dieser Datensatz nicht aussagekräftig, wenn Daten von älteren TFs angefordert werden, die zum Zeitpunkt der Anforderung von OnInit() noch nicht berechnet sind.

Dieser Eintrag muss jedoch nur einmal bei der Initialisierung vorgenommen werden.

Außerdem... ähm... Subjektiv würde ich das nicht so machen.

Ich unterteile das Programm gerne in:

1. Erster Lauf (historische Analyse);

2. Nachfolgende Läufe:

2.1. jedes Häkchen;

2.2 Der gebildete Balken;

D.h:

Und erst danach - Hauptberechnungszyklus (Funktion).

Ihre Kopierfunktionen geben uninformative Fehler. Der Code ist nicht sehr gut.

Es gibt keine Überprüfung der Synchronisierung der Daten der älteren TF.

Und das Wichtigste dabei ist, die Reihenfolge zu verstehen. Ich empfehle, einen Testindikator zu erstellen, der nur die Daten des Haupt-TF beim ersten Start abfragt, um zu verstehen, wie das Kopieren erfolgt. D.h., dass dies vom Anfang des Codes entfernt werden sollte:

Und heben Sie das erste und das letzte Element des Arrays auf. Und nur dann, wenn es notwendig ist, ändern Sie die Richtung der Indizierung.

Ich mache Variablen, die für mich auf einen Blick erkennbar sind. Wenn du sie nicht verstehst, mach sie so, dass du sie verstehst ;).

Ich beginne nicht-globale Variablen immer mit einem kleinen Buchstaben - der Grund ist einfach: Groß- und Kleinschreibung...

Dies ist der Testcode, da der Nicht-Test-Code groß genug ist, und auf MT4 fliegt er beim Umschalten des Traffics, und es gibt keine Fehler von fehlenden Daten - alles ist immer da. Aber MT5, wenn ich wechseln mtf nur für eine halbe Minute lädt die Geschichte, und dann nicht mit den Daten arbeiten, ist nicht seine TF - sagt über ihre Abwesenheit.

Deshalb habe ich darüber gesprochen, was ich falsch gemacht habe. Es stellte sich heraus, dass es notwendig ist, die Daten für alle verwendeten Clients im Init abzufragen. Ich denke, wenn Sie die geschätzte Anzahl der gebrauchten Telefone nicht im Voraus kennen, müssen Sie sie alle anfordern. Es zählt nur eine von einer halben Minute. Es gibt insgesamt 21 davon...

Stimmt wieder etwas nicht?

 
Dies ist fürAnfänger sehr nützlich:

Im MT5 dauert es nur eine halbe Minute, um die Historie herunterzuladen, wenn ein Etf gewechselt wird.


schrieb darüber

я правильно понимаю тогда, что подготовив кэш,терминал при последующих обращениях (начиная со 2 обращения) затрачивает на порядки меньше времени?

можно ли как-то уменьшить время первого обращения после перезагрузки терминала,чтобы было как в МТ4?
Теперь выводы:

    Разница только в скорости начальной инициализации кеша чарта 0.6 мс МТ4 против 113 мс у МТ5

mehr Details hier

https://www.mql5.com/ru/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

Je mehr TF oder Symbole angefordert werden, desto langsamer wird der Start sein.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:


schrieb darüber

mehr Details hier

https://www.mql5.com/ru/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

Je mehr TFs oder Zeichen abgefragt werden, desto langsamer wird der Start sein.

Ich denke, es wäre gut, wenn dies nur beim ersten Start des Indikators geschehen würde. Aber wenn ich den Zeitrahmen wechsle, wird der Verlauf bei jedem Wechsel eine halbe Minute lang geladen. Ich weiß, dass es nicht so sein sollte, aber... Ich mache etwas falsch... Und nur bei einem Indikator passiert das - wenn ich versuche, auf einen nicht-nativen Zeitrahmen zuzugreifen.
 
Artyom Trishkin:
Es wäre gut, wenn ich den Indikator nur beim ersten Mal starten würde. Jedes Mal, wenn ich den Zeitrahmen wechsle, muss ich eine halbe Minute lang den Verlauf laden. Ich weiß, dass es nicht so sein sollte, aber... Ich mache etwas falsch... Ich versuche, in nur einem Indikator auf einen nicht-nativen Zeitrahmen zuzugreifen.

Nun, messen Sie die Geschwindigkeit des Kopierens von Daten aus einem anderen Zeitraum und sehen Sie, wo der Engpass liegt.
 
Artyom Trishkin:

Wenn Sie mehrere Indikatoren von verschiedenen TFs für Berechnungen verwenden müssen, müssen Sie den Griff für jeden TF erhalten.

Wenn Sie wollen, dass es schneller geht, reduzieren Sie die Größe des Verlaufs im Terminal.

Haben Sie meinen Testindikator ausgeführt? Sammelt sie Daten?

 
Alexey Kozitsyn:

Wenn Sie mehrere Indikatoren von verschiedenen TFs für Berechnungen verwenden müssen, müssen Sie den Griff für jeden TF erhalten.

Wenn Sie wollen, dass es schneller geht, reduzieren Sie die Größe des Verlaufs im Terminal.

Haben Sie meinen Testindikator ausgeführt? Sammelt sie Daten?

Nein, das habe ich nicht.

Es stellt sich heraus, dass, wenn ich ALLE Zeitrahmen benötigen, sollte ich 21 Griffe der AO-Indikator erstellen? Ist das nicht eine Verschwendung?

 
Artyom Trishkin:

Nein, ich habe es noch nicht ausprobiert.

Es stellt sich heraus, dass Sie, wenn Sie ALLE Zeitrahmen benötigen, 21 AO-Indikator-Handles erstellen müssen? Ist das nicht eine Verschwendung?

Wie kann ich sonst die Daten vom richtigen Symbol/TF erhalten? CopyBuffer funktioniert nur mit Handles.