English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Son Haçlı Seferi

Son Haçlı Seferi

MetaTrader 5Örnekler | 16 Aralık 2021, 16:16
162 0
Roman Zamozhnyy
Roman Zamozhnyy

Giriş

МetaТrader 5 terminalinde (ayrıca МetaТrader 4 terminalinde) üç varsayılan enstrüman fiyat sunumu vardır: çubuklar, şamdanlar ve çizgiler. Esasen, hepsi aynı şeyi temsil eder: zaman grafikleri. Geleneksel zamanla ilişkili fiyat sunumu yöntemine ek olarak, yatırımcılar ve spekülatörler arasında oldukça popüler olan zamanla ilişkili olmayan diğer araçlar da mevcuttur: Renko ve Kagi grafikleri, Three Line Break ve nokta ve şekil grafikleri.

Klasiklerle kıyaslayıp avantajlarını öne sürmeyeceğim, ancak zaman değişkenini gözden uzak tutmak, bazı yatırımcıların fiyat değişkenine odaklanmasına yardımcı olmaktadır. Burada nokta ve şekil grafiklerini ilgili bir grafik algoritması ile birlikte ele almamızı, bu tür grafikleri oluşturmaya yarayan iyi bilinen piyasa ürünlerine göz atmamızı ve algoritmayı uygulayan sade ve basit bir komut dosyası yazmamızı öneriyorum. Thomas J. Dorsey tarafından yazılan bir kitap "Point and Figure Charting: The Essential Application for Forecasting and Tracking Market Prices (Nokta ve Şekil Grafiği: Piyasa Fiyatlarını Tahmin Etme ve İzleme İçin Temel Uygulama)" bizim temel kitabımız olacak.

Bull's-Eye Broker, çevrimdışı grafikler çizmek için en popüler yazılım paketidir. Yazılımın 21 günlük deneme süresi vardır (çok sayıda deneme mümkündür) ve yeni Beta sürümü, Beta döneminde mevcuttur. Bu yazılım paketi, komut dosyası performans sonuçlarımızı hesaplamak için kullanılacaktır. Nokta ve şekil grafiği bakımından en iyi çevrimiçi kaynaklardan bir tanesi StockCharts'tır. Web sitesi borsa odaklıdır bu nedenle de ne yazık ki Forex enstrüman fiyatlarını sağlamaz.

Tanıtacağımız komut dosyası performans sonuçlarını karşılaştırmak için, yazılım ve web sitesi kullanılarak Altın vadeli işlemleri, Hafif Ham Petrol vadeli işlemleri ve S&P 500 CFD grafikleri oluşturulacaktır; yalnızca Bull's-Eye Broker kullanılarak bir EURUSD fiyat grafiği çizilecektir (StockChart sınırlamalarını unutmayın).


Nokta ve Şekil Grafiği Algoritması

Evet, işte algoritma.

Nokta ve şekil grafiğinde iki önemli parametre vardır:

  1. Minimum enstrüman fiyat değişimi olan kutu boyutu; minimum fiyat değişikliğinden daha küçük değişiklikler grafiği etkilememektedir;
  2. Mevcut grafik yönüne zıt yöndeki fiyat hareketini temsil eden kutuların sayısı olan trend dönüşü, bunun ardından bu gibi hareketler yeni sütunda görüntülenir.

Grafik yapma, Açılış-Yüksek-Düşük-Kapanış fiyatları biçiminde saklanan fiyat tekliflerinin geçmişini gerektirdiği için, aşağıdakileri varsayıyoruz:

  1. Grafik, Yüksek-Düşük fiyatlara dayanarak çizilmektedir;
  2. Yüksek fiyat, kutu boyutuna aşağı yuvarlanır (MathFloor), Düşük fiyat, kutu boyutuna yukarı yuvarlanır (MathCeil).

Bir örnek vereyim. 1$'a (bir) eşit bir kutu boyutuna sahip olan bir Hafif Ham Petrol grafiği ve bir 3 (üç) kutu trend dönüşü çizmek istediğimizi varsayalım. Bu, tüm Yüksek fiyatların 1$'a en yakın şekilde aşağı yuvarlandığı ve Düşük fiyatların da aynı şekilde yukarı yuvarlandığı anlamına gelir:

Tarih Yüksek Düşük XO Yüksek XO Düşük
2012.02.13 100.86 99.08 100 100
2012.02.14 101.83 100.28 101 101
2012.02.15 102.53 100.62 102 101
2012.02.16 102.68 100.84 102 101
2012.02.17 103.95 102.24 103 102


X'ler (çarpılar) grafikte yukarı yönlü bir fiyat hareketini göstermek için kullanılırken, O'lar (boşluklar) düşen bir fiyat hareketini temsil eder.

Fiyatın başlangıç yönü nasıl belirlenir (birinci sütunun X mi yoksa O mu olacağı):

XO Yüksek ve XO Düşük [Bars-1] değerlerini aklınızda tutun ve şu zamana kadar bekleyin:

  • XO Düşük değer, başlangıç XO Yüksek ile kıyaslandığında kutu sayısının tersine döndürülmesiyle azalır (ilk sütun O'dur); veya
  • XO Yüksek değer, başlangıç XO Düşük ile kıyaslandığında kutu sayısının tersine döndürülmesiyle artar (ilk sütun X'tir).

Hafif Ham Petrol örneğimizde, XO Yüksek[Bars-1]=100 ve XO Düşük[Bars-1]=100 olduğunu aklımızda tutmalıyız.

Ardından, daha önce ne olduğunu görmek için bekleyin:

  • Sonraki çubuğun XO Düşük[i] değeri 97$'dan küçük veya buna eşit olur ve ilk sütunun O olduğu önerilir; veya
  • Sonraki çubuğun XO Yüksek[i] değeri 103 $'dan küçük veya buna eşit olur ve ilk sütunun X olduğu önerilir; veya

17 Şubat'ta ilk sütunu belirleyebiliriz: XO Yüksek fiyat 103$'a ulaşmıştır ve ilk sütun X'tir. 100$'dan 103$'a dört X çizerek bunu yapın.

Daha fazla grafik hareketi nasıl belirlenir:

Mevcut sütun X ise, mevcut çubuktaki XO Yüksek'in mevcut XO fiyatına kıyasla kutu boyutunda artış olup olmadığını kontrol edin (yani, 20 Şubat'ta ilk olarak XO Yüksek'in 104$'dan daha büyük ya da buna eşit olup olmadığını kontrol edeceğiz). XO Yüksek[2012.02.20], 104$ veya 105$ veya daha yüksekse, mevcut X sütununa ilgili sayıdaki X'i ekleyeceğiz.

Mevcut çubuğun XO Yüksek'i mevcut XO fiyatına kıyasla kutu boyutu olarak artmadıysa, mevcut çubuğun XO Düşük'ünün kutuların trend dönüşü sayısı olarak XO Yüksek'ten daha düşük olup olmadığını kontrol edin (bizim örneğimizde, XO Düşük[2012.02.20] 103-3$*1$=100$'dan daha az veya buna eşit veya 99$ veya bundan daha düşük olup olmadığını). Daha düşükse, X sütununun sağına, 102$'dan 100$'a kadar bir O sütunu çizeceğiz.

