English Русский 中文 Español Deutsch 日本語 Português
preview
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

MetaTrader 5Örnekler | 23 Ağustos 2024, 13:10
17 0
Daniel Jose
Daniel Jose

Giriş

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.

Uyarı: Piyasayı kumar olarak görüyorsanız bu makalede sunulacak değişiklikleri KULLANMAYIN, çünkü çok büyük zarar riski vardır.

Yukarıdaki uyarı kulağa şaka gibi gelse de, gerçek şu ki Uzman Danışmanda yapılan bazı değişiklikler onu genel olarak kumar bağımlısı olanlar için tehlikeli hale getirmektedir.

Burada yapılacak değişikliklerden bazıları Uzman Danışmanın genel kararlılığını ve performansını artırmaya yöneliktir. Bu makalede sileceğimiz bazı şeyleri saklamak istiyorsanız, bu zor değil. Uzman Danışmanda oluşturulan ve mevcut olan emir sistemi sayesinde, bazı şeyleri herhangi bir sorun oluşturmadan kaldırabilirsiniz. Bu nedenle, bir şeyleri kabul etmek ve kullanmak ya da silmek size bağlıdır.


2.0. Alım-satım arayüzünü silme

Alım-satım arayüzü, Uzman Danışmanımızda kullanılandan daha az karmaşık olan basit bir emir sisteminde hala mantıklı olan bir şeydir. Ancak şu anki geliştirme aşamasındaki Uzman Danışmanımız için grafikte alım-satım arayüzü olması mantıklı değil, bu yüzden onu kaldırabiliriz. İsterseniz sadece bir komutu düzenleyerek onu saklayabilirsiniz. Doğru, işleri basit tutmayı severim, böylece daha sonra içeriği çok hızlı bir şekilde değiştirebilirim (veya değiştirmeyebilirim), böylece değişiklikler kritik noktalarda sorunlar veya yıkıcı arızalar gibi herhangi bir stres yaratmaz.

Kontrolü çok hızlı ve aynı zamanda güvenli hale getirmek için Uzman Danışman koduna aşağıdaki tanım eklenmiştir:

#define def_INTEGRATION_CHART_TRADER            // Chart trader integration with the EA ...

Bu tanım mevcut değilse veya bir yorum haline gelirse, alım-satım arayüzü Uzman Danışman ile derlenmeyecektir. Şimdi bu tanımdan etkilenen noktalara bakalım. Bunlardan ilki ve en belirgin olanı aşağıdakini içermektedir:

#ifdef def_INTEGRATION_CHART_TRADER
        #include <NanoEA-SIMD\SubWindow\C_TemplateChart.mqh>
#endif 

Yukarıdaki kod Uzman Danışman dosyasında değil, C_IndicatorTradeView.mqh dosyasında olmasına rağmen, tanım kodun her yerinde derleyici tarafından görülebilecektir, bu nedenle kodu düzeltme konusunda endişelenmemize gerek yoktur. Burada tanımı kolay erişilebilir bir yerde, bu durumda Uzman Danışman kodunda oluşturuyoruz ve gerektiğinde kullanıyoruz.

Ancak C_IndicatorTradeView.mqh dosyası ile devam edelim. Uzman Danışmanı alım-satım arayüzü olmadan derleyebildiğimiz için, aşağıdaki görüntüde görülebilen Uzman Danışman başlatma mesaj kutusunda tanımlanan verilere erişimi uygulamamız gerekir:

Unutmayın, bu verilere erişmemiz gerekiyor. Daha önce bunu alım-satım arayüzüne ilettik ve bunları bilmemiz gerektiğinde alım-satım arayüzüne başvurduk. Ancak şimdi, alım-satım arayüzü olmadan, aynı verilere erişmek için farklı bir yol izlememiz gerekecektir.

C_IndicatorTradeView.mqh dosyasında, bu değerler yalnızca bir yerde kullanılır - bekleyen emrin nerede bulunacağını gösteren 0 göstergesini oluşturduğumuzda. Bu yer DispatchMessage fonksiyonunun içindedir. Aşağıdaki kodda gösterilmiştir:

