English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Gösterge Emisyonlarının İntegral Özelliklerini Hesaplama

Gösterge Emisyonlarının İntegral Özelliklerini Hesaplama

MetaTrader 5Örnekler | 13 Ocak 2022, 09:19
193 0
Sergey Pavlov
Sergey Pavlov

Giriş

Gösterge emisyonları, zaman serileri çalışmasında yeni ve oldukça ümit verici bir yönü temsil etmektedir. Analizin mevcut haliyle göstergelere değil, gerçek bir piyasa ortamı tahmini yapabileceğimiz geleceğe veya geçmişe yönelik emisyonlarına odaklanması ile karakterize edilir:

  • gelecekteki destek ve direnç seviyeleri;
  • trend yönü (fiyat hareketi);
  • geçmişte biriken hareket gücü.

"MQL5'te Gösterge Emisyonları Çizme" adlı önceki makalemde, emisyon çizimi algoritmasını ele alınmış ve bunların temel özellikleri açıklanmıştır. Hatırlatmama izin verin:

Emisyon, değerlendirilen göstergelere özgü çizgilerin kesişme noktalarında bulunan bir dizi noktadır.

Emisyon noktalarının bazı özellikleri vardır:

  • Aynı türdeki emisyon noktaları kümelenme eğilimindedir.
  • Yoğun nokta kümeleri, fiyatı çekebilir veya tersine itebilir.

Emisyon galerisi:

DCMV Emisyonu iMA & iEnvelopes Emisyonu
DCMV Emisyonu iMA & iEnvelopes Emisyonu

Şekil 1. Gösterge emisyon çizimlerinin örnekleri. Sol: DCMV göstergesinin emisyonu. Sağ: iMA veiEnvelopes göstergelerinin emisyonu.

Emisyonların integral özelliklerinin hesaplanmasının gösterilmesinde, hareketli ortalama zarfları (Zarflar) ve hareketli ortalamaları (Hareketli Ortalama) giriş parametreleriyle aşağıdaki gibi alacağız:

//--- external variable for storing averaging period of the iEnvelopes indicator
input int   ma_period=140; // averaging period of the iEnvelopes indicator
//--- array for storing deviations of the iEnvelopes indicator
double      ENV[]={0.01,0.0165,0.0273,0.0452,0.0747,01234,0.204,0.3373,0.5576,0.9217,1.5237};
//--- array for storing iMA indicator periods
int         MA[]={4,7,11,19,31,51,85};

Böylece, seçilen göstergelere özgü çizgilerin kesişme noktalarını arayacağız. Çizgilerin sayısı ve özellikleri (ortalama periyotlar ve sapmalar) rastgele seçilir. Emisyon, aslında bu göstergeler için herhangi bir parametre seti kullanılarak (uzayda kesiştikleri sürece) çizilebilir.

Göstergeleri seçtiğimize göre, emisyon analizi için temel bir program işlevi görecek bir Uzman Danışman oluşturmaya geçelim. iMA ve iEnvelopes teknik göstergelerinden hesaplanan verileri elde etmemiz gerekecek. Uzman Danışmanlarda Teknik Göstergeleri Kullanma Kılavuzu belgesinde açıklanan bir yöntemi kullanmayı öneriyorum.

Kesişme noktalarını bulmamız gereken çizgileri çizmek için, her bir çizgi için sadece iki nokta belirlememiz gerekir. Bu nedenle, gösterge değerlerinin yalnızca iki çubuk (örneğin mevcut ve önceki) için elde edilmesi yeterlidir. Bir önceki çubuktaki fiyat statikken mevcut çubuktaki fiyat dinamiktir, dolayısıyla her yeni tik ile yeni noktalar üretilmeye devam eder. Kod şu şekildedir:

//+------------------------------------------------------------------+
//|                                      emission_of_MA_envelope.mq5 |
//|                                           Copyright 2013, DC2008 |
//|                           https://www.mql5.com/ru/users/DC2008 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, DC2008"
#property link      "https://www.mql5.com/ru/users/DC2008"
#property version   "1.00"
//---
#include <GetIndicatorBuffers.mqh>
#include <Emission.mqh>
//--- external variable for storing averaging period of the iEnvelopes indicator
input int   ma_period=140;      // averaging period of the iEnvelopes indicator
//--- array for storing deviations of the iEnvelopes indicator
double      ENV[]={0.01,0.0165,0.0273,0.0452,0.0747,01234,0.204,0.3373,0.5576,0.9217,1.5237};
//--- array for storing the iMA indicator periods
int         MA[]={4,7,11,19,31,51,85};
//--- array for storing pointers to the iMA and iEnvelopes indicators
int         handle_MA[];
int         handle_Envelopes[];
//--- market data
datetime    T[],prevTimeBar=0;
double      H[],L[];
#define     HL(a, b) (a+b)/2
//--- class instances
CEmission      EnvMa(0,300);
PointEmission  pEmission;
//--- drawing styles for points of emission
#define     COLOR_UPPER  C'51,255,255'
#define     COLOR_LOWER  C'0,51,255'
#define     COLOR_MA     C'255,51,255'
color       colorPoint[]={COLOR_UPPER,COLOR_LOWER,COLOR_MA};
CodeColor   styleUpper={158,COLOR_UPPER,SMALL};
CodeColor   styleLower={158,COLOR_LOWER,SMALL};
CodeColor   styleMA={158,COLOR_MA,SMALL};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(T,true);
   ArraySetAsSeries(H,true);
   ArraySetAsSeries(L,true);
//---
   int size=ArraySize(MA);
   ArrayResize(handle_MA,size);
//--- create a pointer to the object - the iMA indicator
   for(int i=0; i<size; i++)
     {
      handle_MA[i]=iMA(NULL,0,MA[i],0,MODE_SMA,PRICE_MEDIAN);
      //--- if an error occurs when creating the object, print the message
      if(handle_MA[i]<0)
        {
         Print("The iMA object[",MA[i],"] has not been created: Error = ",GetLastError());
         //--- forced program termination
         return(-1);
        }
     }
