Algoritmik Ticaret Sisteminizi Neden ve Nasıl Tasarlayacağınızı Öğrenin
Giriş
Şüphesiz, hayatımızın her alanında programlama veya kodlamanın öneminin her geçen gün arttığını söyleyebiliriz. Programlama veya kodlama sadece hayatımızı kolaylaştırmakla kalmaz, aynı zamanda istediğimiz ve önceden belirlediğimiz stratejiye net bir şekilde bağlı kalmamızı sağlayarak daha doğru sonuçlar elde etmememize yardımcı olur.
Ticarete gelince de, programlama veya kodlama basitlik ve tutarlılık getirir, belirli eylemleri otomatikleştirir ve bizim için birçok işi yapar. Dolayısıyla kesin olan şey şu ki kodlama dünyası bize çok sayıda fayda sağlar, ancak bence bunların en önemlilerinden biri disiplindir, çünkü hepimiz ticaret kararları alırken ve uygularken disiplinli olmanın ne kadar zor olduğunu biliyoruz. Çoğu zaman disiplin, ticaret ve yatırımın sonuçlarını doğrudan etkiler. Her zaman söylemekten hoşlandığım gibi, ticarette ve genel olarak hayatta başarının anahtarı Disiplindir. Basitçe tanımlarsak disiplin, şartlar ne olursa olsun, yapılması gerekeni doğru zamanda yapmak demektir. Öz disiplin çok zor bir şeydir, çünkü kendi eylemlerinizi bilinçli olarak kontrol etmeniz gerekir. Burada bize yardımcı olacak doğru araç işte kodlamadır.
Hepimizin bildiği gibi, duygularımız ticaret yaparken disiplinli olmamızı engeller, bu nedenle bir şekilde bu duyguları ortadan kaldırmamız veya bu duyguların ticaret kararlarımızı olumsuz yönde etkilemesini önlememiz gerekir. Önceden ayarlanmış belirli parametrelere göre bir sistemin katılımınız olmadan bağımsız olarak sizin adınıza ticaret işlemleri gerçekleştirdiğini hayal edin. Bu durumda, duygularınızın ticaret kararlarınız üzerindeki olumsuz etkisinden kaçınmış olacaksınız. İyi haber şu ki, böyle bir sistemi elde etmenizi sağlayacak bir aracımız var. Bu makalede bu araç hakkında konuşacağız: MetaTrader ticaret platformu için MQL (MetaQuotes Language) programlama dili. Bu dili kullanarak, belirli eylemleri veya ticaret kararlarını garanti altına almak için önceden belirleyeceğiniz parametrelere göre çalışacak bir ticaret sistemi programlayabilirsiniz.
Bu kavramı daha iyi anlamanıza yardımcı olmak için bir örnekten bahsedelim. A ve B olmak üzere iki yatırımcı olduğunu ve tamamen aynı stratejiyle ticaret işlemi gerçekleştirdiklerini varsayalım: yükseliş trendinde alış yapmak ve tutmak ve trend tersine döndüğünde de satış yapmak. Ancak farklı şekilde davranıyorlar: yatırımcı A, yatırımcı B'nin aksine disiplinli bir şekilde ticaret yapıyor. Aşağıdaki görüntülere bakın:
Yukarıdaki görüntülerden anlaşıldığı gibi, iyi sonuçlar elde etmek için disiplin gereklidir. Tersi durumda, disiplin olmazsa sonuçlar iyi olmayacaktır.
Bu makalede MQL5 programlama dilinin temellerini gözden geçireceğiz ve Simple Moving Average göstergesinin çizgilerinin çaprazlamasına dayalı kendi otomatik ticaret sistemimizi yazmaya çalışacağız. Böylece, bu muhteşem aracı, MQL5 programlama dilini kullanarak neler yapabileceğiniz hakkında genel bir fikre sahip olacaksınız.
Bu makalenin ana amacı, yeni başlayanların MQL5'te kendi algoritmik ticaret sistemlerini nasıl tasarlayacaklarını öğrenmelerine yardımcı olmaktır. Bunun için, MQL5'in bazı temellerini ele alarak adım adım basit bir ticaret sistemi kodlayacağız. Komut dosyalarıyla kodlama yapacağız ve oluşturduğumuz kodları çalıştırıp sonuçlarına bakarak ilerleyeceğiz. Burada tartışılacak olan her şeyi daha iyi anlamanız için, makalede sunulan her bir kod parçasını kendi başınıza tekrar etmenizi, uygulamanızı ve kodlamanızı tavsiye ederim. Lütfen makalede sunulan tüm kodların, programların ve ticaret stratejilerinin yalnızca eğitim amaçlı olduğunu, başka amaçlara yönelik olmadığını unutmayın. Tüm kodlar MQL5'te yazılacaktır.
Algoritmik ticaret sistemimizi tasarlamak için neye ihtiyacımız var?
Bu bölümde, sistemi geliştirmek için hangi araçlara ihtiyacımız olduğundan bahsedeceğim:
- MetaTrader 5 platformu, diğer adıyla MetaTrader 5 terminali. Emirleri gerçekleştirmek ve kodlarımızı terminal aracılığıyla test etmek için. MetaTrader büyük olanaklara sahip en popüler ticaret platformudur.
Bir demo hesap. Ticaret stratejilerinizi gerçek para riskine girmeden gerçek piyasa koşullarında test etmek için brokerınızla sanal paraya sahip bir demo hesap açabilirsiniz. Kodlama için gerçek hesabınızı değil bu demo hesabı kullandığınızdan emin olun çünkü hesapta ticaret işlemleri gerçekleştirecek programlar oluşturup çalıştırmanız gerekecek.
Kodlarımızı veya programlarımızı yazacağımız MetaQuotes Language Düzenleyicisi. Düzenleyici MetaTrader 5 terminali ile birlikte kurulur. Aşağıdaki ekran görüntülerinden düzenleyicinin nasıl açılacağını görebilirsiniz. Düzenleyiciyi açmanın üç yolu vardır.
- Araçlar menüsünden 'MetaQuotes Language Düzenleyicisi'ni seçin:
Veya araç çubuğundaki MetaQuotes Language Düzenleyicisi simgesine tıklayın:
Ya da terminal açıkken klavyenizden F4 tuşuna basın.
Aşağıdaki ekran görüntüsü düzenleyicinin nasıl göründüğünü göstermektedir, programlarımızı yazmak ve ticaret sistemlerimizi tasarlamak için yaptığımız çalışmaların çoğu burada olacak.
Şimdi ilk programımızı düzenleyicide oluşturmaya başlayalım, bunun nasıl yapılacağını öğrenmek için aşağıdaki adımları izleyin.
'Yeni'ye tıklayın, düzenleyicide oluşturabileceğiniz program türleri görüntülenecektir:
Bu makalede ele alacağımız olanlar şunlardır: Uzman Danışman, Özel Gösterge ve Komut Dosyası. Tüm bunların ne anlama geldiğine bir göz atalım.
- Uzman Danışman: terminalde çalışan ve belirttiğiniz parametrelere göre fiyatların analizini ve ticaret süreçlerini otomatikleştirmenizi sağlayan programlardır.
- Özel Gösterge: hesaplanmış sayısal bağımlılıkların grafiksel olarak görüntülenmesine olanak sağlayan programlardır.
- Komut Dosyası: analizde veya ticaret süreçlerinde tek bir eylem gerçekleştirmek için tasarlanmış programlardır, bu programlar tiklere dayanarak değil istek üzerine yürütülür.
Hello World! programı
Bu bölümde ilk programımızı ve ilk kodumuzu MQL5'te nasıl yazacağımızı öğreneceğiz. Programlamaya veya kodlamaya yeni başlayan herkes, yolculuğuna “Hello World!” kodunu kodlayarak başlar. Bu yüzden, “Hello World!” yazısını terminal ekranına yazdıran bir program kodlayarak başlayacağız. Hadi başlayalım.
Yukarıda gösterildiği gibi MetaEditor'ı açın, ardından 'Yeni'ye tıklayın, sonrasında seçeneklerden 'Komut Dosyası'nı seçin ve 'İleri'ye tıklayın.
'İleri'ye tıkladıktan parametreleri belirtmeniz gereken aşağıdaki pencere açılacaktır:
- Ad — komut dosyasının adı
- Yazar — komut dosyasının yazarı
- Link — sitenize olan link
- Parametreler — komut dosyası için belirtilmesi gereken parametreler. Komut dosyamızın herhangi bir parametreye ihtiyacı yok, bu nedenle bu adımı atlayacağız.
'Bitir'e tıkladıktan sonra programı kodlayacağımız aşağıdaki pencere açılacaktır. Terminalde “Hello World!” yazısını gösterecek bir program yazıyor olduğumuzu tekrar hatırlatayım. Süslü parantezler içinde kodumuzu yazmaya başlayalım.
Burada kullanacaklarımız:
- Alert: belirtilen mesajı ekranda gösterir, örneğimizde ekranda “Hello World!” yazısını gösterecek.
- (“ ”): tırnak işaretleri arasına gösterilmesini istediğimiz metni yazacağız - örneğimiz için "Hello World!".
- ; - ayırıcı olarak kullanılır.
Kodumuz şu şekilde olacak:
//+----------------------------------------------------------+ //| Hello World!.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+----------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+----------------------------------------------------------+ //| Script program start function | //+----------------------------------------------------------+ void OnStart() { Alert("Hello World!"); } //+----------------------------------------------------------+
Kodun yazdıktan sonra derlenmesi gerekir. Bunu yapmak için 'Derle'ye tıklayın. Bu aşamada programda herhangi bir hata veya uyarı olmadığından emin olun. Hatalar sekmesinde hiçbir mesaj olmamalıdır - yalnızca böylece programın tam olarak ihtiyacımız olduğu gibi çalışmasını bekleyebiliriz. Ardından ortaya çıkan programı test etmek için F4'e basarak terminale gidin.
Ticaret stratejisi fikri (İki Simple Moving Average göstergesinin çaprazlaması)
Bu bölümde, bir ticaret stratejisinin nasıl yazılacağını öğreneceğiz. Burada ilgili ticaret stratejisi yalnızca MQL5 programlama dilinin temellerini ve düzenleyiciyle çalışmayı öğrenmenize yardımcı olmak için eğitim amaçlı sunulmuştur.
Sorumluluk reddi
Sağlanan tüm bilgiler 'olduğu gibi' yalnızca bilgilendirme amaçlıdır, ticaret tavsiyesi değildir. Geçmişteki performans gelecekteki sonuçların garantisi değildir. Bu materyalleri herhangi bir işlem hesabında kullanırsanız, ortaya çıkabilecek tüm riskler size ait olacaktır.
Buradaki strateji fikri, iki Simple Moving Average göstergesinden sinyal onayı alarak trendle ticaret işlemi gerçekleştirmektir:
- Simple Moving Average, belirli bir periyodun ortalama kapanış fiyatını hesaplayan gecikmeli bir teknik göstergedir.
- Ticaret strateji şu şekildedir:
- Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) aşağıdan yukarıya doğru çaprazlıyorsa, bu alış sinyalidir.
- Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) yukarıdan aşağıya doğru çaprazlıyorsa, bu satış sinyalidir.
Bu stratejiyi uygulayan bir program yazacağız.
Algoritmik ticaret sistemi planı
Makalenin bu bölümünde, ticaret sistemlerinin geliştirilmesindeki çok önemli bir aşamayı ele alacağız. Bu aşama, sistemin strateji ve ticaret fikri için gerçekleştirmesi gereken adımlar dizisi şeklinde bir plan oluşturmaktır. Bu, gerekli geliştirme adımlarının net bir şekilde anlaşılmasına olanak sağlar. İki Simple Moving Average göstergesinin çaprazlamasına dayanan sistemimiz için olan aşağıdaki plan, neleri kodlamamız gerektiğini ve neleri elde etmek istediğimizi açıkça göstermektedir.
İlk olarak, MQL5'in bazı temellerini ele alalım, sonrasında tasarlamak için ihtiyacımız olanları kullanalım.
Değişkenler ve türleri ve değişkenleri kullanma
Bu bölümde, şunları inceleyeceğiz:
- Değişkenler nedir?
- Değişken türleri
- Değişkenleri kullanma
Genel olarak, programlardaki veriler iki tür olabilir: sabitler ve değişkenler. Değişken değerler kullanıcı veya program tarafından değiştirilebilir. Değişkenler bellektedir. Değişkenin adı, bellekteki konumuyla ilişkilenir. Veriler bu adreste saklanır. Bir MQL5 programı düzinelerce, yüzlerce değişken içerebilir. Değişkenlerin çok önemli bir özelliği, değerlerini programda kullanma yeteneğidir. Bu özelliğin sınırlaması, değişkenin kapsamı ile ilgilidir; bu, değişkenin kullanılabilir olduğu program kısmı anlamına gelir. Her değişkenin kendi kapsamı vardır.
Kapsama göre MQL5'te yerel ve global olmak üzere iki tür değişken vardır. Yerel değişken, fonksiyon içinde bildirilen değişkendir. Yerel değişkenin kapsamı, değişkenin bildirildiği fonksiyonun gövdesidir. Bir yerel değişken, türüne karşılık gelen bir sabitle veya ifadeyle başlatılabilir. Global değişkenler tüm fonksiyonların ötesinde bildirilir. Global değişkenlerin kapsamı programın tamamıdır. Bir global değişken, yalnızca türüne karşılık gelen bir sabitle başlatılabilir (ifadeyle değil). Global değişkenler, özel fonksiyonların yürütülmesini belirtmeden önce yalnızca bir kez başlatılır.
Kapsamından bağımsız olarak, değişkenler aşağıdaki türlerde olabilir:
- int — sayısal bir türdür; farklı uzunluklardaki sayısal değerleri saklamak için farklı tamsayı türleri vardır.
- Ticarette sayısal değerlerle çalışan bir program yazmak için kesirli sayılarla çalışabilen bir veri türüne ihtiyaç vardır. MetaTrader bu tür verilerle çalışmak için iki veri türü sunar: float ve double. Aralarındaki fark, bellekte ayrılan baytlardır: float için 4 ve double için 8. Bu veri türleri için aşağıdaki minimum ve maksimum değerler mümkündür:
- float - minimum 1.175494351e-38, maksimum 3.402823466e+38
- double - minimum 2.2250738585072014e-308, maksimum 1.7976931348623158e+308
Bu tür verileri bildirmek için float ve double anahtar kelimelerini kullanın. - string — MQL5 dahil olmak üzere programlamada sıklıkla kullanılan bir diğer önemli veri türüdür. Alfasayısal karakter dizilerinin saklanmasına ve işlenmesine olanak sağlar.
- bool (Boolean) — true veya false olabilen mantıksal bir türüdür.
Değişkenlerin kullanımına bir örnek verelim:
//+------------------------------------------------------------------+ //| Variables.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int myInteger = 5; double myDouble = 10.56; string myString = "My name is Mohamed"; bool myBoolean = true; Alert(myInteger); Alert(myDouble); Alert(myString); Alert(myBoolean); } //+------------------------------------------------------------------+
Bu kodu derler ve terminalde çalıştırırsanız, pencere aşağıdaki mesajı gösterecektir:
Değişkenlerin kullanımına başka bir örnek daha verelim.
- message1 değişkeninin değeri
- C değişkeninin değeri
- result değişkeninin değeri
- message2 değişkeninin değeri
//+------------------------------------------------------------------+ //| Variables 2.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int A = 10; int B = 5; int C; double var1 = 2.5; double var2 = 4; double result = var1 / var2; string greeting = "Hello"; string space = " "; string name = "Mohamed"; string message1; string message2; C = A + B; message1 = greeting + space + name; message2 = "Value of A is: " + string(A); Alert(message1); Alert(C); Alert(result); Alert(message2); } //+------------------------------------------------------------------+
Boolean işlemleri
Bu veri türü, mantıksal işlem için true veya false değerini geri döndürür.
- == eşit
- != eşit değil
- < daha küçük
- <= daha küçük veya eşit
- > daha büyük
- >= daha büyük veya eşit
//+------------------------------------------------------------------+ //| Boolean Operations.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { bool result = 4 < 5; Alert (result); //true } //+------------------------------------------------------------------+
Burada 4 < 5 doğru olduğundan uyarı mesajında true geri dönmelidir.
while döngüsü
while operatörü, kontrol edilecek ifadeden ve yürütülecek operatörden oluşur. İfade doğruysa, yanlış olana kadar operatör yürütülür. Aşağıdaki örnekte, program döngünün ne zaman başladığını bildirir, sayacın değerini kontrol eder ve değeri üçten küçükse onu görüntüler. Daha sonra ifade yanlış, yani sayacın değeri >= 3 olana kadar önceki sonuca bir eklenir ve döngü bittiğinde son mesajı gösterir. Program çalıştırıldığında ekranda şu mesajlar görünmelidir: Start of script, 1, 2, Loop has finished.//+------------------------------------------------------------------+ //| While Loop.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //While (Loop) Alert("Start of script"); int counter = 1; while(counter < 3) //true? { Alert(counter); counter = counter + 1; } Alert("Loop has finished"); }
for döngüsü
for operatörü, üç ifadeden ve yürütülebilir operatörden oluşur:
for(ifade1; ifade2; ifade3)
operatör;
ifade1, döngü başlangıcını tanımlar. ifade2, döngü sonlanmasının koşullarını kontrol eder. Doğruysa, for döngü gövdesi yürütülür. İfade2 yanlış olana kadar döngü tekrarlanır. Yanlış olduğunda döngü sonlanır ve kontrol bir sonraki operatöre geçer. ifade3, her yinelemeden sonra hesaplanır.
Aşağıdaki for döngüsü örneğinde, kodun yürütülmesi beş Hello mesajı (i = 0, i = 2, …………, i = 4) göstermelidir, ardından i= 5 olur ve döngü sonlanır.
//+------------------------------------------------------------------+ //| For Loop.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { for(int i=0; i<5 ; i++) { Alert("Hello"); } } //+------------------------------------------------------------------+
if - else operatörü
if - else operatörü, bir seçim yapılması gerektiğinde kullanılır. Sözdizimi şu şekildedir:
if (ifade)
operatör1
else
operatör2
İfade doğruysa, operatör1 yürütülür ve kontrol, operatör2'nin ardındaki operatöre geçer (operatör2 yürütülmez). İfade yanlışsa, operatör2 yürütülür.
Aşağıdaki örnekte, önce Bid fiyatını içeren bir mesaj gösterilir, ardından Bid > 1.146600 ifadesinin doğru olup olmadığı kontrol edilir, ifade doğruysa “The price is above 1.146600 -> BUY” mesajı gösterilir. İfade yanlışsa, “The price is below 1.146600 -> SELL” mesajı gösterilir. Aşağıda kod ve yürütme sonucu verilmiştir.
//+------------------------------------------------------------------+ //| If-else statement.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { double level = 1.146600; double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); Alert("Bid Price = " + string(Bid)); if(Bid > level) { Alert ("The price is above " + string(level) + " -> BUY"); } // What if the condition is false and we need to take an action also here we can use else function instead of writing another if code else { Alert ("The price is below " + string(level) + " -> SELL"); } } //+------------------------------------------------------------------+
Ticaret parametreleri
Bu bölümde, programa parametrelerimizi ve girdilerimizi (girdi parametreleri) nasıl tanımlayacağımızı öğreneceğiz.
Özellikler (#property): Her MQL5 programı, müşteri terminalinin programları doğru şekilde yürütmesine yardımcı olan #property yönergesiyle ek özel parametreler belirlenmesine olanak tanır.
script_show_inputs: Komut dosyasını çalıştırmadan önce özellikler penceresini görüntüler ve bu onay penceresini devre dışı bırakır.
Girdi parametreleri: input sınıfı, harici değişkenleri tanımlar. input değiştiricisi, veri türünden önce belirtilir.
//+------------------------------------------------------------------+ //| Trader Inputs.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 10; input int StopLoss = 10; void OnStart() { double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10) double StopLossLevel = Bid - StopLoss * 0.00001; Alert("Price now = " + string(Bid)); Alert ("TakeProfitLevel = ", TakeProfitLevel); Alert ("StopLossLevel = ", StopLossLevel); } //+------------------------------------------------------------------+
Emir açma
Bu bölümde, emir açmak için kodunuzu nasıl yazacağınızı göstereceğim:
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); } } //+------------------------------------------------------------------+
Hata işleme tekniği
Program çalışırken bir şeyler ters gidebilir, hatalar meydana gelebilir. Bu nedenle, emirlerin oluşturulmasını veya ilgili kodun yürütülmesini kontrol edecek ve bir şeyler ters gittiğinde bildirecek bu tekniği kodumuza eklememiz gerekir. Başka bir deyişle, bu, yatırımcının kendisinin ve fonunun öngörülemeyen durumlardan korunmasını sağlayan bir koruma tekniğidir.
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); if (ticket <= 0) { Alert("Error!"); //in Case of error and the order did not open, appears "Error!" } else { Alert("Your ticket # is: " + string(ticket)); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); } } } //+------------------------------------------------------------------+
Emri kapatma
Bu bölümde, emrin nasıl kapatılacağını öğrenmek için emir açıp kapatan kod oluşturacağız.//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); Sleep(2000); trade.PositionClose(ticket,-1); Alert("Order Closed..."); } } //+------------------------------------------------------------------+
OrderModify ile emirleri düzenleme
Bu bölümde, emirleri düzenlemeye olanak sağlayan kodu nasıl yazacağımızı öğreneceğiz. Daha önce açılmış veya bekleyen emirlerin özelliklerini değiştirir.
//+------------------------------------------------------------------+ //| TEST.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs #include <Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ input int TakeProfit = 150; input int StopLoss = 100; void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); double TakeProfitLevel2 = (TakeProfitLevel+0.00100); double StopLossLevel2 = (StopLossLevel-0.00050); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (" Order Ticket # ", ticket); Alert("TakeProfit = ", TakeProfitLevel); Alert("StopLoss = ", StopLossLevel); Sleep(5000); trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2); Alert("Order Modified..."); Alert("Modified TakeProfit = ", TakeProfitLevel2); Alert("Modified StopLoss = ", StopLossLevel2); } } //+------------------------------------------------------------------+
İki Simple Moving Average göstergesinin çaprazlamasına dayanan sistem
Her şeyi bir araya getirelim ve iki Simple Moving Average göstergesinin çaprazlamasından oluşan sinyallere dayalı ticaret işlemi gerçekleştiren bir sistem oluşturalım. Program yukarıda bahsettiğimiz plana göre çalışacak.
Sistemi yazmak için MetaEditor'da Uzman Danışman türü ile yeni bir proje oluşturalım.
Ayrıntılı çalışma planımızı tekrar hatırlayalım:
- Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) aşağıdan yukarıya doğru çaprazlıyorsa, bu alış sinyalidir.
- Daha kısa Simple Moving Average (periyodu 20), daha uzun Simple Moving Average'ı (periyodu 50) yukarıdan aşağıya doğru çaprazlıyorsa, bu satış sinyalidir.
//+------------------------------------------------------------------+ //| SMA crossover.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //create an array for several prices double myMovingAverageArray1[], myMovingAverageArray2[]; //define the properties of MAs - simple MA, 1st 20 / 2nd 50 int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE); int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE); //sort the price arrays 1, 2 from current candle ArraySetAsSeries(myMovingAverageArray1,true); ArraySetAsSeries(myMovingAverageArray2,true); //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1); CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2); //Check if we have a buy entry signal if ( (myMovingAverageArray1[0]>myMovingAverageArray2[0]) && (myMovingAverageArray1[1]<myMovingAverageArray2[1]) ) { Comment("BUY"); } //check if we have a sell entry signal if ( (myMovingAverageArray1[0]<myMovingAverageArray2[0]) && (myMovingAverageArray1[1]>myMovingAverageArray2[1]) ) { Comment("SELL"); } } //+------------------------------------------------------------------+
Çalıştırıldıktan sonra program, bu stratejiye göre grafik üzerinde mevcut sinyali (alış veya satış) belirten yorumlar görüntüler. Şu şekilde görünür:
Programı çift tıklatarak veya grafiğe sürükleyerek başlattıktan sonra aşağıdaki pencere görünecektir:
'Algoritmik Ticarete izin ver' seçeneğini etkinleştirin ve 'Tamam'a tıklayın. Uzman Danışman grafikte başlatılacak ve Günlük sekmesinde başarılı başlatma hakkında mesaj görünecektir:
Böylelikle, iki Simple Moving Average göstergesinin çaprazlamasına dayalı otomatik olarak ticaret işlemi gerçekleştiren bir program oluşturduk ve çalıştırdık. Bu, kendi otomatik ticaret programınızı nasıl oluşturabileceğinizin en basit örneğidir. MQL5 programlama dili ile hemen hemen tüm ticaret stratejilerini uygulayabilir ve otomatikleştirebilirsiniz.
Tekrar söylemek istiyorum ki, bu makalenin ana amacı bu stratejiyi kullanmak değildir, ana amaç MQL5'in temellerini öğrenmek ve ticareti daha kolay ve daha kârlı hale getirebilecek programlama özelliklerine aşina olmaktır. Bu makalede sunulmuş tüm kodlar eğitim amaçlıdır, bu nedenle bu makalede bahsedilmiş herhangi bir stratejiyi kullanırsanız, bu tamamen sizin sorumluluğunuzda olacaktır.
Sonuç
MQL5, iyi algoritmik ticaret sistemleri tasarlamamıza olanak sağlayarak ticaretimizi daha kolay ve daha kârlı hale getirmemize yardımcı olan harika bir araçtır. Dolayısıyla, bu aracı öğrenmeye ve kullanmaya yapılacak herhangi bir yatırım çok faydalı ve kârlı olacaktır.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/10293
- Ücretsiz ticaret 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