Indikatoren: Setka (Gitter) - Seite 2

 
Prival:
hat eine neue Version 3.09 auf Code Base gepostet, du kannst sie herunterladen.

Man kann es noch ein bisschen verbessern.

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

In solchen Konstruktionen ist ObjectFind() offensichtlich unnötig. Beim Erstellen mit ObjectCreate() wird ähnlich in der Liste nach dem Namen gesucht und entweder ein neues Objekt erstellt, oder die Parameter der Ankerpunkte des bestehenden geändert.
.

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

Für Objekte, die mit dem MQL-Programm erstellt wurden, wird diese Eigenschaft auf false gesetzt.

Es macht auch keinen Sinn, den Wert von OBJPROP_WIDTH zu ändern, da er ohnehin gleich 1 ist.

Nach meinen Messungen verringern diese Änderungen die Erstellungszeit um etwa 10 %.

 

Danke. Ich werde es mir merken. Ich arbeite gerade an etwas, aber es gibt eine Panne.

Ich habe 8 Charts geöffnet, auf denen nur das Raster zu sehen ist.

Ich simuliere die Trennung vom Netz für 5 Minuten. Dies ist das Bild nach dem Einschalten des Netzes. 2 Charts stürzen ab.

Ich füge eine neue Version des Gitters bei, Version 4.01.

Dateien:
setka__1.mq5  15 kb
 
Prival:

Danke. Ich werde es mir merken. Ich arbeite gerade an etwas, aber es gibt eine Panne.

Ich habe 8 Charts geöffnet, auf denen nur das Raster zu sehen ist.

Ich simuliere die Trennung vom Netz für 5 Minuten. Dies ist das Bild nach dem Einschalten des Netzes. 2 Charts stürzen ab.

Ich füge eine neue Version des Gitters bei, Version 4.01.

Dies ist eine Folge der Terminal-Architektur und des Indikator-Algorithmus. Der Indikator wird im Symbolstrom ausgeführt, d.h. während seiner Berechnung sind viele Operationen mit der Historie nicht möglich: Verarbeitung von Ticks, Berechnung anderer Indikatoren, Synchronisation der Historie mit dem Server, Aufbau oder Laden der Historie nach Symbol-Zeitrahmen, etc.

Da der Grid-Indikator für eine lange Zeit berechnet wird und Daten aus anderen Symbolzeitrahmen verwendet, ist es wünschenswert, seine Berechnung im Falle eines Fehlers zu unterbrechen. Wenn Sie den Code nicht ernsthaft umschreiben wollen, können Sie dies auf diese Weise tun:

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

und so:

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

Dateien:
setka.mq5  15 kb
 
antt:

Dies ist eine Folge der Terminalarchitektur und des Indikatoralgorithmus. Der Indikator wird im Symbolstrom ausgeführt, d.h. bei seiner Berechnung sind viele Operationen mit der Historie unmöglich: Verarbeitung von Ticks, Berechnung anderer Indikatoren, Synchronisierung der Historie mit dem Server, Aufbau oder Laden der Historie nach Symbolzeitrahmen usw.

