Mein Indikator (Oszillator)

 

Hallo,

ich bin ein frischling im programmieren und bin gerade an einem kleinen Projekt um die gegenwärtige und vergangenen Kerzen zu berechnen in einem Oszillator (auf jedem Tick). Mein Problem ist, dass ich nicht weiss wie fortfahren mit der Berechnung und zeichnen im einem separtem Indikatorfenster.

Der Code sieht folgendermassen aus:

//---PROPRIETY OF INDICATOR FaWi
#property indicator_separate_window
#property indicator_label1    "FaWi"
#property indicator_buffers   5
#property indicator_type1     DRAW_LINE
#property indicator_color1    clrDeepSkyBlue
#property indicator_width1    1
#property indicator_style1    STYLE_SOLID
#property indicator_plots     1

//---DECLARATIONS OF VARIABLES
input double A=0.10;    //
input double B=10;      //
input double C=0.75;    //
input double D=0.1;     //

input ENUM_APPLIED_PRICE Highprice= PRICE_HIGH;
input ENUM_APPLIED_PRICE LowPrice= PRICE_LOW;
input ENUM_APPLIED_PRICE OpenPrice=PRICE_OPEN;
input ENUM_APPLIED_PRICE Closeprice= PRICE_CLOSE;

//---BUFFERS
double FawiBuffer[];
double HighBuffer[];
double LowBuffer[];
double OpenBuffer[];
double CloseBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator FaWi initialization function                         |
//+------------------------------------------------------------------+

int OnInit()
  {

//---INDICATOR BUFFERS DRAWING
IndicatorBuffers(0);
SetIndexStyle(0,DRAW_LINE);
//---INDICATORS BUFFERS MAPPING
SetIndexBuffer(0,FawiBuffer,INDICATOR_DATA);
SetIndexBuffer(1,HighBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,LowBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,OpenBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(4,CloseBuffer,INDICATOR_CALCULATIONS);
//---SET LEVELS
IndicatorSetInteger(INDICATOR_LEVELS,1);
IndicatorSetDouble (INDICATOR_LEVELVALUE,0);
//---SET MAX AND MIN
IndicatorSetDouble (INDICATOR_MINIMUM, -100);
IndicatorSetDouble (INDICATOR_MAXIMUM, 100);
//---DATAWINDOW NAME 
IndicatorShortName("FaWi Indicator");
SetIndexLabel(1,NULL);

 
//----INITIALIZATION DONE
return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator FaWI 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[])
   {



return (0);
}




            


// {
//---
   
//--- return value of prev_calculated for next call
//   return(rates_total);
//  }
//+------------------------------------------------------------------+

Die Variablen sind frei erfunden und dienen um den Oszillator frei zu bestimmen.

Die Berechnung sollte so aussehen und im neuen Fenster gezeichnet werden:

A*B((Close-Low)/(High-Low)-C)*D (alle daten sollten frei, auch in anderen Varianten geändert werden können)

Ich bitte um Hilfe.

Grüsse Fabian

 

Das was Du suchst ist ähnlich dem ATR, hier findest Du dessen Code: https://www.mql5.com/de/code/12

Du kannst Dich danach richten.

Average True Range (ATR)
Average True Range (ATR)
  • www.mql5.com
Ansichten: 1072 Rating: Veröffentlicht: 2016.02.16 06:29 Aktualisiert: 2016.11.22 07:34 Der technische Indikator Average True Range (ATR) ist ein Indikator der die Volatilität des Marktes anzeigt. Er wurde von Welles Wilder in seinem Buch "New concepts in technical trading systems" vorgestellt. Dieser Indikator wurde seit jeher als...
 

Keinesfalls stimmt: return(0) in der OnCalculate. Damit zwingst du diese Funktion immer wieder alle vorhandenen Kerzen abzuarbeiten.

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[])
{

   
   return (rates_total);
}
Calli ist mir zuvor gekommen. Der ATR ist ein gutes Beispiel.
 

Vielen Dank für die Antworten, habe mir den ATR code mal angeschaut und den unteren code übernommen und ja es funktionierte, es wurde auch ins neue Fenster gezeichnet, einfach nicht korrekt wie ich es mir wünschte.

Für den Indikator (Oszillator -/+) brauche ich keine Berechnung auf x Perioden nur immer die gehandelte Kerze, wenn eine neue Kerze gehandelt wird, die alte Kerze fest im Datenfenster bleibt und die neue wieder auf jedem Tick berechnet.

Gibt es das Beispiele oder kann mir da jemand helfen wie es mit dem Code weitergeht nach OnCalculate?

Danke im Voraus für eure Kommentare.

Grüsse Fabian

 

Ich verstehe nicht ganz, was Du meinst, aber der Code ist nicht 'repainting', d.h. alte Kerzen/Bars/Werte zu den Kerzen/..  (älter als die aktuelle) werden nicht mehr geändert(!), sondern nur grafisch verschoben, wenn eine neue Kerze entsteht.

Jeder neue Tick ist ja nur für die aktuell offenen Kerze und ändert die jeweiligen weiteren Berechnungen auch des ATR (und anderer Indikatoren).

 
Was willst du machen? Ich bin mal überzeugt das gibts schon
 
FabianWi:

Vielen Dank für die Antworten, habe mir den ATR code mal angeschaut und den unteren code übernommen und ja es funktionierte, es wurde auch ins neue Fenster gezeichnet, einfach nicht korrekt wie ich es mir wünschte.

Für den Indikator (Oszillator -/+) brauche ich keine Berechnung auf x Perioden nur immer die gehandelte Kerze, wenn eine neue Kerze gehandelt wird, die alte Kerze fest im Datenfenster bleibt und die neue wieder auf jedem Tick berechnet.

Gibt es das Beispiele oder kann mir da jemand helfen wie es mit dem Code weitergeht nach OnCalculate?

Danke im Voraus für eure Kommentare.

Grüsse Fabian

Verstehe ich das richtig, daß du eigentlich nur zwei Kerzen sehen möchtest. Nämlich die alte(index 1) und die neueste(index 0), sofern diese TimeSeries sind?

A*B((Close-Low)/(High-Low)-C)*D und das soll die Berechnung sein ?

B ist eine Funktion?

A bisserl meht Info wär erforderlich!

Ist im Prinzip alles machbar. wenn du Kerzen darstellen möchtest benötigst du

SetIndexStyle(0,DRAW_BARS);

an Stelle von

SetIndexStyle(0,DRAW_LINE);

Falls ich da richtig liege schau dir den Heiken-Ashi Indikator an. Ich hänge den da dran, falls du ihn nicht hast.

Dateien:
Grund der Beschwerde: