Tool zu verschenken. Update_MarketTicks.

Einloggen oder registrieren, um einen Kommentar zu schreiben
Otto Pauser
2165
Otto Pauser  

Schon seit langem hat es mich gestört, daß im 'Market Watch', Tab 'Ticks',

nach einem Neustart des Terminals ein Kurssprung (Gap) entstand, da das Terminal die Tickdaten nicht aktualisiert.

Auch im build 1910 hat sich daran nichts geändert. Urgenz beim Servicedesk brachte nichts.

Angeregt durch eine Anfrage hier im Forum https://www.mql5.com/de/forum/283940 ist mir eine Lösung eingefallen.

In Form eines Indikators, der nur in irgend einem Chart unsichtbar und unbemerkt läuft, aber seinen Zweck erfüllt.

Er benötigt eigentlich nur die OnInit(), die OnCalculate() muss lediglich für den Compiler vorhanden sein, damit er den Code als Indikator erkennt.

Anderenfalls erscheint die Meldung: 'OnCalculate function not found in custom indicator'.

Nur so nebenbei: OnInit() und OnDeinit() können bedenkenlos weggelassen werden. Also ein Indikator benötigt einzig und allein die OnCalculate.

Gleiches gilt für EAs. Nur die OnTick ist erforderlich.

//+------------------------------------------------------------------+
//|                                           Update_MarketTicks.mq5 |
//|                               Copyright © 2018, Ing. Otto Pauser |
//|                       https://www.mql5.com/de/users/kronenchakra |
//+------------------------------------------------------------------+

#property copyright     "Copyright © 2018, Ing. Otto Pauser"
#property link          "https://www.mql5.com/de/users/kronenchakra"
#property version       "1.0"
#property description   "Updates Tickcharts of all Symbols in Market Watch"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

int OnInit()
{
   MqlTick TickArray[];                      // array of ticks
   int i, count = SymbolsTotal(true);
   string symbol;
   
   for(i=0; i<count; i++)                    // iterate over all symbols
      {
         symbol=SymbolName(i,true);
         CopyTicks(symbol,TickArray);        // loads missing ticks from broker to cache, updates Tickchart
      }

   return(INIT_SUCCEEDED);                   // done
}

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])
{
   return(rates_total);
}

Viel Freude damit, für den der's auch brauchen kann.

Marktübersicht/Market Watch - Symbole im Indikator begrenzen
Marktübersicht/Market Watch - Symbole im Indikator begrenzen
  • 2018.10.14
  • www.mql5.com
Hallo, ich bin kein Programmierer, aber mein Problem sollte sich eigentlich unkompliziert lösen lassen...
Dateien:
Carl Schreiber
Moderator
9813
Carl Schreiber  

Mir schaut das sehr nach einem typischen Problem eines Thread Races aus.

Metaquotes hat versucht beim MT5 zu parallelisieren was geht. Und jetzt ist der lokale PC schneller als die Kurse eintrudeln können.

Warum verschiebst Du Deine Lösung nicht in OnCalclate() mit einem return(0) (= alles neu berechnen) und einem ChartRedraw(0) - hast Du das schon mal versucht.

Es gibt bestimmte Dinge der Initialisierung, die man leider nicht in OnInit() durchführen kann, weil die Kurse noch nicht da sind und zB. ein Indikator kein Sleep kennt.

Ein Beispiel dafür ist diese Lösung eines Indiaktors (iTrend, der andere verwendet als erstes in in OnCalcualte():

//---- checking the number of bars to be enough for the calculation
   if(BarsCalculated(BandsHandle)<rates_total
      || BarsCalculated(BearsHandle)<rates_total
      || BarsCalculated(BullsHandle)<rates_total
      || rates_total<min_rates_total)
      return(RESET);

Unübersichtlicher wird es wenn die OOP verwendest und die Instanzen mit Kursen initialisieren musst :(

Der Vorteil von OnCalculate() ist, dass sie bei jedem Tick neu aufgerufen wird, von daher meine ich, wäre Deine "Preissuche" besser in OnCalculate() aufgehoben.

Nur so eine Idee, da ich nicht weiß, ob das bei Deinem Problem funktionieren würde.

Carl Schreiber
Moderator
9813
Carl Schreiber  

Beim Grünen Tee kam mir jetzt die Idee, man könnte ja einen KursLadeIndikator.mq5 schreiben, der eigentlich nix tut als das Vorhandensein von genug Tickdaten prüft, dann rates_total zurückgibt andernfalls 0 und nach der Prüfung in OnCalculate() wieder gelöscht wird:

//---- checking the number of bars to be enough for the calculation
   if(NeedMore && BarsCalculated(HDL_KursLadeIndikator)<rates_total
      || rates_total<min_rates_total)
      return(RESET);
   NeedMore = false;
   IndicatorRelease(HDL_KursLadeIndikator);
   
Otto Pauser
2165
Otto Pauser  
Carl Schreiber:

Beim Grünen Tee kam mir jetzt die Idee, man könnte ja einen KursLadeIndikator.mq5 schreiben, der eigentlich nix tut als das Vorhandensein von genug Tickdaten prüft, dann rates_total zurückgibt andernfalls 0 und nach der Prüfung in OnCalculate() wieder gelöscht wird:

Ich hab keine Ahnung wieso keiner das Problem, bzw. die Tatsachen sieht.

Ich habe doch bewußt die Lösung mit der OnInit() gewählt, weil diese Aktion nur ein einziges mal erforderlich ist,

nämlich beim Start des Metatraders. ChartRedraw() hat mit den Tickdaten im Marketwatch überhaupt nix zu tun.

Ich hab auch keine Frage gestellt, sondern eine Lösung präsentiert.

Zum besseren Verständnis: Startet man bei geschlossenem Markt den MT5 (beim MT4 ist es genauso) und schaut sich im Marketwatch die Ticks an, ist das Fenster vollkommen leer.

Mit obigem Indi sind die Tickdaten wie durch Zauberhand plötzlich da. Für ALLE Symbole.

Grüße Otto

Carl Schreiber
Moderator
9813
Carl Schreiber  

Ah - da habe ich Dich falsch verstanden, 'tschuldigung. Ich dachte es ginge bei Dir um ein Tickchart als Hauptchart.

Ich habe dort das Problem, dass ich bei der Initialisierung von Instanzen warten muss, bis die Kurse da sind und deren Laden extra forcieren muss/will.

Otto Pauser
2165
Otto Pauser  
Carl Schreiber:

Ah - da habe ich Dich falsch verstanden, 'tschuldigung. Ich dachte es ginge bei Dir um ein Tickchart als Hauptchart.

Ich habe dort das Problem, dass ich bei der Initialisierung von Instanzen warten muss, bis die Kurse da sind und deren Laden extra forcieren muss/will.

Na da hätt ich doch was fertiges. Dieser Indi berechnet den SMA, EMA, WMA im Tickchart.

Ich häng da das ex5 an. Bei Interesse schick ich dir die mq5 und die zugehörigen mqh.

Dieser Indi verwendet auch CopyTicks(..) damit er die Daten sofort hat.

Dateien:
Tick_MAs.ex5 40 kb
Einloggen oder registrieren, um einen Kommentar zu schreiben