
Semafor Göstergelerini Kullanan Basit Alım Satım Sistemleri
Giriş
Semafor veya sinyal göstergeleri, piyasaya giriş veya çıkış anlarını gösteren basit detektörlerdir. Geçerli çubukta bir giriş sinyali olması durumunda, bir sembol grafiğinde uygun bir etiket görünür. Bu etiket daha sonra bir sözleşme gerçekleştirmek için bir koşul olarak kullanılabilir.
Bu tür birçok gösterge vardır, ancak bu tür göstergelere dayanan orijinal alım satım sisteminin özü hiç değişmemiştir. Bu nedenle, bunu en basit ve evrensel biçimde uygulamak iyi bir fikirdir. Bu, önemli değişiklikler olmadan benzer göstergelerle çalışırken elde edilen sonucun daha fazla kullanılmasına izin verecektir.
Şekil 1. ASCtrend semafor sinyal göstergesi
Şekil 2. ASCtrend semafor sinyal göstergesini kullanarak bir sözleşme yapmak için alım satım sinyali
Tipik Semafor Sinyal Göstergelerinin Örnekleri
Şu anda Kod Tabanında bu tür birçok gösterge var. Bu makalede uygun web sayfalarına yalnızca birkaç bağlantı sağlayacağım:
- BykovTrend,
- ASCtrend,
- BrainTrend1Sig,
- BrainTrend2Sig,
- SilverTrend_Signal,
- Stalin,
- WPRSI sinyali,
- StepMA_NRTR,
- LeManSignal,
- 3Parabolic Sistemi,
- PriceChannel_Stop,
- Arrows&Curves,
- Karacatica,
- Sidus.
Semafor sinyal göstergelerine ek olarak, bir grup semafor trend göstergesi vardır:
Şekil 3. Semafor trend göstergesi
Şekil 4. Heiken Ashi Smoothed semafor trend göstergesini kullanarak bir sözleşme yapmak için alım satım sinyali
Bu tür göstergeleri kullanan alım satım sistemleri, alım satım sinyallerini almak için biraz farklı kodlara sahipken, Uzman Danışman (EA) kodu neredeyse değişmeden kalır.
Tipik Semafor Trend Göstergelerinin Örnekleri
Kod Tabanı, bu tür birçok gösterge içerir. Bu makalede uygun web sayfalarına yalnızca birkaç bağlantı sağlayacağım:
- FiboCandles,
- Parabolic SAR,
- X2MA,
- Candles_Smoothed,
- SuperTrend,
- Go,
- 3LineBreak,
- Laguerre,
- Heiken Ashi Smoothed,
- NonLagDot.
Alım Satım Sistemi Oluşturmak için Temel Veriler:
- Uzman Danışanda (EA) bulunması gereken giriş parametreleri ile semafor göstergesi;
- Ek giriş Uzman Danışman (EA) alım satım parametrelerinin listesi:
- bir sözleşmede kullanılan mevduat finansal kaynaklarının payı;
- Zarar Durdur ve Kar Al boyutu (sıfır değerler olması durumunda bekleyen emirler kullanılmamalıdır);
- kayma (belirlenen ve gerçek sözleşme fiyatları arasında izin verilen maksimum fark);
- alım satım sinyallerinin alınacağı çubuğun dizini;
- uzun ve kısa pozisyon açma izinleri;
- gösterge sinyallerine göre uzun ve kısa pozisyonların zorla kapatılması için izinler.
Tabii ki, evrensel alım satım sinyallerini kullanarak işlem yapmak için emir vermek çok daha uygun olacaktır. Bu fonksiyonlar oldukça karmaşıktır ve uygulama kodunu olabildiğince kolaylaştırmak için ayrı bir kitaplık dosyasında paketlenmeleri gerekir.
Semafor alım satım sistemini uygulayan Uzman Danışmanın (EA) kodu:
//+------------------------------------------------------------------+ //| Exp_ASCtrend.mq5 | //| Copyright © 2011, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Nikolay Kositsin" #property link "farria@mail.redcom.ru" #property version "1.00" //+----------------------------------------------+ //| Expert Advisor indicator input parameters | //+----------------------------------------------+ input double MM=-0.1; // Share of a deposit in a deal, negative values - lot size input int StopLoss_=1000; // Stop loss in points input int TakeProfit_=2000; // Take profit in points input int Deviation_=10; // Max. price deviation in points input bool BuyPosOpen=true; // Permission to buy input bool SellPosOpen=true; // Permission to sell input bool BuyPosClose=true; // Permission to exit long positions input bool SellPosClose=true; // Permission to exit short positions //+----------------------------------------------+ //| ASCtrend indicator input parameters | //+----------------------------------------------+ input ENUM_TIMEFRAMES InpInd_Timeframe=PERIOD_H1; // ASCtrend indicator time frame input int RISK=4; // Risk level input uint SignalBar=1; // Bar index for getting an entry signal //+----------------------------------------------+ int TimeShiftSec; //---- declaration of integer variables for the indicators handles int InpInd_Handle; //---- declaration of integer variables of the start of data calculation int min_rates_total; //+------------------------------------------------------------------+ //| Trading algorithms | //+------------------------------------------------------------------+ #include <TradeAlgorithms.mqh> //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- getting ASCtrend indicator handle InpInd_Handle=iCustom(Symbol(),InpInd_Timeframe,"ASCtrend",RISK); if(InpInd_Handle==INVALID_HANDLE) Print(" Failed to get handle of ASCtrend indicator"); //---- initialization of a variable for storing a chart period in seconds TimeShiftSec=PeriodSeconds(InpInd_Timeframe); //---- initialization of variables of the start of data calculation min_rates_total=int(3+RISK*2+SignalBar); //---- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- GlobalVariableDel_(Symbol()); //---- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //---- checking the number of bars to be enough for calculation if(BarsCalculated(InpInd_Handle)<min_rates_total) return; //---- uploading history for IsNewBar() and SeriesInfoInteger() functions normal operation LoadHistory(TimeCurrent()-PeriodSeconds(InpInd_Timeframe)-1,Symbol(),InpInd_Timeframe); //---- declaration of local variables double DnVelue[1],UpVelue[1]; //---- declaration of static variables static bool Recount=true; static bool BUY_Open=false,BUY_Close=false; static bool SELL_Open=false,SELL_Close=false; static datetime UpSignalTime,DnSignalTime; static CIsNewBar NB; //+----------------------------------------------+ //| Searching for deals performing signals | //+----------------------------------------------+ if(!SignalBar || NB.IsNewBar(Symbol(),InpInd_Timeframe) || Recount) // checking for a new bar { //---- zeroing out trading signals BUY_Open=false; SELL_Open=false; BUY_Close=false; SELL_Close=false; Recount=false; //---- copy newly appeared data into the arrays if(CopyBuffer(InpInd_Handle,1,SignalBar,1,UpVelue)<=0) {Recount=true; return;} if(CopyBuffer(InpInd_Handle,0,SignalBar,1,DnVelue)<=0) {Recount=true; return;} //---- getting buy signals if(UpVelue[0] && UpVelue[0]!=EMPTY_VALUE) { if(BuyPosOpen) BUY_Open=true; if(SellPosClose) SELL_Close=true; UpSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec; } //---- getting sell signals if(DnVelue[0] && DnVelue[0]!=EMPTY_VALUE) { if(SellPosOpen) SELL_Open=true; if(BuyPosClose) BUY_Close=true; DnSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec; } //---- searching for the last trading direction for getting positions closing signals //if(!MQL5InfoInteger(MQL5_TESTING) && !MQL5InfoInteger(MQL5_OPTIMIZATION)) //if execution is set to "Random delay" in the Strategy Tester if((BuyPosOpen && BuyPosClose || SellPosOpen && SellPosClose) && (!BUY_Close && !SELL_Close)) { int Bars_=Bars(Symbol(),InpInd_Timeframe); for(int bar=int(SignalBar+1); bar<Bars_; bar++) { if(SellPosClose) { if(CopyBuffer(InpInd_Handle,1,bar,1,UpVelue)<=0) {Recount=true; return;} if(UpVelue[0]!=0 && UpVelue[0]!=EMPTY_VALUE) { SELL_Close=true; break; } } if(BuyPosClose) { if(CopyBuffer(InpInd_Handle,0,bar,1,DnVelue)<=0) {Recount=true; return;} if(DnVelue[0]!=0 && DnVelue[0]!=EMPTY_VALUE) { BUY_Close=true; break; } } } } } //+----------------------------------------------+ //| Performing deals | //+----------------------------------------------+ //---- Closing a long position BuyPositionClose(BUY_Close,Symbol(),Deviation_); //---- Closing a short position SellPositionClose(SELL_Close,Symbol(),Deviation_); //---- Buying BuyPositionOpen(BUY_Open,Symbol(),UpSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_); //---- Selling SellPositionOpen(SELL_Open,Symbol(),DnSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_); //---- } //+------------------------------------------------------------------+
Böyle bir fikri gerçekleştirmek için kod oldukça basit ve açıktır, ancak bazı detayların açıklığa kavuşturulması gerekir.
Bir sinyal göstergesi ve bir Uzman Danışman (EA) tarafından kullanılan grafik periyodu, Uzman Danışmanın (EA) InpInd_Timeframe giriş değişkeninde sabitlenir. Bu nedenle Uzman Danışmanın (EA) bulunduğu bir grafiğin değişmesi, Uzman Danışman (EA) için bu parametreyi değiştirmez.
Yeni bir çubuğun varış anını belirlemek için gerekli olan IsNewBar() fonksiyonu, TradeAlgorithms.mqh dosyasına yerleştirilen bir sınıf olarak uygulanır. Bu, her biri için ayrı bir statik CIsNewBar değişkeni ayarlayarak bu tür herhangi bir sayıda fonksiyonu kodda kolayca kullanmanıza olanak tanır.
UpSignalTime ve DnSignalTime değişkenleri, zamanı depolamak ve aktarmak için kullanılır, bundan sonra bir öncekinden sonraki sözleşmenin alım satım fonksiyonlarına uygulanması mümkündür. Bizim durumumuzda bu özellik, aynı çubukta aynı yönde birkaç sözleşme yapmaktan kaçınmak için kullanılır (bir sözleşme gerçekleştirirken, alım satım fonksiyonu mevcut çubuğun bitiş zamanını depolar ve bu ana kadar aynı yönde yeni sözleşmeler gerçekleştirmez).
OnTick() fonksiyonundaki "Pozisyonları kapatmak için sinyal almak için son alım satım yönünün aranması" bloğu, alım satım sinyali olmayan çubuklarda pozisyon kapatma sinyallerini almak için gereklidir. Uzman Danışmanın (EA) normal çalışması durumunda bunlara gerek yoktur. Ancak internet bağlantısının kesilmesi durumunda yeni bir alım satım sinyalinin kaçırılması oldukça olasıdır. Piyasaya sonra girmek pek iyi bir fikir değil, ancak açık pozisyonları kapatmak akıllıca bir hareket olacaktır.
Alım Satım Sistemini Diğer Semafor Sinyal Göstergeleriyle Kullanma
Şimdi bu kodu başka bir semafor sinyal göstergesi ile kullanma zorunluluğu varsa aşağıdaki işlemler yapılmalıdır:
- Bir Uzman Danışman (EA) giriş parametrelerinde önceki gösterge verilerini yenisinin gerekli parametreleriyle değiştirin;
- OnInit() bloğundaki gösterge tanıtıcısını alma kodunu değiştirin;
- Gösterge kodundan alım ve satım işlem sinyallerini depolamak için kullanılan gösterge tamponları için dizinleri belirleyin ve bunları OnTick() bloğunun CopyBuffer() fonksiyon çağrılarına uygun şekilde girin. Bu durumda sıfır ve birinci gösterge tamponları kullanılır;
- Bir Uzman Danışmanda (EA) veri hesaplama başlangıç noktası değişkeninin (min_rates_total) başlatılmasını aşağıdakilere göre değiştirin. gösterge kodu;
- Gösterge koduna göre OnTick() fonksiyonunda "Pozisyonları kapatmak için sinyal almak için son alım satım yönünün aranması" bloğunu değiştirin.
Alım Satım Sistemini Diğer Semafor Trend Göstergeleriyle Kullanma
Bu alım satım sistemini semafor trend göstergesi ile kullanırken, Uzman Danışman (EA) kodu, OnTick() fonksiyon işlemleri için sinyalleri belirlemek için blokta biraz değişmiştir. Örneğin, FiboCandles göstergesine dayalı Uzman Danışman (EA) için kod aşağıdaki gibi görünecektir:
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //---- checking the number of bars to be enough for calculation if(BarsCalculated(InpInd_Handle)<min_rates_total) return; //---- uploading history for IsNewBar() and SeriesInfoInteger() functions LoadHistory(TimeCurrent()-PeriodSeconds(InpInd_Timeframe)-1,Symbol(),InpInd_Timeframe); //---- declaration of local variables double TrendVelue[2]; //---- declaration of static variables static bool Recount=true; static bool BUY_Open=false,BUY_Close=false; static bool SELL_Open=false,SELL_Close=false; static datetime UpSignalTime,DnSignalTime; static CIsNewBar NB; //+----------------------------------------------+ //| Searching for deals performing signals | //+----------------------------------------------+ if(!SignalBar || NB.IsNewBar(Symbol(),InpInd_Timeframe) || Recount) // checking for a new bar { //---- zeroing out trading signals BUY_Open=false; SELL_Open=false; BUY_Close=false; SELL_Close=false; Recount=false; //---- copy the newly obtained data into the arrays if(CopyBuffer(InpInd_Handle,4,SignalBar,2,TrendVelue)<=0) {Recount=true; return;} //---- getting buy signals if(TrendVelue[0]==1 && TrendVelue[1]==0) { if(BuyPosOpen) BUY_Open=true; if(SellPosClose)SELL_Close=true; UpSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec; } //---- getting sell signals if(TrendVelue[0]==0 && TrendVelue[1]==1) { if(SellPosOpen) SELL_Open=true; if(BuyPosClose) BUY_Close=true; DnSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec; } //---- searching for the last trading direction for getting positions closing signals //if(!MQL5InfoInteger(MQL5_TESTING) && !MQL5InfoInteger(MQL5_OPTIMIZATION)) //if execution is set to "Random delay" in the Strategy Tester { if(SellPosOpen && SellPosClose && TrendVelue[1]==0) SELL_Close=true; if(BuyPosOpen && BuyPosClose && TrendVelue[1]==1) BUY_Close=true; } } //+----------------------------------------------+ //| Performing deals | //+----------------------------------------------+ //---- Closing a long position BuyPositionClose(BUY_Close,Symbol(),Deviation_); //---- Closing a short position SellPositionClose(SELL_Close,Symbol(),Deviation_); //---- Buying BuyPositionOpen(BUY_Open,Symbol(),UpSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_); //---- Selling SellPositionOpen(SELL_Open,Symbol(),DnSignalTime,MM,0,Deviation_,StopLoss_,TakeProfit_); //---- }
Bu durumda alım satım sinyalleri yalnızca bir renkli gösterge tamponundan (renk dizinlerini içeren) alınır. Bu tamponda veriler yalnızca iki değere sahip olabilir: 0 - yükselen piyasa için ve 1 - azalan piyasa için. Herhangi bir çubuktaki bir trend yönü doğrudan gösterge tamponunun uygun hücresinden alınabildiğinden, "Pozisyon kapanış sinyallerini almak için son alım satım yönünün aranması" blok kodu mümkün olduğunca basitleştirildi.
"Sözleşmeleri gerçekleştirme" bloğunda, önce pozisyon kapatma fonksiyonları, ardından açma fonksiyonları gelir. Tersi durumda, sadece bir çubuktaki sözleşmeleri kapatmak mümkün olacak, "Yalnızca açık fiyatlar" modunda test ederken bunları aynı anda açamayacaksınız! Bu nedenle, alım satım sonuçları ciddi şekilde bozulacaktır.
Alım Satım Sisteminin Test Edilmesi
Alım satım sistemi testine geçmeden önce, önemli bir detayın açıklığa kavuşturulması gerekir. SignalBar giriş değişkeni değerinin sıfıra eşit olması durumunda Uzman Danışman (EA) mevcut çubuktan sözleşme gerçekleştirme sinyalleri alacaktır. Ancak mevcut çubuk sinyali, önceki çubukta bu sinyale karşı hareket eden trendin değişimini gösterme açısından güvenilir değildir. Mevcut çubuktaki sinyaller görünebilir ve kaybolabilirken, bir trend bu tür sinyallere karşı oldukça uzun bir süre hareket edebilir. Bu, bir Uzman Danışman (EA) görselleştirmenin etkin olduğu ve SignalBar değişkeninin sıfıra eşit olduğu tüm tikler üzerinde test edildiğinde kolayca görülebilir. ASCtrend göstergesi işlem görselleştirmesi, böyle bir durumda bu gerçeğin çok açık bir kanıtını sunar.
Yine, geçerli çubuktan alınan bir sinyalle bir Uzman Danışman (EA) optimizasyonu için yalnızca "Her tik" modu uygundur. Halihazırda başka bir kapalı çubuktan alınması durumunda, "Yalnızca açık fiyatlar" modu oldukça yeterlidir. Bu, kalitesinde ciddi bir kayıp olmadan alım satım sistemi davranış analizini büyük ölçüde hızlandırır.
Bu nedenle, bu tür alım satım sistemlerinin test edilmesi ve optimizasyonu için mevcut çubuktan gelen sinyalleri kullanmamak daha iyidir!
Öyleyse, Uzman Danışmanı (EA), yılın başından Aralık ayının başına kadar EUR/USD'de varsayılan parametrelerle test edelim:
Şekil 5. EUR/USD H1 üzerinde varsayılan parametrelerle Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları
Strateji Test Cihazında Uzman Danışman (EA) ayarlarını biraz değiştirdikten sonra, mevcut geçmiş veriler için Uzman Danışman (EA) parametrelerinin en uygun kombinasyonunu oldukça kolay bir şekilde bulabiliriz:
Şekil 6. EUR/USD H1 üzerinde daha iyi parametrelerle optimizasyondan sonra Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları
Alım satım sistemi optimizasyonu sürecinin herhangi bir özelliği yoktur, bu yüzden bu süreci ayrıntılı olarak açıklayan makaleye sadece bir bağlantı vereceğim: "MQL5: MQL5'te Uzman Danışmanların (EA) Test Edilmesi ve Optimize Edilmesi Kılavuzu".
Tabii ki, bu kadar basit bir alım satım sisteminden olağanüstü karlar beklemek saflık olur. Ancak bu yarı otomatik sistemin ustaca ele alınması ve piyasanın mevcut davranışına göre düzenli olarak ayarlanması durumunda iyi sonuçlar elde etmek oldukça mümkündür.
Örneğin, 2011'de Ocak'tan Mayıs'a kadar EUR/USD H12 grafiğinde yukarı yönlü bir trend vardı. Ve erken aşamalarda bu kolayca tespit edilebilirdi:
Şekil 7. EUR/USD H12 grafiği (Ocak/Mayıs 2011)
Uzman Danışmanı (EA) bu zaman aralığında varsayılan ayarlarla, yalnızca satın alma olanağıyla ve yalnızca %5 mevduat kullanımıyla (MM=0,05) test etmek ilginç olurdu. H1 grafiği üzerinde test edilen bu tür parametrelere sahip Uzman Danışmanın (EA) sonuçları aşağıdadır:
Şekil 8. Ocak/Mayıs 2011 için EUR/USD H1'de varsayılan parametrelerle Exp_ASCtrend Uzman Danışmanının (EA) test sonuçları (sadece uzun pozisyonlar, MM=0,05)
Tabii ki, bu durumda bir yatırımcı bir sözleşme yönünü seçmekten tamamen sorumludur. Ancak bunun büyük zaman dilimi grafikleri kullanılarak yapılması gerektiğini aklımızda tutarsak herhangi bir zorlukla karşılaşmayız.
Alım Satım Modülünün Başka Bir Göstergeyle Kullanılması İçin Değiştirilmesi
Bu makale burada bitebilirdi ancak MetaEditor, hazır alım satım modüllerine dayalı Uzman Danışmanlar oluşturma olanağını elde etti. Burada sunulan tüm materyalleri göz önünde bulundurarak bu tür modülleri oluşturma işlemi oldukça karmaşıktır ve ayrı bir çalışma gerektirir. Bu nedenle, önerdiğim alım satım sistemlerine tamamen benzeyen, önceden oluşturulmuş alım satım modüllerine odaklanacağım. Ve ancak bundan sonra, gereksiz detaylandırmadan kaçınarak belirli sinyal göstergelerine göre bu modüllerin modifikasyonunun detaylarına geçeceğim.
Halihazırda semafor sinyal sistemleri (MySignals.zip) için alım satım modülleri koleksiyonumuz olduğunu ve herhangi bir özel gösterge için analog modül oluşturmak istediğimizi varsayalım. Bu, tipik bir semafor sinyal göstergesi olan BykovTrendSignal.mq5 göstergesi olsun. Her şeyden önce, bu koleksiyondan (Indicators.zip) göstergenin en doğru analogunu bulmalıyız. Görsel olarak, bu makaledeki ilk göstergenin (ASCtrend) buna en çok benzeyen olduğunu belirledik. Bu nedenle, değişiklik için bu göstergenin alım satım modülünü kullanacağız.
Gerekli program kodunda kullanımı göz önüne alındığında, göstergenin kendisi (BykovTrend) bir dizi giriş parametresine sahiptir:
//+----------------------------------------------+ //| Indicator input parameters | //+----------------------------------------------+ input int RISK=3; input int SSP=9; //+----------------------------------------------+
Ve sözleşmeleri gerçekleştirmek için sinyalleri depolamak için kullanılan gösterge tamponlarının dizinlerine ihtiyacımız var. Bizim durumumuzda bunlar: 0 - satış sinyalleri için ve 1 - alış sinyalleri için.
Artık modifikasyon için hangi modülün kullanılması gerektiğini bildiğimize göre, bunu BykovTrendSignal.mqh dosya adıyla \MQL5\Include\Expert\Signal\MySignals\ klasörüne kopyalayıp MetaEditor'da açıyoruz. Kullanılan kodda düzenli olarak karşılaşılan "ASCtrend" (önceki gösterge adı) ifadesi vardır. Bu, yeni göstergenin adıyla değiştirilmelidir - "BykovTrend". Bunun için "Ctrl" ve "H" tuşlarına aynı anda basın ve gerekli değişikliği yapın:
Şekil 9. Alım satım modülü kodundaki gösterge adının değiştirilmesi
Çalışmamızın bundan sonraki aşaması en titiz olanıdır. Alım satım modülü kodundaki gösterge giriş parametreleriyle ilgili her şeyi değiştirmemiz gerekmektedir. İşlem, "MQL5 Sihirbazı: Alım satım sinyalleri modülü nasıl oluşturulur" makalesinde belirtilene çok benzerdir.
Her şeyden önce, MQL5 Sihirbazı alım satım sinyalleri sınıf açıklamasının dışarıda bırakılan bloğunda bazı değişiklikler yapmalıyız:
//+----------------------------------------------------------------------+ //| Description of the class | //| Title=The signals based on BykovTrend indicator | //| Type=SignalAdvanced | //| Name=BykovTrend | //| Class=CBykovTrendSignal | //| Page= | //| Parameter=BuyPosOpen,bool,true,Permission to buy | //| Parameter=SellPosOpen,bool,true,Permission to sell | //| Parameter=BuyPosClose,bool,true,Permission to exit a long position | //| Parameter=SellPosClose,bool,true,Permission to exit a short position | //| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H1,Timeframe | //| Parameter=RISK,int,4,Risk level | //| Parameter=SSP,int,9,SSP | //| Parameter=SignalBar,uint,1,Bar index for entry signal | //+----------------------------------------------------------------------+ //--- wizard description end //+----------------------------------------------------------------------+ //| CBykovTrendSignal class. | //| Purpose: Class of generator of trade signals based on | //| BykovTrend indicator https://www.mql5.com/ru/code/497/. | //| Is derived from the CExpertSignal class. | //+----------------------------------------------------------------------+
Her iki gösterge de aynı RISK girdi değişkenini içerir, bu nedenle bırakılabilir. Ancak bu göstergelerde, bunun varsayılan değeri farklıdır. Aslında, bu fark kritik değildir ve değişmeden bırakılabilir. SSP değişkeni hakkında yorum satırı eklendi:
//| Parameter=SSP,int,9,SSP |
Ve Kod Tabanı göstergesinin bağlantısı değiştirildi:
//| Purpose: Class of generator of trade signals based on | //| BykovTrend values https://www.mql5.com/ru/code/497/. |
Şimdi, giriş parametrelerinin değişiklikleriyle ilgili her şey, CBykovTrendSignal alım satım sinyalleri sınıfının açıklamasına yansıtılmalıdır. Ayar parametrelerinde yeni global m_SSP sınıfı değişken bildirimi satırına sahibiz:
uint m_SSP; // SSP
ve yeni SSP() ayarları parametrelerinin kurulum yöntemi bildirimi satırı:
void SSP(uint value) { m_SSP=value; }
Oluşturduğumuz alım satım sinyalleri modülündeki RISK giriş değişkeni ile ilgili her şey giriş modülüne eşdeğerdir ve bu nedenle mevcut ve diğer alım satım modülü bloklarında hiçbir değişiklik yoktur.
Şimdi CBykovTrendSignal::CBykovTrendSignal() sınıfı yapıcıya geçiyoruz. Bu bloğa yeni bir değişkenin başlatılması eklenmelidir:
m_SSP=4;
Yeni değişkenin doğruluğunun kontrolü şurada yapılmalıdır: CBykovTrendSignal::ValidationSettings() ayarları parametreleri doğrulama bloğu:
if(m_SSP<=0) { printf(__FUNCTION__+": SSP must be above zero"); return(false); }
Bundan sonra BykovTrend gösterge başlatma bloğuna geçebiliriz - BykovTrendSignal::InitBykovTrend(). Yeni göstergenin farklı sayıda giriş değişkeni vardır ve bu nedenle, bildirilen giriş parametreleri dizisinin boyutu da farklı olacaktır:
//--- setting the indicator parameters MqlParam parameters[3];
Bizim durumumuzda, gösterge dizisi adı için bir boyuta ve giriş parametreleri için iki boyuta daha ihtiyacımız var.
Şimdi, içinde depolanacak değişkenin türünü belirten giriş parametreleri dizilerinin yeni bir hücresini başlatmamız gerekiyor:
parameters[2].type=TYPE_INT; parameters[2].integer_value=m_SSP;
Bundan sonra, gösterge başlatma çağrısında bu blokta giriş değişkenlerinin sayısını 3 ile değiştirin:
//--- object initialization if(!m_indicator.Create(m_symbol.Name(),m_Ind_Timeframe,IND_CUSTOM,3,parameters))
Göstergedeki gösterge tamponlarının sayısı aynı ve ikiye eşit kalır, bu nedenle bizim durumumuzda gösterge tampon sayısı başlatma satırında herhangi bir şeyi değiştirmeye gerek yoktur:
//--- number of buffers if(!m_indicator.NumBuffers(2)) return(false);
ASCtrend ve BykovTrend göstergelerinin her biri iki gösterge tamponuna sahiptir. Tamponların fonksiyonları tamamen benzerdir. Sıfır tamponu, satış sinyallerini depolamak için kullanılırken, 1. dizine sahip tampon, alış sinyallerini depolamak için kullanılır. Dolayısıyla, CBykovTrendSignal::LongCondition() ve CBykovTrendSignal::ShortCondition() alım satım sinyallerinin iletilmesine yönelik fonksiyonların blokların hiçbir şeyin değiştirilmesi gerekmez ve alım satım sinyalleri modülü modifikasyonu üzerindeki çalışma tamamlanmış sayılabilir.
Ancak genel olarak, tüm semafor göstergeleri farklıdır ve bu nedenle, farklı semafor göstergeleri için bu bloklar birbirinden önemli ölçüde farklılık gösterebilir. MySignals.zip alım satım modülü arşivi ve uygun Indicators.zip arşivi, çeşitli göstergeler oluşturmak için yeterli miktarda örnek içerir. Biraz incelemeden sonra, değiştirme işleminin ayrıntılarını ve bunun için olası kod sürümlerini öğrenmek mümkündür.
Şimdi, alım satım sinyalleri modülünün Ind_Timeframe giriş değişkenine odaklanmak istiyorum. Bu değişken, göstergeye uygun bir zaman dilimi indirmeye izin verir. Ancak, oluşturulan Uzman Danışman (EA), atandığı zaman diliminde çalışır. Bu, Ind_Timeframe giriş değişkeni zaman diliminin, modülün normal çalışmasını sağlamak için Uzman Danışmanın (EA) üzerinde çalıştığı grafiğin bir dönemini asla aşmaması gerektiği anlamına gelir.
Son olarak, alım satım sinyalleri modülleri oluşturmanın başka bir özelliğini ortaya çıkarmak istiyorum. Bazen, modül giriş değişkenlerinin türleri olarak temel gösterge koduna özel numaralandırmalar uygulanır. Örneğin, Candles_Smoothed göstergesi için MA_SMethod değişken türü olarak Smooth_Method özel numaralandırması kullanılır:
//+-----------------------------------+ //| Declaration of enumerations | //+-----------------------------------+ enum Smooth_Method { MODE_SMA_, // SMA MODE_EMA_, // EMA MODE_SMMA_, // SMMA MODE_LWMA_, // LWMA MODE_JJMA, // JJMA MODE_JurX, // JurX MODE_ParMA, // ParMA MODE_T3, // T3 MODE_VIDYA, // VIDYA MODE_AMA, // AMA }; */ //+----------------------------------------------+ //| Indicator input parameters | //+----------------------------------------------+ input Smooth_Method MA_SMethod=MODE_LWMA; // Smoothing method input int MA_Length=30; // Smoothing depth input int MA_Phase=100; // Smoothing parameter // for JJMA varying within the range -100 ... +100, // for VIDIA it is a CMO period, for AMA it is a slow average period //+----------------------------------------------+
Böyle bir durumda, bu tür giriş değişkenleri ve alım satım sinyalleri modülündeki (Candles_SmoothedSignal.mqh) ilgili tüm öğeler, int veya uint türlerinin değişkenlerine dönüştürülmelidir. Ayrıca, bu giriş değişkenlerinin bitirilen Uzman Danışmanın (EA) halihazırda oluşturulmuş kodunda kullanım kolaylığı için, Uzman Danışman (EA) giriş parametrelerine kadar özel numaralandırmaların ters prosedürü ve gerekli giriş değişkeni türlerinin (ExpM_Candles_Smoothed Expert Advisor) değiştirilmesi gerçekleştirilmelidir:
//+------------------------------------------------------------------+ //| Declaration of enumerations | //+------------------------------------------------------------------+ enum Smooth_Method { MODE_SMA_, // SMA MODE_EMA_, // EMA MODE_SMMA_, // SMMA MODE_LWMA_, // LWMA MODE_JJMA, // JJMA MODE_JurX, // JurX MODE_ParMA, // ParMA MODE_T3, // T3 MODE_VIDYA, // VIDYA MODE_AMA, // AMA }; //+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ //--- inputs for expert input string Expert_Title ="Candles_Smoothed"; // Document name ulong Expert_MagicNumber =29976; // bool Expert_EveryTick =false; // //--- inputs for main signal input int Signal_ThresholdOpen =40; // Signal threshold value to open [0...100] input int Signal_ThresholdClose=20; // Signal threshold value to close [0...100] input double Signal_PriceLevel =0.0; // Price level to execute a deal input double Signal_StopLevel =50.0; // Stop Loss level (in points) input double Signal_TakeLevel =50.0; // Take Profit level (in points) input int Signal_Expiration =1; // Expiration of pending orders (in bars) input bool Signal__BuyPosOpen =true; // Candles_Smoothed() Permission to buy input bool Signal__SellPosOpen =true; // Candles_Smoothed() Permission to sell input bool Signal__BuyPosClose =true; // Candles_Smoothed() Permission to exit a long position input bool Signal__SellPosClose =true; // Candles_Smoothed() Permission to exit a short position input ENUM_TIMEFRAMES Signal__Ind_Timeframe=PERIOD_H1; // Candles_Smoothed() Timeframe input Smooth_Method Signal__MA_SMethod =4; // Candles_Smoothed() Smoothing method (1 - 10) input uint Signal__MA_Length =30; // Candles_Smoothed() Smoothing depth input uint Signal__MA_Phase =100; // Candles_Smoothed() Smoothing parameter input uint Signal__SignalBar =1; // Candles_Smoothed() Bar index for the entry signal input double Signal__Weight =1.0; // Candles_Smoothed() Weight [0...1.0] //--- inputs for money input double Money_FixLot_Percent =10.0; // Percent input double Money_FixLot_Lots =0.1; // Fixed volume
Bizim durumumuzda bu, Signal__MA_SMethod giriş değişkeni ile yapıldı.
Her iki kod sürümünü de (ASCtrendSignal.mqh ve BykovTrendSignal.mqh) düzenleyicide aynı anda açarsanız (birini sol tarafa, diğerini sağ tarafa yerleştirerek) ve her iki kod sürümünü dikkatli bir şekilde karşılaştırırsanız, kod değişikliğini önemli ölçüde hızlandırabilirsiniz.
Sonuç
Acemi Uzman Danışman oluşturucularının böyle bir kod yazmanın tüm özelliklerini kolayca anlayabilmeleri veya en azından oldukça popüler göstergeleri kullanarak hazır Uzman Danışmanlar (EA) ile çalışabilmeleri için bu makalenin ekindeki Experts.zip arşivine semafor ticaret sistemine dayalı olarak yeterli miktarda Uzman Danışman (EA) yerleştirdim.
Ekli tüm Uzman Danışmanlar (EA), alım satım stratejileri oluşturucusunu kendi alım satım sistemleri için bir temel olarak kullanmak isteyenler için ayrıca alım satım modülleri olarak sunulmaktadır. Bu modüller MySignals.zip'te bulunurken, bunlara dayalı alım satım sistemleri Expertsez.zip'te bulunabilir. Uzman Danışmanlarda (EA) kullanılan göstergeler, Indicators.zip içine yerleştirilir. Dosyaları çıkarma yolları aşağıdaki gibidir:
- Experts.zip: "\MQL5\Experts\";
- Expertsez.zip: "\MQL5\Experts\";
- MySignals.zip: "\MQL5\Include\Expert\Signal\MySignals\";
- Indicators.zip: "\MQL5\Indicators\";
- SmoothAlgorithms.mqh: "\Include\";
- TradeAlgorithms.mqh: "\Include\".
MetaEditor'ı yeniden başlatın, Gezgin penceresini açın, MQL5 etiketine sağ tıklayın ve açılır menüden "Derle" seçeneğini seçin.
SmoothAlgorithms.mqh dosyası, Indicators.zip'ten bazı göstergelerin derlenmesi için gerekliyken, TradeAlgorithms.mqh dosyası Experts.zip'ten tüm Uzman Danışmanların (EA) derlenmesi için gereklidir.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/358





- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz