English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Likit Grafik

Likit Grafik

MetaTrader 5Ticaret | 14 Ocak 2022, 13:27
148 0
Serhii Shevchuk
Serhii Shevchuk

Giriş

Bir keresinde, H4 zaman dilimine sahip grafiklerin her aracıda farklı göründüğünü fark etmiştim. Bunun arkasındaki sebep, aracıların farklı zaman dilimlerinde bulunmasıydı. Bazı durumlardaki zaman dilimleri arasında küçük bir fark olmasına rağmen aynı grafiklerin belirli kısımları önemli ölçüde farklıydı. Bir grafikte belirgin bir geri dönüş formasyonu vardı ancak diğerinin aynı kısmı herhangi kesin bir formasyonu temsil etmiyordu.

Sonra, H1 grafiğini yeniden çizecek bir gösterge yazmak aklıma geldi, böylece sağ tarafta her zaman tam bir kapanış çubuğu olacaktı. Fiyat kaynağı olarak M1 dönemi seçilmiştir. Sonuç olarak, her dakika bir saatlik çizelge yeniden çizildi ve bir saat içinde aynı saatlik çizelgenin 60 çeşidini elde ettim. Biçimi yumuşak ve akıcı bir şekilde değişiyordu ve ilk şeklin bir ipucu bile olmadığı gizli şekilleri ortaya çıkarıyordu.

Bu göstergeye spesifik görünümü için "likit grafik" adını verdim. Çizim moduna bağlı olarak, grafik ya temel sürecin yeni bir çubuğu göründüğünde ya da statik kaymanın değeri değiştiğinde "akar" (yeniden çizilir). Bu makalede, "likit grafik" çizim prensiplerini ele alacağız, ardından bir gösterge yazacağız ve bu teknolojinin kullanım verimliliğini göstergelerle alım satım yapan Experts formasyonlarla alım satım yapan Experts arasında karşılaştıracağız.



1. Çizim Prensibi

Başlamadan önce, terimleri tanımlayacağız.

Shift , ortaya çıkan grafik çubuklarının açılış fiyatları ile kaynak grafik çubuklarının açılış fiyatları arasındaki farktır.

Geçerli zaman dilimi, kaynak grafiğin zaman dilimidir.

Temel zaman dilimi, sonuçtaki grafiğin çubuklarını oluşturmak için kullanacağımız fiyatları içeren bir zaman dilimidir.

Temel dönem mevcut olanı aşamaz. Cari dönem, temel döneme kalansız bölünmelidir. Mevcut zaman diliminin temel olana oranı ne kadar büyük olursa, elde edilen grafikte o kadar farklı varyasyonlar elde edebiliriz. Bununla birlikte oran çok büyükse, o zaman temel zaman diliminin geçmişe yönelik verileri, sonuçta ortaya çıkan grafik çubuklarının gerekli sayıda çizilmesi için yeterli olmayabilir.

Grafik çizmenin üç türü vardır.

  • Statik kaydırmalı grafik (Statik Kaydırma veya SS).
  • Açılış modunda dinamik kaydırmalı grafik (Dinamik Kaydırma, sadece Aç veya DSO).
  • Açılış modunda dinamik kaydırmalı grafik (Dinamik Kaydırma, sadece Aç veya DSO).

Statik kaydırma modunda, çubukların açılma süreleri ayarlanan süre kadar kaydırılır. Açılış modundaki dinamik kaydırma, çubuğun yeni açılmış gibi görünmesini ve kapanış modundaki çubuğun yakında kapanacakmış gibi görünmesini sağlar.

Daha yakından bir göz atalım.


1.1. Statik Kaydırmalı Grafik

Bu modda her çubuğun açılma süresi, ayarlanan temel zaman dilimlerine eşdeğer dakika sayısı kadar kaydırılır. Biz buna shift adını vereceğiz. Bu şekilde küme kayması 0'a eşitse, grafik kaynak olanla tamamen aynıdır. Kayma 1, temel sürenin 15 dakika olması sağlayarak 15 dakikaya eşit olur. Kayma 2, 30 dakikaya eşittir vb.

Kayma (k-1) değerini aşamaz; burada k, mevcut zaman diliminin temel zamana oranıdır. Bu, mevcut zaman dilimi H1 ve temel olan M1 ile, izin verilen maksimum kaymanın 60/1 - 1 = 59 temel zaman dilimi, yani 59 dakika olduğu anlamına gelir. Temel zaman dilimi M5 ise, izin verilen maksimum kayma, temel zaman dilimlerinin 60/5 - 1 = 11'idir, yani 55 dakikadır.

Mevcut zaman dilimi H1'de ve 15 dakikalık kaydırmada çubukların açılış zamanı 00:15, 01:15, 02:15 vb. Mevcut zaman dilimi M15'de ve 1 dakikalık kaydırmada, çubukların açılış zamanı 00:16, 00:31, 00:46, 01:01 vb.

Kaydırmalar sınır değerlere yakın olduğu zaman, bunun gibi bir grafik kaynak olandan nadiren farklı demektir. Kaydırma değeri izin verilen aralığın ortasına yakın olduğunda önemli farklılıklar ortaya çıkar.

Statik kaydırmalı grafik

Şek. 1. 1'e eşit kaydırma değerindeki M15 temel zaman dilimindeki saatlik çubuk biçimlendirme örneği


1.2. Açılış Modunda Dinamik Kaydırmalı Grafik

Bu modda, temel zaman diliminin yeni bir çubuğu her göründüğünde kaydırma yeniden hesaplanır. Aynı zamanda, grafiğin sonundaki çubukta var olan zamanın kaydırması (en son fiyatlar), temel zaman dilimi değerini aşmayacak şekilde hesaplanır. Mevcut zaman dilimi H1 ve temel olan M5 ise, en sağdaki çubuk beş dakikadan önce açılmamış gibi görünecektir.

Çubuğun başındaki dinamik kaydırmalı grafik

Şek. 2. Açılış modunda dinamik kaydırmalı M15'in temel zaman dilimindeki saatlik çubuk biçimlendirmesi örneği


1.3. Kapanış Modunda Dinamik Kaydırmalı Grafik

Açılış modunda olduğu gibi bu modda da, temel zaman diliminin yeni bir çubuğu her göründüğünde kaydırma yeniden hesaplanır. Tek fark kaydırmanın, grafiğin sonundaki çubuğun (en son fiyatlar) var olma zamanının, mevcut ve temel zaman dilimleri arasındaki farktan büyük veya eşit olduğu şekilde hesaplanmasıdır. H1 mevcut zaman diliminde ve M5 temel zaman diliminde, en sağdaki çubuk en geç beş dakika içinde kapanacak gibi görünmektedir.

Dinamik kaydırma grafiği, çubuğun tamamlanması

Şek. 3. M15 temel zaman diliminde saatlik çubuk biçimlendirmesi ve kapanış modunda dinamik kaydırma örneği


2. Veri Dönüşümü

GetRatesLC() işlevi, küme kaymasını hesaba katarak geçmişe dönük verileri dönüştürmek için yazılmıştır. CopyRates() işlevine benzer şekilde, MqlRates türündeki yapı dizisine değiştirilmiş geçmişe dönük verileri yazar.

int GetRatesLC(
   int             start_pos    // source for copying
   int             len,         // amount to copy
   MqlRates&       rates[],     // target array
   ENUM_TIMEFRAMES base_period, // basic timeframe
   int&            shift        // shift
   );

Parametreler

start_pos

[içinde] Geçerli zaman dilimindeki ilk öğe endeksi. Bu veri dönüştürmenin ve bir arabelleğe kopyalamanın başlangıç noktasıdır.

uzunluk

[içinde] Kopyalanan öğe sayısı.

kur[]

