Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın

MQL5 Sihirbazı - Zaman Filtresiyle İki EMA Göstergesinin Çaprazlamasına Dayalı Ticaret Sinyalleri - MetaTrader 5 için Uzman Danışman
- Görüntülemeler:
- 299
- Derecelendirme:
- Yayınlandı:
- 2022.03.09 15:26
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
MQL5 Sihirbazı, Uzman Danışmanların kodunun otomatik olarak oluşturulmasına olanak sağlar. Ayrıntılar için MQL5 Sihirbazında Hazır Uzman Danışmanlar Oluşturma makalesine bakın.
İki hareketli ortalamaya dayalı stratejinin ticaret sinyalleri MQL5 Sihirbazı - İki EMA Göstergesinin Çaprazlamasına Dayalı Ticaret Sinyalleri bölümünde anlatılmıştır. Hareketli ortalamalara dayalı stratejiler, trend varlığında etkilidir, aksi takdirde birçok yanlış sinyal verirler. Ticaret performansını artırmanın yollarından biri, ticaret işlemlerini zamana göre filtrelemek, piyasaya girişi belirli bir zaman aralığıyla sınırlamaktır (örneğin, yalnızca Avrupa seansı sırasında pozisyon açma gibi).
Bu bölümde zaman filtresiyle iki EMA göstergesinin (FastEMA ve SlowEMA) çaprazlamasını temel alan strateji ele alınacak. Strateji "Signals based on crossover of two EMA with intraday time filter" olarak adlandırılır (MQL5 Sihirbazında bu stratejiye dayalı olan Uzman Danışman otomatik olarak oluşturulurken).
Ticaret sinyalleri:
- Alış: FastEMA, SlowEMA'yı yukarı doğru çaprazladığında ve zaman filtresi koşulları karşılanmadığında.
- Satış: FastEMA, SlowEMA'yı aşağı doğru çaprazladığında ve zaman filtresi koşulları karşılanmadığında.
Bu strateji CSignal2EMA_ITF sınıfında yer alır.
Csignal2EMA_ITF sınıfının bir diğer ayırt edici özelliği, fiyat seviyeleri hareketli ortalamanın mevcut değerine göre hesaplanan ve ATR (Average True Range) birimlerinde belirlenen bekleyen emirlerle çalışmasıdır.
Şekil 1. Zamana filtresiyle iki EMA göstergesinin çaprazlamasına dayalı ticaret sinyalleri
Ticaret Sinyalleri
Ticaret stratejisi CSignal2EMA_ITF sınıfında yer alır; fiyat ve gösterge değerlerine erişimi basitleştirmek için birkaç korumalı metoda sahiptir:
double FastEMA(int ind) // çubuğun FastEMA değerini geri döndürür double SlowEMA(int ind) // çubuğun SlowEMA değerini geri döndürür double StateFastEMA(int ind) // FastEMA artıyorsa/azalıyorsa pozitif/negatif değer geri döndürür double StateSlowEMA(int ind) // SlowEMA artıyorsa/azalıyorsa pozitif/negatif değer geri döndürür double StateEMA(int ind) // FastEMA ve SlowEMA arasındaki farkı geri döndürür double ATR(int ind) // çubuğun ATR değerini geri döndürür
- Limit>0. Hareketli ortalamanın yanlış kırılması durumunda düzeltme ile piyasaya giriş yapılır (Buy Limit veya Sell Limit emirleri ticaret sinyaline bağlı olarak verilir).
- Limit<0. Fiyat hareketinin devam etmesi ile piyasaya giriş yapılır (Buy Stop veya Sell Stop emirleri ticaret sinyaline bağlı olarak verilir).
- Limit=0. Bu durumda piyasa fiyatları kullanılarak piyasaya giriş yapılır.
1. Alış pozisyonu açma
İlk olarak, alış pozisyonu açma koşulları kontrol edilir: son tamamlanmış çubukta FastEMA ve SlowEMA arasındaki fark işareti "-"den "+"ya (StateEMA(1)>0 && StateEMA(2)<0) değişmiş mi?
Ardından, CsignalITF sınıfının CheckOpenLong() metodu çağrılarak zaman filtresi kontrol edilir. Girdi parametrelerinde belirtilen zaman aralığına göre ticarete izin verilirse, son tamamlanmış çubuğun baz fiyat seviyesi (hareketli ortalamanın değeri) ve ATR aralığı hesaplanır.
Limit girdi parametresinin işaretine bağlı olarak bekleyen alış emri verilir. Emir fiyatı, Kârı Al ve Zararı Durdur seviyeleri, baz fiyat seviyesine (ATR birimlerinde) göre belirlenir. Verilen emrin ömrü, Expiration girdi parametresiyle belirlenir ve mevcut zaman diliminde çubuk sayısı şeklinde ayarlanır.
//+------------------------------------------------------------------+ //| Alış pozisyonu açma koşullarını kontrol et | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. Alış pozisyonunu kapatma
Bu örnekte, alış pozisyonunu kapatmak için koşulları kontrol eden fonksiyon her zaman false geri döndürür, yani alış pozisyonunun Kârı Al veya Zarar Durdur ile kapatılacağı varsayılır. Gerekirse, pozisyonu kapatmakta kullanılacak başka kurallar ekleyebilirsiniz.
//+------------------------------------------------------------------+ //| Alış pozisyonunu kapatma koşullarını kontrol et | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. Satış pozisyonu açma
İlk olarak, satış pozisyonu açma koşulları kontrol edilir: son tamamlanmış çubukta FastEMA ve SlowEMA arasındaki fark işareti "+"dan "-"ye (StateEMA(1)<0 && StateEMA(2)>0) değişmiş mi?
Ardından, CsignalITF sınıfının CheckOpenLong() metodu çağrılarak zaman filtresi kontrol edilir. Girdi parametrelerinde belirtilen zaman aralığına göre ticarete izin verilirse, son tamamlanmış çubuğun baz fiyat seviyesi (hareketli ortalamanın değeri) ve ATR aralığı hesaplanır.
Limit girdi parametresinin işaretine bağlı olarak bekleyen satış emri verilir. Emir fiyatı, Kârı Al ve Zararı Durdur seviyeleri, baz fiyat seviyesine (ATR birimlerinde) göre belirlenir. Verilen emrin ömrü, Expiration girdi parametresiyle belirlenir ve mevcut zaman diliminde çubuk sayısı şeklinde ayarlanır.
//+------------------------------------------------------------------+ //| Satış pozisyonu açma koşullarını kontrol et | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. Satış pozisyonunu kapatma
Bu örnekte, satış pozisyonunu kapatmak için koşulları kontrol eden fonksiyon her zaman false geri döndürür, yani satış pozisyonunun Kârı Al veya Zarar Durdur ile kapatılacağı varsayılır. Gerekirse, pozisyonu kapatmakta kullanılacak başka kurallar ekleyebilirsiniz.
//+------------------------------------------------------------------+ //| Satış pozisyonunu kapatma koşullarını kontrol et | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Bekleyen Alış Emrinin Takip Hareketi
Hareketli ortalamanın ve ATR'ın mevcut değerlerine bağlı olarak emir fiyatı ayarlanır.
//+--------------------------------------------------------------------+ //| Bekleyen alış emrini değiştirme koşullarını kontrol et | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. Bekleyen Satış Emrinin Takip Hareketi
Hareketli ortalamanın ve ATR'ın mevcut değerlerine bağlı olarak emir fiyatı ayarlanır.
Bekleyen emir ancak piyasa fiyatının emir fiyatına ulaşması durumunda gerçekleşir.
//+--------------------------------------------------------------------+ //| Bekleyen satış emrini değiştirme koşullarını kontrol et | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
MQL5 Sihirbazını kullanarak Uzman Danışman oluşturma
MQL5 Sihirbazını kullanarak bu stratejiye dayalı bir ticaret robotu oluşturmak için ikinci adımda "Signals based on crossover of two EMA with intraday time filter" sinyal türünü seçin:
Şekil 2. MQL5 Sihirbazından "Signals based on crossover of two EMA with intraday time filter" sinyal türünü seçin
Ardından, gerekli takip eden durdurucu algoritmasını ve para ve risk yönetimi sistemini belirlemelisiniz. Uzman Danışman kodu otomatik olarak oluşturulacaktır, oluşturulan kodu derleyebilir ve MetaTrader 5 müşteri terminalinin Strateji Sınayıcısında test edebilirsiniz.
Test Sonuçları
Uzman Danışmanın geçmiş verileri üzerinde geriye dönük testini ele alalım (EURUSD H1, test aralığı: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
Uzman Danışman oluşturulurken 0.1 lotluk sabit işlem hacmi kullanıldı (Trading Fixed Lot), Takip Eden Durdurucu algoritması kullanılmadı (Trailing not used).
Şekil 3. ITF filtresi kullanılmadan iki EMA göstergesinin çaprazlamasına dayalı Uzman Danışmanın geçmişe dönük test sonuçları
Yukarıdaki örnekte zaman filtresi kullanılmamıştır, bu nedenle birçok yanlış sinyal oluşmuştur. İşlem saatlerine bağlı olarak işlem sonuçlarının analizi yapılırsa ticaret sinyalleri iyileştirilebilir.
Yukarıdaki örnekte, iki EMA'nın çaprazlaması 6:00'dan 23:59'a kadar birçok yanlış sinyal sağladığı görülmektedir. Bu bilgiyle filtre parametrelerini ayarlayarak zaman filtresi belirlenebilir.
Bu örnek için, sadece 0:00 ile 5:59 arasında pozisyon açmaya izin veren bir zaman filtresi ayarlanabilir, bu, BadHoursOfDay=16777152=11111111111111111000000b değeri ayarlanarak yapılır. Böylece, ilk 6 saatten sonraki tüm saatler, piyasaya giriş için istenmeyen zaman aralıkları olarak kabul edilir.
Örnek için zaman filtresi ayarlandıktan sonra birçok yanlış ticaret sinyali filtrelenmiş oldu:
Şekil 4. Zaman Filtresiyle iki EMA göstergesinin çaprazlamasına dayalı Uzman Danışmanın geçmişe dönük test sonuçları
CsignalITF sınıfı ayrıca daha karmaşık zaman filtrelerinin (dakikalar, saatler veya haftanın belirli günleri için) ayarlanmasına da olanak tanır.
Ekler: CSignal2EMA_ITF sınıfına sahip Signal2EMA-ITF.mqh dosyası, terminal_veri_klasörü\MQL5\Include\Expert\Signal klasörüne yerleştirilmelidir.
expert_2ema_itf.mq5 dosyası, MQL5 Sihirbazı kullanılarak oluşturulan Uzman Danışman kodunu içerir.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal kod: https://www.mql5.com/ru/code/264

Bu bölümde MACD göstergesinin ana ve sinyal çizgilerinin çaprazlamasına dayalı ticaret sinyalleri (MQL5 Standart Kütüphanesinden CSignalMACD) açıklanmaktadır. Bu stratejiye dayalı olan Uzman Danışman kodu, MQL5 Sihirbazı kullanılarak otomatik olarak oluşturulabilir.

Bu bölümde iki EMA göstergesinin çaprazlamasına dayalı ticaret sinyalleri açıklanmaktadır. Bu stratejiye dayalı olan Uzman Danışman kodu, MQL5 Sihirbazı kullanılarak otomatik olarak oluşturulabilir.

Bu bölümde Alligator teknik göstergesinin çizgilerinin çaprazlamasına dayalı ticaret sinyalleri açıklanmaktadır. Bu stratejiye dayalı olan Uzman Danışman kodu, MQL5 Sihirbazı kullanılarak otomatik olarak oluşturulabilir.

Bu bölümde terse dönüş mum modellerine dayalı ticaret sinyalleri açıklanmaktadır. Bu stratejiye dayalı olan Uzman Danışman kodu, MQL5 Sihirbazı kullanılarak otomatik olarak oluşturulabilir.