Mevcut sütunun O olması durumda, yukarıdaki tüm açıklamalar bunun tersi için geçerli olacaktır.

ÖNEMLİ: Her yeni O sütunu, her zaman önceki X sütununun Yüksek değerinin sağına ve bundan bir kutu aşağıya çizilir ve her yeni X sütunu, her zaman önceki O sütununun Düşük değerinin sağına ve bundan bir kutu aşağıya çizilir.

Grafik oluşturma ilkeleri artık anlaşılmıştır. Destek ve direnç çizgilerine geçelim.

Geleneksel nokta ve şekil grafiklerindeki destek ve direnç çizgileri her zaman 45 derece açılıdır.

Birinci çizgi, birinci sütuna bağlıdır. Birinci sütun X ise, birinci çizgi birinci sütunun maksimumundan bir kutu yukarıda başlayan, 45 derece AŞAĞI ve sağa açılı olan bir direnç çizgisi olacaktır. Birinci sütun O ise, birinci çizgi birinci sütunun minimumundan bir kutu aşağıda başlayan, 45 derece Yukarı ve sağa açılı olan bir destek çizgisi olacaktır. Destek ve direnç çizgileri, fiyat grafiğine ulaşana kadar çizilir.

Destek/direnç çizgisi fiyat grafiğine ulaşır ulaşmaz, buna göre bir direnç/destek çizgisi çizmeye başlarız. Çizerken temel ilke, çizilen çizginin grafik üstündeki önceki trend çizgisinin daha sağında olmasını sağlamaktır. Bundan dolayı, bir destek çizgisi çizmek için ilk olarak az önce çizdiğimiz direnç çizgisi altındaki minimum grafik değerini belirleriz ve belirlenen minimumun bir kutu aşağısından başlayarak grafiğe veya grafiğin son sütununa ulaşana kadar YUKARIYA sağa doğru destek çizgisini çizeriz.

Bir önceki direnç çizgisinin altındaki minimumdan başlayarak çizilen destek çizgisi yukarı çıkar ve aynı direnç çizgisinin altındaki grafikte takılırsa, sağa hareket edin ve direncin altındaki en düşük minimumdan direnç çizgisinin sonuna kadar olan aralıkta yeni bir minimum fiyat bulun. Bu şekilde çizilen trend çizgisi sağa, önceki trend çizgisinin ötesine geçene kadar devam edin.

Yukarıdakilerin tamamı, aşağıda verilen gerçek grafik örnekleriyle gösterildiğinde daha açık olacaktır.