// ... Previous code ...

                                        case CHARTEVENT_MOUSE_MOVE:
                                                Mouse.GetPositionDP(dt, price);
                                                mKeys   = Mouse.GetButtonStatus();
                                                bEClick  = (mKeys & 0x01) == 0x01;    //Left mouse click
                                                bKeyBuy  = (mKeys & 0x04) == 0x04;    //SHIFT pressed
                                                bKeySell = (mKeys & 0x08) == 0x08;    //CTRL pressed
                                                if (bKeyBuy != bKeySell)
                                                {
                                                        if (!bMounting)
                                                        {
#ifdef def_INTEGRATION_CHART_TRADER
                                                                m_Selection.bIsDayTrade = Chart.GetBaseFinance(m_Selection.vol, valueTp, valueSl);
#else 
                                                                m_Selection.vol = EA_user20 * Terminal.GetVolumeMinimal();
                                                                valueTp = EA_user21;
                                                                valueSl = EA_user22;
                                                                m_Selection.bIsDayTrade = EA_user23;
#endif 
                                                                valueTp = Terminal.AdjustPrice(valueTp * Terminal.GetAdjustToTrade() / m_Selection.vol);
                                                                valueSl = Terminal.AdjustPrice(valueSl * Terminal.GetAdjustToTrade() / m_Selection.vol);
                                                                m_Selection.it = IT_PENDING;
                                                                m_Selection.pr = price;
                                                        }

// ... The rest of the code...

Vurgulanan satırlara dikkat edin, bu EA_userXX değerlerini dosyanın içinde aramanıza gerek yoktur - orada değildirler, çünkü aşağıdaki gibi Uzman Danışman kodundan gelirler:

#ifdef def_INTEGRATION_CHART_TRADER
        input group "Chart Trader"
#else 
        input group "Base Operacional do EA"
#endif 
input int       EA_user20   = 1;     //Levering factor
input double    EA_user21   = 100;   //Take Profit (financial)
input double    EA_user22   = 81.74; //Stop Loss (financial)
input bool      EA_user23   = true;  //Day Trade ?

Bu tek başına zaten grafikte alım-satım arayüzüne sahip olmaya benzer bir kontrol sağlar. Lütfen pratikte kodda hiçbir şeyi değiştirmediğimize dikkat edin Biz sadece kullanıcı tarafından tanımlanan gerekli verileri doğru yere taşıyoruz. Bazı kişiler Uzman Danışmanı yüklerken yatırımcı tarafında bu yapılandırmayı gereksiz bulabilir ve bu bir anlamda doğrudur, çünkü emir sistemi tüm değişkenleri herhangi bir zorluk çekmeden yapılandırmaya izin verir. Bu nedenle, kaldıraç faktörünün minimum değerini ve Zararı Durdur ve Kârı Alı 0 olarak ve ilk işlemleri günlük işlem olarak ayarlayabiliriz - bunu C_IndicatorTradeView sınıfının DispatchMessage fonksiyonunda yapın. Bu, sistemi hiç etkilemeyecektir, çünkü yatırımcı grafikteki emri değiştirebilir ve ardından sunucuya gönderebilir. Bu tür bir değişiklik, çok kişisel bir şey olduğu için size bağlıdır.


2.0.1. Bazı ayarlamalar

Alım-satım arayüzünü kaldırdığımız kısma geri dönmeden önce, Uzman Danışmanın bir bütün olarak istikrarını artıracak bir şey daha yapmamız gerekiyor.

Şunları yapalım. C_IndicatorTradeView sınıfında, aşağıda görülebilen özel bir veri yapısı tanımlıyoruz:

struct st01
{
        bool    ExistOpenPosition,
                SystemInitilized;
}m_InfoSystem;

Aşağıdaki kodda başlatılmalıdır:

void Initilize(void)
{
        static int ot = 0, pt = 0;
                                
        m_InfoSystem.ExistOpenPosition = false;
        m_InfoSystem.SystemInitilized = false;
        ChartSetInteger(Terminal.Get_ID(), CHART_SHOW_TRADE_LEVELS, false);
        ChartSetInteger(Terminal.Get_ID(), CHART_DRAG_TRADE_LEVELS, false);                             
        if ((ot != OrdersTotal()) || (pt != PositionsTotal()))
        {
                ObjectsDeleteAll(Terminal.Get_ID(), def_NameObjectsTrade);
                ChartRedraw();
                for (int c0 = ot = OrdersTotal(); c0 >= 0; c0--)  IndicatorAdd(OrderGetTicket(c0));
                for (int c0 = pt = PositionsTotal(); c0 >= 0; c0--) IndicatorAdd(PositionGetTicket(c0));
        }
        m_InfoSystem.SystemInitilized = true;
}

Bu verileri neden burada oluşturuyor ve başlatıyoruz? MetaTrader 5'in Uzman Danışmana olaylar gönderdiğini ve olaylardan birinin OnTick olduğunu unutmayın. Basit sistemlerde çok fazla sorun yaşanmaz. Ancak sistem daha karmaşık hale geldikçe, her şeyin çalıştığından emin olmanız gerekir. MetaTrader 5, Uzman Danışman bu olayları işlemeye hazır olmadan önce Uzman Danışmana olaylar gönderecek şekilde olabilir. Bu nedenle, Uzman Danışmanın hazır olduğundan emin olmalıyız. Uzman Danışmanın hazır olma durumunu gösterecek bazı değişkenler oluşturacağız. Henüz hazır değilse, Uzman Danışman olaylara uygun şekilde yanıt verene kadar MetaTrader 5'in olayları göz ardı edilmelidir.

En kritik nokta aşağıdaki kodda görülebilir:

inline double SecureChannelPosition(void)
                        {
                                static int nPositions = 0;
                                double Res = 0;
                                ulong ticket;
                                int iPos = PositionsTotal();
                                
                                if (!m_InfoSystem.SystemInitilized) return 0;
                                if ((iPos != nPositions) || (m_InfoSystem.ExistOpenPosition))
                                {
                                        m_InfoSystem.ExistOpenPosition = false;
                                        for (int i0 = iPos - 1; i0 >= 0; i0--) if (PositionGetSymbol(i0) == Terminal.GetSymbol())
                                        {
                                                m_InfoSystem.ExistOpenPosition = true;
                                                ticket = PositionGetInteger(POSITION_TICKET);
                                                if (iPos != nPositions) IndicatorAdd(ticket);
                                                SetTextValue(ticket, IT_RESULT, PositionGetDouble(POSITION_VOLUME), Res += PositionGetDouble(POSITION_PROFIT), PositionGetDouble(POSITION_PRICE_OPEN));
                                        }
                                        nPositions = iPos;
                                }
                                return Res;
                        };

Vurgulanan noktalar daha önce mevcut değildi, bu nedenle bazen garip şeyler olabiliyordu. Ancak artık olağandışı hiçbir şeyin fark edilmemesini sağlamak için gerekli kontrollere sahibiz.

Bu her şeyi kontrol etme meselesi oldukça karmaşık bir konudur, çünkü çoklu kontroller bir sistemi çok kararlı hale getirebilir, ancak aynı zamanda kod bakımı ve modifikasyonunu da karmaşıklaştırabilir. Bazı kontrollerin gerçekten etkili olabilmesi için mantıklı bir sırayla yapılması gerekir ki bu da oldukça külfetli bir iştir.

Ancak, Uzman Danışman tarafından izlenen bir sembol için bir pozisyon olup olmadığını kontrol ettiğimizde, biraz çeviklik sağlayabiliriz. Özellikle, her biri Uzman Danışmanda görünecek belirli sayıda pozisyona sahip birden fazla varlıkla işlem yaparken. Bunu burada filtreleyerek döngüyü ortadan kaldırırız, böylece Uzman Danışman yalnızca gerçekten ihtiyaç duyulduğunda döngü içindeki kodu çalıştırır. Aksi takdirde, Uzman Danışman tarafından tüketilen işlemci zamanını biraz azaltırız. Çok fazla değil, ancak aşırı durumlarda büyük bir fark yaratabilir.


2.0.2. Alım-satım arayüzünü Uzman Danışmandan kaldırma

Artık C_IndicatorTradeView sınıfında değişiklikler yaptığımıza göre, Uzman Danışman koduna odaklanabilir ve ondan alım-satım arayüzünü silebiliriz. Yapılacak ilk şey onu OnInit kodundan silmektir:

int OnInit()
{       
        Terminal.Init();

#ifdef def_INTEGRATION_WITH_EA
        WallPaper.Init(user10, user12, user11);
        VolumeAtPrice.Init(user32, user33, user30, user31);
        TimesAndTrade.Init(user41);
        EventSetTimer(1);
#endif 

        Mouse.Init(user50, user51, user52);
        
#ifdef def_INTEGRATION_CHART_TRADER
        static string   memSzUser01 = "";
        if (memSzUser01 != user01)
        {
                Chart.ClearTemplateChart();
                Chart.AddThese(memSzUser01 = user01);
        }
        Chart.InitilizeChartTrade(EA_user20 * Terminal.GetVolumeMinimal(), EA_user21, EA_user22, EA_user23);
        TradeView.Initilize();
        OnTrade();
#else 
        TradeView.Initilize();
#endif 
   
        return INIT_SUCCEEDED;
}

Yeşil kod mavi kod ile değiştirilecektir. Alım-satım arayüzünü kullanmazsak, farkın küçük olduğu, bunun yalnızca yürütülebilir dosya boyutundaki bir değişiklik olduğu düşünülebilir. Ama yalnızca bu değildir. Alım-satım arayüzü koduna ek olarak OnTrade olayını da kaldırdığımıza lütfen dikkat edin. Uzman Danışman artık bu olayı işlemeyecektir.

Bende bir sorun olduğunu düşünebilirsiniz. OnTrade olayını bir Uzman Danışmandan nasıl kaldırabilirim? Şimdi alım-satım olaylarını nasıl ele alacağız? Bu olaylar OnTradeTransaction olayı tarafından işlenecektir. İşleme yöntemi OnTrade'den daha verimli olacaktır, bu da Uzman Danışmanın daha basit ve daha güvenilir olacağı anlamına gelir.

Değişim geçirmekte olan başka bir yer daha var:

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
        Mouse.DispatchMessage(id, lparam, dparam, sparam);
#ifdef def_INTEGRATION_WITH_EA
        switch (id)
        {
                case CHARTEVENT_CHART_CHANGE:
                        Terminal.Resize();
                        WallPaper.Resize();
                        TimesAndTrade.Resize();
        break;
        }
        VolumeAtPrice.DispatchMessage(id, sparam);
#endif 

#ifdef def_INTEGRATION_CHART_TRADER
        Chart.DispatchMessage(id, lparam, dparam, sparam);
#endif 

        TradeView.DispatchMessage(id, lparam, dparam, sparam);  
}