[dışında] MqlRates türünün dizisi.

base_period

[içinde] Temel zaman dilimi. 

kaydırma

[içinde] [dışında] Kaydırma. Aşağıdaki değerleri kabul edebilir:

DeğerAçıklama
 -2
 Açma modundaki kaydırmayı hesaplayın (çubuk biçimlendirme başlangıcı)
 -1
 Kapanış modundaki kaymayı hesaplayın (çubuk biçimlendirme sonu)
 0 ... N
 Küme kaydırması uygulayın. 0'dan N'ye kadar olan değerleri kabul edebilir.
 N = Tcur/Tbase - 1. Tcur mevcut zaman dilimi olduğunda, Tbase temel bir zaman dilimidir.

Tablo 1. shift parametresinin izin verilen değerleri

İşlev başarılı bir şekilde uygulanırsa shift, -2 veya -1 değerlerini geçtiyse hesaplanan kaydırma değerini alır.

Dönüş değeri

Kopyalanan öğe sayısı veya hata kodu:

KodAçıklama
 -1
 Temel zaman dilimi yanlış belirtildi
 -2
 Kaydırma yanlış belirtildi

Tablo 2. Dönüş hatası kodları

liquidchart.mqh dosyasındaki GetRatesLC() işlevinin kodu aşağıdadır.

int GetRatesLC(int start_pos,int len,MqlRates &rates[],ENUM_TIMEFRAMES base_period,int& shift)
  {
   //--- number of basic timeframes contained in the current one  
   int k=PeriodSeconds()/PeriodSeconds(base_period);
   if(k==0)
      return(-1);//basic timeframe specified incorrectly
   //---
   MqlRates r0[];
   ArrayResize(rates,len);
   if(CopyRates(_Symbol,_Period,start_pos,1,r0)<1)
      return(0);// no data
   //---
   int sh;
   if(shift>=0)
     {
      //--- fixed shift
      if(shift<k)
         sh=shift;
      else
         return(-2);//--- shift specified incorrectly   
     }
   else if(shift==-1)
     {
      //--- shift to be calculated (dynamic, beginning of the bar formation)
      sh=int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
     }
   else if(shift==-2)
     {
      //--- shift to be calculated (dynamic, end of the bar formation)
      sh=1+int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
      if(sh>=k)
         sh = 0;
     }
   else
      return(-2);//shift specified incorrectly       
   //--- opening time of the basic period bar, which is the beginning of the current period bar formation
   //--- synchronization of the time of opening bars takes place relative to the tO time
   datetime tO;
   //--- closing time of the bar under formation, i.e. opening time of the last bar of basic timeframe in the series
   datetime tC;
   tO=r0[0].time+sh*PeriodSeconds(base_period);
   if(tO>TimeCurrent())
      tO-=PeriodSeconds();
   tC=tO+PeriodSeconds()-PeriodSeconds(base_period);
   if(tC>TimeCurrent())
      tC=TimeCurrent();
   int cnt=0;
   while(cnt<len)
     {
      ArrayFree(r0);
      int l=CopyRates(_Symbol,base_period,tC,k,r0);
      if(l<1)
         break;
      //--- time of the bar with the (l-1) index does not have to be equal to tC
      //--- if there is no bar with the tC time, it can be the nearest bar
      //--- in any case its time is assigned to the tC time
      tC=r0[l-1].time;
      //--- check if tO has the correct value and modify if needed.
      while(tO>tC)
         tO-=PeriodSeconds();
      //--- the time values of tO and tC have actual meaning for the bar under formation  
      int index=len-1-cnt;
      rates[index].close=0;
      rates[index].open=0;
      rates[index].high=0;
      rates[index].low=0;
      rates[index].time=tO;
      for(int i=0; i<l; i++)
         if(r0[i].time>=tO && r0[i].time<=tC)
           {
            if(rates[index].open==0)
              {
               rates[index].open= r0[i].open;
               rates[index].low = r0[i].low;
               rates[index].high= r0[i].high;
                 }else{
               if(rates[index].low > r0[i].low)
                  rates[index].low=r0[i].low;
               if(rates[index].high < r0[i].high)
                  rates[index].high=r0[i].high;
              }
            rates[index].close=r0[i].close;
           }
      //--- specifying closing time of the next bar in the loop
      tC=tO-PeriodSeconds(base_period);
      //
      cnt++;
     }
   if(cnt<len)
     {
      //-- less data than required, move to the beginning of the buffer
      int d=len-cnt;
      for(int j=0; j<cnt; j++)
         rates[j]=rates[j+d];
      for(int j=cnt;j<len;j++)
        {
         //--- fill unused array elements with zeros
         rates[j].close=0;
         rates[j].open=0;
         rates[j].high=0;
         rates[j].low=0;
         rates[j].time=0;
        }
     }
   shift = sh;  
   return(cnt);
  }

Birkaç önemli nokta vurgulanmalıdır.

  • İşlev, tick hacimlerini döndürmez. Bunun nedeni DSC modundaki işlevin, çubuğun açılışında olduğu gibi asla bire eşit olan hacmi döndürmemesidir. Bu oldukça mantıklıdır. Expert Advisor'ınız bire eşit tick hacmini yeni bir çubuk biçimlendirme sinyali olarak kullanırsa, o sinyali asla alamaz. Bu yöntem, Hareketli Ortalama Expert Advisor'da kullanılır. İşleve tick hacimlerinin bir sayımını ekleyebilirsiniz, ancak düzgün çalışmayacaktır. Karışıklığı önlemek için tick hacimlerini hiç bir zaman ölçmem.
  • İşlev istenen sayıda çubuk döndürür ancak bu, ilk ve son çubuk arasındaki zamanın, kaynak grafikteki karşılık gelen zaman aralığı ile orantılı olacağı anlamına gelmez. Geçmişe dönük verilerin devamındaki bir bölümde benzerlikler olacaktır. Belirtilen bölüm hafta sonlarını içeriyorsa, sınır çizgisinde "hayalet çubuklar" görünebilir.

Aşağıdaki şekil bir "hayalet çubuk" örneğini temsil etmektedir. Bu çubuk, 26 Ekim'de 23:01 açılış saati ile birlikte çubuğa dahil olan 27 Ekim'in ilk dakikası için oluşturuldu. Bu gibi çubuklardan sonra gösterge grafiğinin kaynak grafiğe ilişkin olarak sola kaydırılmasına dikkat edilmelidir. Başlangıç zamanına karşılık gelen zamanlı çubuklar (örneğin, 21:00 -> 21:01), farklı endekslere sahip olacaktır.

Hayalet çubuk

Şek. 4. Hayalet çubuk 2014.10.26 23:01'de



3. Göstergenin Uygulanması

Hadi ayrı bir pencerede "likit grafiği" gösteren bir gösterge yazalım. Gösterge üç modda da çalışmalıdır: statik kaydırma modu, çubuk açılış modunda dinamik kaydırma ve çubuk kapanış modunda dinamik kaydırma. Ayrıca gösterge, modları ve kaydırma değerini gösterge parametreleri diyaloğu çağırmaya gerek kalmadan değiştirmek için kontrol öğelerine sahip olmalıdır.

Başlangıç için liquidchart.mqh dosyasındaki GetRatesLC() işlevini kullanacağız. Biz bunu RefreshBuffers() işlevinden çağıracağız ama bir de OnCalculate işlevinden de çağrılır. Moddaki bazı değişikliklerin veya gösterge arabelleklerinin kaydırması ve yeniden hesaplanmasının gerekliliğinin sağlanmasıyla, OnChartEvent öğesinden de çağrılabilir. OnChartEvent işlevi, düğmelere basmayı ve kaydırma ve mod değerlerini değiştirmeyi işleyecektir.

Göstergenin girdi parametreleri:

input ENUM_TIMEFRAMES   BaseTF=PERIOD_M1;       // LC Base Period
input int               Depth=100;              // Depth, bars
input ENUM_LC_MODE      inp_LC_mode=LC_MODE_SS; // LC mode
input int               inp_LC_shift=0;         // LC shift

Derinlik elde edilen grafiğin çubuk sayısıdır ve ENUM_LC_MODE, göstergenin çizim modlarını açıklayan türdür:

enum ENUM_LC_MODE
  {//plotting mode
   LC_MODE_SS=0,  // Static Shift
   LC_MODE_DSO=1, // Dynamic Shift, just Open
   LC_MODE_DSC=2  // Dynamic Shift, expected Close
  };
inp_LC_mode ve inp_LC_shift parametreleri, buna göre LC_mode ve LC_shift ile çoğaltılır. Bu tasarım, değerlerin düğmeye basarak değiştirilmesine olanak tanır. Düğmelerin çizimi ve düğmelere basmayı işleme bu makalenin konusu ile ilgili olmadığı için ele alınmayacaktır. Hadi RefreshBuffers() işlevini detaylı olarak ele alalım.
bool RefreshBuffers(int total,
                    double &buff1[],
                    double &buff2[],
                    double &buff3[],
                    double &buff4[],
                    double &col_buffer[])
  {
   MqlRates rates[];
   ArrayResize(rates,Depth);
//---
   int copied=0;
   int shift=0;
   if(LC_mode==LC_MODE_SS)
      shift = LC_shift; //static shift
   else if(LC_mode==LC_MODE_DSO)
      shift = -1;       //calculate shift (beginning of the bar formation)
   else if(LC_mode==LC_MODE_DSC)
      shift = -2;       //calculate shift (end of the bar formation)
   else
      return(false);
//---
   copied=GetRatesLC(0,Depth,rates,BaseTF,shift);
//---
   if(copied<=0)
     {
      Print("No data");
      return(false);
     }
   LC_shift = shift;
   refr_keys();
//--- initialize buffers with empty values
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//---
   int buffer_index=total-copied;
   for(int i=0;i<copied;i++)
     {
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
      //---
      if(rates[i].open<=rates[i].close)
         col_buffer[buffer_index]=1;//bullish or doji
      else
         col_buffer[buffer_index]=0;//bearish
      //
      buffer_index++;
     }
//
   return(true);
  }

İlk başta, moda bağlı olarak shift değişkeniyle ilgili bir değer GetRatesLC() işlevine geçirilir. Bu statik modda LC_shift parametresinin kopyası olacak ve buna göre çubuğun açılış veya kapanış modlarında -1 veya -2 olacaktır. İşlevin başarılı bir şekilde yürütülmesinden sonra, GetRatesLC() kaydırmanın geçerli değerini, shift değişkenine döndürür. Ya yeniden hesaplanır ya da olduğu gibi bırakılır. Her durumda, değeri LC_shift değişkenine atarız ve ardından grafik öğelerinin refr_keys() işleviyle yeniden çizilmesini çağırırız.

Ondan sonra, gösterge arabelleklerindeki OHLC değerlerini ve çubuk renklerini yenileriz.

Göstergenin tam kodu liquid_chart.mq5 dosyasında bulunabilir. Başlatmadan sonra gösterge aşağıdaki gibi görünür:

Likit Grafik göstergesi, kaydırma 0

Şek. 5. Likit Grafik göstergesi

Kontrol öğeleri hakkında birkaç söz.

  • SS düğmesi, göstergeyi statik kaydırma moduna geçirir. Bu modda oklu düğmeler aktiftir ve gereken kaydırma değerini ayarlamak için kullanılabilirler.
  • DSO düğmesi, göstergeyi çubuk biçimlendirme başlangıcında dinamik kaydırma moduna geçirir. Bu moddaki kaydırma değeri hesaplanır ve manuel olarak değiştirilemez.
  • DSC düğmesi, göstergeyi dinamik kaydırma modu, çubuk biçimlendirmesinin sonu olarak değiştirir. Bu modda, kaydırmanın manuel olarak değiştirilmesi de mümkün değildir.

SS modundaki kaydırma değeri 0 olduğunda, gösterge ilk grafiğin değerlerini çoğaltır. Kaydırmayı değiştirirseniz, grafiğin yeniden çizildiğini göreceksiniz. Zaten 28 değerinde gözle görülür bir fark ortaya çıkar. Zayıf "raylar" yerine belirgin bir "çekiç" vardır. Satın alma zamanı geldi mi?

Likit Grafik göstergesi, kaydırma 28

Şek. 6. Likit Tablo göstergesi, kaydırma 28

Göstergeyi DSO moduna getirin ve yeni oluşturulmuş bir çubuk her zaman sağda olacaktır. DSC modunda, temel zaman dilimi değerinden daha geç olmamak üzere kapanacak bir çubuk vardır.


4. Expert oluşturma

Şimdi iki Expert oluşturacağız. İlki Hareketli Ortalama ve ikincisi "pin çubuğu" formasyonu ile işlem görecektir.

Standart örneklerden (Experts\Examples\Moving Average klasörü) Hareketli Ortalama Expert'i şablon olarak alalım. Bu yolla, statik veya dinamik kaydırmayı kullanırken anlamak için temelde farklı iki stratejinin optimizasyon sonuçlarını karşılaştırabileceğiz.


4.1. Hareketli Ortalamaya Göre Expert Alım Satım

İlk önce girdi parametreleri tanımlanmalıdır. Bunlardan dört tanedir:

input double MaximumRisk    = 0.1// Maximum Risk in percentage
input double DecreaseFactor = 3;    // Decrease factor
input int    MovingPeriod   = 12;   // Moving Average period
input int    MovingShift    = 6;    // Moving Average shift

Modernizasyondan sonra üç parametre daha eklenecektir:

input ENUM_TIMEFRAMES  BaseTF=PERIOD_M1;  // LC Base Period
input bool             LC_on = true;      // LC mode ON
input int              LC_shift = 0;      // LC shift

LC_on parametresi, GetRatesLC()'nin düzgün çalışıp çalışmadığını kontrol etmek için faydalı olacaktır. (LC_on == true && LC_shift == 0) kombinasyonu, (LC_on == false) ile aynı sonuca sahip olmalıdır.

Hazır Expert Hareketli Ortalamanın kaydırma ile modernizasyonu için liquidchart.mqh dosyasının eklenmesi ve kaydırma özelliğinin etkinleştirildiği durumlarda GetRatesLC() işlevleriyle CopyRates() işlevlerinin değiştirilmesi gerekmektedir ( LC_on girdi parametresi true'dır):

   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      copied=GetRatesLC(0,2,rt,BaseTF,shift);
     }
   else
      copied = CopyRates(_Symbol,_Period,0,2,rt);
   if(copied!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }

Bunun hem CheckForOpen() hem de CheckForClose() işlevlerinde yapılması gereklidir. Gösterge tanıtıcılarını kullanmayı reddedip ve Hareketli Ortalamaları manuel olarak hesaplayacağız. Bunun için CopyMABuffer() işlevini ekledik:

int CopyMABuffer(int len,double &ma[])
  {
   if(len<=0)
      return(0);
   MqlRates rates[];
   int l=len-1+MovingPeriod;
   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      ArrayResize(rates,l);
      copied=GetRatesLC(MovingShift,l,rates,BaseTF,shift);
     }
   else
      copied=CopyRates(_Symbol,_Period,MovingShift,l,rates);
//      
   if(copied<l)
      return(0);