Şimdiye kadar, grafik algoritmasını zaten sıraladık. Komut dosyamıza birkaç güzel özellik ekleyelim:

  • Mod seçimi: Yalnızca mevcut bir sembol için veya MarketWatch'taki tüm semboller için grafik;
  • Zaman dilimi seçimi (Günlük zaman dilimlerinde 100 piplik grafikler ve M1'de 1-3 piplik grafikler çizmek daha mantıklı görünmektedir);
  • Kutu boyutunu pip olarak ayarlama;
  • Tersine döndürme için kutu sayısını ayarlama;
  • Sütunlarda ve satırlarda (MarketDepth göstergesi gibi) hacimleri (komut dosyasında - gerçek hacim sağlayan aracılarla karşılaşmadığım için tik hacimlerini) görüntülemek için karakter sayısını ayarlama;
  • Grafiğin çizileceği tarih derinliğini ayarlama;
  • Çıktı biçimini ayarlama - sonuçlar düz metin dosyaları veya görüntü dosyaları olarak kaydedilebilir;
  • Ve son olarak acemiler için bir özellik - otomatik grafik yapma (grafiğin gerekli yüksekliğine göre kutu boyutunu otomatik olarak ayarlar).

Algoritma açıklamaları ve gereklilikler verildiğine göre, artık komut dosyasını sunma vakti geldi.

//+------------------------------------------------------------------+
//|                                         Point&Figure text charts |
//|                                        BSD Lic. 2012, Roman Rich |
//|                                           http://www.FXRays.info |
//+------------------------------------------------------------------+
#property               copyright "Roman Rich"
#property               link      "http://www.FXRays.info"
#property               version   "1.00"
#property               script_show_inputs
#include                "cIntBMP.mqh"                                       // Include the file containing cIntBMP class

input bool              mw=true;                                    // All MarketWatch?
input ENUM_TIMEFRAMES   tf=PERIOD_M1;                                 // Time frame
input long              box=2;                                      // Box size in pips (0 - auto)
enum                    cChoice{c10=10,c25=25,c50=50,c100=100};
input cChoice           count=c50;                                 // Chart height in boxes for autocharting
enum                    rChoice{Two=2,Three,Four,Five,Six,Seven};
input rChoice           reverse=Five;                              // Number of boxes for reversal
enum                    vChoice{v10=10,v25=25,v50=50};
input vChoice           vd=v10;                                    // Characters for displaying volumes
enum                    dChoice{Little=15000,Middle=50000,Many=100000,Extremely=1000000};
input dChoice           depth=Little;                              // History depth
input bool              pic=true;                                   // Image file?
input int               cellsize=10;                                // Cell size in pixels
//+------------------------------------------------------------------+
//| cIntBMP class descendant                                         |
//+------------------------------------------------------------------+
class cIntBMPEx : public cIntBMP
  {
public:
   void              Rectangle(int aX1,int aY1,int aSizeX,int aSizeY,int aColor);
   void              Bar(int aX1,int aY1,int aSizeX,int aSizeY,int aColor);
   void              LineH(int aX1,int aY1,int aSizeX,int aColor);
   void              LineV(int aX1,int aY1,int aSizeY,int aColor);
   void              DrawBar(int aX1,int aY1,int aX2,int aY2,int aColor);
   void              TypeTextV(int aX,int aY,string aText,int aColor);
  };
cIntBMPEx bmp;    // cIntBMPEx class instance
uchar Mask_O[192]= // The naughts
  {
   217,210,241,111,87,201,124,102,206,165,150,221,237,234,248,255,255,255,255,255,255,255,255,255,
   73,42,187,137,117,211,201,192,235,140,120,212,60,27,182,178,165,226,255,255,255,255,255,255,
   40,3,174,250,249,253,255,255,255,255,255,255,229,225,245,83,54,190,152,135,216,255,255,255,
   68,36,185,229,225,245,255,255,255,255,255,255,255,255,255,247,246,252,78,48,188,201,192,235,
   140,120,212,145,126,214,255,255,255,255,255,255,255,255,255,255,255,255,188,177,230,124,102,206,
   237,234,248,58,24,181,209,201,238,255,255,255,255,255,255,255,255,255,168,153,222,124,102,206,
   255,255,255,199,189,234,63,30,183,186,174,229,247,246,252,204,195,236,60,27,182,204,195,236,
   255,255,255,255,255,255,232,228,246,117,93,203,52,18,179,83,54,190,196,186,233,255,255,255
  };
uchar Mask_X[192]= // The crosses
  {
   254,252,252,189,51,51,236,195,195,255,255,255,255,255,255,235,192,192,248,234,234,255,255,255,
   255,255,255,202,90,90,184,33,33,251,243,243,212,120,120,173,0,0,173,0,0,255,255,255,
   255,255,255,254,252,252,195,69,69,192,60,60,178,15,15,233,186,186,253,249,249,255,255,255,
   255,255,255,255,255,255,241,210,210,173,0,0,209,111,111,255,255,255,255,255,255,255,255,255,
   255,255,255,255,255,255,205,99,99,192,60,60,181,24,24,241,210,210,255,255,255,255,255,255,
   255,255,255,249,237,237,176,9,9,241,213,213,226,165,165,189,51,51,254,252,252,255,255,255,
   255,255,255,230,177,177,185,36,36,255,255,255,255,255,255,189,51,51,222,153,153,255,255,255,
   255,255,255,240,207,207,200,84,84,255,255,255,255,255,255,227,168,168,211,117,117,255,255,255
  };
//+------------------------------------------------------------------+
//| Instrument selection                                             |
//+------------------------------------------------------------------+
void OnStart()
  {
   int    mwSymb;
   string symb;
   int    height=0,width=0;
   string pnfArray[];
   if(mw==true)
     {
      mwSymb=0;
      while(mwSymb<SymbolsTotal(true))
        {
         symb=SymbolName(mwSymb,true);
         ArrayFree(pnfArray);
         ArrayResize(pnfArray,0,0);
         PNF(symb,pnfArray,height,width,pic,cellsize);
         pnf2file(symb,pnfArray,0,height);
         mwSymb++;
        };
     }
   else
     {
      symb=Symbol();
      ArrayFree(pnfArray);
      ArrayResize(pnfArray,0,0);
      PNF(symb,pnfArray,height,width,pic,cellsize);
      pnf2file(symb,pnfArray,0,height);
     };
   Alert("Ok.");
  }
//+------------------------------------------------------------------+
//| Chart calculation and drawing                                    |
//+------------------------------------------------------------------+
void PNF(string sName,      // instrument
         string& array[],  // array for the output
         int& y,           // array height
         int& z,           // array width
         bool toPic,       // if true-output and draw
         int cs)           // set the cell size for drawing
  {
   string      s,ps;
   datetime    d[];
   double      o[],h[],l[],c[];
   long        v[];
   uchar       matrix[];
   long        VolByPrice[],VolByCol[],HVolumeMax,VVolumeMax;
   int         tMin[],tMax[];
   datetime    DateByCol[];
   MqlDateTime bMDT,eMDT;
   string      strDBC[];
   uchar       pnf='.';
   int         sd;
   int         b,i,j,k=0,m=0;
   int         GlobalMin,GlobalMax,StartMin,StartMax,CurMin,CurMax,RevMin,RevMax,ContMin,ContMax;
   int         height,width,beg=0,end=0;
   double      dBox,price;
   int         thBeg=1,thEnd=2,tv=0;
   uchar       trend='.';
// --------------------------------- BMP -----------------------------------------
   int RowVolWidth=10*cs;
//--- shift for prices
   int startX=5*cs;
   int yshift=cs*7;
// --------------------------------- BMP -----------------------------------------
   if(SymbolInfoInteger(sName,SYMBOL_DIGITS)<=3) sd=2; else sd=4;
   b=MathMin(Bars(sName,tf),depth);
   ArrayFree(d);
   ArrayFree(o);
   ArrayFree(h);
   ArrayFree(l);
   ArrayFree(c);
   ArrayFree(v);
   ArrayFree(matrix);
   ArrayFree(VolByPrice);
   ArrayFree(VolByCol);
   ArrayFree(DateByCol);
   ArrayFree(tMin);
   ArrayFree(tMax);
   ArrayResize(d,b,0);
   ArrayResize(o,b,0);
   ArrayResize(h,b,0);
   ArrayResize(l,b,0);
   ArrayResize(c,b,0);
   ArrayResize(v,b,0);
   ArrayInitialize(d,NULL);
   ArrayInitialize(o,NULL);
   ArrayInitialize(h,NULL);
   ArrayInitialize(l,NULL);
   ArrayInitialize(c,NULL);
   ArrayInitialize(v,NULL);
   CopyTime(sName,tf,0,b,d);
   CopyOpen(sName,tf,0,b,o);
   CopyHigh(sName,tf,0,b,h);
   CopyLow(sName,tf,0,b,l);
   CopyClose(sName,tf,0,b,c);
   CopyTickVolume(sName,tf,0,b,v);
   if(box!=0)
     {
      dBox=box/MathPow(10.0,(double)sd);
     }
   else
     {
      dBox=MathNorm((h[ArrayMaximum(h,0,WHOLE_ARRAY)]-l[ArrayMinimum(l,0,WHOLE_ARRAY)])/count,
                      1/MathPow(10.0,(double)sd),true)/MathPow(10.0,(double)sd);
     };
   GlobalMin=MathNorm(l[ArrayMinimum(l,0,WHOLE_ARRAY)],dBox,true)-(int)(reverse);
   GlobalMax=MathNorm(h[ArrayMaximum(h,0,WHOLE_ARRAY)],dBox,false)+(int)(reverse);
   StartMin=MathNorm(l[0],dBox,true);
   StartMax=MathNorm(h[0],dBox,false);
   ContMin=(int)(StartMin-1);
   ContMax=(int)(StartMax+1);
   RevMin=(int)(StartMax-reverse);
   RevMax=(int)(StartMin+reverse);
   height=(int)(GlobalMax-GlobalMin);
   width=1;
   ArrayResize(matrix,height*width,0);
   ArrayInitialize(matrix,'.');
   ArrayResize(VolByPrice,height,0);
   ArrayInitialize(VolByPrice,0);
   ArrayResize(VolByCol,width,0);
   ArrayInitialize(VolByCol,0);
   ArrayResize(DateByCol,width,0);
   ArrayInitialize(DateByCol,D'01.01.1971');
   ArrayResize(tMin,width,0);
   ArrayInitialize(tMin,0);
   ArrayResize(tMax,width,0);
   ArrayInitialize(tMax,0);
   for(i=1;i<b;i++)
     {
      CurMin=MathNorm(l[i],dBox,true);
      CurMax=MathNorm(h[i],dBox,false);
      switch(pnf)
        {
         case '.':
           {
            if(CurMax>=RevMax)
              {
               pnf='X';
               ContMax=(int)(CurMax+1);
               RevMin=(int)(CurMax-reverse);
               beg=(int)(StartMin-GlobalMin-1);
               end=(int)(CurMax-GlobalMin-1);
               SetMatrix(matrix,beg,end,height,(int)(width-1),pnf);
               SetVector(VolByPrice,beg,end,v[i]);
               VolByCol[width-1]=VolByCol[width-1]+v[i];
               DateByCol[width-1]=d[i];
               trend='D';
               break;
              };
            if(CurMin<=RevMin)
              {
               pnf='O';
               ContMin=(int)(CurMin-1);
               RevMax=(int)(CurMin+reverse);
               beg=(int)(CurMin-GlobalMin-1);
               end=(int)(StartMax-GlobalMin-1);
               SetMatrix(matrix,beg,end,height,(int)(width-1),pnf);
               SetVector(VolByPrice,beg,end,v[i]);
               VolByCol[width-1]=VolByCol[width-1]+v[i];
               DateByCol[width-1]=d[i];
               trend='U';
               break;
              };
            break;
           };
         case 'X':
           {
            if(CurMax>=ContMax)
              {
               pnf='X';
               ContMax=(int)(CurMax+1);
               RevMin=(int)(CurMax-reverse);
               end=(int)(CurMax-GlobalMin-1);
               SetMatrix(matrix,beg,end,height,(int)(width-1),pnf);
               SetVector(VolByPrice,beg,end,v[i]);
               VolByCol[width-1]=VolByCol[width-1]+v[i];
               DateByCol[width-1]=d[i];
               break;
              };
            if(CurMin<=RevMin)
              {
               pnf='O';
               ContMin=(int)(CurMin-1);
               RevMax=(int)(CurMin+reverse);
               tMin[width-1]=beg-1;
               tMax[width-1]=end+1;
               beg=(int)(CurMin-GlobalMin-1);
               end--;
               width++;
               ArrayResize(matrix,height*width,0);
               ArrayResize(VolByCol,width,0);
               ArrayResize(DateByCol,width,0);
               ArrayResize(tMin,width,0);
               ArrayResize(tMax,width,0);
               SetMatrix(matrix,0,(int)(height-1),height,(int)(width-1),'.');
               SetMatrix(matrix,beg,end,height,(int)(width-1),pnf);
               SetVector(VolByPrice,beg,end,v[i]);
               VolByCol[width-1]=0;
               VolByCol[width-1]=VolByCol[width-1]+v[i];
               DateByCol[width-1]=d[i];
               tMin[width-1]=beg-1;
               tMax[width-1]=end+1;
               break;
              };
            break;
           };
         case 'O':
           {
            if(CurMin<=ContMin)
              {
               pnf='O';
               ContMin=(int)(CurMin-1);
               RevMax=(int)(CurMin+reverse);
               beg=(int)(CurMin-GlobalMin-1);
               SetMatrix(matrix,beg,end,height,(int)(width-1),pnf);
               SetVector(VolByPrice,beg,end,v[i]);
               VolByCol[width-1]=VolByCol[width-1]+v[i];
               DateByCol[width-1]=d[i];
               break;
              };
            if(CurMax>=RevMax)
              {
               pnf='X';
               ContMax=(int)(CurMax+1);
               RevMin=(int)(CurMax-reverse);
               tMin[width-1]=beg-1;
               tMax[width-1]=end+1;
               beg++;
               end=(int)(CurMax-GlobalMin-1);
               width++;
               ArrayResize(matrix,height*width,0);
               ArrayResize(VolByCol,width,0);
               ArrayResize(DateByCol,width,0);
               ArrayResize(tMin,width,0);
               ArrayResize(tMax,width,0);
               SetMatrix(matrix,0,(int)(height-1),height,(int)(width-1),'.');
               SetMatrix(matrix,beg,end,height,(int)(width-1),pnf);
               SetVector(VolByPrice,beg,end,v[i]);
               VolByCol[width-1]=0;
               VolByCol[width-1]=VolByCol[width-1]+v[i];
               DateByCol[width-1]=d[i];
               tMin[width-1]=beg-1;
               tMax[width-1]=end+1;
               break;
              };
            break;
           };
        };
     };
//--- credits
   s="BSD License, 2012, FXRays.info by Roman Rich";
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
   s=SymbolInfoString(sName,SYMBOL_DESCRIPTION)+",
                      Box-"+DoubleToString(box,0)+",Reverse-"+DoubleToString(reverse,0);
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
// --------------------------------- BMP -----------------------------------------
   if(toPic==true)
     {
      //-- BMP image size on the chart display
      int XSize=cs*width+2*startX+RowVolWidth;
      int YSize=cs*height+yshift+70;
      //-- creating a bmp image sized XSize x YSize with the background color clrWhite
      bmp.Create(XSize,YSize,clrWhite);
      //-- displaying cells of the main field
      for(i=height-1;i>=0;i--)
         for(j=0;j<=width-1;j++)
           {
            bmp.Bar(RowVolWidth+startX+cs*j,yshift+cs*i,cs,cs,clrWhite);
            bmp.Rectangle(RowVolWidth+startX+cs*j,yshift+cs*i,cs,cs,clrLightGray);
           }
      bmp.TypeText(10,yshift+cs*(height)+50,array[k-2],clrDarkGray);
      bmp.TypeText(10,yshift+cs*(height)+35,array[k-1],clrGray);
     }
// --------------------------------- BMP -----------------------------------------
//--- calculating trend lines
   i=0;
   while(thEnd<width-1)
     {
      while(thBeg+i<thEnd)
        {
         if(trend=='U')
           {
            i=ArrayMinimum(tMin,thBeg,thEnd-thBeg);
            j=tMin[i];
           }
         else
           {
            i=ArrayMaximum(tMax,thBeg,thEnd-thBeg);
            j=tMax[i];
           }
         thBeg=i;
         tv=j;
         i=0;
         while(GetMatrix(matrix,j,height,(long)(thBeg+i))=='.')
           {
            i++;
            if(trend=='U') j++; else j--;
            if(thBeg+i==width-1)
              {
               thEnd=width-1;
               break;
              };
           };
         if(thBeg+i<thEnd)
           {
            thBeg=thBeg+2;
            i=0;
           };
        };
      thEnd=thBeg+i;
      if(thEnd==thBeg) thEnd++;
      for(i=thBeg;i<thEnd;i++)
        {
         SetMatrix(matrix,tv,tv,height,(long)(i),'+');
         // --------------------------------- BMP -----------------------------------------
         if(toPic==true)
           {
            //--- support and resistance lines
            if(trend=='U') { bmp.DrawLine(RowVolWidth+startX+i*cs,yshift+tv*cs,
                                         RowVolWidth+startX+(i+1)*cs,yshift+(tv+1)*cs,clrGreen); }
            if(trend=='D') { bmp.DrawLine(RowVolWidth+startX+i*cs,yshift+(tv+1)*cs,
                                         RowVolWidth+startX+(i+1)*cs,yshift+(tv)*cs,clrRed); }
            //--- broadening of support/resistance lines
            if(trend=='U') { bmp.DrawLine(RowVolWidth+1+startX+i*cs,yshift+tv*cs,
                                         RowVolWidth+1+startX+(i+1)*cs,yshift+(tv+1)*cs,clrGreen); }
            if(trend=='D') { bmp.DrawLine(RowVolWidth+1+startX+i*cs,yshift+(tv+1)*cs,
                                         RowVolWidth+1+startX+(i+1)*cs,yshift+(tv)*cs,clrRed); }
           }
         // --------------------------------- BMP -----------------------------------------
         if(trend=='U') tv++; else tv--;
        };
      if(trend=='U') trend='D'; else trend='U';
      i=0;
     };
//--- displaying data in columns
   ArrayResize(strDBC,width,0);
   TimeToStruct(DateByCol[0],bMDT);
   TimeToStruct(DateByCol[width-1],eMDT);
   if((DateByCol[width-1]-DateByCol[0])>=50000000)
     {
      for(i=0;i<=width-1;i++) StringInit(strDBC[i],4,' ');
      for(i=1;i<=width-1;i++)
        {
         TimeToStruct(DateByCol[i-1],bMDT);
         TimeToStruct(DateByCol[i],eMDT);
         if(bMDT.year!=eMDT.year) strDBC[i]=DoubleToString(eMDT.year,0);
        };
      for(i=0;i<=3;i++)
        {
         StringInit(s,vd,' ');
         s=s+"            : ";
         for(j=0;j<=width-1;j++) s=s+StringSubstr(strDBC[j],i,1);
         s=s+" : ";
         k++;
         ArrayResize(array,k,0);
         array[k-1]=s;
        };
     }
   else
     {
      if((DateByCol[width-1]-DateByCol[0])>=5000000)
        {
         for(i=0;i<=width-1;i++) StringInit(strDBC[i],7,' ');
         for(i=1;i<=width-1;i++)
           {
            TimeToStruct(DateByCol[i-1],bMDT);
            TimeToStruct(DateByCol[i],eMDT);
            if(bMDT.mon!=eMDT.mon)
              {
               if(eMDT.mon<10) strDBC[i]=DoubleToString(eMDT.year,0)+".0"+DoubleToString(eMDT.mon,0);
               if(eMDT.mon>=10) strDBC[i]=DoubleToString(eMDT.year,0)+"."+DoubleToString(eMDT.mon,0);
              }
           };
         for(i=0;i<=6;i++)
           {
            StringInit(s,vd,' ');
            s=s+"            : ";
            for(j=0;j<=width-1;j++) s=s+StringSubstr(strDBC[j],i,1);
            s=s+" : ";
            k++;
            ArrayResize(array,k,0);
            array[k-1]=s;
           };
        }
      else
        {
         for(i=0;i<=width-1;i++) StringInit(strDBC[i],10,' ');
         for(i=1;i<=width-1;i++)
           {
            TimeToStruct(DateByCol[i-1],bMDT);
            TimeToStruct(DateByCol[i],eMDT);
            if(bMDT.day!=eMDT.day)
              {
               if(eMDT.mon<10 && eMDT.day<10) strDBC[i]=DoubleToString(eMDT.year,0)+".0"
                                                       +DoubleToString(eMDT.mon,0)+".0"+DoubleToString(eMDT.day,0);
               if(eMDT.mon<10 && eMDT.day>=10) strDBC[i]=DoubleToString(eMDT.year,0)+".0"
                                                       +DoubleToString(eMDT.mon,0)+"."+DoubleToString(eMDT.day,0);
               if(eMDT.mon>=10&&eMDT.day< 10) strDBC[i]=DoubleToString(eMDT.year,0)+"." 
                                                      +DoubleToString(eMDT.mon,0)+".0"+DoubleToString(eMDT.day,0);
               if(eMDT.mon>=10&&eMDT.day>=10) strDBC[i]=DoubleToString(eMDT.year,0)+"." 
                                                      +DoubleToString(eMDT.mon,0)+"." +DoubleToString(eMDT.day,0);
              }
           };
         for(i=0;i<=9;i++)
           {
            StringInit(s,vd,' ');
            s=s+"            : ";
            for(j=0;j<=width-1;j++) s=s+StringSubstr(strDBC[j],i,1);
            s=s+" : ";
            k++;
            ArrayResize(array,k,0);
            array[k-1]=s;
           };
        };
     };
   StringInit(s,25+vd+width,'-');
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
//--- displaying price chart
   price=GlobalMax*dBox;
   HVolumeMax=VolByPrice[ArrayMaximum(VolByPrice,0,WHOLE_ARRAY)];
   s="";
   for(i=height-1;i>=0;i--)
     {
      StringInit(ps,8-StringLen(DoubleToString(price,sd)),' ');
      s=s+ps+DoubleToString(price,sd)+" : ";
      for(j=0;j<vd;j++) if(VolByPrice[i]>HVolumeMax*j/vd) s=s+"*"; else s=s+" ";
      s=s+" : ";
      for(j=0;j<=width-1;j++) s=s+CharToString(matrix[j*height+i]);
      s=s+" : "+ps+DoubleToString(price,sd);
      k++;
      ArrayResize(array,k,0);
      array[k-1]=s;
      s="";
      price=price-dBox;
     };
   StringInit(s,25+vd+width,'-');
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
//--- simple markup through 10
   StringInit(s,vd,' ');
   s=s+"            : ";
   for(j=0;j<=width-1;j++) if(StringGetCharacter(DoubleToString(j,0),
                                                    StringLen(DoubleToString(j,0))-1)==57) s=s+"|"; else s=s+" ";
   s=s+" : ";
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
//--- displaying volume chart in columns
   VVolumeMax=VolByCol[ArrayMaximum(VolByCol,0,WHOLE_ARRAY)];
   for(i=vd-1;i>=0;i--)
     {
      StringInit(s,vd,' ');
      s=s+"            : ";
      for(j=0;j<=width-1;j++) if(VolByCol[j]>VVolumeMax*i/vd) s=s+"*"; else s=s+" ";
      s=s+" : ";
      k++;
      ArrayResize(array,k,0);
      array[k-1]=s;
     };
   StringInit(s,25+vd+width,'-');
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
//--- column history
   s="     | Start Date/Time     | End Date/Time       | ";
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
   TimeToStruct(DateByCol[0],bMDT);
   s="   1 | 0000/00/00 00:00:00 | ";
   s=s+DoubleToString(bMDT.year,0)+"/";
   if(bMDT.mon >=10) s=s+DoubleToString(bMDT.mon ,0)+"/"; else s=s+"0"+DoubleToString(bMDT.mon ,0)+"/";
   if(bMDT.day >=10) s=s+DoubleToString(bMDT.day ,0)+" "; else s=s+"0"+DoubleToString(bMDT.day ,0)+" ";
   if(bMDT.hour>=10) s=s+DoubleToString(bMDT.hour,0)+":"; else s=s+"0"+DoubleToString(bMDT.hour,0)+":";
   if(bMDT.min >=10) s=s+DoubleToString(bMDT.min ,0)+":"; else s=s+"0"+DoubleToString(bMDT.min ,0)+":";
   if(bMDT.sec >=10) s=s+DoubleToString(bMDT.sec ,0)+" | "; else s=s+"0"+DoubleToString(bMDT.sec ,0)+" | ";
   k++;
   ArrayResize(array,k,0);
   array[k-1]=s;
   for(i=1;i<=width-1;i++)
     {
      TimeToStruct(DateByCol[i-1],bMDT);
      TimeToStruct(DateByCol[i],eMDT);
      s="";
      StringInit(ps,4-StringLen(DoubleToString(i+1,0)),' ');
      s=s+ps+DoubleToString(i+1,0)+" | ";
      s=s+DoubleToString(bMDT.year,0)+"/";
      if(bMDT.mon >=10) s=s+DoubleToString(bMDT.mon ,0)+"/"; else s=s+"0"+DoubleToString(bMDT.mon ,0)+"/";
      if(bMDT.day >=10) s=s+DoubleToString(bMDT.day ,0)+" "; else s=s+"0"+DoubleToString(bMDT.day ,0)+" ";
      if(bMDT.hour>=10) s=s+DoubleToString(bMDT.hour,0)+":"; else s=s+"0"+DoubleToString(bMDT.hour,0)+":";
      if(bMDT.min >=10) s=s+DoubleToString(bMDT.min ,0)+":"; else s=s+"0"+DoubleToString(bMDT.min ,0)+":";
      if(bMDT.sec >=10) s=s+DoubleToString(bMDT.sec ,0)+" | "; else s=s+"0"+DoubleToString(bMDT.sec ,0)+" | ";
      s=s+DoubleToString(eMDT.year,0)+"/";
      if(eMDT.mon >=10) s=s+DoubleToString(eMDT.mon ,0)+"/"; else s=s+"0"+DoubleToString(eMDT.mon ,0)+"/";
      if(eMDT.day >=10) s=s+DoubleToString(eMDT.day ,0)+" "; else s=s+"0"+DoubleToString(eMDT.day ,0)+" ";
      if(eMDT.hour>=10) s=s+DoubleToString(eMDT.hour,0)+":"; else s=s+"0"+DoubleToString(eMDT.hour,0)+":";
      if(eMDT.min >=10) s=s+DoubleToString(eMDT.min ,0)+":"; else s=s+"0"+DoubleToString(eMDT.min ,0)+":";
      if(eMDT.sec >=10) s=s+DoubleToString(eMDT.sec ,0)+" | "; else s=s+"0"+DoubleToString(eMDT.sec ,0)+" | ";
      k++;
      ArrayResize(array,k,0);
      array[k-1]=s;
     };
   y=k;
   z=25+vd+width;
// --------------------------------- BMP -----------------------------------------
   if(toPic==true)
     {
      //--- displaying dates in YYYY/MM/DD format
      for(j=0;j<=width-1;j++)
        {
         string s0=strDBC[j];
         StringReplace(s0,".","/");
         bmp.TypeTextV(RowVolWidth+startX+cs*j,yshift+cs*(height-1)+5,s0,clrDimGray);
        }
      //--- volume cell support
      for(i=height-1;i>=0;i--)
         for(j=0;j<vd;j++)
           {
            bmp.Bar(cs+startX+cs*(j-1),yshift+cs*i,cs,cs,0xF6F6F6);
            bmp.Rectangle(cs+startX+cs*(j-1),yshift+cs*i,cs,cs,clrLightGray);
           }
      for(i=0; i>-7;i--)
         for(j=0;j<=vd;j++)
           {
            bmp.Bar(cs+startX+cs*(j-1),yshift+cs*i,cs,cs,clrWhite);
            bmp.Rectangle(cs+startX+cs*(j-1),yshift+cs*i,cs,cs,clrLightGray);
           }
      //--- exact volumes
      for(i=height-1;i>=0;i--)
         bmp.Bar(startX,yshift+cs*i,int(10*cs*VolByPrice[i]/HVolumeMax),cs,0xB5ABAB);
      //--- displaying naughts and crosses
      for(i=height-1;i>=0;i--)
         for(j=0;j<=width-1;j++)
           {
            int xpos=RowVolWidth+startX+cs*j+1;
            int ypos=yshift+cs*i+1;
            if(CharToString(matrix[j*height+i])=="X") ShowCell(xpos,ypos,'X');
            else
               if(CharToString(matrix[j*height+i])=="O") ShowCell(xpos,ypos,'O');
           }
      //--- volume underside support
      for(i=0;i<=60/cs;i++)
         for(j=0;j<=width-1;j++)
           {
            bmp.Bar(RowVolWidth+startX+cs*j,12+cs*i,cs,cs,0xF6F6F6);
            bmp.Rectangle(RowVolWidth+startX+cs*j,12+cs*i,cs,cs,clrLightGray);
           }
      //--- displaying volumes
      for(j=0;j<=width-1;j++) bmp.Bar(RowVolWidth+startX+cs*j,yshift-60,
                                     cs,int(60*VolByCol[j]/VVolumeMax),0xB5ABAB);
      //--- displaying the main field border
      bmp.Rectangle(RowVolWidth+startX+cs*0,yshift+cs*0,cs*(width),cs*(height),clrSilver);
      //--- displaying prices and scale
      bmp.LineV(startX,yshift,cs*height,clrBlack);
      bmp.LineV(RowVolWidth+startX+cs*width,yshift,cs*height,clrBlack);
      price=GlobalMax*dBox;
      for(i=height-1;i>=0;i--)
        {
         //-- prices on the left
         bmp.TypeText(cs,yshift+cs*i,DoubleToString(price,sd),clrBlack);
         bmp.LineH(0,yshift+cs*i,startX,clrLightGray);
         bmp.LineH(0+startX-3,yshift+cs*i,6,clrBlack);
         //-- prices on the right     
         int dx=RowVolWidth+cs*width;
         bmp.TypeText(10+startX+dx,yshift+cs*i,DoubleToString(price,sd),clrBlack);
         bmp.LineH(startX+dx,yshift+cs*i,40,clrLightGray);
         bmp.LineH(startX+dx-3,yshift+cs*i,6,clrBlack);
         price=price-dBox;
        }
      //-- saving the resulting image in a file  
      bmp.Save(sName,true);
     }
// --------------------------------- BMP -----------------------------------------
  }
//+------------------------------------------------------------------+
//|Outputting as a text file                                         |
//+------------------------------------------------------------------+
void pnf2file(string sName,        // instrument for the file name
              string& array[],    // array of lines saved in the file
              int beg,            // the line of the array first saved in the file
              int end)            // the line of the array last saved in the file
  {
   string fn;
   int    handle;
   fn=sName+"_b"+DoubleToString(box,0)+"_r"+DoubleToString(reverse,0)+".txt";
   handle=FileOpen(fn,FILE_WRITE|FILE_TXT|FILE_ANSI,';');
   for(int i=beg;i<end;i++) FileWrite(handle,array[i]);
   FileClose(handle);
  }
//+------------------------------------------------------------------+
//| Adjusting the price to the box size                              |
//+------------------------------------------------------------------+
int MathNorm(double value,     // transforming any double-type figure into long-type figure
             double prec,      // ensuring the necessary accuracy
             bool vect)        // and if true, rounding up; if false, rounding down
  {
   if(vect==true)
      return((int)(MathCeil(value/prec)));
   else
      return((int)(MathFloor(value/prec)));
  }
//+------------------------------------------------------------------+
//| Filling the array                                                 |
//| Character one-dimensional array represented as a matrix         |
//+------------------------------------------------------------------+
void SetMatrix(uchar& array[],      // passing the array in a link to effect a replacement
               long pbeg,          // from here
               long pend,          // up to here
               long pheight,       // in the column of this height
               long pwidth,        // bearing this number among all the columns in the array
               uchar ppnf)         // with this character
  {
   long offset=0;
   for(offset=pheight*pwidth+pbeg;offset<=pheight*pwidth+pend;offset++) array[(int)offset]=ppnf;
  }
//+------------------------------------------------------------------+
//| Getting an isolated value from the array                           |
//| Character one-dimensional array represented as a matrix         |
//+------------------------------------------------------------------+
uchar GetMatrix(uchar& array[],      // passing it in a link to obtain a character...
                long pbeg,          // here
                long pheight,       // in the column of this height
                long pwidth)        // bearing this number among all the columns in the array
  {
   return(array[(int)pheight*(int)pwidth+(int)pbeg]);
  }
//+------------------------------------------------------------------+
//|Filling the vector                                                |
//+------------------------------------------------------------------+
void SetVector(long &array[],      // passing the long-type array in a link to effect a replacement
               long pbeg,         // from here
               long pend,         // up to here
               long pv)           // with this value
  {
   long offset=0;
   for(offset=pbeg;offset<=pend;offset++) array[(int)offset]=array[(int)offset]+pv;
  }
//+------------------------------------------------------------------+
//| Displaying a horizontal line                                     |
//+------------------------------------------------------------------+
void cIntBMPEx::LineH(int aX1,int aY1,int aSizeX,int aColor)
  {
   DrawLine(aX1,aY1,aX1+aSizeX,aY1,aColor);
  }
//+------------------------------------------------------------------+
//| Displaying a vertical line                                       |
//+------------------------------------------------------------------+  
void cIntBMPEx::LineV(int aX1,int aY1,int aSizeY,int aColor)
  {
   DrawLine(aX1,aY1,aX1,aY1+aSizeY,aColor);
  }
//+------------------------------------------------------------------+
//| Drawing a rectangle (of a given size)                         |
//+------------------------------------------------------------------+
void cIntBMPEx::Rectangle(int aX1,int aY1,int aSizeX,int aSizeY,int aColor)
  {
   DrawRectangle(aX1,aY1,aX1+aSizeX,aY1+aSizeY,aColor);
  }
//+------------------------------------------------------------------+
//| Drawing a filled rectangle (of a given size)                     |
//+------------------------------------------------------------------+
void cIntBMPEx::Bar(int aX1,int aY1,int aSizeX,int aSizeY,int aColor)
  {
   DrawBar(aX1,aY1,aX1+aSizeX,aY1+aSizeY,aColor);
  }
//+------------------------------------------------------------------+
//| Drawing a filled rectangle                                       |
//+------------------------------------------------------------------+
void cIntBMPEx::DrawBar(int aX1,int aY1,int aX2,int aY2,int aColor)
  {
   for(int i=aX1; i<=aX2; i++)
      for(int j=aY1; j<=aY2; j++)
        {
         DrawDot(i,j,aColor);
        }
  }
//+------------------------------------------------------------------+
//| Displaying the text vertically                                   |
//+------------------------------------------------------------------+
void cIntBMPEx::TypeTextV(int aX,int aY,string aText,int aColor)
  {
   SetDrawWidth(1);
   for(int j=0;j<StringLen(aText);j++)
     {
      string TypeChar=StringSubstr(aText,j,1);
      if(TypeChar==" ")
        {
         aY+=5;
        }
      else
        {
         int Pointer=0;
         for(int i=0;i<ArraySize(CA);i++)
           {
            if(CA[i]==TypeChar)
              {
               Pointer=i;
              }
           }
         for(int i=PA[Pointer];i<PA[Pointer+1];i++)
           {
            DrawDot(aX+YA[i],aY+MaxHeight+XA[i],aColor);
           }
         aY+=WA[Pointer]+1;
        }
     }
  }
//+------------------------------------------------------------------+
//| Transforming components into color                               |
//+------------------------------------------------------------------+
int RGB256(int aR,int aG,int aB)
  {
   return(aR+256*aG+65536*aB);
  }
//+------------------------------------------------------------------+
//| Drawing X's or O's as an image                                   |
//+------------------------------------------------------------------+
void ShowCell(int x,int y,uchar img)
  {
   uchar r,g,b;
   for(int i=0; i<8; i++)
     {
      for(int j=0; j<8; j++)
        {
         switch(img)
           {
            case 'X':
               r=Mask_X[3*(j*8+i)];
               g=Mask_X[3*(j*8+i)+1];
               b=Mask_X[3*(j*8+i)+2];
               break;
            case 'O':
               r=Mask_O[3*(j*8+i)];
               g=Mask_O[3*(j*8+i)+1];
               b=Mask_O[3*(j*8+i)+2];
               break;
           };
         int col=RGB256(r,g,b);
         bmp.DrawDot(x+i,y+j,col);
        }
     }
  }
//+------------------------------------------------------------------+

Pic giriş parametresinin değerine bağlı olarak, komut dosyası sonuçları ya görüntü dosyalarıyla birlikte metin dosyaları (terminal_data_directory\MQL5\Images) biçiminde ya da yalnızca metin dosyaları (terminal_data_directory\MQL5\Files konumuna kaydedilmiştir) biçiminde oluşturulacaktır.


Sonuçları Karşılaştırma

Sonuçları karşılaştırmak için, şu parametreleri takip ederek bir Hafif Ham Petrol grafiği çizelim: Kutu boyutu 1$, tersine döndürme 3 kutu.

StockCharts.com:

Şekil 1. StockCharts.com tarafından oluşturulmuş Hafif Ham Petrol nokta ve şekil grafiği

Şekil 1. StockCharts.com tarafından oluşturulmuş Hafif Ham Petrol nokta ve şekil grafiği

Bull's-Eye Broker:

Şekil 2. Bull's-Eye Broker yazılımı tarafından oluşturulmuş Hafif Ham Petrol nokta ve şekil grafiği

Şekil 2. Bull's-Eye Broker yazılımı tarafından oluşturulmuş Hafif Ham Petrol nokta ve şekil grafiği


Komut dosyası performans sonuçlarımız:

Şekil 3. Komut dosyamız tarafından oluşturulmuş Hafif Ham Petrol nokta ve şekil grafiği

Şekil 3. Komut dosyamız tarafından oluşturulmuş Hafif Ham Petrol nokta ve şekil grafiği

Üç grafik de aynı. Tebrikler! Nokta ve şekil grafiğini öğrendik.


Tipik Nokta ve Şekil Grafiği Paternleri

Nasıl kullanılabilirler?

İlk olarak adresinde bulunan, parmakla sayılabilecek tipik paternlere göz atalım.

Bunlar:

Şekil 4. Fiyat paternleri: Çift Tepe, Üçlü Tepe, Çift Dip ve Üçlü Dip

Şekil 4. Fiyat paternleri: Çift Tepe, Üçlü Tepe, Çift Dip Kırılımı ve Üçlü Dip

ayrıca:

Şekil 5. Fiyat paternleri: Yükselen Üçgen ve Alçalan Üçgen

Şekil 5. Fiyat paternleri: Yükselen Üçgen ve Alçalan Üçgen

ve son olarak:

Şekil 6. Fiyat paternleri: Yükselen Mancınık ve Alçalan Mancınık

Şekil 6. Fiyat paternleri: Yükselen Mancınık ve Alçalan Mancınık

Şimdi birkaç ipucu.

  1. Destek çizgisinin üzerine yalnızca uzun pozisyonlar ve direnç çizgisinin altına yalnıza kısa pozisyonlar açın. Örneğin, Aralık 2011'in ortasından başlayarak, Eylül 2011'in sonundan bu yana oluşan direnç çizgisini kırdıktan sonra, Hafif Ham Petrol vadeli işlemlerinde yalnızca uzun pozisyonlar açın.
  2. Destek ve direnç çizgilerini, zararı durdur (stop loss) emirlerini takip etmek için kullanın.
  3. Olası kâr ve olası zarar arasındaki oranı tahmin etmek için bir pozisyon açmadan önce dikey sayımı kullanın.

Dikey sayım, aşağıdaki örnekte daha iyi gösterilmiştir.

Aralık 2011'de, X sütunu, 76$'lık başlangıç fiyatından 85$ olan önceki X sütununun ötesine geçerek 87$ olan direnç çizgisini kırdı ve 89$'a ulaştı. Dikey sayıma göre, bu, fiyatın 76$+(89$-75$)*3 (3 kutu ters işlem)=118$ seviyesine ulaşabileceği anlamına geliyor.

Sonraki hareket, fiyatı 85$ seviyesine getiren düzeltici hareketti. Spekülatörler, bir uzun pozisyona 1$ daha az, yani 84$'dan bir zararı durdur (stop loss) emri verebilir.

Uzun pozisyona giriş, önceki X sütunundan bir kutu daha yüksek olan, yani 90$ fiyatla tamamlanmış bir düzeltici hareketten sonra planlanabilir.

Olası zararı hesaplayalım; bir vadeli işlem kontratı başına 90$-84$=6$ olabilir. Olası kâr 118$-90$=28$'a ulaşabilir. Olası kâr-olası zarar oranı 28$/6$>4.5 Bana kalırsa iyi bir performans. Şu ana kadar karımız her vadeli işlem kontratı başına 105$-90$=15$ tutarında olurdu.


Lisanslar

Komut dosyası, yazar Roman Rich tarafından BSD lisansı altında yazılmıştır ve sağlanmıştır. Lisans metni Lic.txt dosyasında bulunabilir. cIntBMP kitaplığı Dmitry, diğer adıyla Integer tarafından oluşturulmuştur. StockCharts.com ve Bull's-Eye Broker ticari markaları, ilgili sahiplerinin mülkiyetindedir.


Sonuç

Bu makale, nokta ve şekil grafiği için ("boşluklar ve çarpılar") bir algoritma ve bir komut dosyası önermiştir. Verilen önerilerde pratik kullanımı özetlenen çeşitli fiyat paternlerine değinilmiştir.


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

Ekli dosyalar |
pnf.zip (659.49 KB)
cintbmp.mqh (39.68 KB)
pnf2.mq5 (27.36 KB)
lic.txt (1.35 KB)
Bir ürün Market'te nasıl yayınlanır Bir ürün Market'te nasıl yayınlanır
Alım satım uygulamalarınızı Market aracılığıyla dünyanın her yerinden milyonlarca MetaTrader kullanıcısına sunmaya başlayın. Hizmet hazır bir altyapı sağlar: geniş bir kitleye erişim, lisanslama çözümleri, deneme sürümleri, güncellemelerin yayınlanması ve ödemelerin kabulü. Yalnızca hızlı bir satıcı kayıt prosedürünü tamamlamanız ve ürününüzü yayınlamanız yeterlidir. Hizmetin sunduğu hazır teknik altyapıyı kullanarak programlarınızdan ek kazanç elde etmeye başlayın.
AutoElliottWaveMaker - Elliott Waves Yarı Otomatik Analizi İçin MetaTrader 5 Aracı AutoElliottWaveMaker - Elliott Waves Yarı Otomatik Analizi İçin MetaTrader 5 Aracı
Makale, MetaTrader 5'teki Elliott Wave analizi için manuel ve otomatik dalga etiketlemenin bir kombinasyonunu temsil eden ilk geliştirme olan AutoElliottWaveMaker'ın bir incelemesini sunar. Dalga analizi aracı, yalnızca MQL5'te yazılmıştır ve harici dll kitaplıklarını içermez. Bu, MQL5'te sofistike ve ilginç programların geliştirilebileceğinin (ve geliştirilmesi gerektiğinin) bir başka kanıtıdır.
MetaTrader 5 ve MQL5 ile Sınırsız Fırsatlar MetaTrader 5 ve MQL5 ile Sınırsız Fırsatlar
Bu makalede, MQL5'i sıfırdan öğrenmeye başlayan bir girişimcinin programının nasıl olabileceğine ve 9 ayda ne gibi sonuçlara ulaşılabileceğine bir örnek vermek istiyorum. Bu örnek aynı zamanda böyle bir programın fiyat grafiğinde minimum yer kaplarken bir girişimci için ne kadar çok işlevli ve bilgilendirici olabileceğini gösterecektir. Ve kullanıcı alım satım bilgi panellerinin ne kadar renkli, parlak ve sezgisel olarak anlaşılır olabileceğini görebileceğiz. Diğer birçok özelliğin yanı sıra...
EX5 Kitaplıklarını Kullanarak Geliştirme Projelerinizi Öne Çıkarın EX5 Kitaplıklarını Kullanarak Geliştirme Projelerinizi Öne Çıkarın
Bir .ex5 dosyasında sınıfların/fonksiyonların uygulama ayrıntılarının gizlenmesi, teknik bilgi algoritmalarınızı diğer geliştiricilerle paylaşmanıza, ortak projeler oluşturmanıza ve bunları Web'de öne çıkarmanıza olanak sağlayacaktır. Ve MetaQuotes ekibi, ex5 kitaplık sınıflarının doğrudan kalıtım olasılığını gerçekleştirmek için elinden geleni yaparken, bunu hemen şimdi uygulayacağız.