Uzman Danışman içinde herhangi bir entegrasyon yoksa, derlenecek satırlar yalnızca vurgulanan satırlar olacaktır. Bu olaylar oldukça sabit olma eğiliminde olduğundan (bu olayların işlenmesi ne kadar verimli olursa o kadar iyidir), genellikle MetaTrader 5'in Uzman Danışmanın işlemesi için tetiklediği başka bir olayla rekabet ederler. Bu diğer olay aşağıda gösterilmektedir:

void OnTick()
{
#ifdef def_INTEGRATION_CHART_TRADER
        Chart.DispatchMessage(CHARTEVENT_CHART_CHANGE, 0, TradeView.SecureChannelPosition(), C_Chart_IDE::szMsgIDE[C_Chart_IDE::eRESULT]);
#else 
        TradeView.SecureChannelPosition();
#endif 

#ifdef def_INTEGRATION_WITH_EA
        TimesAndTrade.Update();
#endif 
}

Böyle bir olay gerçek bir kabustur çünkü genellikle birden çok kez çağrılır ve bazı durumlarda 1 saniyeden kısa bir süre içinde birden çok kez çağrılabilir. Ancak C_IndicatorTradeView sınıfının kodunda yapılan değişiklikler sayesinde, bu olayın işlenmesi biraz daha verimli hale geldi. Daha sonra bu verimliliği daha da artıracağız, ancak şimdilik bu yeterli olacaktır.