Ich kann diese Vorstellung eines Streams nicht nachvollziehen, und ich habe die Hilfe zum Datenzugriff 50 Mal gelesen (( das Skript ist dort als Beispiel angegeben. Und es dauert etwa eine Minute für die Ausführung (eine lange Zeit), aber es scheint, dass ich angefangen habe, es zu verstehen. Habe ich das richtig verstanden, dass während der Berechnung des Indikators, d.h. während der Ausführung der Funktion

int OnCalculate () {
alle Ressourcen des Computers (Terminal) werden dieser Aufgabe zugewiesen, und zwar so lange, bis sie ausgeführt (abgeschlossen) ist

return(rates_total); }

Sie dürfen keines der folgenden Dinge tun:

- versuchen, die Historie dieses Symbols zu lesen, wenn sie nicht vorhanden ist

- einen anderen Zeitrahmen anfordern

- ein anderes Symbol anfordern

Ich glaube, ich habe verstanden, wie man das Programm neu aufsetzen kann, man muss alle Zeilen beim ersten Aufruf setzen und sie bis if(prev_calculated==0) vergessen.

antt richtig ?

S.Y.

  1. Händler - eine Person, die auf Harken tritt.
  2. Dummy - ein Anfänger, der noch nie auf eine Rake getreten ist und daher sicher ist, dass es keine Rake gibt.
  3. Trottel - ein Trader, der regelmäßig auf Rakes tritt und trotzdem sicher ist, dass es keine Rakes gibt.
  4. Engagierter Spezialist - ein Trader, der die Technik des Tretens auf ein und dieselbe Rake beherrscht.
  5. Breit Spezialist ist ein Händler, der auf mehr als zwei Rakes gleichzeitig tritt.
  6. Mechsystem-Spezialist - ein Händler, der in der Lage ist, Rake-Hits zu automatisieren.

Nach der Einschätzung von Renat habe ich Level 5 :-)) , https://www.mql5.com/ru/forum/1165/page3 ging eine Stufe weiter )))

 

Ich habe den Code komplett umgeschrieben. Es werden keine anderen Zeitrahmen verlangt.

wenn es Ihnen nichts ausmacht. Stellen Sie die Makrobalken im Fenster Unlimit ein und gehen Sie durch M15, M5 und M1. posten Sie das Ergebnis hier im Log. Bei M1 stimmt etwas nicht - ich habe an den Service geschrieben. Ich möchte nur sehen, ob es nur mich betrifft oder alle.

Hier ist mein Log.

2010.06.17 11:39:55 Grid (EURUSD,M1) Failure or first run Time= 1.2 sec for 1293476 bars ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Failure or first run Time= 0.0 sec für 847192 Bars ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Grid (EURUSD,M15) Failure or first run Time= 0.0 sec für 285186 Bars ObjectsTotal= 962 _time= 2010.05.04 22:00:00

Vielen Dank im Voraus. Grid Version 4.11

 
Prival:

Ich kann diesen Begriff des Threads nicht verstehen, und ich habe die Hilfe über den Datenzugriff 50 Mal gelesen (( das Skript ist dort als Beispiel angegeben. Und es dauert etwa eine Minute für die Ausführung (eine lange Zeit), aber ich glaube, ich fange an, es zu verstehen. Verstehe ich das richtig, dass, während die Berechnung des Indikators läuft, d.h. die Funktion mit der Ausführung begonnen hat

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
alle Computer- (Terminal-) Ressourcen werden dieser Aufgabe zugewiesen , und zwar so lange, bis sie ausgeführt (beendet) ist

return(rates_total); }

Nicht alle Ressourcen. Aber die meisten Berechnungen im Zusammenhang mit diesem Symbol werden warten, bis OnCalculate() abgeschlossen ist.


Sie dürfen keines der folgenden Dinge tun:

- Versuchen Sie, die Historie für dieses Symbol zu lesen, wenn sie nicht vorhanden ist.

Ja. Wenn es nicht genügend Historie für das aktuelle Symbol gibt, wird die Ausführung von OnCalculate() definitiv nicht besser.


- einen anderen Zeitrahmen anfordern

Sie können es anfordern, aber wenn die Daten fehlen oder nicht ausreichend sind, macht es keinen Sinn, in OnCalculate() zu warten. Ähnlich verhält es sich mit den Daten der anderen Indikatoren für das aktuelle Symbol.

- ein anderes Symbol anfordern

Sie können ein anderes Symbol anfordern, theoretisch können Sie sogar in der Schleife warten, bis alle erforderlichen Daten erscheinen, da die Verarbeitung der Daten eines anderen Symbols (Historie, Indikatoren) in einem anderen Thread erfolgt. Aber es ist besser, dies nicht zu tun, da die Warteschleife in OnCalculate() die Verarbeitung der Daten des aktuellen Symbols stoppen wird.

.

Ich glaube, ich habe verstanden, wie man das Programm wiederholen kann, indem man alle Zeilen beim ersten Aufruf setzt und sie dann vergisst, wenn(prev_calculated==0).

Die allgemeine Empfehlung beim Schreiben von benutzerdefinierten Indikatoren: Wenn ein Fehler festgestellt wird, ein Mangel an Daten, stoppen Sie sofort die Ausführung von OnCalculate() mit return(0). Beim nächsten Tick einen neuen Berechnungsversuch mit if(prev_calculated==0) starten.
 
Prival:

wenn es nicht zu viel Mühe ist. Legen Sie die mac. Bars in der Unlimit-Fenster und gehen durch M15, M5 und M1. Das Ergebnis, das im Protokoll sein wird, hier posten. Ich habe etwas falsch auf M1 - schrieb an den Dienst. Ich möchte nur sehen, ob es mich oder alle.

2010.06.17 11:58:59 6op0k (EURUSD,M1) Failure or first run Time=0.1sec for 4009008 bars ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Fehlschlag oder erster Durchlauf Time=0.0sec für 847196 Balken ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Fehlschlag oder erster Lauf Time=0.0sec für 285187 Balken ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) Fehlschlag oder erster Lauf Zeit=0.1sec für 4009008 Balken ObjectsTotal=403Zeit=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Fehlschlag oder erster Durchlauf Zeit=0.0sec für 847196 Bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Fehlschlag oder erster Durchlauf Zeit=0.0sec für 285187 Bars ObjectsTotal=1108_time=2010.05.04 22:15:00