//---
   size=ArraySize(ENV);
   ArrayResize(handle_Envelopes,size);
//--- create a pointer to the object - the iEnvelopes indicator
   for(int i=0; i<size; i++)
     {
      handle_Envelopes[i]=iEnvelopes(NULL,0,ma_period,0,MODE_SMA,PRICE_MEDIAN,ENV[i]);
      //--- if an error occurs when creating the object, print the message
      if(handle_Envelopes[i]<0)
        {
         Print("The iEnvelopes object[",ENV[i],"] has not been created: Error = ",GetLastError());
         //--- forced program termination
         return(-1);
        }
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- market data
   CopyTime(NULL,0,0,2,T);
   CopyHigh(NULL,0,0,2,H);
   CopyLow(NULL,0,0,2,L);
//--- fill the declared arrays with current values from all indicator buffers
   string name;
   uint GTC=GetTickCount();
//---- indicator buffers
   double   ibMA[],ibMA1[];      // arrays for the iMA indicator
   double   ibEnvelopesUpper[];  // array for the iEnvelopes indicator (UPPER_LINE)
   double   ibEnvelopesLower[];  // array for the iEnvelopes indicator (LOWER_LINE)
   for(int i=ArraySize(handle_MA)-1; i>=0; i--)
     {
      if(!CopyBufferAsSeries(handle_MA[i],0,0,2,true,ibMA))
         return;
      //---
      for(int j=ArraySize(handle_Envelopes)-1; j>=0; j--)
        {
         if(!GetEnvelopesBuffers(handle_Envelopes[j],0,2,ibEnvelopesUpper,ibEnvelopesLower,true))
            return;
         //--- find the intersection point of the iEnvelopes(UPPER_LINE) and iMA indicators
         pEmission=EnvMa.CalcPoint(ibEnvelopesUpper[1],ibEnvelopesUpper[0],ibMA[1],ibMA[0],T[0]);
         if(pEmission.real) // if the intersection point is found, draw it in the chart
           {
            name="iEnvelopes(UPPER_LINE)"+(string)j+"=iMA"+(string)i+(string)GTC;
            EnvMa.CreatePoint(name,pEmission,styleUpper);
           }
         //--- find the intersection point of the iEnvelopes(LOWER_LINE) and iMA indicators
         pEmission=EnvMa.CalcPoint(ibEnvelopesLower[1],ibEnvelopesLower[0],ibMA[1],ibMA[0],T[0]);
         if(pEmission.real) // if the intersection point is found, draw it in the chart
           {
            name="iEnvelopes(LOWER_LINE)"+(string)j+"=iMA"+(string)i+(string)GTC;
            EnvMa.CreatePoint(name,pEmission,styleLower);
           }
        }
      //---
      for(int j=ArraySize(handle_MA)-1; j>=0; j--)
        {
         if(i!=j)
           {
            if(!CopyBufferAsSeries(handle_MA[j],0,0,2,true,ibMA1))
               return;
            //--- find the intersection point of the iMA and iMA indicators
            pEmission=EnvMa.CalcPoint(ibMA1[1],ibMA1[0],ibMA[1],ibMA[0],T[0]);
            if(pEmission.real) // if the intersection point is found, draw it in the chart
              {
               name="iMA"+(string)j+"=iMA"+(string)i+(string)GTC;
               EnvMa.CreatePoint(name,pEmission,styleMA);
              }
           }
        }
     }
//--- deletion of the graphical objects of emission not to stuff the chart
   if(T[0]>prevTimeBar) // delete once per bar
     {
      int  total=ObjectsTotal(0,0,-1);
      prevTimeBar=T[0];
      for(int obj=total-1;obj>=0;obj--)
        {
         string obj_name=ObjectName(0,obj,0,OBJ_TEXT);
         datetime obj_time=(datetime)ObjectGetInteger(0,obj_name,OBJPROP_TIME);
         if(obj_time<T[0])
            ObjectDelete(0,obj_name);
        }
      Comment("Emission © DC2008       Objects = ",total);
     }
//---
  }

Bu Uzman Danışmanın her detayı üzerinde durmayacağım. Burada dikkat edilmesi gereken en önemli şey, emisyonu çizmek için herhangi iki çizginin kesişme noktalarının hesaplanmasından ve görüntülenmesinden sorumlu bir CEmission sınıfı örneği kullanmamızdır.

//+------------------------------------------------------------------+
//|                                                     Emission.mqh |
//|                                           Copyright 2013, DC2008 |
//|                           https://www.mql5.com/ru/users/DC2008 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, DC2008"
#property link      "https://www.mql5.com/ru/users/DC2008"
#property version   "1.00"
#define  BIG   7    // point size
#define  SMALL 3    // point size
//+------------------------------------------------------------------+
//| pMABB structure                                                  |
//+------------------------------------------------------------------+
struct PointEmission
  {
   double            x;       // X-coordinate of the time point
   double            y;       // Y-coordinate of the price point
   datetime          t;       // t-coordinate of the point's time
   bool              real;    // whether the point exists
  };
//+------------------------------------------------------------------+
//| CodeColor structure                                              |
//+------------------------------------------------------------------+
struct CodeColor
  {
   long              Code;    // point symbol code 
   color             Color;   // point color
   int               Width;   // point size
  };
//+------------------------------------------------------------------+
//| Base class for emissions                                         |
//+------------------------------------------------------------------+
class CEmission
  {
private:
   int               sec;
   int               lim_Left;   // limiting range of visibility in bars
   int               lim_Right;  // limiting range of visibility in bars

public:
   PointEmission     CalcPoint(double   y1,  // Y-coordinate of straight line 1 on bar [1]
                               double   y0,  // Y-coordinate of straight line 1 on bar [0]
                               double   yy1, // Y-coordinate of straight line 2 on bar [1] 
                               double   yy0, // Y-coordinate of straight line 2 on bar [0]
                               datetime t0   // t-coordinate of the current bar Time[0]
                               );
   bool              CreatePoint(string name,            // point name
                                 PointEmission &point,   // coordinates of the point
                                 CodeColor &style);      // point drawing style
                                 CEmission(int limitLeft,int limitRight);
                    ~CEmission();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CEmission::CEmission(int limitLeft,int limitRight)
  {
   sec=PeriodSeconds();
   lim_Left=limitLeft;
   lim_Right=limitRight;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CEmission::~CEmission()
  {
  }
//+------------------------------------------------------------------+
//| The CalcPoint method of the CEmission class                      |
//+------------------------------------------------------------------+
PointEmission CEmission::CalcPoint(double   y1, // Y-coordinate of straight line 1 on bar [1]
                                   double   y0, // Y-coordinate of straight line 1 on bar [0]
                                   double   yy1,// Y-coordinate of straight line 2 on bar [1]
                                   double   yy0,// Y-coordinate of straight line 2 on bar [0]
                                   datetime t0  // t-coordinate of the current bar Time[0]
                                   )
  {
   PointEmission point={NULL,NULL,NULL,false};
   double y0y1=y0-y1;
   double y1yy1=y1-yy1;
   double yy0yy1=yy0-yy1;
   double del0=yy0yy1-y0y1;
   if(MathAbs(del0)>0)
     {
      point.x=y1yy1/del0;
      if(point.x<lim_Left || point.x>lim_Right) return(point);
      point.y=y1+y0y1*y1yy1/del0;
      if(point.y<0) return(point);
      point.t=t0+(int)(point.x*sec);
      point.real=true;
      return(point);
     }
   return(point);
  }
//+------------------------------------------------------------------+
//| The CreatePoint method of the CEmission class                    |
//+------------------------------------------------------------------+
bool CEmission::CreatePoint(string name,            // point name
                            PointEmission &point,  // coordinates of the point
                            CodeColor &style)      // point drawing style
  {
   if(ObjectCreate(0,name,OBJ_TEXT,0,0,0))
     {
      ObjectSetString(0,name,OBJPROP_FONT,"Wingdings");
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,style.Width);
      ObjectSetString(0,name,OBJPROP_TEXT,CharToString((uchar)style.Code));
      ObjectSetDouble(0,name,OBJPROP_PRICE,point.y);
      ObjectSetInteger(0,name,OBJPROP_TIME,point.t);
      ObjectSetInteger(0,name,OBJPROP_COLOR,style.Color);
      return(true);
     }
   return(false);
  }

Emisyon noktalarının Metin gibi grafik nesneleri aracılığıyla gösterildiğine dikkat edilmelidir. İlk olarak bu, nesne yer işaretlerinin sembol merkezine hizalanması gerektiği gerçeğinden yola çıkar. İkincisi, nesne boyutunu geniş bir aralıkta değiştirebilirsiniz. Bu nokta özellikleri, büyük bir karmaşık emisyonlar elde etme potansiyeli sunar.

Şekil 2. iMA ve iEnvelopes göstergelerinin orijinal emisyonu

Şekil 2. iMA ve iEnvelopes Göstergelerinin orijinal emisyonları

 

Emisyonların İntegral Özellikleri

Böylece, önerilen Uzman Danışmanı grafiğe yerleştirdikten sonra farklı renklerde birçok nokta elde ederiz (bakınız, Şekil 2):

  • Akua - iMA ve iEnvelopes kesişme noktaları, UPPER_LINE tamponu.
  • Mavi - iMA ve iEnvelopes kesişme noktaları, LOWER_LINE tamponu.
  • Macenta - iMA ve iMA kesişme noktaları.

Bu karmaşa otomatik alım satımda kullanılamaz. Sinyallere, seviyelere ve diğer nicel piyasa özelliklerine ihtiyacımız varken burada sadece meditation (meditasyon) ve chiromancy (el falı) türünde görsel görüntüler ederken herhangi bir sayı elde etmiyoruz.

Emisyonların integral özellikleri, gösterge emisyonlarının sonucunda elde edilen verilerin genelleştirilmesine hizmet eder. 

Emisyonların integral özelliklerine duyulan ihtiyaç, bunların yeni gösterge türlerinin kullanılması ile piyasa araştırması için fırsatlar sunmalarından da kaynaklanmaktadır: integral kanallar, çizgiler, seviyeler, sinyaller, vb. En tipik emisyon değerlerini belirlemek için küçükten başlayacağız ve her bir nokta türü için ortalama fiyatı belirleyerek daha sonra bunlar içinden aşağıda gösterildiği gibi yatay çizgiler çizeceğiz:

Şekil 3. Her bir nokta türü için ortalama fiyatın yatay çizgileri

Şekil 3. Her bir nokta türü için ortalama fiyatın yatay çizgileri

Bunun için, mevcut koda birkaç ek kod bloğu ekleyeceğiz. Veri bölümüne:

//--- arrays for calculation and display of integral characteristics of emissions
#define     NUMBER_TYPES_POINT   3
double      sum[NUMBER_TYPES_POINT],sumprev[NUMBER_TYPES_POINT];
datetime    sum_time[NUMBER_TYPES_POINT];
int         n[NUMBER_TYPES_POINT],W[NUMBER_TYPES_POINT];
color       colorLine[]={clrAqua,clrBlue,clrMagenta};

OnTick() modülüne:

//--- calculation of integral characteristics of emissions
   ArrayInitialize(n,0);
   ArrayInitialize(sum,0.0);
   ArrayInitialize(sum_time,0.0);
   for(int obj=total-1;obj>=0;obj--)
     {
      string   obj_name=ObjectName(0,obj,0,OBJ_TEXT);
      datetime obj_time=(datetime)ObjectGetInteger(0,obj_name,OBJPROP_TIME);
      if(obj_time>T[0])
        {
         color    obj_color=(color)ObjectGetInteger(0,obj_name,OBJPROP_COLOR);
         double   obj_price=ObjectGetDouble(0,obj_name,OBJPROP_PRICE);
         for(int i=ArraySize(n)-1; i>=0; i--)
            if(obj_color==colorPoint[i])
              {
               n[i]++;
               sum[i]+=obj_price;
               sum_time[i]+=obj_time;
              }
        }
     }
//--- displaying integral characteristics of emissions
   for(int i=ArraySize(n)-1; i>=0; i--)
     {
      if(n[i]>0)
        {
         name="H.line."+(string)i;
         ObjectCreate(0,name,OBJ_HLINE,0,0,0,0);
         ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DASHDOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetDouble(0,name,OBJPROP_PRICE,sum[i]/n[i]);
        }
     }

Devam ediyoruz. Ayarlanan her bir nokta için ortalama zaman değerini hesaplayalım ve bunu ortalama fiyatın karşılık gelen çizgisinde işaretleyelim (bakınız, Şekil 4). Böylece hiçbir zaman statik olmayan, uzayda daima hareket eden emisyonların ilk nicel özelliklerini elde etmiş olduk.

Grafik bunların yalnızca anlık konumlarını gösterir. Bunları daha sonra inceleyebilmek için bir şekilde tarihte sabit tutmamız gerekiyor. Şimdiye kadar bunun nasıl yapılabileceği hala gizemini koruyor ve dikkatli bir şekilde düşünmemiz gerekiyor. Bu arada, daha fazla iyileştirme yapacağız ve çizelgedeki işaretlerin yanında hesaplamada yer alan noktaların sayısını görüntüleyeceğiz. Bunlar elde edilen özelliklerin bir tür ağırlıklarıdır ve daha sonraki analizlerde de faydalı olacaktır.

Şekil 4. Ortalama fiyat ve ortalama zamanın kesişme noktalarındaki işaretçiler

Şekil 4. Ortalama fiyat ve ortalama zamanın kesişme noktalarındaki işaretçiler

Ancak, analiz kolaylığı için yüzde oranlarını kullanacağız. Ana emisyon noktaları, iMA ve iEnvelopes göstergelerinin kesişme noktasından kaynaklanan noktalar olduğundan, bunların toplamını %100 olarak kabul edeceğiz. Şimdi elimizde ne olduğuna bakalım:

Şekil 5. Emisyon noktalarının her bir türü için yüzde değeri

Şekil 5. Emisyon noktalarının her bir türü için yüzde değeri

Üç değeri toplarsak toplamda %100'den fazlasını verecektir. Macenta renginde görüntülenen 34,4 değeri, belirli bir zaman noktasında iMA ve iMA'nın kesişme noktalarının özelliğidir, yani gösterge kendisi ile kesişmiş, ancak farklı giriş verileriyle kesişmemiştir. Bu durumda, bu bir referans değerdir ve piyasa analizinde nasıl kullanılabileceğini daha sonra düşünebiliriz.

Bununla birlikte, noktaların sayısının yüzde oranlarını elde ettiğimizde başka bir sorun ortaya çıkar: Özellikle değişiklik gösterdiklerinden dolayı, geçmişteki emisyon özelliklerinin yüzde değerlerini nasıl sabitleyebiliriz?

 

Grafik Analizi

Emisyonların integral özelliklerini elde etmemize rağmen, elde edilen verilere dayalı bir alım satım stratejisinin analizine ve geliştirilmesine hala yeterince yakın değiliz. Ancak dikkatli bir okuyucu, bu soruna bir çözümü zaten bulmuştur (bakınız, Şekil 1). Çözüm aşağıdaki gibidir: İntegral eğrileri, ana emisyon noktalarının yüzde oranıyla orantılı olacak farklı kalınlıklar kullanarak çizmeyi öneriyorum.

Eğrinin mevcut kısmı, bu koordinatların aslında gelecekten alındığı dikkate alınarak, mevcut ve önceki çubuk arasındaki ortalama fiyat çizgisi boyunca çizilecektir. Bu, gösterge emisyonlarının bir tür öncü integral kanalıdır. Kulağa gerçekten çok kafa karıştırıcı geldiğini biliyorum. Okumaya devam edip etmemeniz gerektiğini düşünüyor olmalısınız. Ama umarım konu, ilerledikçe ilginçleşecek.

Şekil 6. Gösterge emisyonlarının integral kanalı

Şekil 6. Gösterge emisyonlarının integral kanalı

Dolayısıyla, "iMA & iMA" emisyonu için bir kullanım bulmuş gibiyiz (grafikte macenta renginde gösterilir). Ve yeni bir göstergemiz var: entegre hareketli ortalama.

Şimdi, OnTick() modülünde hangi değişikliklerin gerçekleştiğini görmek için Uzman Danışmanın koduna geri dönelim:

//--- displaying integral characteristics of emissions
   ArrayInitialize(W,10);
   W[ArrayMaximum(n)]=20;
   W[ArrayMinimum(n)]=3;
   for(int i=ArraySize(n)-1; i>=0; i--)
     {
      if(n[i]>0)
        {
         //--- horizontal lines of mean prices
         name="H.line."+(string)i;
         ObjectCreate(0,name,OBJ_HLINE,0,0,0,0);
         ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
         ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DASHDOT);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
         ObjectSetDouble(0,name,OBJPROP_PRICE,sum[i]/n[i]);
         //--- markers
         name="P."+(string)i;
         ObjectCreate(0,name,OBJ_TEXT,0,0,0);
         ObjectSetString(0,name,OBJPROP_FONT,"Wingdings");
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
         ObjectSetInteger(0,name,OBJPROP_FONTSIZE,17);
         ObjectSetString(0,name,OBJPROP_TEXT,CharToString(163));
         ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
         ObjectSetDouble(0,name,OBJPROP_PRICE,sum[i]/n[i]);
         ObjectSetInteger(0,name,OBJPROP_TIME,sum_time[i]/n[i]);
         //--- integral curves
         name="T"+(string)i+".line"+(string)T[1];
         ObjectCreate(0,name,OBJ_TREND,0,0,0);
         ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
         ObjectSetInteger(0,name,OBJPROP_WIDTH,W[i]);
         if(sumprev[i]>0)
           {
            ObjectSetDouble(0,name,OBJPROP_PRICE,0,sumprev[i]);
            ObjectSetInteger(0,name,OBJPROP_TIME,0,T[1]);
            ObjectSetDouble(0,name,OBJPROP_PRICE,1,(sum[i]/n[i]));
            ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
           }
         //--- numerical values of integral characteristics
         name="Text"+(string)i+".control";
         ObjectCreate(0,name,OBJ_TEXT,0,0,0);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
         ObjectSetInteger(0,name,OBJPROP_FONTSIZE,30);
         ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
         string str=DoubleToString((double)n[i]/(double)(n[0]+n[1])*100,1);
         ObjectSetString(0,name,OBJPROP_TEXT,str);
         ObjectSetDouble(0,name,OBJPROP_PRICE,0,(sum[i]/n[i]));
         ObjectSetInteger(0,name,OBJPROP_TIME,0,sum_time[i]/n[i]);
        }
     }