//
   for(int i=0;i<len;i++)
     {
      double sum=0;
      for(int j=0;j<MovingPeriod;j++)
        {
         if(LC_on==true)
            sum+=rates[j+i].close;
         else
            sum+=rates[copied-1-j-i].close;
        }
      ma[i]=sum/MovingPeriod;
     }
   return(len);
  }

Herhangi bir nedenle elde edilemezse, ma[] arabelleğinde gerekli sayıda değer veya 0 döndürür.

Açılan çubukların kontrolü de dikkat edilmesi gereken bir diğer önemli noktadır. Hareketli Ortalama Expert Advisor orijinal versiyonunda, tick değerleri kullanılarak uygulanmıştır:

   if(rt[1].tick_volume>1)
      return;

Bizim durumumuzda tick hacmi yoktur. Bu nedenle, çubuğun açılmasını kontrol etmek için newbar() işlevini yazacağız:

bool newbar(datetime t)
  {
   static datetime t_prev=0;
   if(t!=t_prev)
     {
      t_prev=t;
      return(true);
     }
   return(false);
  }

Çalışma prensibi, çubuğun açılma zamanının önceki değer ile karşılaştırılmasında yatmaktadır. CheckForOpen() ve CheckForClose() işlevlerindeki newbar() işlevinin çağrısı için tick hacminin kontrolünü değiştirelim:

   if(newbar(rt[1].time)==false)
      return;

Hazır Expert'in tam kodu moving_average_lc.mq5 dosyasında bulunabilir.


4.2. "Pin Çubuğu" Formasyonuyla Expert Advisor Alım Satım İşlemi

Pin çubuğu veya Pinokyo çubuğu, üç çubuktan oluşan bir formasyondur. Orta çubuk, fiyat hareketinin olası tersine döndüğünü gösteren uzun bir gölgeye veya "buruna" sahip olmalıdır. Kenarlardaki çubuklara "göz" denir. Uç noktalar komşu çubuğun gölgesinden çıkmamalıdır. Bu formasyon, şamdan formasyonuyla alım satım yapan yatırımcılar arasında popülerdir.

Pin çubuğumuz, fiyatı aşağı yönde tersine çevirmek için aşağıdaki koşulları yerine getirmelidir:

  • r[0] çubuğu yükselişte olmalıdır.
  • r[2] çubuğu düşüşte olmalıdır.
  • A ve C fiyatlarının en büyük değeri B değerini aşmamalıdır, burada A ve C sırasıyla r[0] ve r[2] çubuklarının Yüksek değerleridir. B, r[1] çubuğunun Yüksek fiyatıdır.
  • Orta çubuğun gövdesi, yani r[1] çubuğunun Açık veKapalı (şekildeki OC) arasındaki farkın modülüdür, harici parametre ile ayarlanan nokta sayısını geçmemelidir.
  • Orta çubuğun gölgesi veya r[1] çubuğunun Yüksek fiyat ile Açık ve Kapalı değerlerin en büyüğünün farkı, harici parametre ile ayarlanan nokta sayısından az olmamalıdır.
  • Orta çubuk gölgesinin gövdesine oranı, harici parametre ile ayarlanan değerden az olmamalıdır.

Formasyon kontrolü, r[3] çubuğunun açılma anında gerçekleştirilecektir.

Pinbar

Şek. 7. "Pin Çubuğu" formasyonu

Aşağıya tersine dönüş için pin çubuğunun iletişim durumunu tanımlayan kod şu şekilde görünmelidir:

   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
     //--- eyes of the upper pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }

Yukarıya tersine dönüş için de aynı şekildedir. Bu nedenle, pin çubuğunun iletişim durumunu kontrol etme işlevi aşağıdaki gibi görünecektir:

int IsPinbar(MqlRates &r[])
  {
   //--- there must be 4 values in the r[] array
   if(ArraySize(r)<4)
      return(0);
   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
      //--- eyes of the upper pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }
   else if(r[0].open>r[0].close && r[2].open<r[2].close && r[1].low<MathMin(r[0].low,r[2].low))
     {
      //--- eyes of the lower pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(MathMin(r[1].open,r[1].close)-r[1].low)/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(-1);
     }
   return(0);
  }

Geçirilen geçmiş veri dizisi dörtten az öğeye sahip olmamalıdır. Yukardaki pin çubuğunun algılanması durumunda (yani aşağıya tersine dönüşü gösteren pin çubuğu), işlev 1 değerini döndürür. Daha aşağıda bir pin çubuğu olması durumunda (yukarı tersine döndürüldüğü varsayılır), işlev -1 değerini döndürür. Hiç pin çubuğu yoksa işlev 0 döndürür. İşlev ayrıca aşağıdaki girdi parametrelerini de kullanır:

input uint   inp_pb_min_shdw     = 40;    // Pin bar min shadow, point
input uint   inp_pb_max_OC       = 20;    // Pin bar max OC, point
input double inp_pb_min_ratio    = 2.0;   // Pin bar shadow to OC min ratio

Pin çubuğundaki en basit alım satım stratejisi ile alım satım işlemi yapacağız. Beklenen aşağıya tersine dönüş ise satar, yukarıya tersine dönüş ise alırız. Normalde, gösterge doğrulamaları gereklidir ancak bu sefer deneysel bütünlüğü korumak için bunları kullanmayacağız. Sadece pin çubuğu kullanacağız.

"Pin Çubuğu" formasyonuyla Expert Advisor alım satım işlemi, Hareketli Ortalama ile Expert işlemine dayalı olacaktır. CopyMABuffer() işlevi ikincisinden silinmeli hem de bu işlevi CheckForOpen() ve CheckForClose() işlevlerinden çağırmalıdır. Talep edilen geçmişe dönük veri sayısı ikiden dörde çıkarılacaktır. r[3] çubuğunun zamanı, yeni çubuğun açılması için kontrollü şekilde kullanılacaktır.

   int copied;
   if(LC_on==true)
   {
      int shift = LC_shift;
      copied=GetRatesLC(0,4,rt,BaseTF,shift);
   }
   else
      copied = CopyRates(_Symbol,_Period,0,4,rt);
   if(copied!=4)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(newbar(rt[3].time)==false)
      return;

Pozisyon açılış sinyali kontrolü şu şekilde görünecektir:

   int pb=IsPinbar(rt);
   if(pb==1)       // upper pin bar
      signal=ORDER_TYPE_SELL; // sell conditions
   else if(pb==-1) // lower pin bar
      signal=ORDER_TYPE_BUY// buy conditions

Karşıt pin çubuğu ile pozisyonu kapatmak için:

   if(type==(long)POSITION_TYPE_BUY && pb==1)
      signal=true;
   if(type==(long)POSITION_TYPE_SELL && pb==-1)
      signal=true;

Lütfen girdi parametrelerinin katı koşullarında, pin çubuğunun seyrek oluştuğunu unutmayın. Bu nedenle pozisyonu sadece karşıt pin çubuğu ile kapatırken, kar kaybetme veya zararla kapama riski vardır.

Bu bağlamda Kar Al ve Zarar Durdur seviyeleri ekleriz. Sırasıyla inp_tp_pp ve inp_sl_pp harici parametreleri tarafından ayarlanacaklardır:

   double sl=0,tp=0,p=0;
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(signal==ORDER_TYPE_SELL)
   {
     p=bid;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(ask+inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(ask-inp_sl_pp*_Point,_Digits);
   } else {
     p=ask;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(bid-inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(bid+inp_sl_pp*_Point,_Digits);
   }
   CTrade trade;
   trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),p,sl,tp);

inp_tp_pp veya inp_sl_pp değeri sıfırsa, o zaman karşılık gelen Kar Al veya Zarar Durdur seviyesi ayarlanmayacaktır.

Modifikasyon tamamlandı. Expert hazır. Kodun tamamı pinbar_lc.mq5 dosyasında bulunabilir.


5. Expert Optimizasyonu

