Fehler, Irrtümer, Fragen - Seite 590

 
Swan:

Der Indikator wird für alle Balken einmal berechnet, d.h. er kann beim Start etwas langsam sein, wenn es sich um eine landwirtschaftliche Geschichte handelt.

Anschließend wird ein Wertepaar neu berechnet - alles muss funktionieren :)

Vergessen Sie nicht, dass Programmierer Menschen sind, die in ihrer Freizeit gerne von Hand durch Zeitfenster springen. Und jeder neue Zeitrahmen ist eine weitere Deinitialisierung und Initialisierung der Anatomie des Indikators, alle Berechnungen werden erneut durchgeführt. Daher wird ArrayInitialize() jedes Mal ausgelöst, wenn von einer TF zu einer anderen gesprungen wird. Wenn der Indikator komplex ist und mehrere Puffer enthält, die neu initialisiert werden müssen, häufen sich die Verzögerungen, und ich spreche nicht einmal von einem Speicherüberlauf, der automatisch zugewiesen wird.

Wie naiv ich doch bin! Ich bin immer zuversichtlich, dass die Initialisierung in OnInit() ausreicht, und ich kann mich in diesem Stadium damit vergnügen und meinen Kopf in dringendere Aufgaben in OnCalculate() stecken. Aber nein, das tue ich nicht. Übrigens, mehr oder weniger erfolgreiches Schreiben von komplexen Indikatoren hat mir kein klares Verständnis dafür gegeben, warum ArrayInitialize() genau in OnCalculate() enthalten sein muss, indem es bei jedem Tick überprüft wird, anstatt der primären und einzigen Initialisierung in OnInit(). Nach meiner Erfahrung habe ich nur Fälle gefunden, in denen die Ablehnung dieser Variante sofort zu Problemen führte, aber darauf werde ich später eingehen. Für den Moment möchte ich anmerken, dass vom Standpunkt der einfachen und offensichtlichen menschlichen Logik (und nicht der Code-Logik) ArrayInitialize() in OnCalculate() sehr verwerflich aussieht, wenn man bedenkt, dass ich noch nie auf Fälle gestoßen bin, in denen

if(prev_calculated<7) // или < чего-то там...
Das erste Mal würde das Programm mehr als einmal ausgelöst werden - beim ersten Start. Das heißt, es entstehen neue Fraktale und der Zustand ist still. Was zum Teufel macht es also in OnCalculate()?

Ich bin sogar noch naiver in meinem Glauben, dass

handle=iFractals(_Symbol,_Period);

Ich bin angeblich verpflichtet, die Arrays dieser Aufräumarbeiten und den Effekt des ökonomischen Algorithmus automatisch von der Originaldatei Fractals.mq5 zu übernehmen, die ebenfalls vorhanden ist, allerdings in einer etwas anderen Form. Aber - immer wieder nein!!! Ich musste zweimal nachdenken und meinen eigenen Code erstellen, indem ich den Indikator, dessen Handle ich verwende, kopierte. Ich erinnere mich, wie ich zum ersten Mal den Code der Indikatoren analysierte und erstaunt war, als ich Fractals.mq5 mit dem Beispiel von iFractals aus der Hilfe verglich und feststellte, dass der zweite Code größer war als der erste (selbst nach der Reduzierung seiner Länge). Ich weiß es nicht. Werfen Sie mir alle Hüte zu, aber Programmierer erwarten eigentlich, dass sie in einer Zeile etwas in ihren Code einfügen können, das auf eine ganze Bibliothek, Klasse oder etwas Umfangreiches dort verweist, aber hier...

Jetzt werde ich den Kern des Problems aufdecken, das ich vorhin erwähnt habe. Ich füge den Code des iFractals-Indikators vereinfacht für die oberen Fraktale bei. Im ersten Beispiel wird der Puffer für die gesamte Historie gefüllt. Wir wollen die Situation ändern, indem wir nur einen Teil der Geschichte kopieren. Wir kommentieren die Zuweisung der kopierten Werte für die erste Berechnung aus und setzen unseren eigenen kleineren Wert:

values_to_copy=100; // то же, что amount
Springen wir nun auf den Zeitskalen herum und lassen wir uns von den fraktalen Artefakten erschrecken, die dabei entstanden sind. Mir ist nichts Besseres eingefallen, als den nicht geerbten Codeblock clean up arrays aus Fractals.mq5 automatisch zu kopieren, um den Teil der Geschichte zu bereinigen, in dem Fraktale nicht benötigt werden:
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
Jetzt ist alles(mit viel Redundanz!!!) perfekt aufgeräumt, und gleichzeitig zeigt Print() an, wann und wie oft die Reinitialisierung funktionieren wird, und zeigt die Puffergröße an. Wir können sehen, dass es nicht 100 sind, sondern viel mehr. Wenn ich Staub von einem Tisch wischen muss, wische ich den Staub vom Tisch, anstatt die ganze Wohnung zu reinigen. Oder besteht der Trick darin, mir um jeden Preis zu versichern, dass die Speicher- und Zeitüberschreitung kein Problem ist, dass man einen Weg finden kann, das Problem indirekt zu lösen, und dass man den eklatanten Ressourcenverzehr, der sich meiner Kontrolle entzieht, ignoriert?


