Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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.
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);
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.
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
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
int OnCalculate () {
alle Computer- (Terminal-) Ressourcen werden dieser Aufgabe zugewiesen , und zwar so lange, bis sie ausgeführt (beendet) ist
return(rates_total); }
Sie dürfen keines der folgenden Dinge tun:
- Versuchen Sie, die Historie für dieses Symbol zu lesen, wenn sie nicht vorhanden ist.
- 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
.
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).
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: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
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
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?