Farklı stratejilerdeki kaydırma grafiklerinin verimliliğini değerlendirmek için, Expert optimizasyonunu en iyi sonuçların daha ileri karşılaştırılmasıyla kullanacağız. Buradaki en önemli parametreler kar, alçalma ve işlem sayısıdır. Hareketli Ortalama ile Expert Advisor alım satım işlemi, bir gösterge stratejisi örneği sunacak ve "Pin Çubuğu" formasyonuyla Expert alım satım işlemi, gösterge olmayan bir strateji durumu temsil edecektir.

Optimizasyon, son yarım yıl boyunca MetaQuotes-Demo sunucusundaki tekliflerle gerçekleştirilecektir. Deneme EURUSD, GBPUSD ve USDJPY için yapılacaktır. Başlangıç mevduatı, 1:100 kaldıracıyla 3000 USD'dir. Test modu "Tüm tickler"dir. Optimizasyon modu - hızlı (genel algoritma), Denge Max.


5.1. Hareketli Ortalamaya Göre Expert Alım Satım İşlemi Optimizasyon Sonuçlarının Analizi

Expert farklı modlarda çalışırken optimize etme sonuçlarını karşılaştıralım: sıfır kaydırmalı, statik kaydırmalı ve dinamik kaydırmalı (DSO ve DSC).

2014.04.01 - 2014.10.25 (son altı ay) döneminde EURUSD, GBPUSD ve USDJPY için test yapılacaktır. Süre H1.

Expert giriş parametreleri:

Parametre
Değer
 Yüzde olarak Maksimum Risk
 0.1
 Kurtarma Faktörü
 3.0
 Dönem
 12
 Hareketli Ortalama kaydırma
 6
 BaseTF
 1 dakika
 LC_on
 doğru
 LC_shift
 0

Tablo 3. Hareketli Ortalama LC Expert'in giriş parametreleri

5.1.1. Devre Dışı Kaydırma Modunda Expert Optimizasyonu

Optimize edilmiş parametreler:

Parametre
 Başlat AdımDurdur
 Dönem
 12
 1
 90
 Hareketli Ortalama kaydırma
 6
 1
 30

Tablo 4. Hareketli Ortalama LC Expert'in sıfır kaydırma modunda optimize edilmiş parametreleri

Devre dışı kaydırma modunda Expert optimizasyonunu gösteren grafik, EURUSD:

Sıfır kaydırma modunda optimizasyon, EURUSD

Şek. 8. Hareketli Ortalama LC Expert'in sıfır kaydırma modundaki optimizasyonu, EURUSD

En iyi sonuçlar:

 Sonuç
 KarDüşüş %
Yapılan işlem sayısı
MovingPeriod MovingShift
 3796,43 796,43 16,18 111 24 12
 3776,98 776,98 17,70 77 55
 22
 3767,45 767,45 16,10 74 59
 23
 3740,38 740,38 15,87 78 55
 17
 3641,16 641,16 15,97 105 12
 17

Tablo 5. Hareketli Ortalama LC Expert'in EURUSD için sıfır kaydırma modundaki en iyi sonuçları

Sıfır kaydırma modunda Expert optimizasyonunu gösteren grafik, GBPUSD:

Sıfır kaydırma modunda optimizasyon, GBPUSD

Şek. 9. Hareketli Ortalama LC Expert'in sıfır kaydırma modundaki optimizasyonu, GBPUSD

En iyi sonuçlar:

 Sonuç KarDüşüş %
 Yapılan işlem sayısı
 MovingPeriodMovingShift
 4025,75 1025,75 8,08 80 18
 22
 3857,90 857,90 15,04 74 55
 13
 3851,40 851,40 18,16 80 13
 24
 3849,48 849,48 13,05 69 34
 29
 3804,70 804,70 16,57 137 25
 8

Tablo 6. Hareketli Ortalama LC Expert'in GBPUSD için sıfır kaydırma modundaki optimizasyonunun en iyi sonuçları

Devre dışı kaydırma modunda Expert optimizasyonunu gösteren grafik, USDJPY:

Sıfır kaydırma modundaki optimizasyon, USDJPY

Şek. 10. Hareketli Ortalama LC Expert'in sıfır kaydırma modundaki optimizasyonu, USDJPY

En iyi sonuçlar:

Sonuç
Kar
Düşüş %
Yapılan işlem sayısı
 MovingPeriod MovingShift
5801,632801,6311,5448
65
23
5789,172789,1714,0350
44
27
5539,062539,0617,1446
67
27
5331,342331,3415,0561
70
9
5045,192045,1912,6148
83
15

Tablo 7. Hareketli Ortalama LC Expert'in USDJPY için sıfır kaydırma modundaki en iyi sonuçları

5.1.2. Statik Kaydırma Modunda Expert Optimizasyonu

Optimize edilmiş parametreler:

Parametre
 Başlat AdımDurdur
 Dönem
 12
 1
 90
 Hareketli Ortalama kaydırma
 6
 1
 30
 LC_shift 1 1 59

Tablo 8. Hareketli Ortalama LC Expert'in statik kaydırma modundaki optimize edilmiş parametreleri

Statik kaydırma modunda Expert optimizasyonunu gösteren grafik, EURUSD:

Statik kaydırma modunda optimizasyon, EURUSD

Şek. 11. Hareketli Ortalama LC Expert'in statik kaydırma modundaki optimizasyonu, EURUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
MovingPeriod
MovingShift
LC_shift
 4385,06
 1385,06
 12,87 100 32 11 8
 4149,63
 1149,63
 14,22 66 77 25 23
 3984,92
 984,92
 21,52 122 12 11 26
 3969,35
 969,35
 16,08 111 32 11 24
 3922,95
 922,95
 12,29 57 77 25 10

Tablo 9. Hareketli Ortalama LC Expert'in EURUSD için statik kaydırma modundaki en iyi optimizasyon sonuçları

Statik kaydırma modunda Expert optimizasyonunu gösteren grafik, GBPUSD:

Statik kaydırma modunda optimizasyon, GBPUSD

Şek. 12. Hareketli Ortalama LC Expert'in statik kaydırma modundaki optimizasyonu, GBPUSD

En iyi sonuçlar:

 Sonuç KarDüşüş %
Yapılan işlem sayısı
 MovingPeriod MovingShiftLC_shift
 4571,07 1571,07 14,90 79 12
 25
 42
 4488,90 1488,90 15,46 73 12
 25
 47
 4320,31 1320,31 9,59 107 12
 16
 27
 4113,47 1113,47 10,96 75 12
 25
 15
 4069,21 1069,21 15,27 74 12
 25
 50

Tablo 10. Hareketli Ortalama LC Expert'in GBPUSD için statik kaydırma modundaki en iyi optimizasyon sonuçları

Statik kaydırma modunda Expert optimizasyonunu gösteren grafik, USDJPY:

Statik kaydırma modunda optimizasyon, USDJPY

Şek. 13. Hareketli Ortalama LC Expert'in statik kaydırma modundaki optimizasyonu, USDJPY

En iyi sonuçlar:

Sonuç
Kar
Düşüş %
Yapılan işlem sayısı
MovingPeriod
 MovingShiftLC_shift
 6051,39 3051,39 15,94 53
 76
 12
 31
 5448,98 2448,98 10,71 54
 44
 30
 2
 5328,15 2328,15 11,90 50
 82
 13
 52
 5162,82 2162,82 10,46 71
 22
 26
 24
 5154,71 2154,71 14,34 54
 75
 14
 58

Tablo 11. Hareketli Ortalama LC Expert'in USDJPY için statik kaydırma modundaki en iyi optimizasyon sonuçları

5.1.3. Dinamik Kaydırma Modunda Expert Optimizasyonu

Optimize edilmiş parametreler:

Parametre
 Başlat AdımDurdur
 Dönem
 12
 1
 90
 Hareketli Ortalama kaydırma
 6
 1
 30
 LC_shift -2 1 -1

Tablo 12. Hareketli Ortalama LC Expert'in dinamik kaydırma modundaki optimize edilmiş parametreleri

Dinamik kaydırma modunda Expert optimizasyonunu gösteren grafik, EURUSD:

Dinamik kaydırma modunda optimizasyon, EURUSD

Şek. 14. Hareketli Ortalama LC Expert'in dinamik kaydırma modundaki optimizasyonu, EURUSD

En iyi sonuçlar:

Sonuç
Kar
Düşüş %
Yapılan işlem sayısı
MovingPeriod
MovingShift
LC_shift
 3392,64 392,64 27,95 594 15 13 -2
 3140,26 140,26 23,35 514 12 17 -2
 2847,12 -152,88 17,04 390 79 23 -1
 2847,12 -152,88 17,04 390 79 12 -1
 2826,25 -173,75 20,12 350 85 22 -1

Tablo 13. Hareketli Ortalama LC Expert'in EURUSD için dinamik kaydırma modundaki en iyi optimizasyon sonuçları

Dinamik kaydırma modundaki Expert optimizasyonunu gösteren grafik, GBPUSD:

Dinamik kaydırma modunda optimizasyon, GBPUSD

Şek. 15. Hareketli Ortalama LC Expert'in dinamik kaydırma modundaki optimizasyonu, GBPUSD

En iyi sonuçlar:

 SonuçKar
 Düşüş %
Yapılan işlem sayısı
MovingPeriod
 MovingShiftLC_shift
 5377,58 2377,58 19,73 391 12
 26
 -2
 3865,50 865,50 18,18 380 23
 23
 -2
 3465,63 465,63 21,22 329 48
 21
 -2
 3428,99 428,99 24,55 574 51
 16
 -1
 3428,99 428,99 24,55 574 51
 15
 -1

Tablo 14. Hareketli Ortalama LC Expert'in GBPUSD için dinamik kaydırma modundaki en iyi optimizasyon sonuçları

Dinamik kaydırma modunda Expert optimizasyonunu gösteren grafik, USDJPY:

Dinamik kaydırma modunda optimizasyon, USDJPY

Şek. 16. Hareketli Ortalama LC Expert'in dinamik kaydırma modundaki optimizasyonu, USDJPY

En iyi sonuçlar:

Sonuç
Kar
Düşüş %
 Yapılan işlem sayısı
MovingPeriod
MovingShift
 LC_shift
 6500,19 3500,19 17,45 244
 42
 28
 -2
 6374,18 3374,18 19,91 243
 54
 24
 -2
 6293,29 3293,29 19,30 235
 48
 27
 -2
 5427,69 2427,69 17,65 245
 90
 8
 -2
 5421,83 2421,83 16,30 301
 59
 12
 -2

Tablo 15. Hareketli Ortalama LC Expert'in USDJPY çin dinamik kaydırma modundaki en iyi optimizasyon sonuçları

5.2. "Pin Çubuğu" Formasyonu ile Yapılan Expert Alım Satım İşlemi Optimizasyon Sonuçlarının Analizi

Expert farklı modlarda çalışırken optimize etme sonuçlarını karşılaştıralım: sıfır kaydırmalı, statik kaydırmalı ve dinamik kaydırmalı (DSO ve DSC). 2014.04.01 - 2014.10.25 döneminde EURUSD, GBPUSD ve USDJPY için test yapılacaktır. Süre H1.

Expert giriş parametreleri:

 ParametreDeğer
Yüzde olarak Maksimum Risk
0.1
Azaltma faktörü
3.0
Pin çubuğu minimum gölge, puan
40
Pin çubuğu maksimum OC, puan
110
Pin çubuğu gölgesi OC min oranı
1.4
SL, puan (KAPALI için 0)
150
TP, puan (KAPALI için 0)
300
LC Baz Dönemi
1 dakika
LC modu AÇIK
doğru
LC kaydırma
0

Tablo 16. Pin Çubuğu LC Expert'in girdi parametreleri

Pin çubuğu şeklini tanımlayan parametreleri optimize edeceğiz: "burun" uzunluğu, "burun" uzunluğunun orta çubuğun gövdesine oranı ve gövdenin maksimum boyutu. Kar Alma ve Zarar Durdurma seviyeleri de optimize edilmelidir.


5.2.1. Devre Dışı Kaydırma Modunda Expert Optimizasyonu

Optimize edilmiş parametreler:

 Parametre Başlat Adım Durdur
Pin çubuğu minimum gölge, puan
100
20
400
Pin çubuğu maksimum OC, puan
20
20
100
Pin çubuğu gölgesi OC min oranı
1
0.2
3
SL, puan (KAPALI için 0)
150
50
500
TP, puan (KAPALI için 0)
150
50
500

Tablo 17. Devre dışı bırakma modundaki Pin Çubuğu LC Expert'in optimize edilmiş parametreleri

Devre dışı kaydırma modunda Expert optimizasyonunu gösteren grafik, EURUSD:

Sıfır kaydırmalı optimizasyon, EURUSD

Şek. 17. Pin Çubuğu LC Expert'in sıfır kaydırma modundaki optimizasyonu, EURUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP
 3504,59
 504,59
 9,82
 33
 100
 60
 1.8
 450
 500
 3428,89
 428,89
 8,72
 21
 120
 60
 2.8
 450
 350
 3392,37
 392,37
 9,94
 30
 100
 60
 2,6
 450
 250
 3388,54
 388,54
 9,93
 31
 100
 80
 2,2
 450
 300
 3311,84
 311,84
 6,84
 13
 140
 60
 2,2
 300
 450

Tablo 18. Pin Çubuğu LC Expert'in EURUSD için sıfır kaydırma modundaki en iyi optimizasyon sonuçları

Sıfır kaydırma modunda Expert optimizasyonunu gösteren grafik, GBPUSD:

Sıfır kaydırmalı optimizasyon, GBPUSD

Şek. 18. Pin Çubuğu LC Expert'in sıfır kaydırma modundaki optimizasyonu, GBPUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin Çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP
 3187,13
 187,13
 11,10
 13
 160
 60
 2,6
 500
 350
 3148,73
 148,73
 3,23
 4
 220
 40
 2,8
 400
 400
 3142,67
 142,67
 11,27
 17
 160
 100
 1,8
 500
 350
 3140,80
 140,80
 11,79
 13
 180
 100
 2
 500
 500
 3094,20
 94,20
 1,62
 1
 260
 60
 1,6
 500
 400

Tablo 19. Pin Çubuğu LC Expert'in GBPUSD için sıfır kaydırma modundaki en iyi optimizasyon sonuçları

Devre dışı kaydırma modunda Expert optimizasyonunu gösteren grafik, USDJPY:

Sıfır kaydırmalı optimizasyon, USDJPY

Şek. 19. Pin Çubuğu LC Expert'in sıfır kaydırma modundaki optimizasyonu, USDJPY

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP
 3531,99
 531,99
 9,00
 6
 160
 60
 2.2
 450
 500
 3355,91
 355,91
 18,25
 16
 120
 60
 1,6
 450
 400
 3241,93
 241,93
 9,11
 4
 160
 40
 2,8
 450
 500
 3180,43
 180,43
 6,05
 33
 100
 80
 1,8
 150
 450
 3152,97
 152,97
 3,14
 6
 160
 80
 2,8
 150
 500

Tablo 20. Pin Çubuğu LC Expert'in USDJPY için sıfır kaydırma modundaki en iyi optimizasyon sonuçları

5.2.2. Statik Kaydırma Modunda Expert Optimizasyonu