Grafik analizimize devam edelim. Ama bir şey eksik. Görünüşe göre bir başka önemli emisyon özelliklerini gözden kaçırmışız. İntegral eğriler yalnızca ortalama fiyatlara dayalı olarak çizilmiştir. Ancak, bizim ortalama zaman koordinatını dikkate almamız gerekir. Aşağıdaki şekle bir göz atın ve kanal limitlerine özellikle dikkat edin:

  • Akua çizgi kanal üst limitindedir.
  • Mavi çizgi kanal alt limitindedir.

Sıfır çubuğuna zaman cinsinden daha yakın olan işaretçiyi belirlememiz gerekiyor.

Kanalın en üst limiti
Kanalın en alt limiti

Şekil 7. Zamanda öncü integral özellikler. Sol: kanalın en üst limiti. Sağ: kanalın en alt limiti.

Bu sorun aşağıdaki şekilde çözülebilir: fiyat çizgisini (PRICE_MEDIAN) fiyat grafiğine ekleriz ve çizginin rengi son çubuğa daha yakın olan işaretçinin rengine (akua veya mavi) göre değişir (bakınız, Şekil 7). Ayrıca, aşağıdaki kod bloğunu mevcut koda ekleyin:

//---
   if(n[ArrayMinimum(n)]>0)
     {
      datetime d[2];
      for(int j=0;j<2;j++)
        {
         d[j]=sum_time[j]/n[j];
        }
      int i=ArrayMinimum(d);

      name="Price.line"+(string)T[1];
      ObjectCreate(0,name,OBJ_TREND,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_WIDTH,8);
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,HL(H[1],L[1]));
      ObjectSetInteger(0,name,OBJPROP_TIME,0,T[1]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,HL(H[0],L[0]));
      ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
      ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine1[i]);
     }