Danke. es bedeutet, dass ich endlich alles richtig geschrieben habe und der "Indikator" wirklich so funktioniert, wie ich es beabsichtigt habe. der Fehler, den ich hatte, ist ein Problem des Terminals (Sie haben alles normal). _time=2010.06.15 07:45:00). es ist schade, dass die entwickler im service dex schweigen. wenigstens würden sie ein paar worte schreiben (( wie

problem reproduziert...wir denken...danke

 
Prival:

danke. es bedeutet, dass ich schließlich alles richtig geschrieben und der "Indikator" wirklich funktioniert, wie ich beabsichtigt hatte. der Fehler, den ich hatte, ist ein Problem mit dem Terminal (Sie tun gut. _time=2010.06.15 07:45:00). es ist schade, dass die entwickler in der service dex schweigen. wenigstens würden sie ein paar worte schreiben (( wie

problem reproduziert...wir denken...danke.

und kann korrigiert werden:

wenn auf H1 gravfik eine vertikale oder horizontale Linie zu tragen, dann wechseln Sie zu einem anderen Zeitintervall, die Linien nicht auf den Indikator bezogen werden gelöscht.

Dies ist ein sehr bequemer Indikator für die Überprüfung der Geschichte, um visuell zu bestimmen, den Preis Schritt, aber aufgrund der Tatsache, dass die Marken (vertikale und horizontale Linien) auf die älteren Zeitintervalle setzen verschwinden beim Wechsel zu einem kleineren Zeitintervall, wird es unangenehm.

 

Der Indikator hat das Problem der brauchbaren Anzeige der Preisskala in den Terminalfenstern perfekt gelöst.

Kompilierung in Builds bis einschließlich 3021 zeigt keine Fehler und alles wird OK gezeichnet (und auch wenn Sie die zuvor kompilierte Version in ein neues Build des Terminals werfen).

Die Kompilierung in späteren Builds zeigt keine Fehler, aber im Terminal zeichnet der Addierer keine vertikale Markierung und schreibt in den Logs: 1 leaked strings left

Nachdem ich die Zeile auskommentiert habe:

StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":":",IntegerToString(str.min,2,'0'),"_N",line_counter);

der Fehler in den Terminalprotokollen verschwindet (obwohl die Linien nicht gezeichnet werden).

Wo soll man graben? Wie kann man ein großartiges Werkzeug wiederbeleben?