Forex Algoritmik Ticareti: Mühendisler İçin Pratik Bir Hikaye
Yayınlanan: 2022-03-11Bildiğiniz gibi Döviz (Forex veya FX) piyasası döviz çiftleri arasında işlem yapmak için kullanılır. Ancak dünyanın en likit piyasası olduğunun farkında olmayabilirsiniz.
Birkaç yıl önce, merakımdan yola çıkarak, bir demo hesabı oluşturarak ve Meta Trader 4 işlem platformunda simülasyonlar (sahte para ile) oynayarak Forex algoritmik ticaret dünyasına ilk adımımı attım.
Bir haftalık 'ticaret'ten sonra, paramı neredeyse ikiye katlamıştım. Kendi başarılı algoritmik ticaretimin teşvikiyle, daha derine indim ve sonunda bir dizi FX forumuna kaydoldum. Kısa bir süre sonra, algoritmik ticaret sistemleri (alıp satmayacağınızı belirleyen kural kümeleri), özel göstergeler, piyasa ruh halleri ve daha fazlasını okumak için saatler harcıyordum.
İlk Müşterim
Bu sıralarda, tesadüfen, birinin basit bir ticaret sistemini otomatikleştirmek için bir yazılım geliştiricisi bulmaya çalıştığını duydum. Bu, Java'da eşzamanlı programlama (iş parçacığı, semafor ve tüm bu önemsiz şeyler) hakkında öğrendiğim üniversite günlerimdeydi. Bu otomatik sistemin ileri düzey veri bilimi dersi çalışmamdan çok daha karmaşık olamayacağını düşündüm, bu yüzden işi sordum ve gemiye katıldım.
Müşteri, hisse senedi ile ilgili eylemleri gerçekleştirmek için Meta Trader 4 platformu tarafından kullanılan işlevsel bir programlama dili olan MQL4 ile oluşturulmuş algoritmik ticaret yazılımı istiyordu.
Ticaret platformunun rolü (bu durumda Meta Trader 4) bir Forex brokeriyle bağlantı sağlamaktır. Aracı daha sonra piyasa hakkında gerçek zamanlı bilgiler içeren bir platform sağlar ve alım/satım emirlerinizi gerçekleştirir. Forex ticaretine aşina olmayan okuyucular için, veri akışı tarafından sağlanan bilgiler:
Meta Trader 4 aracılığıyla, tüm bu verilere çeşitli zaman dilimlerinde erişilebilen dahili işlevlerle erişebilirsiniz: her dakika (M1), her beş dakikada bir (M5), M15, M30, her saat (H1), H4, D1, W1, MN .
Mevcut Fiyatın hareketine kene denir. Başka bir deyişle, onay işareti, bir döviz çifti için Alış veya Satış fiyatındaki bir değişikliktir. Aktif piyasalarda saniyede çok sayıda tıklama olabilir. Yavaş piyasalarda, tıklanmayan dakikalar olabilir. Kene, bir döviz piyasası robotunun kalp atışıdır.
Böyle bir platform üzerinden sipariş verdiğinizde, belirli bir para biriminin belirli bir hacmini alır veya satarsınız . Ayrıca zararı durdur ve kar al limitleri de belirlersiniz. Stop-loss limiti , bir ticaretten vazgeçmeden önce kaybetmeyi göze alabileceğiniz maksimum pip (fiyat değişiklikleri) miktarıdır. Kâr alma limiti , parayı çekmeden önce lehinize biriktireceğiniz pip miktarıdır.
Müşterinin algoritmik ticaret özellikleri basitti: iki göstergeye dayalı bir Forex robotu istiyorlardı. Geçmiş verilere (örneğin, son n gündeki en yüksek fiyat değeri) dayandıklarından, arka plan için göstergeler, bir piyasa durumunu tanımlamaya ve alım satım kararları vermeye çalışırken çok faydalıdır. Birçoğu Meta Trader 4'te yerleşik olarak gelir. Ancak, müşterimin ilgilendiği göstergeler özel bir ticaret sisteminden geldi.
Bu özel göstergelerden ikisi her kesiştiğinde ve yalnızca belirli bir açıyla ticaret yapmak istediler.
eller üzerinde
Ellerimi kirlettiğimde MQL4 programlarının aşağıdaki yapıya sahip olduğunu öğrendim:
- [Önişlemci yönergeleri]
- [Harici Parametreler]
- [Küresel Değişkenler]
- [İşlevi Başlat]
- [Deinit Fonksiyonu]
- [İşlevi Başlat]
- [Özel İşlevler]
Başlatma işlevi, her MQL4 programının kalbidir, çünkü piyasa her hareket ettiğinde yürütülür (dolayısıyla, bu işlev tik başına bir kez yürütülür). Kullanmakta olduğunuz zaman diliminden bağımsız olarak durum budur. Örneğin, H1 (bir saatlik) zaman diliminde çalışıyor olabilirsiniz, ancak başlatma işlevi zaman diliminde binlerce kez yürütülür.
Bu soruna geçici bir çözüm bulmak için, işlevi dönem birimi başına bir kez çalıştırmaya zorladım:
int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...
Göstergelerin değerlerini alma:
// Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }
Göstergelerin kesişimi ve açıları dahil olmak üzere karar mantığı:
int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }
Siparişlerin Gönderilmesi:
void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }
İlgileniyorsanız, eksiksiz, çalıştırılabilir kodu GitHub'da bulabilirsiniz.

