Diskussion zum Artikel "Entwicklung von Bestandsindikatoren mit Volumensteuerung am Beispiel des Delta-Indikators" - Seite 9

 
Aleksey Vyazmikin:

Wenn wir von offenem Interesse ausgehen, ist das die Art von Code, die Sie im Sinn hatten?

Traded delta, ich beziehe mich auf den Indikator, in dem Thread, wo unser Dialog geht auf

Sie fassen also diese Deltas in einem gleitenden Fenster (z.B. die letzten 100) oder in aufsteigender Reihenfolge (n+1 ab einem bestimmten Datum, z.B. ab dem Startdatum des aktuellen Tages) zusammen, für welchen Zeitraum? Warum für diesen Zeitraum?

Nun, ja, dieser Code ist ungefähr. Wenn in %, dann * 100. Dies ist besser für Roboter geeignet, visuell ist es besser, absolute Werte zu betrachten, IMHO.

Ich habe eine Reihe von Fenstern für verschiedene Taktiken. Etwa so:


 

Wenn man davon ausgeht, dass die Futures aktiv gehandelt werden (und für einige Märkte global die Preise von Vermögenswerten bestimmen, wie z. B. 6B, 6E, RB, CL, GC), sobald sie am nächsten liegen, sollte das Delta ab dem Beginn dieses Datums zusammengefasst werden.

Wenn Sie mit dem Delta von Aktien arbeiten, ist es viel schwieriger, den Startpunkt zu bestimmen. In der Realität nehmen die meisten Systeme (wie ClusterDelta) ein festes gleitendes Fenster, z.B. 90 Balken. Wenn man jedoch genau nachdenkt, ist es wahrscheinlich richtiger, ein Preisextremum in der Vergangenheit, z.B. 30 Tage, als Referenzpunkt zu nehmen

 

Herr Kozitsyn,

Gratulation für die tolle Arbeit! Das ist der beste Delta-Indikator bis jetzt, sehr schnell.

Ich versuche, es zu ändern, um nur positive Werte mit unterschiedlicher Farbe zu kaufen/verkaufen Delta (am besten, um die Größe der Histogramm-Balken zu vergleichen), ohne Erfolg, Sie können einige tipe geben, wie es zu tun oder posten, wo sollte den ursprünglichen Code ändern?

Eine weitere Frage, ist es möglich, ein vertikales statt ein horizontales Histogramm zu erstellen? Ich habe versucht, ein vertikales Histogramm mit https://www.mql5.com/de/articles/2714 zu zeichnen, aber es wurde kein Wert gezeichnet. Ich habe versucht, die Volumenwerte im vertikalen Histogramm zu zeichnen, aber es wurde kein König des Volumens gezeichnet (ich benutze NormalizeDouble, um von long zu double zu konvertieren).

Herzlichen Dank!

Statistical distributions in the form of histograms without indicator buffers and arrays
Statistical distributions in the form of histograms without indicator buffers and arrays
  • www.mql5.com
Histograms allow researchers to visually evaluate the distribution of statistical data grouped by the frequency of their penetration into a certain (predetermined) interval. Histograms and their use in the statistical data analysis are a well-studied topic with multiple articles devoted to it [1, 2, 3, 4, 5, 6, 7] and a large number of CodeBase...
[Gelöscht]  
frcardim:

Herr Kozitsyn,

Herzlichen Glückwunsch für tolle Arbeit! Das ist der beste Delta-Indikator bis jetzt, sehr schnell.

Danke!

Ich habe versucht, ihn so zu modifizieren, dass er nur positive Werte mit einer anderen Farbe als das Kauf-/Verkaufsdelta anzeigt (am besten, um die Größe der Histogrammbalken zu vergleichen), ohne Erfolg. Können Sie einen Tipp geben, wie man das macht, oder posten, wo man den ursprünglichen Code ändern sollte?

Ersetzen Sie DisplayValues() Funktion mit dieser:

//+------------------------------------------------------------------+
//| Отображение значений индикатора|
//+------------------------------------------------------------------+
void DisplayValues(const int index,// Номер свечи
                   const long sumVolBuy,// Суммарный объем покупок
                   const long sumVolSell,          // Суммарный объем продаж
                   const int line                  // Номер строки вызова функции
                   )
  {
//--- Проверяем корректность номера свечи
   if(index<0) // Если некорректный номер
     {
      Print(__FUNCTION__,": ОШИБКА! Некорректный номер свечи '",index,"'");
      return;                                       // Выходим
     }
//--- Рассчитаем дельту
   const double delta=double(sumVolBuy-sumVolSell);
//--- Заносим значения в буферы
   //bufDelta[ index ]= delta; // Записываем значение дельты
   bufDelta[ index ]= (delta>0) ? delta : -delta;  // Записываем значение дельты
   bufDeltaColor[ index ] =(delta>0) ?  0 : 1;     // Записываем цвет значения
   bufBuyVol[ index ] = (double)sumVolBuy;         // Записываем сумму покупок
   bufSellVol[ index ]=(double)sumVolSell;         // Записываем сумму продаж
  }

Eine andere Frage, ist es möglich, ein vertikales statt ein horizontales Histogramm darzustellen?

Das ist in diesem Indikator nicht möglich.
 

Herr Kozitsyn,


Zunächst einmal: Herzlichen Glückwunsch!!! Großartig, großartig, großartige Arbeit!!! Das ist genau das, wonach ich gesucht habe.

Allerdings ist dieser Indikator nur die Hälfte meines Wunsches. Ich würde gerne ein Bolinger-Band über den Delta-Indikator zeichnen, um mir zu zeigen, wo der Geldfluss größer ist als ein normales Verhalten. Ich hatte dies versucht, aber ich war nicht in der Lage, die Bänder Linien im gleichen Fenster zu sehen. Können Sie mir helfen?

Herzlichen Dank!!!


Rodrigo Pimenta

[Gelöscht]  
rpimentaf:

Können Sie mir helfen?

Vielen Dank!!!


Rodrigo Pimenta

Tut mir leid, aber ich arbeite nicht mit BB.

Sie können Freelance für Ihre Aufgabe verwenden.

 
Alexey Kozitsyn:

Im Allgemeinen kann man auf unserem Markt mit Zecken und Glas sehr coole Sachen machen.

Ich stimme mit Ihnen überein. Ich habe Delta für eine lange Zeit beobachtet, ich benutze es nicht oft

Sie haben einen großartigen Indikator, er funktioniert bei mir sogar am Wochenende!

Ich beobachte Delta auf Zeitrahmen von weniger als einer Minute, wenn der Preis das lokale Hoch durchbricht und es anstelle von Stopps (blaues Delta) Verkäufe am Markt gibt. Normalerweise korrigiert der Kurs nach einem solchen Setup.

Bild

Nun, es ist genau so, nur zum Thema.

Meine Frage ist eine andere. Ich habe vor kurzem angefangen zu lernen, wie man Indikatoren schreibt. Ich bin langsam meistern sie, mit der wissenschaftlichen Methode und Copypaste.

Ich wollte einen Delta-Divergenz-Indikator schreiben. Dies ist der Code der Delta-Verkaufs-Delta von AP Bars (rot), und blau Delta von unten Bars.

Mit Hilfe Ihres Indikators, durch iCustom mein Indikator funktioniert normal.

Aber da ich lerne, bin ich daran interessiert, meinen eigenen zu schreiben. Und mein eigener Indikator funktioniert nicht (. Es ist der dritte Tag, an dem ich ihn überprüfe, und er gibt nicht nach. Wenn es nicht schwierig ist, sagen Sie mir bitte, was der Fehler ist.

Die Logik der Bestimmung des Deltas ist wie folgt: Da ich das Delta auf dem aktuellen Balken nicht brauche, habe ich beschlossen, dass ich das Delta mit dem Tick-Volumen des vorherigen Balkens OnCalculate, tick_volume[] , als die Anzahl der Ticks beim Kopieren von CopyTicks berechnen kann. Der Meta-Editor kompiliert, aber gibt eine Warnung, dass ich verschiedene Datentypen in tick volume long verwenden, und in CopyTicks ist es notwendig, die Anzahl der Ticks in uint angeben. Die Zeit des Kopierens Start wird in der gleichen time[] genommen,

Beim Testen im Tester gibt es den Fehler "Array out of range", und ich kann nicht verstehen, welche Grenzen es geht über und wie zu bestimmen, was zu ändern, um den Indikator nicht funktionieren, aber zumindest diesen Fehler zu entfernen.

Hier ist der Code des Addierers, bitte lachen Sie nicht zu viel.

#property indicator_chart_window 
#property indicator_buffers 5 
#property indicator_plots   1
  
#property indicator_label1  "Diver_handl" 
#property indicator_type1   DRAW_COLOR_CANDLES 
//--- 2 Farben zum Malen von Kerzen einstellen (sie werden im Farbpuffer gespeichert) 
#property indicator_color1  clrRed,clrBlue
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 // Linienstärke, wird hier nicht wirklich benötigt.

//--- Eingabeparameter 
//--- Indikatorpuffer
double         ColorCandlesBuffer1[];//Kerzenpuffer
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[]; // Farbpuffer

string symbol;  //--- Zeichenname 
double _Delta;
//+------------------------------------------------------------------+ 
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- Zuordnung von Indikatorpuffern 
   SetIndexBuffer(0,ColorCandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
   
//--- leerer Wert (Wert, der nicht gezeichnet wird) 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
//--- Name des Symbols, mit dem die Balken gezeichnet werden 
   symbol=_Symbol;
   
//--- Einstellen der Symbolanzeige 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"Diver("+symbol+")");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| Benutzerdefinierte Indikator-Iterationsfunktion | 
//+------------------------------------------------------------------+ 
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 i,limit;
   int buf_size=rates_total-prev_calculated;
   if(rates_total<2)
      return(0);

   if(prev_calculated<3)
     {
      limit=1;
      // Arrays mit leeren Werten initialisieren
      ArrayInitialize(ColorCandlesBuffer1,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer2,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer3,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer4,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesColors,EMPTY_VALUE);
     }
   else limit=rates_total-1;

   MqlTick Ticks[];   //ein Array deklarieren, das mit Tickdaten gefüllt werden soll
   
   for(i=limit; i<rates_total-1; i++)
     {
      CopyTicks(Symbol(),Ticks,COPY_TICKS_TRADE,0,tick_volume[i]);  // Kopieren der Tickdaten in das Array Ticks in der Höhe des Tickvolumens der Kerze tick_volume[i]
      SetBarData(time[i],Ticks,i,_Delta,tick_volume[i]);// Funktion im Keller ↓

      if(open[i-1]<close[i-1] && _Delta<0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=1;
        }
      else if(open[i]>close[i] && _Delta>0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=0;
        }
      else
        {
         ColorCandlesBuffer1[i]=0.0;
         ColorCandlesBuffer2[i]=0.0;
         ColorCandlesBuffer3[i]=0.0;
         ColorCandlesBuffer4[i]=0.0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
// Füllt den Balken mit entsprechenden Ticks
void SetBarData(const datetime TimeBar,const MqlTick &Ticks[],int &Pos,double &Delta,const long vol)
  {
  int i=0;
   while(i<vol)
     {
      MqlTick Tick=Ticks[Pos];  // Kopieren der Werte des Tickdatenpuffers in die Variable
      if(i>=vol)
         break;   // wenn i sanset gleich dem Tickvolumen ist, vail †
      if((bool)(Tick.flags  &TICK_FLAG_BUY))  // wenn die Flagge "Kaufen" lautet, zum Delta hinzufügen
         Delta+=(double)Tick.volume;
      else if((bool)(Tick.flags  &TICK_FLAG_SELL)) // Wenn das Flag "Sell" ist, wird vom Delta abgezogen
         Delta-=(double)Tick.volume;
      i++;
     }
   return;
  }
//+------------------------------------------------------------------+
Ich habe viel experimentiert, daher kann es Artefakte von früheren Experimenten geben, in Form von deklarierten, aber nicht verwendeten Variablen.
[Gelöscht]  
s22aa:

Wenn es nicht schwierig ist, sagen Sie mir bitte, was der Fehler ist.

Ich kann die genaue Stelle mit dem Fehler auf den ersten Blick nicht erkennen, aber schauen Sie sich zunächst einmal an, wie CopyTicks() in meinem Indikator gehandhabt wird. Insbesondere die Rückgabe des Wertes und die Behandlung von möglichen Fehlern.

Ja, wenn ein Array-Überlauf auftritt... Sehen Sie nach, wie viele Werte sich im Array befinden und auf welches Element Sie zugreifen. Sie können auch den ersten und letzten Wert nach dem Empfang der Daten löschen, um zu sehen, ob alle Daten empfangen wurden.

 
Alexey Kozitsyn:

sehen, wie CopyTicks() in meinem Indikator gehandhabt wird.

Wow, es ist kompliziert. Ticks werden sowohl nach Zeitintervall als auch nach Anzahl kopiert. Im Allgemeinen wird das System nicht schlechter als in cosmonauts)))) dupliziert.

Ich habe gefunden, wo ich es gemacht habe.

MqlTick Tick = Ticks[Pos];

Ich versuche, ein Array in eine Variable zu kopieren. Es ist seltsam, warum der Compiler nicht darauf reagiert, und wenn man es im Tester ausführt, bleibt der Tester hängen.

Ich werde versuchen, mir etwas anderes einfallen zu lassen.
 
s22aa:

Ich versuche, ein Array in eine Variable zu kopieren.


Nein, das tust du nicht. Das ist richtig. Ich bin total verwirrt. Ich werde einen besseren Morgen haben. Morgen wird sich alles klären.