Göstergeler: SuperTrend

 

SuperTrend:

SuperTrend trend göstergesi.

SuperTrend

Author: Nikolay Kositsin

 

Nikolay! En az gecikmeye ve en az sayıda yanlış sinyale sahip beyin çocuklarınızdan hangisi (tabii ki bu belirlenebilirse)

 
Makser:

Nikolay! Hangi beyin çocuğunuz en az gecikmeye ve en az sayıda yanlış sinyale sahip (tabii ki bu belirlenebilirse).

İşte bir soru, yani soru. JFatlSpeed'i çaprazlarda ve son zamanlarda diğer her şeyde kullanıyorum. Ama sadece dört saatlik işaretlerde. Ve X2MA_BBx9'da beş dakikalık işlemlerde sıçramaları yakalıyorum.
 

Yani bu kesinlikle benim programlama tarzım değil.

Ağaçlar için odunu göremezsiniz = tüm yorumlar için kodu göremezsiniz.

Ayrıca, 'shift' giriş parametresi hiç kullanılmıyor.

Bunu benim tarzımda yeniden programladım, belki 'süper programcılar' kitabımdan bir yaprak alabilir.

//+------------------------------------------------------------------+
//|Süper trend.mq5 |
//| Orijinal kod https://www.mql5.com/tr/code/527 adresinde bulundu | 
//| Orijinal kod Jason Robinson'dan, Nikolay Kositsin tarafından yeniden yazıldı |
//| Ing. Otto Pauser takma adıyla Kronenchakra tarafından geliştirilmiştir |
//+------------------------------------------------------------------+ 

//--- inckudes
#include <Utils.mqh>

//--- genel özellikler
#property copyright COPY 
#property link      LINK 
#property version   "1.00"

//--- gösterge özellikleri
#property indicator_chart_window
#property indicator_buffers 4 
#property indicator_plots   4

//--- giriş parametreleri
input int CCIPeriod  =  50;   // CCI gösterge dönemi 
input int ATRPeriod  =   5;   // ATR gösterge periyodu
input int Level      =   0;   // CCI aktivasyon seviyesi

//---- gösterge tamponları
double   ATR[],
         CCI[];
double   TrendUp[],
         TrendDn[];
double   SignUp[],
         SignDn[];
         
//---- küresel değişkenler
int      min_rates_total;
int      ATR_Handle,
         CCI_Handle;

//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
{
   min_rates_total=MathMax(CCIPeriod,ATRPeriod);

   CCI_Handle=iCCI(NULL,0,CCIPeriod,PRICE_TYPICAL);
   if(InvalidHandle(CCI_Handle,"iCCI"))
      return(INIT_FAILED);

   ATR_Handle=iATR(NULL,0,ATRPeriod);
   if(InvalidHandle(ATR_Handle,"iATR"))
      return(INIT_FAILED);

   string shortname=IndiShortName("Supertrend",CCIPeriod,ATRPeriod);
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);

   InitBuffer(TrendUp,DRAW_LINE ,"Supertrend Up"         ,clrLime,min_rates_total,0  ,2,true);
   InitBuffer(TrendDn,DRAW_LINE ,"Supertrend Down"       ,clrRed ,min_rates_total,0  ,2,true);
   InitBuffer(SignUp ,DRAW_ARROW,"Supertrend signal Buy" ,clrLime,min_rates_total,108,1,true);
   InitBuffer(SignDn ,DRAW_ARROW,"Supertrend signal Sell",clrRed ,min_rates_total,108,1,true);

   ArraySetAsSeries(ATR,true);
   ArraySetAsSeries(CCI,true);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
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                                                    // kontrol et
      (
          BarsCalculated(CCI_Handle)<rates_total ||      // CCI göstergesini kontrol edin
          BarsCalculated(ATR_Handle)<rates_total ||      // ATR göstergesini kontrol edin
          rates_total<min_rates_total                    // yeterli çubuk olup olmadığını kontrol edin
      )
          return(0);                                     // sonraki tıklamayı dene

   int limit,to_copy,bar;

   ArraySetAsSeries(high,true);                          // her tikte AsSeries olarak ayarlanmalıdır
   ArraySetAsSeries(low ,true);

   if(prev_calculated>rates_total || prev_calculated<=0) // gösterge hesaplamasının ilk başlangıcı için kontrol
      limit=rates_total-min_rates_total;                 // tüm çubukların hesaplanması için başlangıç indeksi
   else
      limit=rates_total-prev_calculated;                 // yeni çubukların hesaplanması için başlangıç indeksi

   to_copy=limit+1;                                      // ATR-Verilerini tampona kopyala
   if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0);

   to_copy++;                                            // CCI-Verilerini tampona kopyala
   if(CopyBuffer(CCI_Handle,0,0,to_copy,CCI)<=0) return(0);

   for(bar=limit; bar>=0; bar--)                         // hesaplama ana döngüsü
     {
      TrendUp[bar]=NULL;                                 // tüm tamponları temizle
      TrendDn[bar]=NULL;
      SignUp [bar]=NULL;
      SignDn [bar]=NULL;
                                                         // çizgileri hesaplayın
      if(CCI[bar]>=Level && CCI[bar+1]<Level) TrendUp[bar]=TrendDn[bar+1];
      if(CCI[bar]<=Level && CCI[bar+1]>Level) TrendDn[bar]=TrendUp[bar+1];

      if(CCI[bar]>Level)                                 
        {
         TrendUp[bar]=low[bar]-ATR[bar];
         if(TrendUp[bar]<TrendUp[bar+1] && CCI[bar+1]>=Level) TrendUp[bar]=TrendUp[bar+1];
        }

      if(CCI[bar]<Level)                                 
        {
         TrendDn[bar]=high[bar]+ATR[bar];
         if(TrendDn[bar]>TrendDn[bar+1] && CCI[bar+1]<=Level) TrendDn[bar]=TrendDn[bar+1];
        }

      if(TrendDn[bar+1]!=0.0 && TrendUp[bar]!=0.0) SignUp[bar]=TrendUp[bar];  // sinyali kontrol et YUKARI
      if(TrendUp[bar+1]!=0.0 && TrendDn[bar]!=0.0) SignDn[bar]=TrendDn[bar];  // DOWN sinyalini kontrol edin
     }
    
   return(rates_total);
}
//+------------------------------------------------------------------+
//|Yardımcı programlar.mqh |
//| Telif Hakkı © 2018, Ing. Otto Pauser | 
//| https://www.mql5.com/tr/users/kronenchakra | 
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| tanımlar|
//+------------------------------------------------------------------+

