Fehler, Irrtümer, Fragen - Seite 2997

 
Alexey Viktorov:

Vielleicht sind die Skier schlecht?


Und dann ist da noch die RTS-6.21.


Das ist etwas anderes. Welchen Broker haben Sie und welche Version von MT5.

 
Alexey Viktorov:

Vielleicht sind die Skier schlecht?


Und auch RTS-6.21.


Vielen Dank für die Hilfe. Ich habe es herausgefunden. Verbinden Sie verschiedene Versionen von Indikatoren aus verschiedenen Ordnern.

 
Francuz:

Ja, das habe ich. Das Ergebnis hat sich nicht geändert.

Ich glaube es nicht.
Versuchen Sie es noch einmal.

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

Ich glaube es nicht.
Versuchen Sie es noch einmal.

Ich habe es herausgefunden. Das Problem war, dass zwei verschiedene ATR-Dateien aus verschiedenen Ordnern miteinander verbunden waren. Deshalb gab es eine Diskrepanz bei den Werten.

Ich danke Ihnen für Ihre Hilfe.
 
Nikolai Semko:

Ich glaube es nicht.
Versuchen Sie es noch einmal.

Nikolai hatte ein anderes Problem. Ich habe das Problem auch nicht sofort verstanden und dachte, ich müsste die Werte von einer anderen TF bekommen. Ich habe die Skier geschmiert und alles ist gut gelaufen.
 
Alexey Viktorov:
Nikolay hatte ein anderes Problem. Ich habe die Frage zuerst auch nicht verstanden, ich dachte, ich müsste die Werte von einer anderen TF bekommen. Ich habe die Skier geölt und alles ging gut.

Seltsam, ich habe nichts verstanden.
Ich habe sein Problem in meinem genau so reproduziert, wie er es beschrieben hat.
Es passierte genau deshalb, weil die einzige Ausführung von CopyBuffer beim ersten Durchlauf in OnCalculate stattfand, als prev_calculated == 0 war und es keine Garantie gab, dass bereits Balken erzeugt wurden.
Die Lösung war, diesen ersten Durchlauf zu ignorieren und den einzigen CopyBuffer nur dann auszuführen, wenn prev_calculated>0 ist.
Ich verstehe"zwei verschiedene ATR-Dateien aus verschiedenen Ordnern " nicht.

 
Nikolai Semko:

Seltsam, ich habe nichts verstanden.
Ich habe sein Problem in meinem genau so reproduziert, wie er es beschrieben hat.
Es passierte genau deshalb, weil die einzige Ausführung von CopyBuffer beim ersten Durchlauf in OnCalculate stattfand, als prev_calculated == 0 war und es keine Garantie gab, dass bereits Balken erzeugt wurden.
Die Lösung war, diesen ersten Aufruf zu ignorieren und CopyBuffer nur dann auszuführen, wenn prev_calculated>0.
Warum es"zwei verschiedene ATR-Dateien aus verschiedenen Ordnern " gab, verstehe ich nicht.

Nun, wenn das Diagramm geöffnet und der Indikator für die aktuelle TF erstellt wird, sollten die Daten bereits bereit sein, wenn das Diagramm geöffnet wird. Nicht wahr?

 
Alexey Viktorov:

Nun, wenn ein Diagramm geöffnet und ein Indikator für die aktuelle TF erstellt wird, sollten die Daten bereits bereitstehen, wenn das Diagramm geöffnet wird. Nicht wahr?

Oh, wie viele wunderbare Entdeckungen warten auf uns ... mehr

 
Alexey Viktorov:

Nun, wenn ein Diagramm geöffnet und ein Indikator für die aktuelle TF erstellt wird, sollten die Daten bereits bereitstehen, wenn das Diagramm geöffnet wird. Nicht wahr?

Ich habe es nicht richtig ausgedrückt. Die Balken sind ja - höchstwahrscheinlich sind sie fertig. Es gibt jedoch keine Garantie dafür, dass der Indikator beim ersten Aufruf von OnCalculate, wenn prev_calculated == 0 ist, für alle diese Balken neu berechnet wurde.
Sie können einen solchen Indikator ausführen, um sich zu vergewissern.
Dies muss jedoch geschehen, wenn die Kurse gehandelt werden. Wenn der Markt geschlossen ist, werden Sie die Diskrepanz nicht sehen.
Es ist also besser, es am Wochenende mit Kryptowährungen zu versuchen, die in Bewegung sind.
Wenn die Größe des Puffer-Arrays = -1 ist, bedeutet dies, dass der Indikatorpuffer noch nicht neu berechnet wurde und der BS-Wert nicht korrekt sein wird.

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Wenn Sie es beim nächsten Aufruf von OnCalculate tun (wenn prev_calculated>0), dann gibt es kein solches Problem.

SOM gab es einen Fehler im Code - korrigiert es

 
Artyom Trishkin:

Oh, welche wundersamen Entdeckungen warten auf uns... mehr

Ich meinte die Daten zur Berechnung des Indikators. Seien Sie nicht sarkastisch))))