BuySell.mq5

 

Hey guys, i would need your help.

I try to understand the code of the mentioned indicator. I puts Squares on the Chart for buy and sell seperate.

I just dont get the function behind it how and when he does the printout. And how he calculates out of the SMA and the ATR these things.

Regards and thanks for your help

Volker



#property copyright "Copyright © 2008, bobik"

#property link "bobik@trah.guchka.eu"
#property description "BuySell "
//---- indicator version
#property version   "1.00"
//---- plot in a separate window
#property indicator_chart_window 
//---- indicator buffers
#property indicator_buffers 4
//---- indicator plots
#property indicator_plots   4
//+----------------------------------------------+
//|  Bearish indicator drawing parameters        |
//+----------------------------------------------+
//---- drawing type
#property indicator_type1   DRAW_ARROW
//---- color - Red
#property indicator_color1  Red
//---- width
#property indicator_width1  1
//---- label
#property indicator_label1  "Lower BuySell"
//+----------------------------------------------+
//|  Bullish indicator drawing parameters        |
//+----------------------------------------------+
//---- drawing type
#property indicator_type2   DRAW_ARROW
//---- color - LightSeaGreen
#property indicator_color2  LightSeaGreen
//---- width
#property indicator_width2  1
//---- label
#property indicator_label2 "Upper BuySell"
//+----------------------------------------------+
//|  Bearish indicator drawing parameters        |
//+----------------------------------------------+
//---- drawing type
#property indicator_type3   DRAW_ARROW
//---- color - DeepPink
#property indicator_color3  DeepPink
//---- width 
#property indicator_width3  4
//---- label
#property indicator_label3  "BuySell Sell"
//+----------------------------------------------+
//|  Bullish indicator drawing parameters        |
//+----------------------------------------------+
//---- drawing type
#property indicator_type4   DRAW_ARROW
//---- color - LightSeaGreen
#property indicator_color4  LightSeaGreen
//---- width
#property indicator_width4  4
//---- label
#property indicator_label4 "BuySell Buy"
//+-----------------------------------+
//|  constants                        |
//+-----------------------------------+
#define RESET 0 // constants

//+----------------------------------------------+
//| Indicator input parameters                   |
//+----------------------------------------------+
input uint MA_Period=14;
input ENUM_MA_METHOD MA_Method=MODE_SMA;        // Smoothing method
input ENUM_APPLIED_PRICE MA_Price=PRICE_CLOSE;  // Price
input uint ATR_Period=60;
//+----------------------------------------------+
//---- declaration of dynamic arrays, used as indicator buffers
double BuyBuffer[],SellBuffer[];
double UpBuffer[],DnBuffer[];
//---- declaration of integer variables, used for handles
int MA_Handle,ATR_Handle;
//---- 
int  min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- initialization of variables
   min_rates_total=int(MA_Period+ATR_Period);

//---- get handle of iMA indicator
   MA_Handle=iMA(NULL,0,MA_Period,0,MA_Method,MA_Price);
   if(MA_Handle==INVALID_HANDLE) {Print(" Error in creation of iMA indicator"); return(1);}

//---- get handle of iATR indicator
   ATR_Handle=iATR(NULL,0,ATR_Period);
   if(ATR_Handle==INVALID_HANDLE) {Print(" Error in creation of iATR indicator"); return(1);}

//---- set UpBuffer[] dynamic array as indicator buffer
   SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);
//---- set plot draw begin
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- define char code, used for drawing
   PlotIndexSetInteger(0,PLOT_ARROW,158);
//---- set indexing as time series
   ArraySetAsSeries(UpBuffer,true);
//---- define empty value (not shown at chart)
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

//---- set DnBuffer[] dynamic array as indicator buffer
   SetIndexBuffer(1,DnBuffer,INDICATOR_DATA);
//---- set plot draw begin
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- define char code, used for drawing
   PlotIndexSetInteger(1,PLOT_ARROW,158);
//---- set indexing as time series
   ArraySetAsSeries(DnBuffer,true);
//---- define empty value (not shown at chart)
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);

//---- set SellBuffer[] dynamic array as indicator buffer
   SetIndexBuffer(2,SellBuffer,INDICATOR_DATA);
//---- set plot draw begin
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- define char code, used for drawing
   PlotIndexSetInteger(2,PLOT_ARROW,167);
//---- set indexing as time series
   ArraySetAsSeries(SellBuffer,true);
//---- define empty value (not shown at chart)
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);

//---- set BuyBuffer[] dynamic array as indicator buffer
   SetIndexBuffer(3,BuyBuffer,INDICATOR_DATA);
//---- set plot draw begin
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- define char code, used for drawing
   PlotIndexSetInteger(3,PLOT_ARROW,167);
//---- set indexing as time series
   ArraySetAsSeries(BuyBuffer,true);
//---- define empty value (not shown at chart)
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0);