geriye dönük test
Algoritmik ticaret sistemimi kurduğumda, şunu bilmek istedim: 1) uygun şekilde davranıp davranmadığını ve 2) kullandığı Forex ticaret stratejisinin iyi olup olmadığını.
Geriye dönük test etme (bazen “geriye dönük test” olarak yazılır) belirli bir (otomatik veya otomatik olmayan) sistemi geçmişin olayları altında test etme sürecidir. Başka bir deyişle, geçmişi şimdiki zaman için bir vekil olarak kullanarak sisteminizi test edersiniz.
MT4, bir Forex ticaret stratejisini geriye dönük test etmek için kabul edilebilir bir araçla birlikte gelir (günümüzde, daha fazla işlevsellik sunan daha profesyonel araçlar vardır). Başlamak için zaman dilimlerinizi ayarlarsınız ve programınızı bir simülasyon altında çalıştırırsınız; araç, her birim için belirli bir fiyattan açılması, belirli bir fiyattan kapanması ve belirtilen en yüksek ve en düşük seviyelere ulaşması gerektiğini bilerek her bir işareti simüle edecektir.
Programın eylemlerini geçmiş fiyatlar ile karşılaştırdıktan sonra, programın doğru bir şekilde yürütülüp yürütülmediği konusunda iyi bir fikir edineceksiniz.
Geriye dönük testlerden, bazı rastgele zaman aralıkları için FX robotunun geri dönüş oranını kontrol etmiştim; Söylemeye gerek yok, müvekkilimin bununla zengin olmayacağını biliyordum - karar mantığıyla birlikte seçtiği göstergeler kârlı değildi . Örnek olarak, 164 işlem için programı M15 penceresi üzerinden çalıştırmanın sonuçları:
Bakiyemizin (mavi çizgi) başlangıç noktasının altında bittiğini unutmayın.
Parametre Optimizasyonu ve Yalanları
Geriye dönük testler beni bu FX robotunun kullanışlılığı konusunda temkinli yapmış olsa da, dış parametreleriyle oynamaya başladığımda ve genel Geri Dönüş Oranında büyük farklılıklar fark ettiğimde ilgimi çekti. Bu özel bilim, Parametre Optimizasyonu olarak bilinir.
Geri Dönüş Oranındaki harici parametrelerin önemini denemek ve çıkarmak için bazı kaba testler yaptım ve şöyle bir şey buldum:
Veya temizlendi:
(Benim yaptığım gibi) Parametre A'yı kullanmanız gerektiğini düşünebilirsiniz. Ancak karar göründüğü kadar basit değil. Spesifik olarak, Parametre A'nın tahmin edilemezliğine dikkat edin: küçük hata değerleri için getirisi önemli ölçüde değişir. Başka bir deyişle, herhangi bir belirsizlik, herhangi bir kayma daha kötü performansla sonuçlanacağından, Parametre A'nın gelecekteki sonuçları aşırı tahmin etmesi çok muhtemeldir.
Ama gerçekten de gelecek belirsiz! Ve böylece Parametre A'nın dönüşü de belirsizdir. Aslında en iyi seçim, öngörülemezliğe güvenmektir. Genellikle, daha düşük maksimum getiriye sahip ancak daha iyi öngörülebilirliğe (daha az dalgalanma) sahip bir parametre, getirisi yüksek ancak öngörülebilirliği zayıf olan bir parametreye tercih edilecektir.
Emin olabileceğiniz tek şey, piyasanın geleceğini bilmediğinizdir ve piyasanın geçmiş verilere dayanarak nasıl performans göstereceğini bildiğinizi düşünmek bir hatadır. Buna karşılık, Forex tahminlerinizde bu öngörülemezliği kabul etmelisiniz.
Bu, Parametre B'yi kullanmamız gerektiği anlamına gelmez, çünkü Parametre A'nın daha düşük getirileri bile Parametre B'den daha iyi performans gösterir; bu sadece size Optimizasyon Parametrelerinin olası gelecekteki sonuçları abartan testlerle sonuçlanabileceğini göstermek içindir ve bu tür bir düşünce açık değildir.
Genel Forex Algoritmik Ticaret Hususları
O ilk algoritmik Forex ticaret deneyiminden bu yana, müşteriler için birkaç otomatik ticaret sistemi kurdum ve size her zaman keşfedilecek ve daha fazla Forex analizi yapılacak yer olduğunu söyleyebilirim. Örneğin geçenlerde “Büyük Balık” denilen hareketleri bulmaya dayalı bir sistem kurdum; yani, küçücük, küçücük zaman birimlerinde büyük tırtıl değişimleri. Bu beni büyüleyen bir konu.
Kendi FX simülasyon sisteminizi oluşturmak, Forex piyasası ticareti hakkında daha fazla bilgi edinmek için mükemmel bir seçenektir ve olanaklar sınırsızdır. Örneğin, bir piyasadaki oynaklığın bir fonksiyonu olarak fiyat değişimlerinin olasılık dağılımını deşifre etmeye çalışabilir (örneğin EUR/USD) ve belki de hangi dereceyi kullanarak oynaklık durumu başına dağılımı kullanarak bir Monte Carlo simülasyon modeli yapabilirsiniz? İstediğiniz doğruluk. Bunu hevesli okuyucular için bir alıştırma olarak bırakacağım.
Forex dünyası zaman zaman bunaltıcı olabilir, ancak umarım bu yazı size kendi Forex ticaret stratejinize nasıl başlayacağınız konusunda bazı noktalar vermiştir.
Daha fazla okuma
Günümüzde, Ticaret Sistemi Otomasyonlarını oluşturmak, test etmek ve geliştirmek için geniş bir araç havuzu var: Test için Trading Blox, ticaret için NinjaTrader, programlama için OCaml, bunlardan birkaçı.
Para piyasası olan gizemli dünya hakkında çok şey okudum. İşte programcılar ve hevesli okuyucular için önerdiğim birkaç yazı:
- BabyPips: Forex ticareti hakkında squat bilmiyorsanız, bu başlangıç noktasıdır.
- Kaplumbağa Yolu, Curtis Faith tarafından: Bu, bence, Forex İncilidir . Biraz ticaret deneyiminiz olduğunda ve bazı Forex stratejilerini öğrendikten sonra okuyun.
- Alım Satım Profesyonelleri için Teknik Analiz — Günümüzün Çalkantılı Küresel Finansal Piyasaları İçin Stratejiler ve Teknikler, Constance M. Brown
- Uzman Danışman Programlama – Meta Trader 4 için MQL'de Otomatik İşlem Sistemleri Oluşturma, Andrew R. Young
- Trading Systems – Urban Jeckle ve Emilio Tomasini'den Sistem Geliştirme ve Portföy Optimizasyonuna Yeni Bir Yaklaşım: Çok teknik, çok döviz testine odaklanmış.
- Rui Pedro Barbosa ve Orlando Belo tarafından Çok Aracılı Para Birimi Ticaret Sisteminin Adım Adım Uygulanması: Bu, bir ticaret sistemi ve test platformunu nasıl oluşturabileceğinizi anlatan çok profesyonel.