Schwan:

Ein fx, eine bestimmte Größe muss eingestellt werden... Warum eine gebogene Schleife mit unterschiedlichen Grenzen, wenn man eine direkte Schleife mit den gleichen Grenzen machen kann?)

Andernfalls wird der Indikator auf Krücken beruhen.

Ehrlich gesagt wollte ich nicht zur Last fallen, aber mir war klar, dass Sympathisanten den gesamten Code durchforsten würden. Es ist wie in der Anekdote über Chapay und Petka, als Wassili Iwanowitsch zurückkehrte und um eine Schaufel bat - es stellte sich heraus, dass sie kaputt war - das Pferd war begraben - das Dorf wurde von den Weißen angegriffen, während Chapay weg war. Da ich davon ausgehe, dass sich niemand mit den Details des Codes anderer Leute befassen möchte, kann ich nur auf die Indikatorausgabe verweisen, die (abgesehen von Bremsen und anderen Dingen) wie folgt aussieht: https://www.mql5.com/ru/forum/1111/page577#comment_119227. Und jetzt denken Sie darüber nach und sagen: Ist es vernünftig, zu denken, dass dort alles einfach ist und scheinbar offensichtliche Lösungen vorzuschlagen?

Nicht umsonst vereinfache und begrenze ich den Code, bevor ich in einem bestimmten Teil etwas frage. Deshalb bitte ich Sie, sich darauf zu beschränken und nicht das ganze Pferd zu exhumieren, es sei denn, es gibt einen Amateur...

Tatsächlich ist der vierte - spezielle - Puffer im Prinzip länger als die ersten drei (gleich lang), und dank SetIndexBuffer() erstreckt er sich über die gesamte Geschichte! Wenn wir die Schleifengrenzen auf den vierten Puffer ausdehnen und gleichzeitig die Größe der ersten drei Arrays an diesen anpassen, erhöht sich zumindest die Anzahl der Elemente in der Schleife, was die geschätzte Zeit für das Lesen des gesamten linken Pufferelementsegments erhöht. Dies ist nur die Spitze eines Eisbergs von Problemen, die bei einer solchen Variante des Algorithmus auftreten werden. Außerdem dauert die Neuinitialisierung anderer Puffer länger, weil sie jetzt größer sind. Das vierte spezielle Array kann sonst nicht explizit mit EMPTY_VALUE gefüllt werden, da der Indikator eine starke Transposition von Fraktalen aus anderen Zeitfenstern nach einem bestimmten Algorithmus aufweist, bei dem es keine Übereinstimmung zwischen den Indizes der ersten drei Puffer und dem vierten Puffer gibt...

Schwan:

//und EMPTY_VALUE-Werte werden den Elementen 0 und 1 von Arrays zugewiesen, mm... und auf den letzten drei Takten)

Wie das? Warum nicht alle? Das verstehe ich nicht. Können Sie das erklären? Ich beziehe mich dabei nicht auf die Zuweisung der tatsächlichen (effektiven) Werte, sondern auf die unvermeidliche Durchsuchung des gesamten Puffers. ArrayInitialize(), wie auch viele andere Array-Funktionen, basieren auf einer Schleife, die für MQL-Programmierer implizit ist.

Die Frage nach Speicherüberlauf bleibt gültig, und die Entwickler sollten darüber nachdenken, einen zusätzlichen Parameter inArrayInitialize() einzuführen, der die Anzahl und noch besser die Grenzen der Puffer-Neuinitialisierung angibt.

P.S.: Ich denke, ich kann erraten, warum ArrayInitialize() in OnInit() hier nicht effizient ist. Puffer sind dynamisch, sie ändern ihre Größe, und in OnInit() werden sie nur einmal und für die aktuelle Länge mit Werten initialisiert, wobei die tatsächlichen Größen der Puffer in OnCalculate() noch nicht bekannt sind.

Dateien:
cleanup.mq5  2 kb
 
papaklass:

Die Anzeige im Visualisierer funktioniert nicht:

Im Terminal im Online-Terminal funktioniert es einwandfrei:

Können Sie Einzelheiten nennen? Wie ist der Indikator in das Visualisierungsdiagramm gelangt?
 
papaklass:

Ich füge die folgenden Zeilen in den Code des Expert Advisors ein