//---- set precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- set indicator short name
   string short_name="BuySell";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//----
   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[])
  {
//---- checking of bars, needed for calculation
   if(BarsCalculated(MA_Handle)<rates_total
      || BarsCalculated(ATR_Handle)<rates_total
      || rates_total<min_rates_total) return(RESET);

//---- declaration of local variables
   int limit,to_copy,bar;
   double MA[],ATR[];

//---- set starting bar index limit
   if(prev_calculated>rates_total || prev_calculated<=0)// checking of first call
      limit=rates_total-min_rates_total-2; // starting bar index for all bars
   else limit=rates_total-prev_calculated; // starting bar index for new bars
   to_copy=limit+2;

//---- copy new data to arrays
   if(CopyBuffer(MA_Handle,0,0,to_copy,MA)<=0) return(RESET);
   if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(RESET);

//---- set indexing as time series
   ArraySetAsSeries(MA,true);
   ArraySetAsSeries(ATR,true);

//---- first calculation
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      //---- set buffers to zero
      DnBuffer[bar]=0.0;
      UpBuffer[bar]=0.0;

      if(MA[bar]>MA[bar+1]) DnBuffer[bar]=MA[bar]-ATR[bar];
      if(MA[bar]<MA[bar+1]) UpBuffer[bar]=MA[bar]+ATR[bar];
     }

//---- recalculation of starting bar index for new bars
   if(prev_calculated>rates_total || prev_calculated<=0)// checking of first call
      limit--;

//---- second calculation
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      //---- set buffers to zero
      BuyBuffer[bar]=0.0;
      SellBuffer[bar]=0.0;

      if(UpBuffer[bar+1]&&DnBuffer[bar]) BuyBuffer [bar]=DnBuffer[bar];
      if(DnBuffer[bar+1]&&UpBuffer[bar]) SellBuffer[bar]=UpBuffer[bar];
     }
//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
  1. Hallo hier im Forum und schon mal viel Erfolg!
  2. Wie sprechen hier deutsch.
  3. Wenn Du Code postest, dann verwende aus der Editierzei8le </> (oder Alt+S)!
  4. Um den Algorithmus eines EAs, Indikators oder Skripts zu verstehen ist im Editor der Debugger (Strg+F5) am besten  geeignet!
    So sieht man den Ablauf und die Veränderung der Werte in den Variablen!!
 

Wahrscheinlich ist der Ursprung dieses Codes hier https://www.mql5.com/de/code/785

Wieder so ein Code, wo man vor lauter Kommentar den Inhalt nicht mehr erkennen kann.

Und dort wo Kommentar sinnvoll wäre um die Berechnungen nachvollziehen zu können, ist natürlich keine Erklärung vorhanden. Grauenhafter Programmierstil.

@volker: was willst du denn genau wissen?

BuySell
BuySell
  • www.mql5.com
Veröffentlicht: Nikolay Kositsin Ansichten: 466 Rating: Veröffentlicht: 2016.06.13 09:59 Aktualisiert: 2016.11.22 07:34 Wirklicher Autor: Dieser Indikator zeigt die "ultimativen Unterstützungs-/Widerstands-" Levels des aktuellen Trends. Trendänderungen werden mit farbigen Rechtecken angezeigt, die Trendrichtung wird durch farbige...
 

Hallo Leute Danke erstmal.

Ja grauenhafter Stil, den ich als Informatiker nicht mal blicke.

Ich möchte wissen, wie die einzelnen Punkte (Quadrate) berechnet werden, da ich einen Expert Advisor zum Automatischen Traden zum Teil daraus bauen möchte.(Als Grundlage)
Da die berechneten Punkte zum Buy und Sell schon recht gut sind. Ich blicke nur die Berechnung und Generierung nicht. Eigentlich mag ich eine Funktion daraus schreiben denen ich Zwei Werte als Pointer bBuy and bSell mitgeben kann und diese auf OnTick ausführen. Aber nur Copy und Paste reicht mir nicht, da ich gerne verstehe was ich tue.

Ja genau ist dieser Code: https://www.mql5.com/de/code/785

Das nächste mal halte ich mich an die Regel wie Code zu pasten ist. Habe es ja versucht bunt zu machen, damit man wenigstens die einzelnen Funktionen und Deklarationen auseinander halten kann.

Wäre lieb wenn ihr die wichtigsten Teile für mich Kommentieren könntet und die Code wieder hier pastet.


Grüße
Volker

Ich habe schon gesehen das er einen SMA mit 14 und den ATR mit 60 verwendet. Aber WTF macht er damit ;)

Habe die Indikatoren auf dem Chart zur seinen Buy Sell Quadraten anzeigen lassen, aber keinen Zusammenhang erkennen können.

input uint MA_Period=14;

input ENUM_MA_METHOD MA_Method=MODE_SMA;        // Smoothing method
input ENUM_APPLIED_PRICE MA_Price=PRICE_CLOSE;  // Price
input uint ATR_Period=60;
BuySell
BuySell
  • www.mql5.com