//---

Şimdi sonraki adıma hazırlanın. Peki ya emisyonları, ikinci derece emisyonlar gibi, orijinal emisyonların integral özelliklerine dayalı olarak çizmeye çalışırsak? Sonuçta, bu çizgiler de birbiriyle kesişiyor ve bunun sonucunda emisyon noktalarının olması gerekiyor. Bakalım buradan neler çıkabilir. Aşağıdaki kod satırlarını ekleyerek önceki kod bloğunu geliştirin:

      //--- emissions of integral characteristics of the original emissions
      pEmission=EnvMa.CalcPoint(sumprev[0],sum[0]/n[0],sumprev[2],sum[2]/n[2],T[0]);
      if(pEmission.real) // if the intersection point is found, draw it in the chart
        {
         name="test/up"+(string)GTC;
         EnvMa.CreatePoint(name,pEmission,styleUpper2);
        }
      pEmission=EnvMa.CalcPoint(sumprev[1],sum[1]/n[1],sumprev[2],sum[2]/n[2],T[0]);
      if(pEmission.real) // if the intersection point is found, draw it in the chart
        {
         name="test/dn"+(string)GTC;
         EnvMa.CreatePoint(name,pEmission,styleLower2);
        }

Veri bölümüne aşağıdaki satırları girin:

#define     COLOR_2_UPPER  C'102,255,255'
#define     COLOR_2_LOWER  C'51,102,255'
CodeColor   styleUpper2={178,COLOR_2_UPPER,BIG};
CodeColor   styleLower2={178,COLOR_2_LOWER,BIG};

Sonuçları aşağıdaki şekilden kontrol edebilirsiniz. Şimdiye kadar hiçbir şey önermeyen yeni noktalar görebiliriz.

Şekil 8. İntegral çizgilerin emisyonları

Şekil 8. İntegral çizgilerin emisyonları

İntegral özellikleri yeni noktalar için hesaplanabilir (bakınız, Şekil 9), bunların emisyonları grafikte çizilir ve bu durum, işlem imkansız olana kadar devam eder.

Emisyon Emisyon
Emisyon Emisyon

Şekil 9. Emisyonların integral özellikleri

Böylece ihtiyacımız olan her şeyi çizdik ve emisyonların integral özelliklerini elde ettik. Artık bir alım satım stratejisinin analizine ve geliştirilmesine geçebiliriz. Ama bu yine de imkansız görünüyor! Şimdi bizi engelleyen ne?

 

Emisyonların Zaman Serileri

Grafik analizi, emisyonların integral özelliklerini incelememizi sağlar, ancak oldukça kaynak yoğundur. Önerilen kodu strateji test cihazının görsel modunda çalıştırmayı denersek, test hızı kısa sürede sıfıra düşecektir! Bunun nedeni, grafikteki çok sayıda grafik nesnesidir.