#define  COPY   "Telif Hakkı © 2018, Ing. Otto Pauser"
#define  LINK   "https://www.mql5.com/tr/users/kronenchakra"
#define  SPACER "---------------------" 

//+------------------------------------------------------------------+
//| kısaltmalar|
//+------------------------------------------------------------------+

#define  PRICE ENUM_APPLIED_PRICE
#define  TIMEF ENUM_TIMEFRAMES

//+------------------------------------------------------------------+
//| Yardımcı fonksiyonlar|
//+------------------------------------------------------------------+

void InitBuffer(double &_buffer[], ENUM_DRAW_TYPE _type, string _label, color _color, int _begin, int _arrow=159, int _width=1, bool _series=false)
{
   static int idx=0;                                  // bufferindex'i 0 olarak başlat
   SetIndexBuffer     (idx,_buffer);                  // tamponu başlat
   ArrayInitialize    (_buffer ,NULL);                // tamponu başlat
   ArraySetAsSeries   (_buffer ,_series);             // set AsSeries
                                                      // özellikleri ayarla
   PlotIndexSetInteger(idx,PLOT_DRAW_TYPE  ,_type );
   PlotIndexSetInteger(idx,PLOT_LINE_COLOR ,_color);
   PlotIndexSetInteger(idx,PLOT_LINE_WIDTH ,_width);
   PlotIndexSetInteger(idx,PLOT_DRAW_BEGIN ,_begin);
   PlotIndexSetInteger(idx,PLOT_ARROW      ,_arrow);
   PlotIndexSetString (idx,PLOT_LABEL      ,_label);
   PlotIndexSetDouble (idx,PLOT_EMPTY_VALUE,NULL  );
   idx++;                                             // sonraki çağrı için bufferindex'i artır
}

bool InvalidHandle(int _handle, string _msg)
{
   if(_handle==INVALID_HANDLE)                     // kontrol kolu
      Alert("*ERROR* creating "+_msg+" handle.");  // bilgi
   return(_handle==INVALID_HANDLE);                // geçersizse true döndür
}

string IndiShortName(string _name, int val_1, int val_2=NULL, int val_3=NULL)
{
   string result=_name+"("+IntegerToString(val_1);
   if(val_2!=NULL)
      result=result+","+IntegerToString(val_2);
   if(val_3!=NULL)
      result=result+","+IntegerToString(val_3);
   return(result+")");
}

//+------------------------------------------------------------------+
//| Hesaplama fonksiyonları|
//+------------------------------------------------------------------+
double StdDeviation(int position,const double &price[],const double &MAprice[],int period)
{
   int i;
   double StdDev_dTmp=0.0;

   if(position<period) return(StdDev_dTmp);        // pozisyonu kontrol et

   for(i=0;i<period;i++)                           // StdDev'i hesaplayın
      StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);

   StdDev_dTmp=MathSqrt(StdDev_dTmp/period);

   return(StdDev_dTmp);                            // hesaplanan değeri döndür
}

Hemen oldukça açık görünüyor.

Belki MetaQutes de bir şeyler öğrenebilir, örneğin çizim tamponlarının tek bir satırda nasıl tanımlanacağı gibi.

Dosyalar:
supertrend.mq5  11 kb
Utils.mqh  7 kb
 

Otto,

Bu:

      TrendUp[bar]=NULL;                                 // tüm tamponları temizle
      TrendDn[bar]=NULL;
      SignUp [bar]=NULL;
      SignDn [bar]=NULL;

tehlikelidir. NULL'void' tipindedir. Bir süre sonra, MT5'i daha da hızlı hale getirmek için, belki de aslında hiçbir şey atanmayabilir (o zaman eski kalır) veya bellek konumu değiştiğinde rastgele bir değer oluşturulur.

Bence sembol için _symbol ve değerler için doğrudan EMPTY_VALUE ya da 0 kullanmak daha iyi olacaktır. Bu şekilde hiçliğe bir varlık vermiş olursunuz ;)

 
Nasıl alabilirim
 
Bu göstergeyi kullanmak istiyorum
 
ka03ht8096:
Nasıl alabilirim

Adım 1:

Adım 2:

 
Çarpan ve ATR değeri hangi girdidir?
 

mt4 için bu var mı