Optimize edilmiş parametreler:

 Parametre Başlat Adım Durdur
 Pin çubuğu minimum gölge, puan
 100
 20
 400
 Pin çubuğu maksimum OC, puan
 20
 20
 100
 Pin çubuğu gölgesi OC min oranı
 1
 0.2
 3
 SL, puan (KAPALI için 0)
 150
 50
 500
 TP, puan (KAPALI için 0)
 150
 50
 500
 LC kaydırma
 1 1 59

Tablo 21. Pin Çubuğu LC Expert'in statik kaydırma modundaki optimize edilmiş parametreleri

Statik kaydırma modunda Expert optimizasyonunu gösteren grafik, EURUSD:

Statik kaydırma modunda optimizasyon, EURUSD

Şek. 20. Pin Çubuğu LC Expert'in statik kaydırma modundaki optimizasyonu, EURUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP LC kaydırma
 4843,54
 1843,54
 10,14
 19
 120
 80
 1,6
 500
 500
 23
 4714,81
 1714,81
 10,99
 28
 100
 100
 1,6
 500
 500
 23
 4672,12
 1672,12
 10,16
 18 120
 80
 1,8
 500
 500
 23
 4610,13
 1610,13
 9,43
 19
 120
 80
 1,6
 450
 450
 23
 4562,21
 1562,21
 13,94
 27
 100
 100
 1,6
 500
 400
 25

Tablo 22. Pin Çubuğu LC Expert'in EURUSD için statik kaydırma modundaki en iyi optimizasyon sonuçları

Statik kaydırma modunda Expert optimizasyonunu gösteren grafik, GBPUSD:

Statik kaydırma modunda optimizasyon, GBPUSD

Şek. 21. Pin Çubuğu LC Expert'in statik kaydırma modundaki optimizasyonu, GBPUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP LC kaydırma
 4838,10
 1838,10
 5,60
 34
 100
 40
 2,4
 450
 500
 24
 4797,09
 1797,09
 5,43
 35
 100
 40
 2,6
 400
 500
 24
 4755,57
 1755,57
 7,36
 42
 100
 100
 2
 400
 500
 24
 4725,41
 1725,41
 8,35
 45
 100
 80
 1
 400
 500
 24
 4705,61
 1705,61
 8,32
 41
 100
 100
 2
 450
 500
 24

Tablo 23. Pin Çubuğu LC Expert'in GBPUSD için statik kaydırma modundaki en iyi optimizasyon sonuçları

Statik kaydırma modunda Expert optimizasyonunu gösteren grafik, USDJPY:

Statik kaydırma modunda optimizasyon, USDJPY

Şek. 22. Pin Çubuğu LC Expert'in statik kaydırma modundaki optimizasyonu, USDJPY

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP LC kaydırma
 4108,83
 1108,83
 6,45
 9
 140
 40
 1,4
 500
 450
 55
 3966,74
 966,74
 7,88
 12
 140
 60
 2,8
 450
 500
 45
 3955,32
 955,32
 9,91
 21
 120
 80
 2
 500
 500
 45
 3953,80
 953,80
 6,13
 10
 140
 60
 2,8
 450
 450
 47
 3944,33
 944,33
 6,42
 6
 160
 100
 2,6
 500
 400
 44

Tablo 24. Pin Çubuğu LC Expert'in USDJPY için statik kaydırma modundaki en iyi optimizasyon sonuçları

5.2.3. Dinamik Kaydırma Modunda Expert Optimizasyonu

Optimize edilmiş parametreler:

 Parametre Başlat Adım Durdur
 Pin çubuğu minimum gölge, puan
 100
 20
 400
 Pin çubuğu maksimum OC, puan
 20
 20
 100
 Pin çubuğu gölgesi OC min oranı
 1
 0.2
 3
 SL, puan (KAPALI için 0)
 150
 50
 500
 TP, puan (KAPALI için 0)
 150
 50
 500
 LC kaydırma
 -2 1 -1

Tablo 25. Pin Çubuğu LC Expert'in dinamik kaydırma modundaki optimize edilmiş parametreleri

Dinamik kaydırma modunda Expert optimizasyonunu gösteren grafik, EURUSD:

Dinamik kaydırma modunda optimizasyon, EURUSD

Şek. 23. Pin Çubuğu LC Expert'in dinamik kaydırma modundaki optimizasyonu, EURUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP LC kaydırma
 4185,65
 1185,65
 13,22
 49
 200
 100
 1,8
 450
 500
 -2
 4011,80
 1011,80
 13,75
 49
 200
 100
 2
 400
 500
 -2
 3989,28
 989,28
 12,01
 76
 140
 20
 1,2
 350
 200
 -1
 3979,50
 979,50
 16,45
 157
 100
 20
 1
 450
 500
 -1
 3957,25
 957,25
 16,68
 162
 100
 20
 1
 400
 500
 -1

Tablo 26. Pin Çubuğu LC Expert'in EURUSD için statik kaydırma modundaki en iyi optimizasyon sonuçları

GBPUSD için dinamik kaydırma modundaki Expert optimizasyonunu gösteren grafik:

Dinamik kaydırma modunda optimizasyon, GBPUSD

Şek. 24. Pin Çubuğu LC Expert'in dinamik kaydırma modundaki optimizasyonu, GBPUSD

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP LC kaydırma
 4906,84
 1906,84
 10,10
 179
 120
 40
 1,8
 500
 500
 -2
 4316,46
 1316,46
 10,71
 151
 120
 20
 2,4
 450
 500
 -1
 4250,96
 1250,96
 12,40
 174
 120
 40
 1,8
 500
 500
 -1
 4040,82
 1040,82
 12,40
 194
 120
 60
 2
 500
 200
 -2
 4032,85
 1032,85
 11,70
 139
 140
 40
 2
 400
 200
 -1

Tablo 27. Pin Çubuğu LC Expert'in GBPUSD için dinamik kaydırma modundaki en iyi optimizasyon sonuçları

Dinamik kaydırma modunda Expert optimizasyonunu gösteren grafik, USDJPY:

Dinamik kaydırma modunda optimizasyon, USDJPY

Şek. 25. Pin Çubuğu LC Expert'in dinamik kaydırma modundaki optimizasyonu, USDJPY

En iyi sonuçlar:

Sonuç
Kar
 Düşüş %
 Yapılan işlem sayısı
 Pin çubuğu minimum gölge
 Pin çubuğu maksimum OC
 Pin çubuğu gölgesi
OC minumum oranı
 SL TP LC kaydırma
 5472,67
 2472,67
 13,01
 138
 100
 20
 2,4
 500
 500
 -1
 4319,84
 1319,84
 15,87
 146
 100
 20
 2,2
 400
 500
 -1
 4259,54
 1259,54
 19,71
 137
 100
 20
 2,4
 500
 500
 -2
 4197,57
 1197,57
 15,98
 152
 100
 20
 1
 350
 500
 -1
 3908,19
 908,19
 16,79
 110
 120
 40
 3
 400
 400
 -1

Tablo 28. Pin Çubuğu LC Expert'in USDJPY için dinamik kaydırma modundaki en iyi optimizasyon sonuçları


6. Optimizasyon Sonuçlarının Karşılaştırılması

Bir karşılaştırma tablosu yapmak için, her en iyi sonuç tablosundan maksimum kar, düşüş ve bir dizi işlem değerlerini seçelim. Statik veya dinamik kaydırma modlarında alınan değerin yanına sıfır kaydırma modunda aynı değere ilişik değişimi (yüzde olarak) veya bu değeri yazacağız.


6.1. Hareketli Ortalamaya Göre Expert Alım Satım

Kar:

 Kaydırma yok
 Statik