Dolayısıyla, doğal olarak tüm bu nokta bolluğundan kurtulmak ve sadece integral eğrileri bırakmak istenir. Bu sorunu çözmek için özel diziler (tamponlar) kullanacağız.

Emisyonların zaman serileri, emisyonlarla ilgili bilgilerin toplandığı özel olarak düzenlenmiş dizilerdir.

Zaman kilit alan olmasına rağmen içerdikleri verilerin zamana göre sıralanmamasından dolayı standart zaman serilerinden ayrılırlar.

Emisyonların Zaman Serileri

Şekil 10. Emisyon özelliklerinin zaman serileri

Bu diziler, yeni öğeler boş hücrelerde veya eski değerlerle dolu hücrelerde saklanacak şekilde düzenlenir. Bunun için CTimeEmission sınıfını kullanacağız. Bu, kodda şu şekilde uygulanır:

//+------------------------------------------------------------------+
//|                                                 TimeEmission.mqh |
//|                                           Copyright 2013, DC2008 |
//|                           https://www.mql5.com/ru/users/DC2008 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, DC2008"
#property link      "https://www.mql5.com/ru/users/DC2008"
#property version   "1.00"
//---
#include <Emission.mqh>
#define ARRMAX       64
#define ARRDELTA     8
//+------------------------------------------------------------------+
//| pIntegral structure                                              |
//+------------------------------------------------------------------+
struct pIntegral
  {
   double            y;       // Y-coordinate of the price point (mean price of the points with the same time)
   datetime          t;       // t-coordinate of the point's time
   int               n;       // n-number of points with the same time
  };