Tüm bu değişikliklerden sonra, alım-satım arayüzü Uzman Danışmana entegre olmayacaktır. Alım-satım arayüzünü bir göstergeye dönüştürebiliriz, bu da Uzman Danışman çalışmasını ana faaliyete odaklanmış halde tutarken bazı faydalar sağlayacaktır: emir sistemini işleme, konumlandırma ve destekleme. Ancak alım-satım arayüzünü bir göstergeye taşımak bazı ek değişiklikler içerir, bu yüzden şimdi nasıl yapılacağını göstermeyeceğim, başka bir zaman göreceğiz. Ancak genel olarak evet, alım-satım arayüzünü bir göstergeye taşıyabilir ve yine de onun üzerinden emir gönderebiliriz.


3.0. Sesler ekleme

Genellikle grafiğe bakmayız, ancak yine de o anda neler olduğunu bilmek isteriz. Bir şeylerden haberdar olmanın yollarından biri de sesli uyarı almaktır. Bu en iyi uyarı türlerinden biridir çünkü dikkatimizi hemen çeker. Bazen başka herhangi bir mesajı kontrol etmemize gerek kalmadan sadece uyarıyı dinleyerek nasıl ilerleyebileceğimizi bilebiliriz.

Öyleyse, bazı temel sesli uyarıları ayarlamayı öğrenelim. Bazı durumlarda bu, belirli bir şeyi anlatan bir cümle olacaktır. Şu anda gösterdiğim ve ekte bulunanlar yalnızca temel özellikler sağlasa da, belki de mevcut uyarı ve ikazların miktarını artırmak için sizi motive edebilir, böylece mesajları okumak için zaman harcamak zorunda kalmazsınız. Bir ses, belirli alım-satım anlarında size çeviklik kazandıran belirli bir olayı gösterebilir. İnanın bana, bu çok fark yaratmaktadır.