kaydırma
Dinamik
kaydırma
 EURUSD
 796,43
 1385,06 (+74%)
 392,64 (-51%)
 GBPUSD
 1025,75
 1571,07 (+53%)
 2377,58 (+132%)
 USDJPY
 2801,63
 3051,39 (+9%)
 3500,19 (+25%)

Tablo 29. Hareketli Ortalama LC Expert'in en iyi optimizasyon sonuçları tablosundan maksimum kar değerlerinin karşılaştırılması

Alçalma:

 Kaydırma yok
 Statik
kaydırma
Dinamik
kaydırma
 EURUSD
 17,7
 21,52 (+22%)   
 27,95 (+58%)      
 GBPUSD
 18,16
 15,46 (-15%)
 24,55 (+35%)
 USDJPY
 17,14
 15,94 (-7%)
 19,91 (+16%)

Tablo 30. Hareketli Ortalama LC Expert'in en iyi optimizasyon sonuçları tablosundaki maksimum alçalma değerlerinin karşılaştırılması

Yapılan işlem sayısı:

 Kaydırma yok
 Statik
kaydırma
Dinamik
kaydırma
 EURUSD
 111
 122 (+10%)     
 594 (+435%)       
 GBPUSD
 137
 107 (-22%)
 574 (+319%)
 USDJPY
 61
 71 (+16%)
 301 (+393%)

Tablo 31. Hareketli Ortalama LC Expert'in en iyi optimizasyon sonuçları tablosundaki maksimum işlem sayısı değerinin karşılaştırılması

Hemen göze çarpan ilk şey, dinamik kaydırma modundaki giriş noktalarında önemli bir artış olmasıdır. Aynı zamanda bununla birlikte, alçalma gözle görülür şekilde artmıştır ve EURUSD için de kar iki kat azalmıştır.

Statik kaydırma modu, bu Expert Advisor için daha karlıdır. Burada GBPUSD ve USDJPY için alçalmanın azaldığını ve EURUSD ve GBPUSD için kârda önemli bir artış olduğunu görebiliriz.


6.2. "Pin Çubuğu" Formasyonuyla Expert İşlemi

Kar:

 Kaydırma yok
 Statik
kaydırma
Dinamik
kaydırma
 EURUSD
504,59
1843,54 (+265%)
1185,65 (+135%)
 GBPUSD
187,13
1838,10 (+882%)
1906,84 (+919%)
 USDJPY
531,99
1108,83 (+108%)2472,67 (+365%)

Tablo 32. Pin Çubuğu LC Expert'in en iyi optimizasyon sonuçları tablosundaki maksimum kar değerlerinin karşılaştırılması

Alçalma:

 Kaydırma yok
 Statik
kaydırma
Dinamik
kaydırma
 EURUSD
9,94
13,94 (+40%)
16,68 (+68%)
 GBPUSD
11,79
8,35 (-29%)
12,4 (+5%)
 USDJPY
18,25
9,91 (-46%)
19,71 (+8%)

Tablo 33. Pin Çubuğu LC Expert'in en iyi optimizasyon sonuçları tablosundaki maksimum alçalma değerlerinin karşılaştırılması

Yapılan işlem sayısı:

 Kaydırma yok
 Statik
kaydırma
Dinamik
kaydırma
 EURUSD
33
28 (-15%)
162 (+391%)
 GBPUSD
17
45 (+165%)
194 (+1041%)
 USDJPY
33
21 (-36%)
152 (+361%)

Tablo 34. Pin Çubuğu LC Expert'in en iyi optimizasyon sonuçları tablosundaki maksimum işlem sayısı değerlerinin karşılaştırılması

Ayrıca burada dinamik kaydırma modundaki işlem sayısında önemli bir artış görüyoruz. Ancak bu durumda önemli alçalma artışı, Hareketli Ortalama LC Expert ile benzer durumdaki gibi sadece EURUSD için gerçekleşir. Diğer çiftler için alçalma önemsiz bir şekilde, yaklaşık yüzde 5-8 oranında artar.

Statik kaydırma modunda, optimizasyon GBPUSD ve USDJPY için sınırlı kar göstermiştir. Yine de aynı çiftler için önemli bir alçalma düşüşü ve bunun EURUSD için arttığını görebiliriz. Statik kaydırma modu, bu Expert Advisor için daha az karlı görünmektedir.


Sonuç

Bu makalede, "likit grafiğinin" çizim prensiplerini ele aldık ve gösterge ve gösterge olmayan stratejilere dayalı olarak çalışma modlarının Expert'in optimizasyon sonucu üzerindeki etkisini karşılaştırdık.

Dolayısıyla aşağıdaki sonuçlar:

  • Gösterge stratejileri kullanan Expert için (örneğin Hareketli Ortalama ile alım satım) statik kaydırma modu daha uygundur. Alçalmada azalmaya ve kârda artışa neden olan daha kesin bir piyasa girişi sağlar.
  • Dinamik kaydırma modu, formasyonlarla alım satım yapan Expert için daha iyidir. Bu mod, alçalma aynı anda artmasına rağmen giriş noktalarının sayısını artırır.
  • Dinamik kaydırma modu, iyi organize edilmiş para yönetimi ile birlikte etkileyici sonuçlar verebilir.
  • Statik kaydırma modunun gösterge stratejileri için çok umut verici görünse de, önemli bir dezavantajı vardır. En iyi sonucu sağlayan kaydırma değeri, girdi parametreleri listesinde doğru tahmin edilmesi gereken bir diğer değişkendir.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/1208

Ekli dosyalar |
liquid_chart.mq5 (27.15 KB)
pinbar_lc.mq5 (18.61 KB)
liquidchart.mqh (8.32 KB)
MQL5 Programlama Temelleri: Terminalin Global Değişkenleri MQL5 Programlama Temelleri: Terminalin Global Değişkenleri
Bu makale, terminal global değişkenleriyle çalışmayı kolaylaştıran nesneler oluşturmak için MQL5 dilinin nesne yönelimli imkanlarını vurgulamaktadır. Pratik bir örnek olarak, genel değişkenlerin program aşamalarının uygulanması için kontrol noktaları olarak kullanıldığı bir durumu ele alıyorum.
MQL4 ve MQL5 kullanarak fraktallara dayalı trend çizgileri çizme MQL4 ve MQL5 kullanarak fraktallara dayalı trend çizgileri çizme
Makale, MQL4 ve MQL5 kullanarak Fraktallar göstergesine dayalı trend çizgilerinin çizilme otomasyonunu açıklar. Makale yapısı, iki dil için çözümün karşılaştırmalı bir görünümünü sağlar. Trend çizgileri, bilinen son iki fraktal kullanılarak çizilir.
Yatırımcının İstatistiksel Yemek Kitabı: Hipotezler Yatırımcının İstatistiksel Yemek Kitabı: Hipotezler
Bu makale, matematiksel istatistiklerin temel fikirlerinden biri olan hipotezi ele almaktadır. Çeşitli hipotezler, matematiksel istatistik yöntemleri kullanılarak örneklerle incelenir ve doğrulanır. Gerçek veriler parametrik olmayan yöntemler kullanılarak genelleştirilir. Verileri işlemek için, Statistica paketi ve taşınan ALGLIB MQL5 sayısal analiz kitaplığı kullanılır.
MQL5 Cookbook: BookEvent İşleme MQL5 Cookbook: BookEvent İşleme
Bu makale, Piyasa Derinliği olayı - BookEvent'i ve işleme prensibini ele almaktadır. Piyasa Derinliği durumlarını işleyen MQL programı örnek teşkil etmektedir. Nesne yönelimli yaklaşım kullanılarak yazılmıştır. İşleme sonuçları panel ve Piyasa Derinliği seviyeleri olarak ekranda görüntülenir.