Fehler, Irrtümer, Fragen - Seite 567

 
CTrade hat also funktioniert... Man braucht nur eine Datei, um alles neu zu machen... Wieder ein Hubschrauber-U-Boot... Und ich habe dir gesagt, dass ich nicht weiß, wie, kein Bumm... :)
 

Ja... im Prinzip ist das alles dasselbe...

 

Die neue Version kopiert keine einfachen Strukturen mehr in der Schleife. Hier ist ein Testskript:

//+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct  trade_settings
  {
   int      reopened;
   int      reverse; 
   int      TrailingStop;
   int      WithoutlossLevel;
   int      WithoutlossProfit;
   double   LossToReverse;
   int      MAPeriod;
   int      MA_use;
   double   Lots;
   int      takeprofit; 
  };
trade_settings arr_tr_set_ini[3]={  
 {60,90,1000,100,900,2000.0,105,1,0.13,2700},   // EURUSD
 {130,1298,400,300,600,1000.0,130,1,0.1,2800},  // GBPUSD
 {110,140,200,600,800,1000.0,85,0,0.15,1700}};   // AUDUSD 
trade_settings symb_default={110,130,200,1300,1500,3000.0,100,1,0.1,1000};

class CTest_Copy_Struct
  {  
protected:
   trade_settings    m_tr_set;
public:
   void              Copy_tr_set(const trade_settings& tr_set){m_tr_set=tr_set;}
   void              Print_tr_set(){printf("Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                        printf("LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void              Zero(){ZeroMemory(m_tr_set);} 
  };

void OnStart()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[0]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[2]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total=ArraySize(arr_tr_set_ini);
   for(int i=0;i<3;i++)
     {
      Print("i=",i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars:

Ergebnis:

2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Zugriffsverletzung beim Lesen von 0x00000000209FFFAC in 'E:\Programmdateien\Championship_2011\MQL5\Scripts\Test_Copy_Struct.ex5'
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) i=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=3000.00 MAPeriod=100 MA_use=1 Lots=0.10 takeprofit=1000
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Einstellung reopened=110 overpos=130 TrailingStop=200 WithoutlossLevel=1300 WithoutlossProfit=1500
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=1000.00 MAPeriod=85 MA_use=0 Lots=0.15 takeprofit=1700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD, M15) Einstellung reopened=110 overpos=140 TrailingStop=200 WithoutlossLevel=600 WithoutlossProfit=800
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=2000.00 MAPeriod=105 MA_use=1 Lots=0.13 takeprofit=2700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Einstellung reopened=60 overpos=90 TrailingStop=1000 WithoutlossLevel=100 WithoutlossProfit=900
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=0.00 MAPeriod=0 MA_use=0 Lots=0.00 takeprofit=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Einstellung reopened=0 overpos=0 TrailingStop=0 WithoutlossLevel=0 WithoutlossProfit=0

 

https://www.mql5.com/ru/docs/basis/function/events sagt am Ende:"Zum besseren Verständnis ist es sinnvoll, den Indikator auszuführen, dessen Code unten beigefügt ist. "

Führen Sie den Code aus. Über das Wochenende. Es kam zu keinem besseren Verständnis - es war gut so, wie es war, denke ich, aber die schlimmsten Eindrücke wurden hinzugefügt. Am Wochenende gibt es keine Ticks, so dass prev_calculated zu diesem Zeitpunkt immer 0 ist, wenn man von Zeitrahmen zu Zeitrahmen wechselt:

An einer Stelle erscheint jedoch dieser Wert (keine erneute Verbindung, ehrlich gesagt, sehr edel!):

und lustige Linien auf dem Diagramm:

Oder nur halb so viel Spaß, wie das hier:

Am Anfang der Geschichte gab es sogar Linien in Form eines Zickzacks (leider habe ich vergessen, einen Screenshot zu machen, und konnte ihn nicht reproduzieren).

Auch auf anderen TFs sind Linien zu finden, allerdings in geringerem Umfang. Sie können sich leicht selbst davon überzeugen.

War es genau das, was die Autoren sagen wollten?

Warum ist das Ergebnis von prev_calculated in Abwesenheit von Ticks zumindest ungleich, wenn nicht sogar seltsam? Funktioniert etwas nicht, wenn man von TF zu TF springt?

Hätten diese (oder andere) Linien außerhalb der Zecken erscheinen müssen?

Kann in seltenen Fällen ein relativ häufiges Springen von TF zu TF eine Art Pseudotick erzeugen, der die Berechnung von Balkenwerten in der Historie usw. auslöst?

Sollte ich erwarten, dass das fehlerhafte Verhalten des Terminals beseitigt wird? Oder soll ich Mathe lernen?

Vielleicht versuche ich etwas zu tun, was ich nicht tun sollte? In diesem Fall sollten Sie Ihren Standpunkt begründen.

Ich habe eine Menge Fragen... aber das ist erst der Anfang...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Fortsetzung folgt...

Unter demselben Link findet sich folgender Satz:"Hinweis: Wenn die Funktion OnCalculate den Wert Null zurückgibt, werden im Datenfenster des Client-Terminals keine Indikatorwerte angezeigt. "

Die Sache ist die... Wenn es sein muss, stimme ich gerne jedem Armwachstum zu und renne sofort los, um ihn zu begradigen, falls nötig. Aber. Bei einfachen und mittelkomplexen Indikatoren können Sie einige Stolperfallen irgendwie überwinden. Aber wie der Code komplexer wird, jede Funktion von Copy... () (sowohl mit einem anderen Indikator Handle als Argument, und ohne sie) beginnen, die Situation zu komplizieren, wie ich persönlich denke, Umgang mit MQL-Programmierung vor einer Woche. Hier kommt der Punkt, an dem man nicht weiß, was noch im Code geändert werden kann, denn alles, was geändert werden kann, wurde geändert, und der Rest, so scheint es mir, darf nicht geändert werden, weil er nichts mit dem Problem zu tun hat. Oder es kommt ein absolut entwaffnender Gedanke auf: den gesamten Algorithmus zu ändern, weil die Eigenheiten und Unwägbarkeiten des Terminals nicht berücksichtigt wurden. Schließlich müssen Sie sich beim Studium von MQL anhand der Dokumentation mit den Nuancen auseinandersetzen, die die Entwickler - höchstwahrscheinlich unbeabsichtigt - verschwiegen haben. Und der MQL-Programmierer lernt viele Dinge nie, nachdem er die Dokumentation vollständig studiert hat... Und was am enttäuschendsten ist: Mit MQL kann man viele der Unwägbarkeiten des Terminals entweder gar nicht korrigieren oder man kann zweifelhafte Krücken benutzen und stürzt eines Tages schmerzhaft ab...

Na ja... Ich bin heute ein bisschen verrückt geworden. Es ist Wochenende.

Und das wollte ich Ihnen heute Morgen sagen...

https://www.mql5.com/ru/forum/1111/page570#comment_117425 - Ich habe das Hauptproblem, das darin besteht, dass der Indikator beim ersten Start des Terminals nicht gerendert wird, vollständig gelöst (ich hoffe, dass niemand einwenden wird, dass nichts einen fraktalen Indikator daran hindern sollte, den gesamten Verlauf korrekt zu rendern, auch wenn es keine Ticks gibt).

Das war es:

            CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

ersetzt durch:

            if(CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                       TimeUpBuffer[shift],
                                       exact_extremum)<0) return(0);

Ich gebe zu, dass ich unaufmerksam war und deshalb einen verhängnisvollen Formalismus betrieben habe.

Aber. Es hat im einfachsten Fall geholfen (ich habe den Anfangsindikator absichtlich vereinfacht). Bei einem komplexeren Indikator waren diese Operationen nicht hilfreich - zu einem bestimmten Zeitpunkt zeigten die Änderungen keinen Unterschied, insbesondere jetzt, da es viele Kopierfunktionen gibt. Und ich würde sehr gerne eine vernünftige Anleitung bekommen, wie und wohin es weitergehen soll. Schließlich wird so viel Zeit auf etwas verwendet, das sofort funktioniert. Bis jetzt weiß ich nicht einmal, ob es meine Schuld ist oder die des Terminals. Und ich bin mir nicht sicher, ob es nur an einem Mangel an Wenn undAber liegt...Hier und da sieht es verdächtig aus, wie zum Beispiel...

Ich werde den Code an Entwickler in meinem persönlichen, wenn nötig; Ich kann auch einen ähnlichen Code, aber in einer anderen Art und Weise implementiert und es funktioniert ohne Probleme (obwohl, es nicht ganz passen, um die Aufgaben und Ziele, die ich erforschen).

 
Ist der Prozess der Protokollierung der Druckfunktion in der Registerkarte "Terminal Experts" sowie im RAM und in der Datei auf der Festplatte ein separater Prozess oder nicht? Scheint getrennt zu sein, das Terminal friert nicht ein, aber warum verlangsamt es sich während des intensiven Logging-Prozesses, als ob es mit Steinen beladen wäre? Gibt es eine Möglichkeit, sie zu entladen? Wenn ich mich entschieden habe, Array-Elemente von eher mittlerer ArraySize auszugeben, sind die Verzögerungen ziemlich spürbar, und ich werde vergessen, Werte von Array-Elementen größerer Größen auf einmal auszugeben.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

Es besteht der dringende Verdacht, dass das Terminal den Cache durcheinander bringt (ich bin fast nicht mehr auf dem Laufenden, also...). Schlimmer noch - sogar MetaEditor beeinflusst irgendwie den Umgang mit dem, was gerade im Terminal vor sich geht.

Mehr als einmal bin ich auf ein Problem gestoßen, als ich den Code des MQL-Programms (das Debugging-Daten in das Expert Advisor-Tab-Protokoll druckt) modifiziert habe, es neu kompiliert habe, zum Terminal-Fenster gegangen bin und gesehen habe, dass sich die vorherigen Ergebnisse wiederholen, obwohl ich definitiv sagen kann, dass es sich nicht um eine Art verzögerte Überarbeitung des vorherigen unvollendeten Programmlaufs handelt. Es sieht also so aus, als würde ich den aktualisierten Code in MetaEditor mit F7 kompilieren und zur Ausführung schicken, und in der Zwischenzeit wird das Terminal angewiesen, den alten Code wieder abzuspielen (aus dem Cache, oder so etwas wie "Fudging" Speicherseiten durch OS). Interessanterweise ist es möglich, die "zwischen den Zähnen steckende" vorherige Version des .ex5-Codes nicht nur durch vollständiges Entladen des terminal.exe-Prozesses, sondern in einigen seltenen Fällen auch durch Schließen von MetaEditor rückgängig zu machen/zu entladen. Verstehen Sie es, wie Sie wollen, ich habe nur wiedergegeben, was ich persönlich beobachtet habe.

Vor kurzem gab es eine Situation, in der das Design:

Print(1);
for(int e=0; e<ArraySize(Arr); e++)
{
   Print(Arr[e]);
}
Das Diagramm zeigt nur den Wert des ersten Ausdrucks an, aber es war sinnlos, auf die Ausgabe der Array-Elemente zu warten. Nach dem Entfernen des ersten Drucks und der Neukompilierung begann die zyklische Ausgabe von Array-Elementen sofort. Ist es eine geheime Verschwörung von Prints gegen die MQL5-Community oder bin ich der Einzige, der so viel Pech hat?

Außerdem möchte ich darauf hinweisen, dass diese seltsamen Fälle von Terminal-Verhalten nicht auf einer MT5-Instanz beobachtet wurden, die mit Chart-Fenstern, grafischen Objekten und MQL-Programmen überladen war, sondern mit einem einzigen sauberen Chart-Fenster (ohne den Umriss eines laufenden Indikators).

[Gelöscht]  
x100intraday Vergessen Sie die Probleme - schreiben Sie es in C oder einer anderen Sprache. Alles, was wir vom Terminal aus brauchen, ist die Abfrage von Kursen, Kontoinformationen und die Ausführung von Aufträgen, und der Rest kann in einer spezialisierten Programmierumgebung geschrieben und über eine Bibliothek angeschlossen werden. Andernfalls werden sie in einem Moment etwas ändern und es wird keine Antwort darauf geben, warum es nicht funktioniert, wenn das Projekt groß ist. Solche Abenteuer braucht man nicht :) Und wenn der Expert Advisor zur gleichen Zeit neu kompilieren und mit der Wartung der laufenden Aufträge aufholen muss, verlieren Sie Geld, weil Sie herausfinden müssen, was und warum...
 
ivandurak:

1. Der ArrayInitialize-Code funktioniert nicht, wenn die Schleife unkommentiert ist, ist alles in Ordnung.

Und wenn Variablen in der Klasse und Indikatoren auf globaler Ebene mit demselben Namen deklariert werden, erscheint eine Warnung.

1. Die Funktion PlotIndexSetDouble(z,EMPTY_VALUE) wird für Indikatorpuffer in der Inite verwendet.

2. Es wird angezeigt. Dann sollte etwas dagegen unternommen werden, es wird empfohlen, Klassenmitglieder mit dem Präfix "m_" zu kennzeichnen.

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5