English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 10): Özel göstergelere erişim

Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 10): Özel göstergelere erişim

MetaTrader 5Ticaret sistemleri | 22 Kasım 2022, 12:21
291 0
Daniel Jose
Daniel Jose

Giriş

Bir ticaret Uzman Danışmanı yalnızca özel göstergeler kullanabiliyorsa gerçek anlamda yararlı olabilir, aksi takdirde sadece bir dizi kod parçası olacaktır - ticaret işlemleri gerçekleştirmeye ve pozisyonları yönetmeye yardımcı olabilir, ancak hepsi bu kadar.

Göstergelerin MetaTrader 5 grafiğine eklenmesi en zor kısım değildir. En zor kısım, bu göstergeler tarafından hesaplanan verilere doğrudan Uzman Danışmandan erişmektir ki bu da uygun bir planlama olmadan neredeyse imkansızdır. Eğer onu nasıl yapacağımızı bilmezsek, sonuç olarak sadece standart göstergelerle sınırlı kalmış olacağız. Ancak çok daha fazlasına ihtiyacımız var. Örneğin, VWAP (Volume Weighted Average Price) göstergesi. Bu, Brezilya borsasında vadelilerle ticaret yapan herkes için çok önemli bir göstergedir. Bu gösterge MetaTrader'daki standart göstergeler arasında bulunmamaktadır. Dolayısıyla, VWAP değerlerini hesaplayacak ve ekranda görüntüleyecek bir özel gösterge kullanmalıyız. Bu özel göstergeyi Uzman Danışmanda analizde kullanmak istediğimizde işler karmaşıklaşır. Gerekli bilgiye sahip olmazsak, bu özel göstergeyi Uzman Danışmanda kullanamayacağız. Dolayısıyla bu makalede, bu zorluğu nasıl aşacağımızı göreceğiz.


Planlama

İlk olarak, özel göstergemizde kullanılacak hesaplamaları oluşturalım. Neyse ki, örnek olarak kullandığımız VWAP için hesaplama formülü oldukça basittir.


Formülü MQL5 koduna çevirirsek şunu elde ederiz:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
        double          Price = 0;
        ulong           Volume = 0;
        static int      siPos = 0;

        if (macroGetDate(time[rates_total - 1]) != macroGetDate(time[siPos]))
        {
                for (int c0 = rates_total - 1; macroGetDate(time[siPos]) != macroGetDate(time[c0]); siPos++);
                ArrayInitialize(VWAP_Buff, EMPTY_VALUE);
        }
        for (int c0 = siPos; c0 < rates_total; c0++)
        {
                Price += ((high[c0] + low[c0] + close[c0]) / 3) * volume[c0];
                Volume += volume[c0];
                VWAP_Buff[c0] = Price / Volume;
        }

    return rates_total;
}

Hesaplamaların bulunduğu kısım vurgulanmaktadır. Fonksiyonun geri kalanı ise günlük VWAP'ın düzgün bir şekilde başlatılması için kullanılır. Ancak göstergemiz hala grafik üzerinde çalıştırılamıyor, koda birkaç şey daha eklememiz gerekiyor. Kodun geri kalanı aşağıda görülebilir:

#property copyright "Daniel Jose - Indicador VWAP ( IntraDay )"
#property version "1.01"
#property indicator_chart_window
#property indicator_buffers     1
#property indicator_plots       1
#property indicator_width1      2
#property indicator_type1 	DRAW_LINE
#property indicator_color1 	clrBlack
//+------------------------------------------------------------------+
#define macroGetDate(A) (A - (A % 86400))
//+------------------------------------------------------------------+
double VWAP_Buff[];
//+------------------------------------------------------------------+
int OnInit()
{
        SetIndexBuffer(0, VWAP_Buff, INDICATOR_DATA);   
        
        return INIT_SUCCEEDED;
}

Böylece VWAP'ı aşağıda gösterildiği gibi grafik üzerinde hareket ettirebiliriz:


Bu, göstergeyi grafiğe ekleme kısmı çok karmaşık değildi. Şimdi, analiz edebilmesi için Uzman Danışmanın VWAP'ı görmesini sağlamanın bir yolunu bulmamız gerekiyor. Bu sayede göstergeyi ticarette kullanabileceğiz.

Göstergeyle daha kolay çalışmak adına VWAP'ı kolayca erişilebilecek şekilde kaydedelim.


VWAP göstergesi esasen doğru olmasına rağmen, Uzman Danışmanda kullanılmak üzere yanlış programlıdır. Peki neden? Sorun şu ki, Uzman Danışman, göstergenin grafikte olup olmadığını bilememektedir. Dolayısıyla göstergeyi okuyamamaktadır.

Dosya adı sistem için çok az şey ifade eder. Dosyaya herhangi bir ad yazabiliriz, ancak göstergenin adı neyi hesapladığını yansıtmalıdır. Göstergemiz ise henüz böyle bir ada sahip değildir. VWAP olarak adlandırılsa bile, bu, sistem için hiçbir şey ifade etmeyecektir. Bu nedenle, Uzman Danışman, göstergenin grafikte var olup olmadığını bilemeyecektir.

Göstergenin neyi hesapladığını yansıtmasını sağlamak adına bunu kodda belirtmemiz gerekir. Bu amaçla, dosya adıyla ilişkili olması gerekmeyen benzersiz bir ad oluşturacağız. Bizim durumumuzda, gösterge başlatma kodu aşağıdaki gibi olacaktır:

int OnInit()
{
        SetIndexBuffer(0, VWAP_Buff, INDICATOR_DATA);   
        IndicatorSetString(INDICATOR_SHORTNAME, "VWAP");
        
        return INIT_SUCCEEDED;
}

Yalnızca vurgulanan satırı ekleyerek sorunu çözmüş oluyoruz. Bazı durumlarda ise bu daha zor olabilir - bu konuya daha sonra geleceğiz. Örnek olması adına MetaTrader 5 kütüphanesinden Custom Moving Average göstergesinin kodunu kullanalım. Kodu aşağıdadır:

void OnInit()
{
	SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
	IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
	PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod);
	PlotIndexSetInteger(0,PLOT_SHIFT,InpMAShift);

	string short_name;
	switch(InpMAMethod)
	{
      		case MODE_EMA :
			short_name="EMA";
         		break;
      		case MODE_LWMA :
	         	short_name="LWMA";
	         	break;
      		case MODE_SMA :
         		short_name="SMA";
         		break;
      		case MODE_SMMA :
         		short_name="SMMA";
         		break;
      		default :
         		short_name="unknown ma";
     	}
   	IndicatorSetString(INDICATOR_SHORTNAME, short_name + "(" + string(InpMAPeriod) + ")");
   	PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
}

Vurgulanan kısım ihtiyacımız olan adı ifade eder. Bu adın dosya adıyla hiçbir ilişkisi olmadığına dikkat edin. Ancak bu tam olarak özel göstergenin içerisinde yapılmalıdır.

Artık Uzman Danışmanın özel göstergenin grafikte çalışıp çalışmadığını kontrol edebileceğinden emin olduğumuza göre, bir sonraki adıma geçebiliriz.


Uzman Danışmandan göstergeye erişim

Daha önce yaptığımız gibi nihai kod üzerinden devam edebiliriz. Ancak ideal olarak, burada neler olup bittiğini tam olarak anlamak adına tamamen yeni bir kod oluşturmalıyız. Ana fikir sıfırdan bir ticaret Uzman Danışmanı geliştirmeyi öğrenmek olduğundan, bu aşamadan geçmeliyiz. Dolayısıyla, bu makalede yolculuğumuzun devamında izole bir Uzman Danışman oluşturacağız. Daha sonra onu nihai koda dahil edebilir veya etmeyebiliriz. Şimdi kodu yazmaya başlayalım. Uzman Danışman, aşağıdaki gibi temiz kodla başlar:

//+------------------------------------------------------------------+
int OnInit()
{
        EventSetTimer(1);
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick(){}
//+------------------------------------------------------------------+
void OnTimer(){}
//+------------------------------------------------------------------+

Şunları yapalım: ilk olarak, VWAP göstergesinin grafikte olduğunu varsayacağız ve gösterge tarafından hesaplanan son değeri Uzman Danışmana ekleyeceğiz - bunu her saniye tekrarlayacağız. Ama nasıl yapacağız? Çok basit. Uzman Danışman kodunun değişikliklerden sonra nasıl göründüğüne bakalım:

#property copyright "Daniel Jose"
#property version   "1.00"
//+------------------------------------------------------------------+
int     handle;
double  Buff[];
//+------------------------------------------------------------------+
int OnInit()
{
        handle = ChartIndicatorGet(ChartID(), 0, "VWAP");
        SetIndexBuffer(0, Buff, INDICATOR_DATA);
        
        EventSetTimer(1);
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+
void OnTimer()
{
        int i;
        
        if (handle != INVALID_HANDLE)
        {
                i = CopyBuffer(handle, 0, 0, 1, Buff);
                Print(Buff[0]);
        }
}
//+------------------------------------------------------------------+

Vurgulanan kısımlar temiz koda eklediğimiz kısımlardır. Sonuç aşağıdaki gibi olur:


Nasıl işe yaradı? MQL5, sistemler arasında veri okumak ve yazmak için araçlar sağlar. Okumanın yollarından biri CopyBuffer fonksiyonudur. Şu şekilde çalışır:


Bu, herhangi bir özel göstergeden herhangi bir veriyi okumamıza olanak sağlar, yani standart MetaTrader 5 göstergeleriyle sınırlı değiliz. Dilersek herhangi bir gösterge oluşturabilir ve onunla çalışabiliriz.

Şimdi başka bir senaryo düşünelim. Bu sefer VWAP göstergesi grafikte olmasın. Ancak Uzman Danışmanın ona ihtiyacı var, dolayısıyla onu grafiğe yüklememiz gerekiyor. Nasıl yapacağız? Bu da oldukça basit. Kaldı ki bunu daha önce başka bir amaç için, Uzman Danışman için bir alt pencere oluştururken, halihazırda kullandık. iCustom fonksiyonunu kullanacağız. Ancak bu kez özel gösterge yükleyeceğiz. Uzman Danışman kodu şu şekilde olacaktır:

#property copyright "Daniel Jose"
#property version   "1.00"
//+------------------------------------------------------------------+
int     handle;
double  Buff[];
//+------------------------------------------------------------------+
int OnInit()
{
        handle = ChartIndicatorGet(ChartID(), 0, "VWAP");
        SetIndexBuffer(0, Buff, INDICATOR_DATA);
        
        EventSetTimer(1);
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+
void OnTimer()
{
        int i;
        
        if (handle == INVALID_HANDLE) handle = iCustom(NULL, PERIOD_CURRENT, "VWAP.EX5");else
        {
                i = CopyBuffer(handle, 0, 0, 1, Buff);
                Print(Buff[0]);
        }
}
//+------------------------------------------------------------------+

Vurgulanan kod, orijinal sisteme yaptığımız tek eklemedir. Böylece, Uzman Danışman şu sonucu üretir:


Aşağıdaki görüntü ne uyguladığımızı göstermektedir:

En temel düzeyde ihtiyacımız olan şeyler bunlar. Ancak yakından bakarsak, VWAP'ın grafikte görünmediğini fark edeceğiz. Uzman Danışman VWAP’ı kullansa bile, kullanıcı neler olup bittiğini bilmez. Bu da kolayca düzeltilebilir ve son kod aşağıdaki gibi görünür. Şunu unutmayın: Uzman Danışmanın ne yaptığını gözlemleyebilmek her zaman iyidir, çünkü ona tam bir özgürlük vermek çok güvenli değildir.

#property copyright "Daniel Jose"
#property version   "1.00"
//+------------------------------------------------------------------+
int     handle;
long    id;
double  Buff[];
string  szCmd;
//+------------------------------------------------------------------+
int OnInit()
{
        szCmd = "VWAP";
        handle = ChartIndicatorGet(id = ChartID(), 0, szCmd);
        SetIndexBuffer(0, Buff, INDICATOR_DATA);
        
        EventSetTimer(1);
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        ChartIndicatorDelete(id, 0, szCmd);
        IndicatorRelease(handle);
        EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+
void OnTimer()
{
        int i;
        
        if (handle == INVALID_HANDLE)
        {
                if ((handle = iCustom(NULL, PERIOD_CURRENT, "VWAP.EX5")) != INVALID_HANDLE)
                        ChartIndicatorAdd(id, 0, handle);
        }else
        {
                i = CopyBuffer(handle, 0, 0, 1, Buff);
                Print(Buff[0]);
        }
}
//+------------------------------------------------------------------+

Yukarıdaki Uzman Danışman kodu, VWAP tarafından hesaplanan son değeri okuyacak ve ekranda görüntüleyecektir. Gösterge grafikte yoksa, yükleyecek ve devamında görüntüleyecektir. Uzman Danışman grafikten kaldırılırsa, VWAP da ekrandan kaldırılacaktır. Böylece Uzman Danışman, hesaplamaları gerçekleştirmek için ihtiyaç duyduğu şeylere her zaman sahip olacaktır. İşte şu sonucu elde ediyoruz:


Gösterge üzerinde herhangi bir değişiklik yapmadığımız için bu yaptıklarımızın pratikte pek elverişli olmadığı düşünülebilir. Ancak yalnızca yukarıdaki adımlarla bile, özel göstergelerle ilişkili her şeyi uygulayabiliriz. Sıradaki bölümde bu amaçla başka bir noktayı ele alacağız: hareketli ortalamalar uygulayacağız ve Uzman Danışmanı VWAP ile yaptığımız gibi kullanacağız, ancak bu sefer hareketli ortalamalar için parametreler belirleyeceğiz.


İkinci durum: hareketli ortalamalar kullanma

Parametrelerin özel göstergeye nasıl iletileceğine odaklanacağımız için hareketli ortalama hesaplaması burada önemli değildir. İşte yeni özel gösterge:

#property copyright "Daniel Jose 16.05.2021"
#property description "Basic Moving Averages (Optimizes Calculation)"
#property indicator_chart_window
//+------------------------------------------------------------------+
enum eTypeMedia
{
        MME,    //Exponential moving average
        MMA     //Arithmetic moving average
};
//+------------------------------------------------------------------+
#property indicator_buffers             1
#property indicator_plots               1
#property indicator_type1               DRAW_LINE
#property indicator_width1              2
#property indicator_applied_price       PRICE_CLOSE
//+------------------------------------------------------------------+
input color      user00 = clrRoyalBlue; //Cor
input int        user01 = 9;            //Periods
input eTypeMedia user02 = MME;          //MA type
input int user03 = 0;            //Displacement
//+------------------------------------------------------------------+
double Buff[], f_Expo;
//+------------------------------------------------------------------+
int OnInit()
{
        string sz0 = "MM" + (user02 == MME ? "E": (user02 == MMA ? "A" : "_")) + (string)user01;
        
        f_Expo = (double) (2.0 / (1.0 + user01));
        ArrayInitialize(Buff, EMPTY_VALUE);
        SetIndexBuffer(0, Buff, INDICATOR_DATA);
        PlotIndexSetInteger(0, PLOT_LINE_COLOR, user00);
        PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, user01);
        PlotIndexSetInteger(0, PLOT_SHIFT, user03);
        IndicatorSetString(INDICATOR_SHORTNAME, sz0);
        
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
        double Value;
        int c0;

        switch (user02)
        {
                case MME:
                        if (user01 < rates_total)
                        {       
                                for (c0 = (prev_calculated > 0 ? prev_calculated - 1 : 0); c0 < rates_total - user03; c0++)
                                        Buff[c0] = (c0 > 0? ((price[c0] - Buff[c0 - 1]) * f_Expo) + Buff[c0 - 1] : price[c0] * f_Expo);
                                for (; c0 < rates_total; c0++)
                                        Buff[c0] = EMPTY_VALUE;
                        }
                        break;
                case MMA:
                        if (user01 < rates_total)
                        {
                                if (prev_calculated == 0) 
                                {       
                                        Value = 0;
                                        for (int c1 = 0; c1 < user01; c1++) Value += price[user01 - c1];
                                        Buff[user01] = Value / user01;
                                }
                                for (c0 = (prev_calculated > 0 ? prev_calculated - 1 : user01 + 1); c0 < rates_total - user03; c0++)
                                        Buff[c0] = ((Buff[c0 - 1] * user01) - price[c0 - user01] + price[c0]) / user01;
                                for (; c0 < rates_total; c0++)
                                        Buff[c0] = EMPTY_VALUE;
                        }
                        break;
        }
        
        return rates_total;
}
//+------------------------------------------------------------------+

Şimdi gösterge adı birkaç faktöre bağlı olacaktır. Böylece Uzman Danışmanın istediğimiz duruma göre ayarlanmasını sağlayabiliriz. Örneğin, Uzman Danışmanın iki hareketli ortalama kullandığını ve onları grafikte görüntülediğini varsayalım. Yukarıda kodda vurgulanan kısımlara dikkat edin - bu kısımlar, Uzman Danışmanın, bizim için iCustom fonksiyonunun gösterge parametrelerini değiştirmesine ve yapılandırmasına olanak tanır. Gerektiğinde uygulayabilmek adına burayı anlamak önemlidir. Hareketli ortalamalardan biri 17 periyotluk EMA, diğeri ise 52 periyotluk SMA olsun. 17 periyotluk EMA yeşil, 52 periyotluk SMA ise kırmızı olsun. Uzman Danışman, göstergeyi şu biçimde bir fonksiyon olarak görecektir:

Hareketli ortalama (renk, periyot, tür, kayma), yani artık gösterge ayrı bir dosya değil, bir Uzman Danışman fonksiyonudur. Bu, programlamada çok yaygındır çünkü programı belirli bir görevi gerçekleştirmek adına uygun parametrelerle çağırırız, böylece sonuca daha kolay ulaşırız. Ancak soru şu: Uzman Danışmanımızın bu senaryoyu VWAP ile yaptığımız şekilde oluşturmasını ve yönetmesini nasıl sağlayabiliriz?

Bu amaçla Uzman Danışman kodunu değiştirmemiz gerekecektir. Uzman Danışmanın tam kodu aşağıda gösterilmektedir:

#property copyright "Daniel Jose"
#property version   "1.00"
//+------------------------------------------------------------------+
long    id;
int     handle1, handle2;
double  Buff1[], Buff2[];
string  szCmd1, szCmd2;
//+------------------------------------------------------------------+
int OnInit()
{
        szCmd1 = "MME17";
        szCmd2 = "MMA52";
        id = ChartID();
        handle1 = ChartIndicatorGet(id, 0, szCmd1);
        handle2 = ChartIndicatorGet(id, 0, szCmd2);
        SetIndexBuffer(0, Buff1, INDICATOR_DATA);
        SetIndexBuffer(0, Buff2, INDICATOR_DATA);
        
        EventSetTimer(1);
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
        ChartIndicatorDelete(id, 0, szCmd1);
        ChartIndicatorDelete(id, 0, szCmd2);
        IndicatorRelease(handle1);
        IndicatorRelease(handle2);
        EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+
void OnTimer()
{
        int i1, i2;
        
        if (handle1 == INVALID_HANDLE)
        {
                if ((handle1 = iCustom(NULL, PERIOD_CURRENT, "Media Movel.EX5", clrGreen, 17, 0)) != INVALID_HANDLE)
                        ChartIndicatorAdd(id, 0, handle1);
        };
        if (handle2 == INVALID_HANDLE)
        {
                if ((handle2 = iCustom(NULL, PERIOD_CURRENT, "Media Movel.EX5", clrRed, 52, 1)) != INVALID_HANDLE)
                        ChartIndicatorAdd(id, 0, handle2);
        };
        if ((handle1 != INVALID_HANDLE) && (handle2 != INVALID_HANDLE))
        {
                i1 = CopyBuffer(handle1, 0, 0, 1, Buff1);
                i2 = CopyBuffer(handle2, 0, 0, 1, Buff2);
                Print(Buff1[0], "<< --- >>", Buff2[0]);
        }
}
//+------------------------------------------------------------------+

Ve sonuç:


Uzman Danışman kodunun vurgulanan kısımlarına dikkat edin. Bu tam olarak ihtiyacımız olan şeydir: VWAP'ta kullandığımız aynı mekanizmayı kullanarak parametreleri göstergeye iletiyoruz. Ancak VWAP söz konusu olduğunda, ona herhangi bir parametre iletmeye gerek yoktu, hareketli ortalamalar söz konusu olduğunda ise parametrelerin iletilmesi gerekliydi. İşte bu bize çok geniş bir özgürlük sağlar.


Sonuç

Bu makalede kullanıma hazır evrensel bir kod bulunmamaktadır. Ancak yine de, böyle bir sistemin daha karmaşık bir Uzman Danışmanda nasıl kullanılacağını anlamak için iki farklı Uzman Danışman ve iki farklı özel gösterge hakkında ayrıntılara girdik. Bu bilgilerin Uzman Danışmanlarda kendi özel göstergelerinizi kullanabilmeniz konusunda yeterli olacağına inanıyorum. Bütün bunlar, MetaTrader 5'in bir yatırımcının isteyebileceği en çok yönlü ve eksiksiz platform olduğunu kanıtlamaktadır. Eğer bir başkası bunu fark edememişse, o zaman bu konuyu sonuna kadar incelememiş demektir.

Bu makalede sunulan bilgileri kullanın, çünkü MetaTrader 5, şimdiye kadar birçok kişinin yapabildiğinden çok daha ileriye gitmenize olanak sağlar.

Bir sonraki makalede görüşmek üzere.


Linkler

MQL5'te göstergeler nasıl çağrılır?

Yeni Başlayanlar için MQL5'te Özel Göstergeler

Yeni Başlayanlar için MQL5: Uzman Danışmanlarda Teknik Göstergeleri Kullanma Rehberi



MetaQuotes Ltd tarafından Portekizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/pt/articles/10329

Ekli dosyalar |
Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 11): Çapraz emir sistemi Sıfırdan bir ticaret Uzman Danışmanı geliştirme (Bölüm 11): Çapraz emir sistemi
Bu makalede çapraz emir sistemi oluşturacağız. Yatırımcıların hayatını çok zorlaştıran bir varlık türü vardır - vadeliler. Peki neden hayatı zorlaştırıyorlar?
MetaTrader 5'te DirectX’i kullanarak 3D grafikler nasıl oluşturulur? MetaTrader 5'te DirectX’i kullanarak 3D grafikler nasıl oluşturulur?
3D grafikler, gizli modellerin görselleştirilmesine olanak sağladıkları için büyük miktarda veriyi analiz etmek adına çok uygundur. Doğrudan MQL5 diliyle DireсtX fonksiyonları kullanılarak üç boyutlu nesneler oluşturulabilir. Böylece, MetaTrader 5 için herhangi bir karmaşıklıkta programlar, hatta 3D oyunlar oluşturmak bile mümkün hale gelir. Basit üç boyutlu şekiller çizerek 3D grafikleri öğrenmeye başlayın.
OBV göstergesine dayalı bir ticaret sistemi nasıl geliştirilir? OBV göstergesine dayalı bir ticaret sistemi nasıl geliştirilir?
Bu, en popüler göstergelere dayalı ticaret sistemleri geliştirdiğimiz serimizin yeni makalesidir. Bu sefer On Balance Volume (OBV) göstergesini inceleyeceğiz - onu nasıl kullanabileceğimizi ve ona dayalı bir ticaret sistemini nasıl tasarlayabileceğimizi öğreneceğiz.
Görselleştirin! R dilinin plot fonksiyonuna benzer MQL5 grafik kütüphanesi Görselleştirin! R dilinin plot fonksiyonuna benzer MQL5 grafik kütüphanesi
Ticaret modellerini incelerken grafikler şeklinde görselleştirme büyük önem taşımaktadır. R ve Python gibi bilim topluluğu arasında popüler olan programlama dilleri görselleştirme için özel plot fonksiyonuna sahiptir. Bu fonksiyon, ticaret modellerinin çizgiler, nokta dağılımları ve histogramlar şeklinde görselleştirilmesine olanak sağlar. MQL5’te de aynısı CGraphics sınıfı kullanılarak yapılabilir.