//+------------------------------------------------------------------+
//| Base class for time series of emissions                          |
//+------------------------------------------------------------------+
class CTimeEmission
  {
private:
   pIntegral         time_series_Emission[]; // time series of emission
   int               size_ts; // number of elements in time series 
   datetime           t[1];
public:
   //--- method of writing new elements to time series of emission
   void              Write(PointEmission &point);
   //--- method of reading integral characteristics of emissions
   pIntegral         Read();
                     CTimeEmission();
                    ~CTimeEmission();
  };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CTimeEmission::CTimeEmission()
  {
   ArrayResize(time_series_Emission,ARRMAX,ARRMAX);
   size_ts=ArraySize(time_series_Emission);
   for(int i=size_ts-1; i>=0; i--)
      time_series_Emission[i].t=0;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CTimeEmission::~CTimeEmission()
  {
  }
//+------------------------------------------------------------------+
//| The Write method of the CTimeEmission class                      |
//+------------------------------------------------------------------+
void CTimeEmission::Write(PointEmission &point)
  {
   CopyTime(NULL,0,0,1,t);
   size_ts=ArraySize(time_series_Emission);
   for(int k=0;k<size_ts;k++)
     {
      if(time_series_Emission[k].t<t[0]) // find the first empty cell
        {
         if(k>size_ts-ARRDELTA)
           {   // increase the array size, if necessary
            int narr=ArrayResize(time_series_Emission,size_ts+ARRMAX,ARRMAX);
            for(int l=size_ts-1;l<narr;l++)
               time_series_Emission[l].t=0;
           }
         time_series_Emission[k].y=point.y;
         time_series_Emission[k].t=point.t;
         time_series_Emission[k].n=1;
         return;
        }
      if(time_series_Emission[k].t==point.t) // find the first similar cell
        {
         time_series_Emission[k].y=(time_series_Emission[k].y*time_series_Emission[k].n+point.y)/(time_series_Emission[k].n+1);
         time_series_Emission[k].n++;
         return;
        }
     }
  }
//+------------------------------------------------------------------+
//| The Read method of the CTimeEmission class                       |
//+------------------------------------------------------------------+
pIntegral CTimeEmission::Read()
  {
   CopyTime(NULL,0,0,1,t);
   pIntegral property_Emission={0.0,0,0};
   size_ts=ArraySize(time_series_Emission);
   for(int k=0;k<size_ts;k++)
     {
      if(time_series_Emission[k].t>=t[0])
        {
         property_Emission.y+=time_series_Emission[k].y*time_series_Emission[k].n;
         property_Emission.t+=(time_series_Emission[k].t-t[0])*time_series_Emission[k].n;
         property_Emission.n+=time_series_Emission[k].n;
        }
     }
   if(property_Emission.n>0)
     {
      property_Emission.y=property_Emission.y/property_Emission.n;
      property_Emission.t=property_Emission.t/property_Emission.n+t[0];
     }
   return(property_Emission);
  }

Burada iki sınıf yönteminin uygulamasını görebiliriz: emisyon noktalarının zaman serilerine yazılması ve emisyonların integral özelliklerinin değerlerinin okunması.

 

İntegral Özelliklerini Kısa ve Öz Şekilde Hesaplama

Artık emisyon zaman serilerimiz olduğuna göre, bir alım satım stratejisini daha fazla geliştirmek için integral özelliklerin hesaplanması için kısa ve öz bir algoritma oluşturmaya başlayabiliriz. Orijinal Uzman Danışmanı güncelleyelim:

//+------------------------------------------------------------------+
//|                                   emission_of_MA_envelope_ts.mq5 |
//|                                           Copyright 2013, DC2008 |
//|                           https://www.mql5.com/ru/users/DC2008 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, DC2008"
#property link      "https://www.mql5.com/ru/users/DC2008"
#property version   "1.00"
//---
#include <GetIndicatorBuffers.mqh>
#include <Emission.mqh>
#include <TimeEmission.mqh>
//--- number of point types
#define     NUMBER_TYPES_POINT   3
//--- array for storing the iMA indicator periods
int      MA[]={4,7,11,19,31,51,85};
//--- external variable for storing averaging period of the iEnvelopes indicator
input int ma_period=140; // averaging period of the iEnvelopes indicator
//--- array for storing deviations of the iEnvelopes indicator
double   ENV[]={0.01,0.0165,0.0273,0.0452,0.0747,01234,0.204,0.3373,0.5576,0.9217,1.5237};
//--- array for storing pointers to the iMA indicator
int      handle_MA[];
//--- array for storing pointers to the iEnvelopes indicator
int      handle_Envelopes[];
//--- market data
datetime    T[],prevTimeBar=0;
double      H[],L[];
#define     HL(a, b) (a+b)/2
//--- class instances
CEmission      EnvMa(0,200);
PointEmission  pEmission;
CTimeEmission  tsMA[NUMBER_TYPES_POINT];
pIntegral      integral[NUMBER_TYPES_POINT];
//--- drawing styles for points of emission
#define     DEL            500
//--- arrays for calculation and display of integral characteristics of emissions
double      sumprev[NUMBER_TYPES_POINT];
int         n[NUMBER_TYPES_POINT],W[NUMBER_TYPES_POINT];
color       colorLine[]={clrAqua,clrBlue,clrMagenta};
int         fontPoint[]={30,30,30};
int         fontMarker[]={16,16,16};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(T,true);
   ArraySetAsSeries(H,true);
   ArraySetAsSeries(L,true);
   ArrayInitialize(sumprev,0.0);
//---
   int size=ArraySize(MA);
   ArrayResize(handle_MA,size);
//--- create a pointer to the object - the iMA indicator
   for(int i=0; i<size; i++)
     {
      handle_MA[i]=iMA(NULL,0,MA[i],0,MODE_SMA,PRICE_MEDIAN);
      //--- if an error occurs when creating the object, print the message
      if(handle_MA[i]<0)
        {
         Print("The iMA object[",MA[i],"] has not been created: Error = ",GetLastError());
         //--- forced program termination
         return(-1);
        }
     }
//+------------------------------------------------------------------+
   size=ArraySize(ENV);
   ArrayResize(handle_Envelopes,size);
//--- create a pointer to the object - the iEnvelopes indicator
   for(int i=0; i<size; i++)
     {
      handle_Envelopes[i]=iEnvelopes(NULL,0,ma_period,0,MODE_SMA,PRICE_MEDIAN,ENV[i]);
      //--- if an error occurs when creating the object, print the message
      if(handle_Envelopes[i]<0)
        {
         Print("The iEnvelopes object[",ENV[i],"] has not been created: Error = ",GetLastError());
         //--- forced program termination
         return(-1);
        }
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- market data
   CopyTime(NULL,0,0,2,T);
   CopyHigh(NULL,0,0,2,H);
   CopyLow(NULL,0,0,2,L);
//--- fill the declared arrays with current values from all indicator buffers
   string name;
   uint GTC=GetTickCount();
//---- indicator buffers
   double   ibMA[],ibMA1[];      // arrays for the iMA indicator
   double   ibEnvelopesUpper[];  // array for the iEnvelopes indicator (UPPER_LINE)
   double   ibEnvelopesLower[];  // array for the iEnvelopes indicator (LOWER_LINE)
   for(int i=ArraySize(handle_MA)-1; i>=0; i--)
     {
      if(!CopyBufferAsSeries(handle_MA[i],0,0,2,true,ibMA))
         return;
      //---
      for(int j=ArraySize(handle_Envelopes)-1; j>=0; j--)
        {
         if(!GetEnvelopesBuffers(handle_Envelopes[j],0,2,ibEnvelopesUpper,ibEnvelopesLower,true))
            return;
         //--- find the intersection point of the iEnvelopes(UPPER_LINE) and iMA indicators
         pEmission=EnvMa.CalcPoint(ibEnvelopesUpper[1],ibEnvelopesUpper[0],ibMA[1],ibMA[0],T[0]);
         if(pEmission.real) // if the intersection point is found, add it to the time series of emission
            tsMA[0].Write(pEmission);
         //--- find the intersection point of the iEnvelopes(LOWER_LINE) and iMA indicators
         pEmission=EnvMa.CalcPoint(ibEnvelopesLower[1],ibEnvelopesLower[0],ibMA[1],ibMA[0],T[0]);
         if(pEmission.real) // if the intersection point is found, add it to the time series of emission
            tsMA[1].Write(pEmission);
        }
      //---
      for(int j=ArraySize(handle_MA)-1; j>=0; j--)
        {
         if(i!=j)
           {
            if(!CopyBufferAsSeries(handle_MA[j],0,0,2,true,ibMA1))
               return;
            //--- find the intersection point of the iMA and iMA indicators
            pEmission=EnvMa.CalcPoint(ibMA1[1],ibMA1[0],ibMA[1],ibMA[0],T[0]);
            if(pEmission.real) // if the intersection point is found, add it to the time series of emission
               tsMA[2].Write(pEmission);
           }
        }
     }
//--- deletion of the graphical objects of emission not to stuff the chart
   if(T[0]>prevTimeBar)
     {
      prevTimeBar=T[0];
      //---
      for(int i=ArraySize(n)-1; i>=0; i--)
         sumprev[i]=integral[i].y;
      //---
      for(int obj=ObjectsTotal(0,0,-1)-1;obj>=0;obj--)
        {
         string obj_name=ObjectName(0,obj,0,OBJ_TREND);
         datetime obj_time=(datetime)ObjectGetInteger(0,obj_name,OBJPROP_TIME);
         if(obj_time<T[0]-DEL*PeriodSeconds())
            ObjectDelete(0,obj_name);
        }
      Comment("Emission © DC2008   Graphical objects = ",ObjectsTotal(0,0,-1));
     }
//--- calculation of integral characteristics of emission
   for(int i=ArraySize(n)-1; i>=0; i--)
      integral[i]=tsMA[i].Read();
//--- displaying integral characteristics of emission
   ArrayInitialize(W,5);
   if(integral[0].n>integral[1].n)
     {
      W[0]=20;
      W[1]=10;
     }
   else
     {
      W[0]=10;
      W[1]=20;
     }
   for(int i=ArraySize(n)-1; i>=0; i--)
     {
      //--- horizontal lines of mean prices
      name="H.line."+(string)i;
      ObjectCreate(0,name,OBJ_HLINE,0,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
      ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DASHDOT);
      ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
      ObjectSetDouble(0,name,OBJPROP_PRICE,integral[i].y);
      //--- markers
      name="P."+(string)i;
      ObjectCreate(0,name,OBJ_TEXT,0,0,0);
      ObjectSetString(0,name,OBJPROP_FONT,"Wingdings");
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontMarker[i]);
      ObjectSetString(0,name,OBJPROP_TEXT,CharToString(163));
      ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
      ObjectSetDouble(0,name,OBJPROP_PRICE,integral[i].y);
      ObjectSetInteger(0,name,OBJPROP_TIME,integral[i].t);
      //--- integral curves
      name="T"+(string)i+".line"+(string)T[1];
      ObjectCreate(0,name,OBJ_TREND,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
      ObjectSetInteger(0,name,OBJPROP_WIDTH,W[i]);
      if(sumprev[i]>0)
        {
         ObjectSetDouble(0,name,OBJPROP_PRICE,0,sumprev[i]);
         ObjectSetInteger(0,name,OBJPROP_TIME,0,T[1]);
         ObjectSetDouble(0,name,OBJPROP_PRICE,1,integral[i].y);
         ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
        }
      //--- numerical values of integral characteristics
      if(integral[0].n+integral[1].n>0)
        {
         name="Text"+(string)i+".control";
         ObjectCreate(0,name,OBJ_TEXT,0,0,0);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
         ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontPoint[i]);
         ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
         string str=DoubleToString((double)integral[i].n/(double)(integral[0].n+integral[1].n)*100,1);
         ObjectSetString(0,name,OBJPROP_TEXT,str);
         ObjectSetDouble(0,name,OBJPROP_PRICE,0,integral[i].y);
         ObjectSetInteger(0,name,OBJPROP_TIME,0,integral[i].t);
        }
     }
  }

Kod kısaltılmıştır ve chesaplama hızı artmıştır. Artık alım satım robotlarınızı görselleştirmeden test edebilir ve optimize edebilirsiniz!

 

İntegral Özelliklerin Alım Satımda Kullanımı

İntegral özellikler, aşağıdakiler için bir sinyal oluşturucu olarak kullanılabilir:

  • kanalda yenilik,
  • birbiriyle veya fiyatla kesişme,
  • yöndeki değişiklik.
Örneğin aşağıdaki şekil, emisyonların integral özelliklerinin fiyat ile kesişme noktalarında varsayımsal olarak nasıl kullanılabileceğini göstermektedir. Fiyat mavi eğri ile yukarı doğru kesiştiğinde satış sinyalleri oluşturulur ve fiyat akua eğri ile aşağı doğru kesiştiğinde alış sinyalleri oluşturulur.

Şekil 11. Emisyonların integral özelliklerinin kesişme noktalarında alım satım sinyalleri

Şekil 11. Emisyonların integral özelliklerinin kesişme noktalarında alım satım sinyalleri

 

Sonuç

  1. Gösterge emisyonlarının integral özelliklerinin hesaplanması, piyasa analizi (zaman serisi) için yeni araçlar ve yöntemler sağlar.
  2. Zaman serilerini kullanarak integral özelliklerin hesaplama hızını artırmayı başardık.
  3. Bu da bize, emisyonları kullanan otomatik alım satım stratejileri geliştirmemiz için bir kapı açtı.

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

MetaTrader 4 ve MetaTrader 5 için Alım Satım Sinyallerine dair Genel Bilgi MetaTrader 4 ve MetaTrader 5 için Alım Satım Sinyallerine dair Genel Bilgi
MetaTrader 4 / MetaTrader 5 Alım Satım Sinyalleri, yatırımcıların bir Sinyal Sağlayıcının alım satım işlemlerini kopyalamasına olanak sağlayan bir hizmettir. Amacımız, Aboneleri koruyan, onları gereksiz maliyetlerden kurtaran ve kitlesel olarak kullanılan yeni bir hizmet geliştirmekti.
MQL5 Programlama Temelleri: Zaman MQL5 Programlama Temelleri: Zaman
Makale, zaman ile çalışmak için standart MQL5 fonksiyonları ve Uzman Danışmanlar ve göstergeler oluştururken gerekecek zaman ile çalışma programlama teknikleri ve pratik olarak kullanışlı fonksiyonlara odaklanır. Genel zaman ölçümü teorisine özellikle dikkat edilir. Bu makale öncelikle acemi MQL5 programcılarının ilgisini çekecektir.
MetaTrader 4 ve MetaTrader 5 Alım Satım Sinyalleri Pencere Öğeleri MetaTrader 4 ve MetaTrader 5 Alım Satım Sinyalleri Pencere Öğeleri
MetaTrader 4 ve MetaTrader 5 kullanıcıları, yakın zamanda Sinyal Sağlayıcı olma ve ek kazanç elde etme fırsatı yakalamıştır. Şimdi ise, alım satım başarınızı yeni pencere öğelerini kullanarak web siteniz, blogunuz veya sosyal ağ sayfanızda gösterebilirsiniz. Pencere öğelerini kullanmanın faydaları açıktır: Sinyal Sağlayıcının popülerliğini artırır, başarılı yatırımcılar olarak ün sağlar ve yeni Aboneleri etkiler. Pencere öğelerini web sitelerine ekleyen tüm yatırımcılar bu faydalardan yararlanabilir.
MetaTrader 4 ve MetaTrader 5 İçin Nasıl Sinyal Sağlayıcı Olunur? MetaTrader 4 ve MetaTrader 5 İçin Nasıl Sinyal Sağlayıcı Olunur?
Ticaret sinyallerinizi sunmak ve kazanç elde etmek ister misiniz? MQL5.com web sitesine Satıcı olarak kaydolun, işlem hesabınızı belirtin ve yatırımcılara ticaret işlemlerinizi kopyalamaları için abonelik sunun.