Yapılacak ilk şey, yeni sınıfı içerecek ve ses sistemimizi destekleyecek ve izole edecek yeni bir dosya oluşturmaktır. Bu yapıldıktan sonra çok istikrarlı bir şekilde bir şeyler üretmeye başlayabiliriz. Sınıfın tamamı aşağıdaki kodda görülebilir:

class C_Sounds
{
        protected:
                enum eTypeSound {TRADE_ALLOWED, OPERATION_BEGIN, OPERATION_END};
        public  :
//+------------------------------------------------------------------+
inline bool PlayAlert(const int arg)
                {
                        return PlaySound(StringFormat("NanoEA-SIMD\\RET_CODE\\%d.wav", arg));
                }
//+------------------------------------------------------------------+
inline bool PlayAlert(const eTypeSound arg)
                {
                        string str1;
        
                        switch (arg)
                        {
                                case TRADE_ALLOWED   : str1 = def_Sound00; break;
                                case OPERATION_BEGIN : str1 = def_Sound01; break;
                                case OPERATION_END   : str1 = def_Sound02; break;
                                defaultreturn false;
                        }
                        PlaySound("::" + str1);
                        
                        return true;
                }
//+------------------------------------------------------------------+
};

Bu kodun aşırı basitliğine rağmen, içinde ilginç bir şey var. PlayAlert fonksiyonunu yeniden yazdığımıza dikkat edin, bu şekilde aynı fonksiyonun iki versiyonuna sahibiz. Ne için? Ses sisteminin çalışma şekli, iki varyasyona sahip olmamızı gerektiriyor. Fonksiyonun ilk versiyonunda, bir dosyadan bir ses çalacağız; ikinci versiyonda ise Uzman Danışmanın bir parçası olan sesi, yani fonksiyonunu çalacağız. Şimdi birçok insanın nasıl yapılacağını bilmediği bir şey var: sesleri doğrudan ses dosyalarından çalmak. Ama merak etmeyin, size nasıl yapılacağını göstereceğim. İlk versiyonun nedeni, bazı kişilerin kendi seslerini veya başka bir sesi uyarı olarak koymak ve Uzman Danışmanı yeniden derlemek zorunda kalmadan istedikleri zaman değiştirmek isteyebilmeleridir. Aslında Uzman Danışman MetaTrader 5'te çalışırken bile bu sesleri değiştirebilirsiniz. Sesin çalınması gerektiği andan itibaren Uzman Danışman en son versiyonu kullanacaktır, bu nedenle yalnızca bir ses dosyasını diğeriyle değiştirmeniz gerekir - Uzman Danışman farkı anlamayacaktır bile, bu çok yardımcı olur. Ancak Uzman Danışman kodundan fark edilebilecek başka bir neden daha var.