Ich setze diese drei Indikatoren auf ein sauberes Diagramm und speichere die Vorlage als Expert Advisor. Das Bild ist in meinem vorherigen Beitrag online.

Ich führe den Expert Advisor im Visualizer aus.

1. Die gespeicherte Vorlage anzeigen

2. Versuchen Sie, die Visualisierung ohne die Vorlage laufen zu lassen (d.h. löschen Sie die entsprechende tpl-Datei vorher). In der neuesten Version 555 sollten die automatisch hinzugefügten benutzerdefinierten Indikatoren korrekt angezeigt werden.

 
papaklass:

Alles funktioniert. Ich danke Ihnen.

Die Vorlage wurde entfernt. Von Experten in OnInit() vorgeschrieben:

Zeigen Sie Ihre Vorlage. Der Indikator sollte auch mit der Vorlage normal angezeigt werden (d.h. es gibt ein Problem und es sollte gelöst sein)
 
papaklass:

Übermittlung der *.tpl-Datei

Jetzt wieder mit Vorlage versucht - funktioniert nicht. Entfernen Sie die Vorlage - es funktioniert.

Ich danke Ihnen. Wir werden uns das ansehen.
 

x100intraday:

Denken Sie darüber nach und sagen Sie mir, ob es sich lohnt, zu glauben, dass dort alles einfach ist und scheinbar offensichtliche Lösungen vorgeschlagen werden?

alle Genies sind einfach.

Den Rest konnte ich nicht machen. Die Anekdote über die Frage im Forum, wie man Mandeln entfernt, erinnert mich daran :)

Ich bin nicht sicher, wie ich es machen soll... Ich bin nicht sicher, wie ich es machen soll.

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • Stimmen: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

alle Genies sind einfach.

Den Rest konnte ich nicht machen. Die Anekdote über die Frage im Forum, wie man Mandeln entfernt, erinnert mich daran :)

Das Beispiel des imho orthodoxen Indikators Fraktale begrenzt. vielleicht hilft es ja...

Eigentlich schreibe ich den Indikator über einen Handle... Aber ich mag die Idee, auf ArrayInitialize() zu verzichten und stattdessen explizit manuell mit EMPTY_VALUE-Werten zu füllen. Danke, ich werde versuchen, ein neues Chaos zu schaffen, das ich hoffentlich später nicht aufräumen muss. Es wird zwar Feinheiten und Unannehmlichkeiten geben, aber ich sehe sie schon im Voraus... aber egal.
 

Nächster Code:

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

Ausgänge:

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) andere = {123, 456}

Die Initialisierungsliste hat also nicht funktioniert, es ist Müll in der Struktur. Ist dies ein Fehler oder nicht?

 

Ich habe zwei Agenten von der Cloud getrennt und sie verbinden sich immer noch alle 30 Sekunden mit den Cloud-Servern.

MO 0 Netzwerk 00:00:17 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
LK 0 Netzwerk 00:00:47 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RG 0 Netzwerk 00:01:17 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
NS 0 Netzwerk 00:01:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RO 0 Netzwerk 00:02:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
OK 0 Netzwerk 00:02:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
MG 0 Netzwerk 00:03:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
DR 0 Netzwerk 00:03:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
DN 0 Netzwerk 00:04:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
EJ 0 Netzwerk 00:04:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
GF 0 Netzwerk 00:05:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RR 0 Netzwerk 00:05:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
NN 0 Netzwerk 00:06:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
KJ 0 Netzwerk 00:06:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
QF 0 Netzwerk 00:07:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
HQ 0 Netzwerk 00:07:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
PM 0 Netzwerk 00:08:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
QI 0 Netzwerk 00:08:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
KE 0 Netzwerk 00:09:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
NQ 0 Netzwerk 00:09:51 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
OM 0 Netzwerk 00:10:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RI 0 Netzwerk 00:10:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
LE 0 Netzwerk 00:11:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
EP 0 Netzwerk 00:11:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
IL 0 Netzwerk 00:12:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
HH 0 Netzwerk 00:12:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
FD 0 Netzwerk 00:13:18 verbunden mit 2.agents.mql5.com (über einen Proxyserver)

 
Konstantin83:

Ich habe zwei Agenten von der Cloud getrennt und sie verbinden sich immer noch alle 30 Sekunden mit den Cloud-Servern.

Lassen Sie uns zu servicedesk gehen.

Bitte klären Sie, wie genau Sie die Verbindung getrennt haben? Haben Sie die Dienste gelöscht (eingefroren)? Bitte fügen Sie die Protokolle der Problem-Agenten bei.

Die Proxy-Einstellungen in Ihren Protokollen sind etwas seltsam. Haben Sie die Proxy-Einstellungen in Ihre Agenten-Konfigurationen geschrieben? Bitte fügen Sie der Bewerbung die common.ini Ihres Agentenmanagers bei.