Fragen von einem "Dummy" - Seite 235

 
lazarev-d-m:

Geändert in dies

Es scheint zu funktionieren.

Ihre Arrays sind nicht serialisiert.

Deshalb ist es das hier.

Buffer[i+1]=Buffer[i]+delta;

ein Blick in die Zukunft


Es berechnet nicht 0 bar neu - aus dem gleichen Grund - wie Ihr Start - es beginnt nicht mit 0.

 
sergeev:

Ihre Arrays sind nicht serialisiert.

Das ist der Grund, warum es so ist.

einen Blick in die Zukunft werfen.


Aus demselben Grund, aus dem Sie nicht mit 0 beginnen, wird auch nicht 0 bar neu berechnet.

Mein 0 bar wird nicht nach der Formel berechnet.

Buffer[0]=price[0]; 

Und dann wird der Indikator auf der Grundlage der Preisbewegung mit dem Trend Schritt halten.

Zum Beispiel, wenn der Preis hat sich weg von dem Indikator und wird sich nicht bewegen, dann während der"Periode" der Kerze Indikator wird der Preis aufholen, das ist eine Art Alternative zu MA für mich

 

lazarev-d-m:

Es ist für mich eine Art Alternative zu MA

Wenn Sie 1 Bar in die Zukunft blicken, können Sie diese Alternative getrost in den Papierkorb werfen.
 

Mein erster Indikator. Ich möchte das Symbol von 0 bis 100 skalieren. Mache ich es richtig? Und wie man den aktuellen Balken nicht neu berechnen lässt (im Tester ruckelt es, aber nicht im Diagramm)

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
   ArrayInitialize(MainBuffer, EMPTY_VALUE);

//---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
   
   int first,bar,nLowBar=0,nHighBar=0;
   int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   if(prev_calculated==0) // проверка на первый старт расчёта индикатора
     {
      first=0; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated-1; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for(bar=first; bar<rates_total; bar++)
     {
      nLowBar =ArrayMinimum(low, bar, nVizCount);
      nHighBar=ArrayMaximum(high, bar, nVizCount);
      if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
        }
      else
        {
         MainBuffer[bar]=EMPTY_VALUE;
        }
     }

  
//--- return value of prev_calculated for next call

   return(rates_total);
  }
 
Konstantin83: Wie kann man erreichen, dass der aktuelle Balken nicht neu berechnet wird?

Speichern Sie die Eröffnungszeit des aktuellen Balkens und vergleichen Sie sie mit dem gleichen Wert des eingehenden Ticks. Berechnen Sie den Wert des aktuellen Balkens nur dann neu, wenn die Werte nicht übereinstimmen.

Ich würde dies in den Initialisierungsblock aufnehmen:

   nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
   

und die Variablen würden auf der globalen Ebene des Programms deklariert werden:

int first,bar,nLowBar=0,nHighBar=0, nVizCount; 
 
Yedelkin:

Speichern Sie die Eröffnungszeit des aktuellen Balkens und vergleichen Sie sie mit dem gleichen Wert des eingehenden Ticks. Berechnen Sie den Wert des aktuellen Balkens nur dann neu, wenn die Werte nicht übereinstimmen.

Ich würde dies in den Initialisierungsblock aufnehmen:

Ich danke Ihnen. Ist dies im Allgemeinen richtig?
 
Konstantin83: Und im Allgemeinen ist alles korrekt?

Ich habe nichts anderes bemerkt. Die Artikel legen eine ähnliche Struktur nahe. Es gibt eine Prüfung auf Division durch Null.

Ja, um eine Neuberechnung zu vermeiden, können Sie auch prev_calculated und rates_total vergleichen, soweit ich mich erinnere.

 
Yedelkin:

Ich habe nichts anderes bemerkt. Die Artikel legen eine ähnliche Struktur nahe. Es gibt eine Prüfung auf Division durch Null.

Ja, um eine Neuberechnung zu vermeiden, können Sie auch prev_calculated und rates_total vergleichen, soweit ich mich erinnere.

Wissen Sie, warum der Indikator die Linie nach dem Schließen des Terminals und dem Neustart des Terminals nicht zeichnet? Wenn Sie zu einem anderen Zeitrahmen wechseln, wird dieser ausgelost.
 
Konstantin83: Wissen Sie, warum nach dem Schließen des Terminals mit dem Indikator und dem Neustart des Terminals der Indikator keine Linie zeichnet? Wenn Sie zu einem anderen Zeitrahmen wechseln, wird dieser ausgelost.

Das Terminal braucht eine gewisse Zeit, um "hochzufahren", seine Datenbanken mit dem Server zu synchronisieren usw., wenn es startet. Wenn der Indikator gleichzeitig gestartet wird, gibt es möglicherweise keine Daten für die Berechnung des Indikators. Versuchen Sie die einfachste Lösung: Fügen Sie eine Verzögerung von zwei oder drei Sekunden in OnInit() ein.

Eine gute Lösung ist es, bei der Suche nach der Problemstelle alle wichtigen Informationen auszudrucken. Wie

if(nLowBar<0) Print("Ошибка, nLowBar=",nLowBar,", prev_calculated=",prev_calculated,", bar=",bar);
 

Yedelkin:

forward666 : Ich brauche eine Visualisierung

Ich habe noch keine Hilfe für den Live-Handel gefunden - versuchen Sie einfach, eine Position in einem Demokonto zu eröffnen und zu schließen.

Hier ist sie: https://www.mql5.com/ru/forum/6343/page96#comment_419028