Aslında, aşağıda vurgulanan sınıf kodunda görülebileceği gibi, ilk seçenek oldukça özel bir yerde kullanılır:

class C_Router
{
        protected:
        private  :
                MqlTradeRequest TradeRequest;
                MqlTradeResult  TradeResult;
//+------------------------------------------------------------------+
inline bool Send(void)
        {
                if (!OrderSend(TradeRequest, TradeResult))
                {
                        if (!Sound.PlayAlert(TradeResult.retcode))Terminal.MsgError(C_Terminal::FAILED_ORDER, StringFormat("Error Number: %d", TradeResult.retcode));
                        
                        return false;
                }
                return true;
        }

// ... The rest of the class code....

İşlem sunucusu tarafından geri döndürülen tüm olası hataları işlemek için gereken iş miktarını hayal edin. Ancak bir ses dosyası kaydeder ve bunu işlem sunucusunun geri döndürdüğü değere göre adlandırırsak, Uzman Danışman hangi dosyayı çalacağını bilecek ve bu da hayatımızı büyük ölçüde kolaylaştıracaktır. Çünkü burada sadece sunucu tarafından geri döndürülen değere göre hangi dosyanın kullanılacağını belirtmemiz gerekiyor - Uzman Danışman bu dosyayı bulacak ve oynatacak, bize sesli bir uyarı veya sesli bir mesaj verecek, böylece tam olarak ne olduğunu bileceğiz. Harika, değil mi? Şimdi, örneğin bir emir reddedilirse, platform bize ne olduğunu veya neyin yanlış olduğunu çok net bir şekilde bildirecektir. Bu, size özgü bir şeyi, alım-satım yapma ve piyasada ilerleme şeklinize özel ve benzersiz olabilecek bir şeyi temsil eden çok uygun bir şekilde yapılacaktır. Ne kadar çeviklik kazanacağınızı görün, çünkü aynı ses dosyasında sorunu nasıl çözeceğinizi netleştirebilirsiniz.

Ancak, seslerin yürütülebilir Uzman Danışman dosyasının içinde saklandığı ikinci bir çalışma modumuz da var. Bu aynı fonksiyonun ikinci versiyonudur ve bu aşamada 3 farklı yerde 3 farklı olay türünü belirtmek için kullanılacaktır. İlk yer aşağıdaki kodda görülebilir:

int OnInit()
{
        if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
        {
                Sound.PlayAlert(C_Sounds::TRADE_ALLOWED);
                return INIT_FAILED;
        }
        
        Terminal.Init();

// ... The rest of the code...

Bu kod, platformda ‘Algoritmik alım-satım’ın etkin olup olmadığını kontrol eder. Etkinleştirmeyi unutursak, Uzman Danışman bize alım-satımın mümkün olmayacağını söyleyecektir. Seçeneğin etkin olup olmadığını kontrol etmek için, aşağıdaki görüntüde işaretle gösterilen platformdaki düğmeye bakmanız yeterlidir:


Yardımcı ses kullanacağımız ikinci yer aşağıda gösterilmiştir:

void CreateIndicator(ulong ticket, eIndicatorTrade it)
{
        string sz0;
                                
        switch (it)
        {
                case IT_TAKE    : macroCreateIndicator(it, clrForestGreen, clrDarkGreen, clrNONE); break;
                case IT_STOP    : macroCreateIndicator(it, clrFireBrick, clrMaroon, clrNONE); break;
                case IT_PENDING:
                        macroCreateIndicator(it, clrCornflowerBlue, clrDarkGoldenrod, def_ColorVolumeEdit);
                        m_BtnCheck.Create(ticket, sz0 = macroMountName(ticket, it, EV_CHECK), def_BtnCheckEnabled, def_BtnCheckDisabled);
                        m_BtnCheck.SetStateButton(sz0, true);
                        macroInfoBase(IT_PENDING);
                        break;
                case IT_RESULT  :
                        macroCreateIndicator(it, clrSlateBlue, clrSlateBlue, def_ColorVolumeResult);
                        macroInfoBase(IT_RESULT);
                        Sound.PlayAlert(C_Sounds::OPERATION_BEGIN);
                        m_InfoSystem.ExistOpenPosition = true;
                        break;
        }
        m_BtnClose.Create(ticket, macroMountName(ticket, it, EV_CLOSE), def_BtnClose);
}

Bir pozisyon göstergesi her oluşturulduğunda bir ses çalınacaktır. Bu bizim için hayatı çok daha kolaylaştıracaktır, çünkü bekleyen emrin bir pozisyon haline geldiğini ve ona dikkat etmeye başlamamız gerektiğini bileceğiz.

Yardımcı bir sesin olduğu üçüncü ve son nokta, bir pozisyonun herhangi bir nedenle kapatıldığı zamandır. Bu çok spesifik bir yerde yapılır:

inline void RemoveIndicator(ulong ticket, eIndicatorTrade it = IT_NULL)
{
        ChartSetInteger(Terminal.Get_ID(), CHART_EVENT_OBJECT_DELETE, false);
        if ((it == IT_NULL) || (it == IT_PENDING) || (it == IT_RESULT))
        {
                if (macroGetPrice(ticket, IT_RESULT, EV_LINE) > 0) Sound.PlayAlert(C_Sounds::OPERATION_END);
                ObjectsDeleteAll(Terminal.Get_ID(), StringFormat("%s%c%llu%c", def_NameObjectsTrade, def_SeparatorInfo, ticket, (ticket > 1 ? '*' : def_SeparatorInfo)));
        } else ObjectsDeleteAll(Terminal.Get_ID(), StringFormat("%s%c%llu%c%c", def_NameObjectsTrade, def_SeparatorInfo, ticket, def_SeparatorInfo, (char)it));
        ChartSetInteger(Terminal.Get_ID(), CHART_EVENT_OBJECT_DELETE, true);
        m_Selection.ticket = 0;
        Mouse.Show();
        ChartRedraw();
}

Uzman Danışmanı kaldırdığınızda pozisyon kapanış sesini çalacağını düşünebilirsiniz, ancak hayır. Bu olmayacak çünkü fiyat çizgisi hala sistemde mevcut olacak. Ancak pozisyon kapatıldığında farklı bir şey olacak ve pozisyon fiyat çizgisi 0 fiyat seviyesinde belirecektir - bu anda pozisyonun kapandığını ifade eden bir ses çalacaktır.

Uzman Danışmanın kaynakları olan bu sesler, çalıştırılabilir dosyayı gittiği her yerde takip edeceğinden ve kod yeniden derlenmeden değiştirilemeyeceğinden, daha sınırlıdırlar, ancak aynı zamanda ses dosyalarını yanımıza almamıza gerek kalmadan Uzman Danışmanı başka yerlere taşımamıza yardımcı olurlar.

Ancak hatalar hakkında uyarı vermek için kullanılan sesler söz konusu olduğunda mantık farklıdır: gerektiğinde çalışabilmeleri için ayrı olarak taşınmaları ve önceden belirlenmiş bir yere yerleştirilmeleri gerekir.

Ekte Sounds adında bir klasör bulunmaktadır. Bu klasörü kodun bulunduğu klasörde bırakmayın, çünkü bu klasörde bulunan sesler çalınmayacaktır. Kolayca bulunabilecek farklı bir yere taşıyın. Nerede olduğunu bilmiyorsanız endişelenmeyin - daha sonra göreceğiz:

#property copyright "Daniel Jose"
//+------------------------------------------------------------------+
void OnStart()
{
        Print(TerminalInfoString(TERMINAL_PATH));
}
//+------------------------------------------------------------------+

Bu kodu çalıştırdığınızda, araç çubuğunda kullanacağınız konumu gösteren bilgi alacaksınız. Yürütme sonucunun bir örneği aşağıdaki görüntüde gösterilmiştir:

Aşağıdakileri yapmalısınız:

  1. Eki açın
  2. Dosya Gezginini açın
  3. Yukarıdaki görüntüde gösterilen klasöre gidin
  4. Ekteki Sounds klasörünün içeriğini yukarıda belirtilen klasöre kopyalayın
  5. İsterseniz üç dosyayı (Begin, End, Warring) silebilirsiniz, çünkü bunlar Uzman Danışman ile birlikte derlenecektir.
  6. .wav dosyalarının içeriğini istediğiniz herhangi bir şeyle değiştirebilirsiniz; sadece adını değiştirmediğinizden emin olun
  7. Uzman Danışmanı MetaTrader 5 platformunda kullanın ve keyfini çıkarın!
Ancak, seslerin (Begin, End, Warring) Uzman Danışmanda derlenebilmesi için, MQL5 kod dizininde bu sesleri içeren Sounds klasörüne sahip olmanız gerektiğini unutmayın, aksi takdirde Uzman Danışman koduna entegre edilmeyeceklerdir.


Sonuç

Bu makalede, Uzman Danışman sistemine özel seslerin nasıl ekleneceğini öğrendiniz. Burada bunun nasıl yapıldığını göstermek için çok basit bir sistem kullandık, ancak sadece Uzman Danışman ile sınırlı değilsiniz, göstergelerde ve hatta komut dosyalarında da kullanabilirsiniz.

Harika olan şey, burada önerilen aynı kavramları ve fikirleri kullanırsanız, bir şey söyleyen veya bir şey hakkında uyaran sesli mesajlar kaydedebilirsiniz. Ve MetaTrader 5 tarafından yürütülen ve ses sistemini kullanan Uzman Danışman veya başka herhangi bir işlem, makalede gösterilen tetikleyiciler aracılığıyla etkinleştirildiğinde, size daha önce öngördüğünüz ve yapmanız gereken bir tür eylem hakkında bilgi veren veya sizi uyaran böyle bir sesli mesaj alacaksınız.

Ve bu bir metin değil, sesli bir mesajdır, bu da sistemi kullanan herkese ne yapılması gerektiğini veya böyle bir mesajı oluşturan nedenin ne olduğunu hızlı bir şekilde açıklayabileceğiniz için çok daha etkilidir.

Bu sistem bu şema ile sınırlı değildir ve burada gösterilenin ötesine geçebilirsiniz. Buradaki fikir tam olarak şudur: kullanıcının platformda bir yardımcıya sahip olmasını sağlamak. Yatırımcıyla sesli bir etkileşim kurarak, belki de düz metinden daha iyi anlaşılabilecek bir mesaj iletebiliriz. Burada sizi sınırlayan tek şey yaratıcılığınızdır.
   


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

Ekli dosyalar |
EA_-_h_Parte_29_6.zip (14465.62 KB)
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.
Bill Williams MFI göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir? Bill Williams MFI göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir?
En popüler teknik göstergelere dayalı alım-satım sistemleri tasarladığımız serimizin yeni makalesindeyiz. Bu makalede Bill Williams Market Facilitation Index (BW MFI) göstergesini inceleyeceğiz.
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)
Uzman Danışmanımızdan farklı parçalar çıkarmaya devam ediyoruz. Bu, bu serideki son makaledir. Çıkarılacak son şey ise ses sistemi. Bu makale serisini takip etmediyseniz bu biraz kafa karıştırıcı olabilir.
Gator Oscillator göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir? Gator Oscillator göstergesine dayalı bir alım-satım sistemi nasıl geliştirilir?
En popüler göstergelere dayalı alım-satım sistemlerini nasıl oluşturacağımızı öğrendiğimiz serinin yeni makalesi. Bu kez Gator Oscillator göstergesi hakkında konuşacağız ve bu göstergeyi kullanan bazı basit stratejilere dayalı olarak bir alım-satım sistemi oluşturacağız.