Veröffentlicht: Nikolay Kositsin Ansichten: 468 Rating: Veröffentlicht: 2016.06.13 09:59 Aktualisiert: 2016.11.22 07:34 Wirklicher Autor: Dieser Indikator zeigt die "ultimativen Unterstützungs-/Widerstands-" Levels des aktuellen Trends. Trendänderungen werden mit farbigen Rechtecken angezeigt, die Trendrichtung wird durch farbige...
 

Der Supertrend Indikator ist sehr ähnlich https://www.mql5.com/de/code/527

Ich habe den Code überarbeitet damit er für mich lesbar wurde. Ich hänge den da dran.

Du kannst diesen Code nicht direkt in einen EA packen.

Du musst mit iCustom() bzw. mit i.......(zb iMA()) das handle zum Indikator erzeugen und mit CopyBuffer() den Buffer des Indikators auslesen.

Wie Carl so oft geschrieben hat "verwende die F1 Taste und dir wird geholfen".

Hast noch eine langen Weg vor dir ;)

SuperTrend
SuperTrend
  • www.mql5.com
Wirklicher Autor: Dieser Indikator ist ein Trendindikator, der recht einfach zu beurteilen ist: sobald seine Farbe nach Grün wechselt, bedeutet das den Beginn einen Aufwärtstrend, und wechselt sie auf Rot, bedeutet das einen...
Dateien:
supertrend.mq5  15 kb
 

Danke erstmal,

Ich verstehe nur die Mathematik( Algorithmus)  dahinter in dem BuySell nicht, das ist mein Problem
Die dann zu implementieren, darüber mach ich mir keinen Kopf. 

Grüße

Volker

 
Volker.Groemling:

Danke erstmal,

Ich verstehe nur die Mathematik( Algorithmus)  dahinter in dem BuySell nicht, das ist mein Problem
Die dann zu implementieren, darüber mach ich mir keinen Kopf. 

Grüße

Volker

Die Berechnung ist sehr simpel.

Im ersten Schritt wird der MA und der ATR gelesen.

   for(bar=limit; bar>=0; bar--)          // first calculation
     {
      if(MA[bar]>MA[bar+1])               // falls der MA steigt
         DnBuffer[bar]=MA[bar];//-ATR[bar];  // vom MA wird ATR abgezogen
      else 
         DnBuffer[bar]=0.0;               // MA fällt oder ist gleich, setze buffer auf 0.0

      if(MA[bar]<MA[bar+1])               // falls der MA fällt
         UpBuffer[bar]=MA[bar];//+ATR[bar];  // zu MA wird ATR addiert
      else 
         UpBuffer[bar]=0.0;               // MA steigt oder ist gleich, setze buffer auf 0.0
     }

Ich habe das etwas umgeformt um es im Debugger leichter verfolgen zu können.

Den ATR einzurechnen verfälscht imho den Eindruck den der Indi erzeugt. Probiere Testhalber den ATR auszukommentieren wie in meinem Beispiel.
Dann sitzen die Signale direkt am MA.

Im Zweiten Schritt wird nur der Trendwechsel berechnet und angezeigt.
Auch diesen Teil habe ich etwas umcodiert.

   for(bar=limit; bar>=0; bar--)             // second calculation
     {
      if(UpBuffer[bar+1]&&DnBuffer[bar])     // Trendwechsel ?
         BuyBuffer [bar]=DnBuffer[bar]; 
      else 
         BuyBuffer [bar]=0.0;  

      if(DnBuffer[bar+1]&&UpBuffer[bar])     // Trendwechsel ?
         SellBuffer[bar]=UpBuffer[bar]; 
      else 
         SellBuffer[bar]=0.0;
     }

Die Korrektur von limit dazwischen kann man getrost entfernen.

Die Besonderheit dieses Indikators ist, daß er in den for-schleifen quasi von hinten aufgerolltr wird. Also mit bar-- nicht mit bar++

Der Indikator ist in der bar[0] extrem 'repainting'.

Es war für mich sehr aufschlußreich diesen Indi zu analysieren. Ich werde den überarbeiten und einen Grenzwert für die Steigung des MAs einarbeiten, damit sollte das 'repainting' verringert werden.

Den stelle ich dann hier rein, evtl. auch in die Codebase.

LG Otto

 

Danke für die Antwort.

Werde es mir morgen bei Tageslicht mal zu Gemüte führen.
Nach der Analyse mit dem Chart fande ich die Signale, die der Indikator erzeugt schöne Aussagekräftige und belastbare Werte.

Grüße

Volker

 

Hier die überarbeitete Version vom BuySell Indikator.

Ich glaube nicht, daß man mit diesem Indi glücklich(=reich) wird.

Er ist nur ein anders dargestellter Moving Average und der ATR wird nur zur Darstellung verwendet.

Grüße

Otto

Dateien:
Grund der Beschwerde: