English Русский 中文 Español Deutsch 日本語 Português
preview
Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 31): Geleceğe doğru (IV)

Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 31): Geleceğe doğru (IV)

MetaTrader 5Ticaret | 23 Ağustos 2024, 13:13
19 0
Daniel Jose
Daniel Jose

Giriş

"Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 29): Konuşan platform" makalesinde alım-satım arayüzünü Uzman Danışmandan kaldırdıktan sonra, alım-satım arayüzü panelini bir göstergeye dönüştürdük. Bunun nasıl yapılacağı ve göstergenin çalışmaya devam etmesi için gereken fonksiyonların nasıl ayarlanacağı ve sürdürüleceği Bölüm 30'da açıklanmaktadır. Bu olası yaklaşımlardan biridir, ancak aslında avantajları ve dezavantajları olan başka yollar da vardır, ancak bunları başka bir zaman ele alacağız.

Yani, Uzman Danışmandan çıkarmamız gereken bir şey kaldı. Şimdi onu kaldıracağız ve makale bu serinin sonuncusu olacak. Çıkarılması gereken şey ses sistemidir. Önceki makaleleri takip etmediyseniz bu kafa karıştırıcı olabilir.

Tüm sürecin nasıl olacağını anlamak için (açıklama gerektiren birçok şey içerdiğinden), bir önceki makaleye dayanan neredeyse aynı modeli kullanacağız. Bu, profesyonel programcı olmayanlar için bile açıklamayı basit ve anlaşılır hale getirecektir. Ayrıca, işleri biraz renklendirmek için sistemi biraz karmaşıklaştıracağız.

Bu kez yeni parça ses sistemi. Uzman Danışmanın bir parçası olmaktan çıkacaktır. Ancak bu, gelecekte birçok fayda sağlayacaktır. Ama acele etmeyelim, çünkü önemli olan burada ne olacağını anlamaktır. Makale nispeten kısa ama ilginç olacak.


Ses hizmetine giriş

Tüm bu değişiklikler sizi çılgına çevirebilir. Ama inanın bana, fikir sizi çıldırtmak değil, belki biraz şaşırtmak, ancak bazen küçük değişikliklerin nasıl büyük bir fark yaratabileceğini ve MetaTrader 5 platformunu kullanmayı çok daha keyifli hale getirebileceğini göstermektir. Aynı zamanda, tüm bu eylemlerin modülasyonu nasıl sağladığını göreceksiniz.

Bu şekilde neye ihtiyacınız olup olmadığını seçebilirsiniz. Bir şey gerçekten kullanılıyorsa, özelliği daha da kullanışlı ve keyifli hale getirmek için daha sonra ona iyileştirmeler ekleyebilirsiniz. Bu, büyük değişiklikler veya bir süre önce oluşturulmuş olanın yeniden programlanmasını gerektirmeyecektir. Buradaki fikir HER ZAMAN YENİDEN KULLANMAKTIR.

Bu özelliklerden biri de ses sistemidir. Bu sistemi Uzman Danışmanın içinde bırakmak iyi bir fikir gibi görünebilir. Bu sistem bir anlamda Uzman Danışmanın bir bütün olarak işleyişine müdahale etmemektedir. Ancak onu Uzman Danışmandan çıkarır ve aralarında bazı iletişimler uygularsak, ses uyarılarını çok basit bir şekilde, sanki bir ses kütüphanesiymiş gibi kullanmanın mümkün olduğunu göreceksiniz. Bu çözüm çok faydalı olacaktır.

Bir uyarı sistemini yalnızca bir Uzman Danışman içine yerleştirmenin bir anlamı yoktur. Göstergelerde ve hatta belirli zamanlarda çalışan komut dosyalarında bir ses sistemine sahip olmak faydalı olabilir. Bu analizde çok yardımcı olacaktır. Böylece, MetaTrader 5 platformu analiz açısından gerçek bir canavar haline gelebilir; burada, pozisyon girişi veya kapanışı gibi çok spesifik anlarda piyasayı daha iyi analiz etmek için büyük hesaplamalar yapabilirsiniz. Tüm bunlar minimum çaba ile yapılabilir.

Bazı kişiler şunu diyebilir: "Ancak tüm sesleri bir MQH dosyasına (başlık dosyası) ekleyebilir, bunları yürütülebilir dosyalara yerleştirebilir ve gerekli davranışı elde edebilirim." Evet, yapabilirsiniz. Ancak şu senaryoyu düşünün: Zamanla, bu MQH dosyası büyüyecek ve büyüdükçe, bazı eski programlar bu başlık dosyasıyla (MQH) uyumsuz hale gelebilir. Bu tür eski dosyaları yeniden derlemek zorunda kalırsanız, sorunlarla karşılaşırsınız. Ve süreçler arasında bir iletişim protokolünün bulunduğu modüler bir sistem oluşturursanız, eski programlarla uyumluluğu korurken platformun işlevselliğini genişletebilirsiniz.

Bu değişikliklerin nedeni budur: olası yollardan herhangi birini nasıl oluşturabileceğinizi ve kullanabileceğinizi göstermek. Ve bunu, işleri orijinal davranışa mümkün olduğunca yakın tutarken, Uzman Danışmandan bir şeyler çıkararak gösteriyorum.

Önceki makalede, alım-satım arayüzünün Uzman Danışmana entegre edildiği zamanki gibi davranması için nasıl yeniden oluşturulacağını gösterdim. Ancak, Uzman Danışmandan çıkarıldıktan sonra, aynı modda çalışmaya devam etmesi için bir yol yaratılması gerekiyordu. Size gösterdiğim yol, mümkün olan pek çok yoldan biridir ve en iyisi olmasa da işe yaramaktadır. Her çözüm, genel olarak sürecin nasıl yürüdüğünün doğru bir şekilde anlaşılmasını gerektirir. Bazen tek bir fikir modeliyle sınırlı kalmak, belirli durumların çözümüne yardımcı olmaz, tam tersine zarar verir. Tam olarak bilgi eksikliği nedeniyle, birçok kişi bir şey yapmanın mümkün olmadığını düşünür veya sistemin sınırlı olduğunu söyler, oysa aslında sınırlama, çözümü planlamak ve uygulamaktan sorumlu kişinin bilgi eksikliğinde yatmaktadır.

Bunu, verileri depolamak için herhangi bir yapı kullanmadan emir sistemini uygularken gördük. Birçok kişi bunun imkansız bir şey olduğunu, böyle şeyler yapmanın bir yolu olmadığını düşünüyordu. Ama ben bunun mümkün olduğunu gösterdim. Önemli olan ne yaptığınızı bilmek ve anlamaktır. İlk adım, her bir çözüm türünün sınırlarını bilmektir.

Öyleyse, sistem büyüdükçe işlevselliğini artıracağımızı akılda tutarak ses sistemini mümkün olduğunca modüler hale getirmeyi öğrenelim.

Öncelikle, işlevselliği genişletmemiz gereken durumlar dışında C_Sound sınıfına dokunmayacağız. Yani bu sınıfta büyük bir değişiklik olmayacak. Aslında bu aşamada bu sınıf değişmeden kalacaktır, ancak sisteme küçük eklemeler yapmamız gerekiyor. Bunlardan ilki aşağıda gösterilen başlık dosyasıdır:

#property copyright "Daniel Jose"
//+------------------------------------------------------------------+
#define def_GlobalVariableAlert "Sound Alert"
//+------------------------------------------------------------------+


Bu dosyayı Uzman Danışmanda kullanacağımızı düşünebilirsiniz, ancak hayır... Uzman Danışman bu dosyayı kullanmayacaktır, en azından henüz değil. Daha sonra göreceğimiz başka bir dosya kullanacaktır.

Bundan sonra, ses hizmeti olacak bir dosya oluşturabiliriz. Aşağıdaki kodda gösterilmiştir:

#property service
#property copyright "Daniel Jose"
//+------------------------------------------------------------------+
#include <NanoEA-SIMD\Auxiliar\C_Sounds.mqh>
#include <NanoEA-SIMD\Interprocess\Sound.mqh>
//+------------------------------------------------------------------+
void OnStart()
{
        union u00
        {
                double value;
                struct s00
                {
                        uint    i0,
                                i1;
                }info;
        }u_local;
        C_Sounds Sound;
        
        while (!IsStopped())
        {
                Sleep(500);
                if (GlobalVariableGet(def_GlobalVariableAlert, u_local.value))
                {
                        GlobalVariableDel(def_GlobalVariableAlert);
                        if (u_local.info.i1 == 0) Sound.PlayAlert((C_Sounds::eTypeSound)u_local.info.i0);
                        else Sound.PlayAlert(u_local.info.i1);
                }
        }
}
//+------------------------------------------------------------------+


Bu hizmet MetaTrader 5 global değişkenlerini izler. Başlık dosyasında adı bildirilen değişken, ne olduğu ve ne zaman gerçekleştiği önemli olmaksızın herhangi bir komut dosyası, Uzman Danışman veya gösterge tarafından başlatılır başlatılmaz belirtilen sesi çalacaktır.

Tek yapmanız gereken oynatılacak dosyanın indeksini belirtmektir. Yukarıdaki yapıya dayanarak, yalnızca harici dosyalar için sayı olan toplam 4,294,967,295 farklı ses çalabileceksiniz. Aynı sayıda dahili sese sahip olabilirsiniz, böylece pek çok şey yapabilirsiniz.

Sistemin hangi ses türünü çalacağını bilmesi için u_local.info.i1 değişkeninin değerini kontrol eder: değer 0 ise, yeniden üretilecek ses hizmet dosyasına gömülür ve sesin indeksi u_local.info.i0 değişkeni tarafından gösterilir, ancak bu değer C_Sound sınıfı içindeki numaralandırıcıyı temsil eder.

Şimdi hizmeti derleyebilir ve çalıştırabiliriz. Yukarıdaki koşullar yerine getirilir getirilmez, hizmet işini gerçekleştirecek ve global değişken hizmet tarafından yakalandığında, başka bir zamanda kullanılabilmesi için kaldırılacağını hatırlayacaktır.

Daha ileri gitmeden önce biraz düşünelim. Yalnızca Uzman Danışman ile iletişim kuracak olan alım-satım arayüzü göstergesinin aksine, ses sistemi MetaTrader 5 platformundaki her tür programla iletişim kurabilir. İstenen sesi çalmak için, her zaman double olacak olan değişkenin değerini ayarlamanız gerekir.

Kolay olduğunu düşünebilirsiniz ama deneyin ve öyle olmadığını göreceksiniz. Ayrıca, global değişkeni her seferinde doğru adla oluşturmaya devam etmeniz gerekecektir. Dolayısıyla, önceden kaydedilmiş bir sesi her çalmak istediğinizde çok fazla iş yapmanız gerekecektir.

Ancak tüm bu güçlükleri ortadan kaldıran pratik bir çözüm var. Oldukça güzel olduğu için, bu çözümü bu erken aşamada en temel düzeyde kullanacağız. Bunun nasıl yapıldığını görmek için bir sonraki bölüme geçelim.


Ses hizmetine erişmek için bir kütüphane oluşturma

Bir kütüphane oluşturmamızın nedeni hayatımızı bir şekilde kolaylaştıracak olmasıdır. Nasıl olduğu önemli değil, ama hayatımızı kolaylaştıracak. Bir önceki bölümde, bir program ses hizmetine eriştiğinde, hizmete erişim sağlayan global değişkenin adını bilmemize gerek olmadığından bahsetmiştim. Kulağa garip gelse de, süreçler arasında bilgi aktarmanın en iyi yolu sisteme bir katman eklemektir. Bu katman kütüphanedir.

Bu kütüphaneler, veri modellemenin karmaşıklığını süreçler arasında "gizler", böylece modellemenin hangi biçimi alması gerektiği konusunda artık endişelenmezsiniz. Siz sadece çağrıların kendisiyle ve beklenen sonuçlarla ilgilenirsiniz.

Bir kütüphane oluştururken yalnızca 2 endişe vardır:

  1. Dışa aktarılacak fonksiyonları açıkça bildirmek.
  2. Dahili modellemenin karmaşıklığını mümkün olduğunca gizlemek, böylece kütüphane kullanıcısının neler olduğunu bilmesine gerek kalmaz. Kullanıcı sadece gelen veriyi ve çıkan sonucu görmelidir.

Dolayısıyla, bir kütüphane içindeki herhangi bir prosedür veya fonksiyon, kullanıcının bakış açısından çok basit bir davranışa sahip olacak şekilde tasarlanmalıdır. Ama içeride, nihai sonuçlara götüren son derece karmaşık bir çalışma seviyesi olabilir. Ancak kütüphaneyi kullanacak olan programcının kütüphanenin içinde neler olup bittiğini bilmesine gerek yoktur. Sonuçların doğru bir şekilde sağlandığını bilmek önemlidir.

Şimdi ses hizmetinde kullanılan veri modellemesini gizleyecek olan kütüphanemize bir göz atalım. Her program iki şeyi rapor etmelidir: birincisi sesin dahili mi yoksa harici mi olduğu, ikincisi ise sesin indeksi. Kulağa karmaşık mı geliyor? Şimdi bu çağrıların kütüphane içindeki kodlarını görelim:

void Sound_WAV(uint index) export { Sound(0, index); }
void Sound_Alert(uint index) export { Sound(index, 0); }


Bu iki fonksiyon, veri modellemedeki her türlü karmaşıklığı gizler. Derleyiciye bu fonksiyonlara sembolik bir bağlantı oluşturması talimatını veren export anahtar kelimesini kullandığımıza dikkat edin. Bunlar aslında prosedürlerdir çünkü herhangi bir değer geri döndürmezler. Bu şekilde, sanki bu dosya bir DLL'miş gibi dosyanın dışında görülebilirler.

Ancak kodu incelerseniz, Sound adında bir fonksiyon bulamazsınız. Nerede bu? Kütüphanenin içindedir, ancak kütüphanenin dışında görünmeyecektir. Aşağıdaki kütüphane kodunun tamamına bakın:

//+------------------------------------------------------------------+
#property library
#property copyright "Daniel Jose"
//+------------------------------------------------------------------+
#include <NanoEA-SIMD\Interprocess\Sound.mqh>
//+------------------------------------------------------------------+
void Sound_WAV(uint index) export { Sound(0, index); }
//+------------------------------------------------------------------+
void Sound_Alert(uint index) export { Sound(index, 0); }
//+------------------------------------------------------------------+
void Sound(uint value00, uint value01)
{
        union u00
        {
                double value;
                struct s00
                {
                        uint    i0,
                                i1;
                }info;
        }u_local;
        
        u_local.info.i0 = value00;
        u_local.info.i1 = value01;
        GlobalVariableTemp(def_GlobalVariableAlert);
        GlobalVariableSet(def_GlobalVariableAlert, u_local.value);
}
//+------------------------------------------------------------------+


Ses prosedürünün yeterli değeri bir araya getirmek için gereken tüm karmaşıklığı içereceğini ve böylece hizmetin bir komut dosyası, gösterge veya Uzman Danışmanın talep ettiği görevi yürütebileceğini unutmayın. Ancak bu kodu hizmete erişecek programın içine yerleştirmek yerine, yalnızca basitleştirilmiş çağrıları kullanacağız, bu da program hata ayıklamasını daha rahat ve daha az yorucu hale getirir.

Bunun nasıl çalıştığını anlamak için örnek bir komut dosyasına bakalım:

#property copyright "Daniel Jose"
#property script_show_inputs
#import "Service_Sound.ex5"
        void Sound_WAV(uint);
        void Sound_Alert(uint);
#import
//+------------------------------------------------------------------+
input uint value00 = 1;         //Internal sound service...
input uint value01 = 10016;     //Sound in WAV file...
//+------------------------------------------------------------------+
void OnStart()
{
        Sound_WAV(value01);
        Sound_Alert(value00);
}
//+------------------------------------------------------------------+


Yukarıdaki koda bakın. Ne tür bir iletişimin uygulandığını, ses olayının nerede ve ne zaman gerçekleşeceğini bilmek gerekli değildir - herhangi bir yerde, platform içinde, işletim sistemi içinde veya hatta uzaktan gerçekleşebilir, önemli değil. Bilgilendirmemiz gereken tek şey, sesin sistemin içinde mi yoksa dışında mı olduğu ve indeksidir.

Şimdi, devam etmeden önce, bir deney yapmanızı istiyorum. Fonksiyonların yerlerini değiştirin. Bu durumda Sound_WAV'ı ve ardından Sound_Alert'i çalıştırıyoruz. Çalıştırın ve sonucu görün. Ardından, sırayı değiştirin: Sound_Alert'i, ardından Sound_WAV'ı çalıştırın ve sonucu görün. Anlamayanlar için, OnStart olayının içindeki kod ilk durumda şöyle görünecektir:

void OnStart()
{
        Sound_WAV(value01);
        Sound_Alert(value00);
}


İkinci durumda da bu şekilde:

void OnStart()
{
        Sound_Alert(value00);
        Sound_WAV(value01);
}


Aptalca görünse de, bu deney birkaç şeyi anlamak için gereklidir. Bunu görmezden gelmeyin, sonuçları görmek ilginç olacaktır.

Artık ses çalabilmek için programlarımıza ne eklememiz gerektiğini gördüğümüze göre, aşağıdaki kodu eklememiz yeterlidir:

#import "Service_Sound.ex5"
        void Sound_WAV(uint);
        void Sound_Alert(uint);
#import


Bir ses çalmanız gerektiğinde, nasıl yapılacağı konusunda endişelenmeden doğru fonksiyonu doğru değerle kullanın. Sistemin kendisi her şeyin mükemmel çalıştığından emin olacaktır. Uzman Danışmanımızda kod şu şekilde görünecektir:

// ...

#import "Service_Sound.ex5"
        void Sound_WAV(uint);
        void Sound_Alert(uint);
#import
//+------------------------------------------------------------------+
#include <NanoEA-SIMD\Trade\Control\C_IndicatorTradeView.mqh>
#include <NanoEA-SIMD\Interprocess\Sound.mqh>

// ...

Şu soru ortaya çıkıyor: Vurgulanan kod orada ne yapıyor? Kütüphaneyi kullanamaz mıyız? Evet, ancak daha önce yapıldığı gibi seslerin sayısal kodlarını tanımlamak için bir numaralandırma kullanabiliriz ve çok az sayıda ses veya uyarı kullanmadığınız sürece, sadece koda bakarak her birinin neyi temsil ettiğini anlamak çok zor olabilir. Bu nedenle, Sound.mqh başlık dosyasına aşağıdaki kodda vurgulanan bir ekleme yaptık:

#property copyright "Daniel Jose"
//+------------------------------------------------------------------+
#define def_GlobalVariableAlert "Sound Alert"
//+------------------------------------------------------------------+
enum eTypeSound {TRADE_ALLOWED, OPERATION_BEGIN, OPERATION_END};
//+------------------------------------------------------------------+


Böylece, aşağıdaki gibi bir kod elde edebiliriz:

int OnInit()
{
        if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
        {
                Sound_Alert(TRADE_ALLOWED);
                return INIT_FAILED;
        }

// ... The rest of the function

Numaralandırma yerine indeks kullanan aynı koddan çok daha açıklayıcıdır:

int OnInit()
{
        if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
        {
                Sound_Alert(0);
                return INIT_FAILED;
        }

// ... Rest of the code


Hangisini anlamak daha kolay?

Tüm bu çalışmalardan sonra, aşağıdaki şekilde gösterildiği gibi platformda bilgi akışına sahip olacaksınız:

Gördüğünüz gibi, sinyali kim sağlarsa sağlasın, her zaman aynı hedefe ulaşacağız.


Sonuç

Çok önemli bir şey gibi görünmese de, bu makalede gösterilenler kodunuzun, programlarınızın ve bilgilerinizin kullanılabilirliğini artırma yolunda size çok yardımcı olabilir. Giderek daha az programlamaya ve daha üretken olmaya başladığınızda, aynı zamanda yeniden kullanım ve testler birçok farklı senaryoda tekrarlandığı için kodunuz daha güvenli ve kararlı hale gelir.

Burada, bir önceki makalede gördüğümüzden farklı bir yol gördük, ki bu yol daha çok geliştirilebilir ve bize çok sayıda yeni olasılık sunabilir. Ancak bunu, MetaTrader 5'teki programlarınızı ve projelerinizi burada gösterilen yöntemlerden çok daha yüksek düzeyde güvenlik, kullanılabilirlik ve kararlılıkla nasıl çok daha modüler hale getireceğinizi öğreneceğiniz başka bir seride göreceğiz.

Ancak asıl ve en önemli şey, bazı farklı çözümlerin nasıl tasarlanacağını ve kullanılacağını bilmektir, çünkü şu veya bu nedenle bir çözümün diğerinden daha iyi olacağı durumlar vardır.

Tüm kodlar ekteki dosyada mevcuttur. Kütüphaneleri kullanarak bu şekilde programlamaya çok alışık olmayanlar için Uzman Danışman geliştirmenin bu aşamasını iyi incelemelerini tavsiye ederim. Bugün yapabileceklerinizi yarına ertelemeyin, çünkü yarın sizin için beklediğiniz gibi gelmeyebilir.

Bu makale, bu Uzman Danışman geliştirme aşamasını tamamlamaktadır. Yakında, karmaşıklık seviyesinin çok daha yüksek olduğu, ancak yine de çok daha ilginç olan başka bir durum türüne odaklanan başka bir materyal sunacağım. Herkese teşekkürler. Yakında görüşmek üzere.


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

Ekli dosyalar |
EA_-_j_Parte_31_f.zip (14533.52 KB)
Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler Yeni Raylara Adım Atın: MQL5'te Özel Göstergeler
Yeni terminalin ve dilin tüm yeni olanaklarını ve özelliklerini listelemeyeceğim. Bunlar sayısızdır ve bazı yenilikler ayrı bir makalede tartışılmaya değerdir. Ayrıca burada nesne yönelimli programlama ile yazılmış bir kod yoktur, geliştiriciler için ek avantajlar olarak bir bağlamda basitçe bahsedilemeyecek kadar ciddi bir konudur. Bu makalede, MQL4'e kıyasla göstergeleri, yapılarını, çizimlerini, türlerini ve programlama ayrıntılarını ele alacağız. Umarım bu makale hem yeni başlayanlar hem de deneyimli geliştiriciler için faydalı olacaktır, belki bazıları yeni bir şeyler bulacaktır.
Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 30): Bir gösterge olarak alım-satım arayüzü? Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 30): Bir gösterge olarak alım-satım arayüzü?
Bugün yine alım-satım arayüzünü kullanacağız, ancak bu sefer grafikte mevcut olabilecek veya olmayabilecek bir gösterge şeklinde olacaktır.
İşte Karışınızda Yeni MetaTrader 5 ve MQL5 İşte Karışınızda Yeni MetaTrader 5 ve MQL5
Bu MetaTrader 5 ile ilgili sadece kısa bir inceleme. Sistemin tüm yeni özelliklerini bu kadar kısa sürede açıklayamam, test süreci 09.09.2009’da başladı. Bu sembolik bir tarihtir ve şanslı sayı olacağına eminim. MetaTrader 5 terminalinin ve MQL5’in beta sürümünü beş gün önce aldım. Tüm özelliklerini deneme şansım olmadı ama şimdiden etkilendim.
Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 29): Konuşan platform Sıfırdan bir alım-satım Uzman Danışmanı geliştirme (Bölüm 29): Konuşan platform
Bu makalede MetaTrader 5 platformunu nasıl konuşturacağımızı öğreneceğiz. Uzman Danışmanı daha eğlenceli hale getirmeye ne dersiniz? Finansal piyasalarda alım-satım yapmak genellikle çok monotondur, ancak bu süreci daha eğlenceli hale getirebiliriz. Bu projenin bağımlılık gibi sorunlar yaşayanlar için tehlikeli olabileceğini lütfen unutmayın. Genel olarak alım-satım sürecini daha keyifli hale getireceğiz.