Fehler, Irrtümer, Fragen - Seite 3031

 
Igor Makanu:

mein Code wird "bei jedem Tick hämmern" nur Ihr Indikator #1, wo Sie geschrieben haben:

wird es dem Terminal ermöglicht, selbständig den "höheren Zeitrahmen" zu erstellen.

Für mich ist das "billiger" als eine komplette Neuberechnung von Indikator 1, die in Ihrem Code bei der Synchronisierung der Historie auf der "höheren TF" stattfindet.

Ja, aber warum ist die Rückstellung vor dem Fehler bei der unteren TF?

 
Andrey Dik:

Ja, aber warum wird der vorherige Kalk auf die untere TF zurückgesetzt?

weil 0 zurückgegeben wird;
 
Andrey Dik:

Ja, aber warum wird der vorherige Kalkwert auf die niedrige TF zurückgesetzt?

Viele Varianten, wir kennen die Umsetzung nicht


es gab letztes Jahr eine ähnliche Diskussion über MT4, einer der Entwickler (ich glaube Slava) sagte, dass jeder Zugriff auf die "ältere TF" eine Datensynchronisation auslöst, wenn diese erforderlich ist....

Ich denke, dass das Terminal im MT5 auch selbst TF aufbaut, wenn es nötig ist, aber ob es Netzwerkverzögerungen oder eine ..... Implementierung gab, ist unbekannt... dann synchronisiert das Terminal, bevor es die Daten an den Indikator für eine ältere TF weitergibt, die historischen Daten mit dem Server, wenn dies sofort geschieht, und wenn es vielleicht lange dauert, dann wird es wahrscheinlich pre_calculated = 0 sein

 
Igor Makanu:

es gibt viele Optionen, wir kennen die Umsetzung nicht

Wenn das Herunterladen die historischen Daten der niedrigen TF ändert, wird der Zähler der niedrigen TF vom Terminal auf Null gesetzt, machen Sie keine Probleme aus heiterem Himmel

 
Andrey Dik:

Du beweist, dass ich Recht habe, Genosse.

Ich bin kein... Genosse des Coders. Das ist keine Bestätigung, sondern ein Hinweis: Geben Sie nicht 0 zurück. Das ist Ihr einziges Problem. Sie selbst verursachen eine vollständige Neuberechnung des Indikators.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Andrey Dik, 2021.05.28 17:26

Pre_calculated wird beim nächsten Takt nicht um 1 erhöht.


prev_calculated erhöht sich nicht; es wird immer derselbe Wert wie am Ende der Berechnung sein

return(rates_total);


d.h., was wir beim Verlassen von OnCalculated() zurückbekommen, wird beim nächsten Tick in prev_calculated zurückgegeben (außer prev_calculated == 0, das Terminal tut dies beim Starten des Indikators oder beim Synchronisieren von TF......)


Andrei Trukhanovich:

wenn das Herunterladen die Verlaufsdaten der niedrigen TF ändert, wird der Zähler der niedrigen TF vom Terminal zwangsweise auf Null gesetzt, machen Sie nicht aus heiterem Himmel Ärger

Ich habe ihm schon den zweiten Tag geschrieben - nehmen Sie die Indikatoren von Mladen und studieren Sie sie - sie funktionieren, und ohne komplizierte Synchronisation zwischen TFs, und hier ... wir sparen Ressourcen und lassen das Terminal nicht die aufgerufenen TFs bilden

 
Andrei Trukhanovich:

ersetzen.

zu

und testen Sie es.

Nicht auffordern... Er wird es sowieso nicht glauben.

 
Alexey Viktorov:

Ich ... bin kein Freund des Codierers. Dies ist keine Bestätigung, sondern ein Hinweis: Geben Sie nicht 0 zurück, denn das ist die Ursache für alle Ihre Probleme. Sie selbst verursachen eine vollständige Neuberechnung des Indikators.

Sie sind vielleicht ein Idiot, wenn Sie einen Hinweis geben, aber nicht jeder kann Ihnen helfen, etwas zu verstehen und zu erklären.

 
Andrei Trukhanovich:

ersetzen.

zu

und testen Sie es.

Vielen Dank, Andrej. Sie sind der Einzige, der sich mit dieser Frage eingehend beschäftigt hat.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) Der Indikator für Periode 3 ist noch nicht berechnet

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) Der Indikator für Periode 3 wurde noch nicht berechnet

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 sec, 50046 Bars berechnet, insgesamt 50046 Bars

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 sec, 50000 Balken berechnet, 50000 Balken insgesamt

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Indikator für Zeitraum 3 noch nicht berechnet

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 sec, 1 bar berechnet, 50047 bars total

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 sec, berechnet 1 Balken, Gesamtbalken 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 sec, berechnet 1 Balken, Balken gesamt 50002

Jetzt funktioniert alles wie geplant, die Indikatoren werden nur einmal beim ersten Durchlauf und danach nur noch einmal für jeden neuen Balken vollständig berechnet.


Der endgültige Code des zweiten Indikators, ich hoffe, es wird jemandem nützlich sein:

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[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

Jeder Narr kann dir einen Tipp geben, aber nicht jeder kann dir helfen, zu verstehen und dir im Detail zu helfen.

Zähle, wie viele Dummköpfe dich beraten... Nur ein kluger Kerl kann niemandem zuhören und ist stur...............

Sie haben Ihr eigenes Problem geschaffen und versuchen, Ihren ...code als mql-Fehler darzustellen.