English Русский 中文 Español Deutsch 日本語 Português
Ticaret sistemlerinin geliştirilmesi ve analizi için optimum yaklaşım

Ticaret sistemlerinin geliştirilmesi ve analizi için optimum yaklaşım

MetaTrader 5Ticaret sistemleri | 24 Ağustos 2023, 16:03
285 0
Evgeniy Ilin
Evgeniy Ilin

Giriş

Gün geçtikçe Forex ticareti giderek daha popüler hale gelmektedir, sürekli olarak yeni sinyaller ve ticaret sistemleri ortaya çıkmaktadır. Bu kaçınılmazdır, çünkü her zaman hızlı ve kolay para kazanmak isteyen birçok insan olmuştur. İnternet altyapısının dünya çapında yaygınlaşmasıyla birlikte bu sektör daha da büyüyecektir. Bu web sitesi bunun açık bir örneğidir. Kullanıcıların bir ürün veya hizmet satın almasına ve web sitesinin geliştirilmesine katkıda bulunarak para kazanmasına olanak tanıyan çok sayıda işlev içeren en gelişmiş ekosisteme sahiptir. Bu makalede, bir ürün veya sinyal seçerken kullanılacak kriterlerin yanı sıra kendi ticaret sistemlerinizi geliştirirken ve kullanırken uyulması gereken kuralları vurgulayacağım.

Benim felsefem

Size biraz motivasyonumdan ve ticaret sistemleri oluşturma yaklaşımımın ilkelerinden bahsedeyim. MetaTrader 5'e alışma zamanı gelmesine rağmen, çoğu MetaTrader 4'te olmak üzere birçok farklı Uzman Danışman geliştirdim. Bazı sistemleri daha sonra MetaTrader 5 için uyarladım.

İşlevsellik açısından MetaTrader 5, önceki versiyonunu elbette çok geride bırakmaktadır. Piyasayı anlamak için öncelikle teori ve pratiği birleştirmek gerektiğine inanıyorum. MetaTrader 4, gerekli pratiği yeterince iyi sağlamaktadır.

Mümkün olduğunca basit ve hızlı bir şekilde geliştirmeye çalışıyorum ve daha sonra sonuca bakıyorum. Sonuç bir modele benziyorsa, filtreler eklemeye ve sinyal gücünü artırmaya çalışıyorum ve ardından sonucu yeniden kontrol ediyorum. Eğer iyileşme varsa, süreci araştırmaya ve iyileşme ya da kötüleşmenin arkasındaki nedenleri bulmaya çalışıyorum.

Ayrıca, bir tür üretim hattı oluşturmak adına farklı ve aynı zamanda basit sistemler geliştirmek gerekir. Mükemmel hale getirmek için aylarca tek bir sistemle uğraşmak, başarısızlığa giden kesin bir yoldur. Bazı yatırımcılar da sistemin ne kadar çok girdisi ve diğer karmaşıklıkları varsa o kadar iyi olduğuna inanmaktadır. Aslında tam tersi doğrudur.

Geliştirdiğim Uzman Danışmanların bazıları 2000-3000 kod dizgesi içermektedir ve hiçbir sonuç vermemektedir, 20-50 dizgeden oluşan bazı kodlarım ise çok dövizli olarak tüm geçmiş üzerinde çalışabilmektedir. Piyasa hakkındaki bilginizin kalitesi burada ana başarı faktörüdür. Yetenekli programcılar hayal edilebilecek en karmaşık sistemi geliştirebilenler değil, hedeflerini anlayan ve sisteme gerçekte ne eklemeleri gerektiğini bilenlerdir.

Bu yaklaşımın bir diğer avantajı da, ortaya çıkan sistem ne kadar basit olursa, düzeltilmesi ve değiştirilmesinin de o kadar kolay olmasıdır. Bir başka ilginç nokta ise, geliştirdiğiniz bir Uzman Danışmanın sonunda tamamen farklı bir mantık izleyebilmesidir ki bunu anlamak bazen yıllar alabilir.

Bir sonraki deneyim seviyesinde, piyasayı anlamaya başlarsınız ve geliştirdiğiniz neredeyse tüm robotlar olabildiğince kârlı ve istikrarlı olurken olabildiğince basit hale gelir. Şu anda tam da bu seviyedeyim. Neyin işe yarayıp neyin yaramadığını ve üzerinde durulması gereken temel konuların neler olduğunu biliyorum. Bu seviyeye ulaştıktan sonra, mum modelleri ve göstergeler de dahil olmak üzere ticaret camiasında dolaşan bilgilerin %99'unun tamamen saçmalık olduğunu fark ediyorsunuz. Trend ve yatay gibi diğer bazı bilgiler nispeten güvenilir görünebilir, ancak işin püf noktası onların çeşitli şekillerde yorumlanabilmesidir. Dolayısıyla, zarar ettiğinizde, ticaret uzmanları(!) her zaman bir şeyi kaçırdığınızı veya trend çizginizin yanlış ayarlandığını söyleyebilir.

Zaman kaybetmek yerine, fiyatı gerçekten neyin belirlediğini düşünmeye başlamalıyız. Bir diğer gerekli ön koşul ise matematik bilgisi ve sonuçları analiz ederken onu uygulama, uygun modelleri tespit etme ve onların arkasındaki fiziği anlama becerisidir. Tüm bunlar ancak teori ve pratiğin birleştirilmesiyle başarılabilir. Sonunda, her şey geliştirdiğiniz ve test ettiğiniz ticaret sistemlerinin sayısına bağlıdır. Başkasının kodunu kullanmayın, kendi kodunuzu sıfırdan oluşturun. Ayrıca, yakın zamanda bir kutsal kase bulabileceğinizi düşünmeyin. Ben birkaç yıl boyunca bulabileceğimi düşünmüştüm. Düşünmek bilmek anlamına gelmez.


Sinyaller, Uzman Danışmanlar ve göstergeler

Tüm bu araçlar Forex yatırımcılarına yardımcı olmak için tasarlanmıştır ve doğru kullanıldığında her biri faydalı olabilir. Bu bağlamda, bir bütün olarak duruma ilişkin doğru bir vizyon oluşturmak için bu araçların her birinin ayrı ayrı doğru bir şekilde anlaşılmasının çok önemli olduğuna inanıyorum. Farkına varılması gereken en önemli şey, herhangi bir hizmetin size bir çözüm değil, yalnızca bir araç sunmayı amaçladığıdır. Fiyat etiketinin arkasında gerçekte neyin yattığını bilmek çok önemlidir. Şahsen ben uzun zamandır bu konulara ilişkin bir anlayış geliştirdim ve bunun birilerine yardımcı olabileceğine inanıyorum. Bir başka neden de, kendi ticaret sistemlerinizi geliştirme düşüncesine doğru bir şekilde yaklaşmanız için size bir rehber niteliğinde kısa bir bilgi turu sunmak istememdir.

Sinyaller

Sinyaller gerçek ve demo hesaplarda ticaret yapar. Sinyaller, kendi işlem hesabınızı ve diğer yatırımcıların hesaplarını izlemenin yanı sıra sinyallere abone olmaya ve diğer yatırımcıların ticaret işlemlerini kopyalamaya olanak sağlar. Şahsen, ortalama pozisyon tutma süresinin bir dakikadan az olduğu sinyallere abone olmanızı önermiyorum. Gerçek şu ki, bu tür kısa işlemler ya arbitraj ya da scalping’dir. Her iki durumda da, bu tür stratejiler ping'e karşı çok hassastır ve bir pozisyonun yanlış şekilde açılması için 10 milisaniye bile yeterli olabilir. Ortalama işlem süresi ne kadar uzun olursa, işlemleriniz orijinallerinden o kadar az farklılık gösterir.

Aşağıda kötü ve iyi sinyallere örnekler vereceğim:

Güvenli sinyal:


Güvenlidir çünkü varlık çizgisi bakiye çizgisine olabildiğince yakındır, yani uzun süreli işlemler içermemektedir, pozisyonlar sırayla açılmakta ve kapanmaktadır, martingale ve grid yoktur. Sinyalin stabil olduğu açıktır. Güçlü bir şekilde düz bir çizgiyi andırmaktadır ve mevduat üzerinde nispeten küçük bir yük ve yüksek oranda kârlı işlemler içermektedir.

Bir sonraki sinyal:


Bu sinyal de oldukça iyidir, ancak aşağı doğru büyük yeşil tepeler sistemin aktif olarak martingale uyguladığını göstermektedir. Testin başlangıcında, potansiyel olarak kazanılan tüm kârı yok edebilecek birkaç tepe noktası bulunmaktadır. Bunun tekrarlanmayacağına dair hiçbir garanti yoktur. Bakiyenin tamamının yok olması söz konusu olabilir. Buna rağmen, Sinyaller sekmesi çok geniş bir sinyal yelpazesine sahiptir ve oldukça iyi örnekler bulabilirsiniz.

Uzman Danışmanlar

Hiçbir geliştirici, Uzman Danışmanını satmanın kendisine onu kullanmaktan çok daha fazlasını kazandırıp kazandırmayacağını değerlendirmeden Mağazada istikrarlı ve kârlı bir Uzman Danışman yayınlamayacaktır. Bir diğer olası seçenek de geliştiricinin sistemden emin olmaması ve büyük miktarda para yatırarak risk almak istememesidir. Bunun yerine, riski azaltarak küçük miktarda paralarla ticaret yapar. Bir Uzman Danışman satın almanın karşılığını alabilmek için büyük bir bakiyeye ihtiyacınız olacaktır. Örneğin, 100 dolarlık başlangıç bakiyesiyle 200 dolar getirmesi beklenen bir Uzman Danışmanı 200 dolar maliyetle kiralarsanız, Uzman Danışman çalışır durumda devam etse bile hiçbir şey elde edemezsiniz.

Tahmin edilen kâr, Uzman Danışmanın fiyatından en az birkaç kat daha yüksek olmalıdır. Ayrıca, hiç kimsenin Uzman Danışmanın performansının gerekli süre boyunca kârlı kalacağını garanti edemeyeceğini unutmayın. Çok dövizli yapı, Uzman Danışman için ek bir avantaj olarak hizmet eder. En azından birkaç döviz çifti üzerinde çalışabiliyorsa, piyasanın fiziğini kâr şansını büyük ölçüde artıracak şekilde kullanıyor demektir. Örnek olarak, son sistemimin performansını bir tablo halinde göstereceğim ve tablodaki sonuçlardan birini de gerçek bir test şeklinde sunacağım.

İlk olarak, Uzman Danışmanı ana döviz çiftlerinin son 10 yıllık geçmişi üzerinde test etmenin genel tablosunu göstereceğim:


Tüm bu sonuçlar, herhangi bir spesifik döviz çifti için ayarlama yapılmadan ve optimizasyon olmadan tek bir ayar dosyası kullanılarak elde edilmiştir.

Aşağıda tabloda sunulan seçeneklerden biri yer almaktadır:


Bu seçenek, bunun sadece rastgele bir tablo olmadığını teyit etmektedir. Ayrıca, otomatik bir ticaret sistemi kullanılarak elde edilebilecek sonuçları göstermektedir. Mağazada bu tür Uzman Danışmanları bulmak oldukça zordur, bu yüzden kendi sonuçlarımı göstermeye karar verdim. Bu Uzman Danışman henüz ürünlerimde mevcut değildir. Ticarette 1'lik sabit lot kullanılmıştır.

Göstergeler

Göstergelere karşı tutumum çoğunlukla olumsuzdur. Manuel ticaret için daha uygun olduklarına inanıyorum. Onları bir koda entegre etmek mümkün olsa da, son derece yavaş çalışırlar ve genellikle biraz değiştirilmiş bir fiyatı temsil ederler. Gösterge fiyat penceresinde çizildiğinde bu doğaldır. Ayrı bir penceredeki göstergelere gelince, onlar çoğunlukla bir fonksiyonu hesaplar veya tekrarlayan hesaplamalar yapar, yani sonraki değerler öncekilerden hesaplanır. Her iki durumda da bu araçların verimliliği son derece sınırlıdır.

Göstergelerin çaprazlaşması şeklinde bir sinyale asla güvenmemelisiniz. Bu sadece psikolojik bir andır, başka bir şey değildir. En faydalı göstergelerin piyasa geometrisini (modelleri) tespit edenler olduğunu düşünüyorum. Sağlam bir sinyale sahip olmalıdırlar. Her ne olursa olsun, bir yatırımcı her zaman bir modeli takip edip etmeme konusunda nihai kararı kendisi vermelidir.

Giriş noktalarını doğru tespit eden bir gösterge geliştirmek mümkün olsaydı, ona dayalı bir Uzman Danışman uzun zaman önce oluşturulmuş olurdu. Test ettiğim tüm göstergeler (geliştirdiklerim dahil) giriş noktalarını göstermemektedir. Onlara dayalı Uzman Danışmanların işe yaramaz olduğu ortaya çıktı. Çoğunlukla netlik sağlama amaçlı yardımcı araçlar olarak ve dürüstçe söylemek gerekirse, yatırımcının zihnini sakinleştirmek için faydalıdırlar. Yatırımcılar hem giriş hem de çıkış konusunda emin olmak isterler.

Aşağıda göstergemin bir örneği yer almaktadır:


Gösterge standart dışı bir yaklaşım sergilemektedir. Basit matematiksel fonksiyonları tanımlar, onları grafikte arar ve tespit edildiğinde sizi bilgilendirir. Yine, bu gösterge yalnızca zaman kazanmak için tasarlanmış bir araçtır. Bu göstergeler manuel ticarette faydalı olabilir, ancak nihai karar her zaman size aittir.

Yatırım ve ticaretin ek özelliklerine kısa bir tur attıktan sonra, daha derin bir anlayış için matematik açısından test ve geliştirmeye göz atmanın zamanı geldi.

Optimal aramanın arkasındaki matematik

Geliştirmenin nihai hedefi gereksinimlerimizi karşılayan n sayıda sistem elde etmekse, o zaman ilk soru, çalışmamızın verimliliğini en üst düzeye çıkarmak için sistemin ne kadar karmaşık olması gerektiğidir? Burada verimlilik, ilk prototipin tanımladığımız prototip kriterlerine uyma olasılığıdır. Başka bir deyişle, prototip daha ilk aşamada belirli parametreler sağlamalı ve belirli bir parite üzerinde ya da çok dövizli olarak çalışmalıdır. Şahsen, çok dövizli yapıyı her zaman zorunlu bir kriter olarak görüyorum. Sonuç olarak, her şey güvenilir bir şekilde belirlenemeyen, ancak deneyler yoluyla kabaca araştırılabilen bir tür bağımlılığa dayanmaktadır:

  • Ps = Ps(L)

Burada L, çalışan kod dizgelerinin sayısıdır. Başka bir deyişle, oluşturulan sistemin ilk parametrelerinin kabul edilebilir bir aralıkta olma olasılığı, yazdığımız kod miktarı ile doğrudan ilişkilidir. Sistemde ne kadar çok dizge varsa o kadar iyi olduğunu düşünebilirsiniz, ancak durum her zaman böyle değildir. Şunu unutmayın:

  • T = K*L

Dizgeler ne kadar fazla olursa, geliştirmeyi tamamlamak o kadar fazla zaman alır. Ancak bizim önceliğimiz kod dizgelerinin sayısı değil, onların verimliliği ve birim zamanda kaç tane çalışan sistem geliştirebileceğimizdir. Bu parametre geri kalanların tümünü etkiler:

  • E = Ps/T
  • E --> Max

Başka bir deyişle, E parametresini mümkün olan tüm yollarla maksimize etmeliyiz. Bunun başlıca iki yolu, piyasa bilgisinin kalitesini artırmak ve en uygun prototip kod büyüklüğünü bulmaktır. Prototip büyüklüğünü belirledikten sonra ve doğal olarak, mevcut piyasa bilginiz ve bunu uygulama beceriniz göz önüne alındığında, tüm bunlar belirli bir "E0" verir. Verimliliğinizin bir göstergesi olarak kullanılabilir. Ayrıca, bir sistemi geliştirmek için gereken ortalama süreyi elde ederiz.

Geliştirmeyi her zaman test ve değişiklik takip eder. Bu süreçlerin de kendi olasılıkları vardır. Bizim durumumuzda bu, başarılı değişiklik+optimizasyon olasılığıdır. Biri diğerinden ayrılamaz. Test yapmadan düzeltme ve değişiklik yapmak mümkün değildir. Sonuç olarak, her şey birkaç tekrarlayan "test-analiz-değişiklik" döngüsüne indirgenir. Neticede, sistemi ya bir kenara atarız ya da kullanmak veya satmak üzere iyileştiririz.

Ayrıca, geliştirme ve ilk teste yönelik yaklaşımınızı optimize etmenin, böyle en az bir sistem bulacağınızı garanti etmediğini de unutmayın. Güvenebileceğiniz tek şey, istenen sonucu elde etmek için maksimum şanstır ve geliştirme ve ilk test için ne kadar zamanınız olduğunu bilmeniz gerekir. Bernoulli denklemini kullanarak aşağıdaki gibi yazabiliriz: 

  • Pa = Sum(m0...m...n)[C(n,m)*Pow(Ps,m)*Pow(1-Ps,n-m)]
  • m0 - tatmin edici prototiplerin minimum sayısı
  • Pa - "n" geliştirme döngüsünden en az "m0" veya daha fazlasını elde etme olasılığı
  • n - çalışan prototipler için mevcut maksimum arama döngüsü sayısı

Denklemde toplamı kullanıyoruz çünkü tatmin edici prototip sayısının ihtiyacımızdan fazla olduğu seçeneklerden de memnunuz. Daha sonra vereceğim denklem de aynı fikri uygulamaktadır.

Burada yeteneklerinizi abartmadığınızdan emin olun. Ayrıca, çok fazla iyi prototip beklemeyin. Onları bulsanız bile, istediğiniz şekilde çalışacaklarını kimse garanti edemez. Çok sayıda basit prototipe güvenebileceğiniz gibi daha karmaşık olanlara da güvenebilirsiniz. Seçim sizin. Ben basit olanlara güveniyorum.

Değişiklik yaparken ve test ederken, maksimize edilebilecek ve edilmesi gereken parametreler de mevcuttur. Test şemasında kabul edilebilir bir seçenek bulma olasılığı ile başlayacağım. Başlangıçta seçilen prototipten kabul edilebilir sonuçlar bulma sürecinin tamamı nihayetinde tek bir test-değişiklik-optimizasyon sürecinde birleşir. Bernoulli denklemi kullanılarak tanımlanabilen bir periyodik süreçtir:

  • Pf = Sum(1...m...n)[C(n,m)*Pow(Po,m)*Pow(1-Po,n-m)]
  • Po - bir yineleme sırasında kabul edilebilir bir sonuç elde etme olasılığı
  • n - mevcut maksimum arama döngüsü sayısı

Kabul edilebilir sonuçlar ararken en az bir tatmin edici olaya ihtiyacımız olduğunu varsayıyoruz. Başka bir deyişle, test ve revizyon için belirli bir süremiz vardır ve bu da nihayetinde prototipte ilk sonuçtan daha fazlasını bulmak için mevcut yinelemelerin (test veya değişiklik) sayısına karşılık gelir ve bu sonuç bize uygun olmalıdır. Zamanın rasyonel kullanımı daha önemli olduğu için maksimum Pf istememize gerek yoktur:

  • Ef = Pf/m
  • Ef --> Max

Mevcut aşamada, düzenleme ve test etme arasındaki dengeyi korumak ve belirli bir parametrenin nihai sonucu nasıl etkilediğini ve daha fazla test etmenin herhangi bir anlamı olup olmadığını tanımlamak önemlidir. Testler ve iyileştirmeler her zaman aşağı yukarı aynı süreyi alır, bu nedenle buradaki "m", sezgilerinizi veya deneyimlerinizi kullanarak kendi başınıza belirlemeniz gereken test sayısıdır. Burada belirli bir kılavuz veya tavsiye bulunmamaktadır. Elbette, "n" döngü alıp sonuçları gördüğünüz standart algoritmaya bağlı kalmak mümkündür, ancak birçok durumda yineleme sayısını azaltmak ve örneğin sistemi ilk aşamada atmak veya tersine verimli ve esnek olduğuna karar vermek mümkündür. Her zaman bu yaklaşıma sadık kalmaya çalışıyorum, çünkü zaman kazandırmaktadır. Zaman sahip olduğumuz en değerli şeydir. Önceki bulgulara dayanarak, ortalama olarak tam "n" test yerine "m" test kullandığınızı göz önünde bulundurarak geliştirme verimliliğinin daha eksiksiz ve genel bir ölçüsünü oluşturabiliriz:

  • ET = (Ps*Pf)/(TSumm)
  • TSumm = T+m*Tm
  • Tm - ortalama döngü süresi (test-değişiklik-optimizasyon)

Pf ve Ps olasılıklarının olayları tutarsız olduğundan, yeni olayın bir prototipin bulunması olduğu yeni bir olay uzayı oluşturma hakkına sahibiz. Ardından başarılı bir iyileştirme yapılır, bu da temelde kabul edilebilir bir ticaret sisteminin başarıyla bulunması anlamına gelir. Bu nedenle, belirli bir olayın olasılığını elde etmek için olasılıkları çarpıyoruz.

Ancak tespit edilen her seçeneğin "T" prototip geliştirme süresi ve "m*Tm" iyileştirme süresi gerektirdiğini de biliyoruz. Bir tam geliştirme döngüsüyle ilgili başarı olasılığı ne kadar yüksek olursa, yaklaşım da o kadar etkili olur. Birçok yönden, nihai süre test süresine bağlıdır. Başlangıçta tik tabanlı robotlar yaptım, ancak herkese çubuk tabanlı prototipler geliştirmelerini tavsiye ederim. Birincisi, testlerinizi birkaç kat hızlandıracaksınız ve ikincisi, tiklerden uzaklaşacak, böylece gerçek tikler içeren testlerde zaman kaybetmeyeceksiniz, ki bu, inanın bana, geliştirme hızınıza büyük bir ivme katacaktır. Şimdi en önemli strateji kriterlerini analiz etme zamanı.

Ana strateji parametreleri

Bir stratejinin kalitesini değerlendirmek için, her biri stratejinin belirli özelliklerini yansıtan belirli nicel değerler vardır. Bazı değerler diğerlerinden daha önemlidir, ancak genel olarak strateji hakkında her şeyi söyleyebilirler. Aşağıdaki nicel strateji parametreleri bulunmaktadır:

  • Beklenen getiri
  • Kâr faktörü
  • Mutlak düşüş
  • Göreceli düşüş
  • Maksimum düşüş
  • Düzelme faktörü
  • Kârla kapanan işlemlerin yüzdesi

Beklenen getiri

Beklenen getiri, herhangi bir Uzman Danışman veya manuel ticaret sisteminin en önemli parametresidir. İyi bir beklenen getiriniz yoksa, saf şans durumları dışında başarılı olma ihtimaliniz yoktur. Beklenen getiri iki türde olabilir: puan ve mevduat para birimi cinsinden.

  • M_Points = (Sum(1,n)(PrPoints[i])-Sum(1,n)(LsPoints[i]))/n
  • M = (Sum(1,n)(Pr[i])-Sum(1,n)(Ls[i]))/n

Tanımlamalar:

  • PrPoints[i] - i'ninci işlem kârla kapanmışsa, bu puan cinsinden kâr miktarıdır
  • LsPoints[i] - i'ninci işlem zararla kapanmışsa, bu puan cinsinden zarar miktarıdır
  • Pr[i] - i'ninci işlem kârla kapanmışsa, bu mevduat para birimi cinsinden kâr miktarıdır
  • Ls[i] - i'ninci işlem zararla kapanmışsa, bu mevduat para birimi cinsinden zarar miktarıdır
  • n - işlem sayısı

Burada açıklayacağım tüm değerler, bir stratejiyi %100 doğrulukla karakterize etmez, çünkü onları doğru bir şekilde belirlemek için n'nin sonsuza eğilim göstermesi gerekir. Ancak makul miktarda işlem olması durumunda bile, tüm bu değerler bize strateji hakkında çok yüksek derecede güvenilirlikle çok şey söyleyebilir.

Stratejinin kârlı olabilmesi için değer sıfırdan büyük olmalıdır. Aynı zamanda, kârın bir kısmının makas, komisyon ve swap tarafından azaltıldığını unutmamalıyız.

  • PrPoints[i] = PrPoints_0[i]-(SpreadOpen[i]/2+SpreadClose[i]/2)-(OrderComission[i]/OrderLots[i])/TickValue)+(OrderSwap[i]/OrderLots[i])/TickValue)
  • Pr[i] = Pr_0[i]-(SpreadOpen[i]/2+SpreadClose[i]/2)*OrderLots[i])*TickValue-OrderComission[i]+OrderSwap[i]

TickValue'dan burada özellikle bahsetmek gerekir. Bu, 1'lik lotu kullanmamız koşuluyla, mevduat para birimi cinsinden bir puanın değeridir. Bu değer tüm döviz çiftleri için farklıdır ve minimum fiyat değişimi tamsayı TickValue'yu verecek şekilde alınır. Aslında bu, stratejinin en önemli parametresidir, çünkü makas esasen brokera giden beklenen getirinin bir parçasıdır. Bu nedenle, bu parametreye çok dikkat göstermeliyiz. Beklenen getiri makası çok az aşıyorsa, diğer tüm strateji parametrelerinin hiçbir önemi yoktur.

Kâr faktörü

Kâr faktörü, stratejinizin en önemli ikinci parametresidir. İyi bir beklenen getiri elde ettiyseniz, bu, sinyalinizin kalitesini veya başka bir deyişle öngörü kalitesini yansıttığı için odaklanmanız gereken bir sonraki parametredir. İşlemlerinizden elde ettiğiniz toplam kâr miktarı ne kadar yüksek ve toplam zarar miktarı ne kadar düşükse, parametre değeri o kadar yüksek olur.

  • PrFactor = Sum(1,n)(Pr[i])/Sum(1,n)(Ls[i])

Denklemin paydası sıfır olursa, kâr faktörü hesaplanamaz. Dolayısıyla, kâr faktörü değerinin üst sınırı artı sonsuzdur. Bu, zararla kapanmış işlem yoksa göstergenin sonsuz olacağı, kârla kapanmış işlem yoksa 0 olacağı anlamına gelir. Yani, değer aralığı [0,+sonsuz] şeklindedir. Ortalama değer 1'dir. Bu değeri aşan her şey kârlıdır, daha az olan her şey ise zarar oluşturur.

Sonraki iki parametre de aynı şeyi yansıtır, ancak biraz farklı şekillerde.

Maksimum düşüş

Maksimum düşüş, bakiyenin yerel maksimum değerine göre para cinsinden en büyük düşüşüdür. Yerel uç değerleri PriceExtremum[i] olarak ayarlarsak, maksimum düşüş şu şekilde olur:

  • MaximumDrawdown = MaxOf(PriceExtremum[i+1]-PriceExtremum[i])

Aynı nihai kâra sahip iki veya daha fazla stratejiniz varsa, en az maksimum düşüşe sahip olanı seçin. Bir sonraki parametre, bu varsayımı yapmaya gerek kalmadan bunu yansıtır:

Düzelme faktörü

Bu parametre, kârın denklemde yer alması dışında bir öncekiyle neredeyse aynıdır:

  • RecoveryFactor = TotalProfit/MaximumDrawdown

Bu parametrenin daha bilgilendirici olduğuna inanıyorum. Kurtarma faktörü ne kadar yüksekse, strateji o kadar istikrarlıdır. Örneğin, parametre ne kadar yüksek olursa, strateji martingale kullanmak için o kadar uygun olur, çünkü zarar dizisi küçülür ve bakiyeyi kaybetme korkusu olmadan zarar durumunda lotu artırmaya başlayabiliriz.

Kârla kapanan işlemlerin yüzdesi

Bu parametre yalnızca kârla kapanan işlemlerin ortalama değeri zararla kapanan işlemlerin ortalama değerine çok yakın veya eşit olduğunda geçerlidir. Aslında %50 seviyesine alışkınız. Bunu aşan tüm değerler stratejinin kârlı olduğunu, aksi takdirde ise zarar oluşturduğunu gösterir. Şahsen %60 seviyesinin vurgulanması gerektiğini düşünüyorum. Bu parametre herhangi bir yatırımcıyı büyük ölçüde etkilediğinden, bu seviyenin özellikle manuel bir ticaret sistemi için oldukça önemli olduğuna inanıyorum. Ancak bu parametre bize kâr faktörü hakkında herhangi bir bilgi vermez. Ayrıca, bu parametre her zaman bilgilendirici değildir.

  • WinPercent = (100*NProfit)/(NProfit+NLoss)

Mutlak düşüş

Bu parametre, stratejinizin bakiyeniz üzerinde ağır bir yük oluşturması veya bakiye eğrisinin düz bir çizgiye benzememesi, bunun yerine kâra doğru sadece hafif bir eğilimle kaotik bir karmaşaya benzemesi veya en azından gelecekte bunun için bazı ön koşulların olması durumunda önemlidir. Bir kişiye mutlak düşüşün, parayı mahvolmaktan kurtarmamıza izin veren minimum bakiyeyi gösterebileceği izlenimi verebilir, ancak bu bir yanılsamadır ve kimseye bu fikre bağlı kalmasını tavsiye etmem. Bu değer, ‘başlangıç bakiyesi’ ile ‘test edilen veya ticaret yapılan aralıktaki bakiye grafiğindeki en alt nokta’ arasındaki farka eşittir:

  • AbsoluteDrawdown = StartBalance-MinimumBalance
Göreceli düşüş

Bence bu parametre, toplam kârı dikkate aldığı için ticaret sisteminin kârlılığının veya istikrarının bir göstergesi olarak daha bilgilendiricidir. Mutlak düşüş ile arasındaki fark, maksimum düşüş ile düzelme faktörü arasındaki farkla kabaca aynıdır:

  • 100*AbsoluteDrawdown/EndProfit

Değer yüzde olarak ölçülür ve mutlak düşüşün nihai kârı ne kadar etkilediğini gösterir. Bu faktörün bilgilendirici değeri de çok sınırlıdır. Değer ne kadar düşükse, strateji o kadar iyidir.

Diğer strateji parametreleri

Aşağıda daha az önemli bazı strateji parametreleri yer almaktadır. Ancak, hafife alınmamalıdırlar.

  • En yüksek kâr
  • En yüksek zarar
  • Kârla kapanan işlemlerin ortalama kârı
  • Zararla kapanan işlemlerin ortalama zararı
  • En fazla işleme sahip ardışık kâr serisi
  • En fazla işleme sahip ardışık zarar serisi
  • Ardışık kâr serilerinin ortalama işlem sayısı
  • Ardışık zarar serilerinin ortalama işlem sayısı

En yüksek kâr

En yüksek kârla kapanan işlemin kâr miktarı. Bu parametre mevduat para birimi veya puan cinsinden olabilir. Bu seçim, parametreye neden ihtiyaç duyduğumuza bağlıdır. Parametrenin önemi oldukça soyuttur. Aynı şey bir sonraki parametre için de söylenebilir.

En yüksek zarar

En yüksek zararla kapanan işlemin zarar miktarı.

Kârla kapanan işlemlerin ortalama kârı

Toplam kârın kârla kapanan işlem sayısına bölümüdür. Bu parametre yalnızca beklenen getiri ve kâr faktörü pozitif olduğunda bilgilendiricidir.

  • MiddleProfit = Sum(Pr[i])/n

Zararla kapanan işlemlerin ortalama zararı

Toplam zararın zararla kapanan işlem sayısına bölümüdür.

  • MiddleLoss = Sum(Ls[i])/n

En fazla işleme sahip ardışık kâr serisi

Bu parametre oldukça kullanışlıdır, çünkü yukarıdan sınırlıysa, ters martingale kullanmak için mükemmeldir. Ardışık kâr serisi ne kadar kısa olursa, ters martingale için o kadar iyidir.

En fazla işleme sahip ardışık zarar serisi

Önceki parametrenin aksine, bu parametrenin sınırlandırılması düz martingale kullanılmasına izin verir. Herhangi bir sinyal için bu değeri bir şekilde sınırlamayı başarırsanız, bakiyenizi kaybetme korkusu olmadan martingale kullanarak hızlı ve güvenli bir şekilde para kazanabilirsiniz.

Ardışık kâr serilerinin ortalama işlem sayısı

Parametre, kârla kapanan işlemlerin yüzdesi ile neredeyse aynıdır. Aslında, ticaret sisteminin neredeyse aynı göstergesini biraz farklı bir şekilde yansıtmaktadır.

  • MiddleWins = Sum(Wins[i])/n

Burada Wins[i] belirli bir yarım dalganın uzunluğudur. Tüm bakiye grafiğini yükselen ve düşen segmentlere bölerek yükselenleri vurgular ve içlerindeki işlem sayısını ve yükselen yarım dalgaların sayısını (n) hesaplarsak, belirli yarım dalgaların aritmetik ortalamasından başka bir şey olmayan parametrenin kendisini hesaplamak mümkün olacaktır.

Ardışık zarar serilerinin ortalama işlem sayısı

Yukarıdaki ile aynı parametredir. Tek fark, negatif yarım dalgaları dikkate almasıdır:

  • MiddleLosses = Sum(Loss[i])/n

Eklemelerim

Daha eksiksiz bir strateji değerlendirmesi sağlayan başka bir parametre daha olduğuna inanıyorum:

  • Doğrusallık faktörü

Bakiye eğrisinin, bakiye grafiğinin başlangıcını ve sonunu birleştiren düz çizgiden sapmasını yansıtır. Sabit bir lotla ticaret yaparken bakiye grafiği ne kadar düz bir çizgi gibi görünürse, sistem o kadar iyidir. Bu, gelecekte daha yüksek bir performans olasılığı sağlar. Bu parametre özellikle sabit bir lotla ticaret yaparken kullanışlıdır. Piyasa volatilitesi sürekli değişir, bu da ortalama mum büyüklüğünün (genel piyasa dinamiklerinin) de değiştiği anlamına gelir. Bunu bilirsek, bazı stratejilerin beklenen getirisinin testin herhangi bir yerinde neden azaldığını veya arttığını anlayabiliriz. Bu durumda, grafik çok kavisli olur ve bu da gelecekte eğim açısının ve dolayısıyla beklenen getirinin sabit kalacağına dair hiçbir garanti bırakmaz.

  • LinearFactor = MaxDeviation/EndBalance
  • MaxDeviaton = Max(MathAbs(Balance[i]-AverageLine))
  • AverageLine = StartBalance+K*i
  • K = (EndBalance-StartBalance)/n
  • n - testteki anlaşma sayısı

MetaTrader 4 ve MetaTrader 5 strateji sınayıcılarında bu tür parametrelerin bulunmamasının nedeni çok basittir. Bu tür parametreleri hesaplamak için, nihai kârı içerdiklerinden her zaman iki çalıştırmaya ihtiyaç duyulmasıdır. Bu parametre ne kadar düşükse, strateji o kadar iyidir. Dilerseniz onu % olarak da ölçebilirsiniz.

Daha iyi anlaşılması amacıyla aşağıdaki görüntüye bakınız:


Bir sistemi test ederken veya gözden geçirirken hangi parametrelere odaklanılmalıdır?

Odaklanmaya değer sadece birkaç temel sistem parametresi olduğuna inanıyorum:

  • Puan cinsinden beklenen getiri
  • Kâr faktörü veya eşdeğeri
  • Maksimum düşüş
  • En fazla işleme sahip ardışık zarar serisi
  • Doğrusallık faktörü

Diğer parametrelerin bir sistem veya piyasa hakkında ek bilgi olarak kullanılması çok zordur. Her halükarda, henüz onlardan yararlanabilecek algoritmalar bulamadım ve kullanımları için herhangi bir ön koşul bile yoktur. Göründüğünden çok daha basit olan şeyleri karmaşık hale getirmenin bir anlamı olmadığına inanıyorum. Bu durum kafa karışıklığına yol açar ve dikkati asıl önemli şeylerden uzaklaştırır.

Bu kriterlerin seçimini mümkün olduğunca basit bir şekilde anlatmaya çalışacağım:

Stratejinin kârlı olabilmesi için puan cinsinden beklenen getirinin puan cinsinden ölçülen makas+komisyon+swap'ı aşması gerekir. Beklenen getiri tercihen ortalama makas+komisyon+swap’ın en az iki katı olmalıdır. Bu şekilde kayıpları telafi edeceğiz ve parametre modülüne eşit veya daha büyük bir kâr elde edeceğiz.

Stratejinin kârlılığına ikna olduktan sonra, öngörü kalitesine, yani kâr faktörüne dikkat etmeliyiz. Gösterge 1 değerini ne kadar aşarsa, öngörü kalitesi o kadar iyidir. Öngörü kalitesi ne kadar iyi olursa, parametre geri kalanların tümünü o kadar fazla etkiler. Beklenen getiriyi göz ardı etmek mümkün olsaydı, kâr faktörü en önemli parametre olurdu. Diğer tüm parametreleri doğrudan veya dolaylı olarak etkiler.

Uygun kârlılığı elde ettikten sonra, maksimum düşüşü düşünmenin zamanı gelmiştir. Bu parametre, mevcut bakiye aşamasında maksimum kârlılığı sağlamak için gereken minimum bakiyeyi tanımlar. Maksimum düşüşe bağlı olarak, başlangıç bakiyesini, bakiyemizi kaybetme endişesi duymadan maksimum yıllık kâr yüzdesini sağlayacak şekilde seçebiliriz. En fazla işleme sahip ardışık zarar serisinin veya maksimum düşüşün aşırı değerlere sahip olduğundan eminsek, stop out korkusu olmadan sinyalde martingale uygulamak mümkündür.

Doğrusallık faktörü, bunun rastgele bir sonuç değil, bir model olduğu konusunda bize bilgi sağlar. Grafik düz bir çizgiye ne kadar çok benziyorsa, bunun gerçek bir model olma olasılığı o kadar yüksektir.

Test süresi de hafife alınan parametrelerden biridir. Test edilen segment ne kadar uzun ve kârlılık sonuçları ne kadar benzer olursa, sistemin rastgele bir sonuçtan ziyade global bir modeli yansıtma olasılığı o kadar yüksek olur.

Bakiye ve varlık

Bu konu, bu değerler arasındaki farkı göremeyen yeni başlayanlar için çok önemlidir. Varlık mevcut değişken kârdır, bakiye ise mevcut sabit kârdır. Yatırımcılar genellikle varlık yerine bakiye çizgisine bakarlar. İyi ticaret sistemlerinde, varlık mümkün olduğunca bakiye çizgisine yakın konumlanır. Bu, stratejinin grid, martingale veya piramitleme uygulamadığını gösterir. Bu yöntemlerin işe yaramadığını ima etmiyorum ancak iyi bir sinyale ihtiyaçları vardır. Önceki makalelerimde bu konu üzerinde daha fazla durdum. MetaTrader 5 strateji sınayıcıda ve MQL5 web sitesinde, bakiye çizgisi koyu mavi renkte görüntülenirken, varlık çizgisi yeşil renkte gösterilir. Varlık çizgisi bakiye çizgisine ne kadar yakınsa, her iki çizginin de yükselmesi koşuluyla strateji o kadar güvenlidir. 

Gerçek ticaret sistemi parametreleri ve uygulanabilirliği

Bu konuyu kendi uygulamalarıma ve geliştirdiğim gerçek ticaret sistemlerine dayanarak değerlendiriyorum. Sizi sadece güzel bir resim gösteren ve başka bir şey göstermeyen sinyallere veya Uzman Danışmanlara yapılan yatırımlardan korumak istiyorum. Benim naçizane tecrübelerime göre, 10 yıldan daha az bir geçmiş üzerinde test edilen sistemlerin zararla sonuçlanma riski daha yüksektir. Test edilen segment iki yıl veya daha az ise bu durum daha da geçerlidir.

Deneyimlerim bana, geçmiş boyunca kârlı bir şekilde ticaret yapabilen bir sistemin yaklaşık 5-50 puanlık beklenen getiriye sahip olacağını, kâr faktörünün ise 1.05-3.0 aralığında olacağını söylüyor. M5 zaman dilimini gerçekten seviyorum, çünkü oluşturduğum tüm işe yarayan sistemler bu zaman diliminde çalışmıştır ve isterseniz onları M1'de de çalıştırabilirsiniz. Bu aynı zamanda çok iyi bir grafiktir, çünkü muhtemelen birim zaman başına en yüksek miktarda veriye sahip en küçük çubukları içermektedir (High[i], Low[i], Close[i] ve Open[i]). Bu çubuk noktaları özünde kaydedilen gerçek tiklerdir. Grafik zaman dilimi ne kadar küçük olursa, mumların içerisine o kadar fazla gerçek tik kaydedilir. Birçok sistem için, testinizde gerçek tikler kullanmadığınız sürece, sınayıcıda bir sistemi kontrol ederken bu büyük önem taşır.

Şahsen ben asla gerçek tikleri kullanmıyorum. Tüm Uzman Danışmanlarım çubuk kapanışına dayanmaktadır ve yapay tik oluşturma konusunda da endişelenmeme gerek yok çünkü çubuk kapanışı her zaman gerçek bir tiktir. Sistemlerimin ortalama kâr faktörü 1.2 civarındayken, beklenen getiri yaklaşık 15 puandır çünkü oldukça küçük zaman dilimleri kullanıyorum. Yüksek zaman dilimlerinde çalışan bir şey bulmak çok daha zordur. Beklenen getiriyi artırabilirsiniz ancak kâr faktörünü artıramazsınız.

Birçok satıcı, Uzman Danışmanın optimize edilmesi gerektiğini ve hatta yeniden optimizasyondan önce öngörülen süreyi bile yazıyor. Bu tür ifadelere aldanmayın, çünkü Uzman Danışmanın gelecekte çalışma süresini hiçbir şekilde tahmin etmek mümkün değildir. Ayrıca bu aracı nasıl kullanacağınızı öğrenene kadar "optimizasyon" kelimesini unutmanızı tavsiye ederim. İstediğiniz sonucu elde etmek için her şeyi optimize edebilirsiniz, ancak büyük olasılıkla bu rastlantısallığın bir sonucu olacaktır. Optimizasyon kapsamlı bir yaklaşım gerektirir. Bu aracı neredeyse hiç kullanmıyorum, bunun yerine her şeyi manuel olarak kontrol ediyorum. İnsan beyni, parametrelerin künt bir şekilde sıralanmasından çok daha verimli bir sistemdir.

Sistem nasıl düzgün bir şekilde test edilir?

Hem kendi sistemlerimi hem de başkalarının sistemlerini test etmek için aşağıdaki yaklaşımı kullanıyorum (ancak olguların %99'unda kendi sistemlerimi test ediyorum):

İlk test için her zaman mevcut tarihten itibaren son bir yılı veya biraz daha fazlasını seçiyorum. Test sonuçlarını beğenirsem, birkaç segment daha alıyorum. Kapsamlı analizin en az 10 yıllık bir segment gerektirdiğini unutmayın. 20 yıllık bir segment daha iyidir.

İlk ve son yıllar iyiyse, ortaya yakın birkaç segment alın. Buradaki sonuçlar da kabul edilebilirse, 10 yılın tamamını test edin ve bakiye eğrisi ile varlığı değerlendirin. Düz bir çizgiye benziyorlarsa, sistem dikkati hak ediyor demektir. Bu yaklaşımın tek bir amacı vardır - zamandan tasarruf etmek ve ortaya çıkan sistemlerin kalitesini en üst düzeye çıkarmaktır.

Analizi gerçekleştirdikten sonra, sıra diğer eylemleri belirlemeye gelir. Sisteme olan güveni daha da güçlendirmek için, diğer birkaç döviz çifti üzerinde test edilmelidir. En azından orada verimliliğinin bir kısmını koruyorsa, o zaman piyasa fiziğine dayanıyor demektir ve geliştirilebilir. Ana sistem parametrelerini tek tek kontrol edin ve sonucu nasıl etkilediklerini tanımlayın. Çoğu durumda, belirli bir parametrenin etkisinin bir diğerinden neredeyse tamamen bağımsız olduğu ortaya çıkmaktadır.

En iyi performansı elde ettikten sonra, sistemi bir demo hesapta test etme zamanı gelir. Sistem bir demo hesapta kabul edilebilir bir sonuç gösteriyorsa, o zaman gerçek bir hesapta denenebilir. Çubukları kullanmanın bir başka avantajı da, bir demo hesaptaki sonucun, brokerın yetkin olması koşuluyla gerçek olandan farklı olmamasıdır. Ben şahsen Alp***'yi tavsiye ederim. Eksik harfleri ekleyebileceğinize inanıyorum. Bu brokerın geçmiş verileri çarpıtılmamıştır. Tik robotlarının test edilmesini önermiyorum çünkü o konuda hiçbir garanti yoktur. Yalnızca çubuk açılışlarına veya kapanışlarına dayalı Uzman Danışmanları kullanın.

Çubuk parametreleri

Bir fiyatı doğru bir şekilde anlamak için, çubuğu veya mumu ve içerdiği verileri ve çubuğun veya mumun görünümüne dayalı olarak hangi verileri elde edebileceğimizi tanımlamamız gerekir. Çubuk (mum) sabit uzunlukta bir tik geçmişi segmentidir ve tüm tikleri kaydetmez, bunun yerine Açılış, Kapanış, Yüksek ve Düşük tiklerinin yanı sıra tarih ve saat olarak değiştirilen çubuk açılış zamanını kaydeder. Bu değer, 1 Ocak 1970'ten bu yana geçen saniye sayısını temsil eder. Çubuğun içerisinde altı değer vardır:

  • Close[]
  • Open[]
  • Low[]
  • High[]
  • Time[]
  • Volume[]

İlk dört değer, çubuğa kaydedilen dört tiktir ve son iki değer de çubuğun açılış zamanı ve hacmidir. Hacim, çubuğa sığan tik sayısıdır. Fiyat verileri en önemlisidir, ancak zaman ve hacmi de unutmamak gerekir. Bu verileri doğru bir şekilde kullanabilirseniz, iyi sinyaller bulabilirsiniz. Çubuk ve mum aynı anlama gelir. Tek fark, aynı değerlerin farklı grafiksel gösterimidir:


Çubukları ve mumları analiz etmenin çeşitli yöntemleri vardır. Bu sadece grafiksel bir veri olduğu için çok katı bir şekilde uygulanmasını önermiyorum. Yalnızca göstergeler ve diğer analiz yöntemleriyle birlikte kullanıldığında faydalı olabilir.

Basit bir hacme dayalı Uzman Danışman yazma ve test etme

Ek bir piyasa verisi ve ticaret kısıtlaması olarak hacmi ve zaman koridorlarını kullanarak bir Uzman Danışman geliştirmeyi ele alalım. Hacim artışları, piyasa katılımcıları tarafından alınan önemli kararları tespit etmemizi sağlar. Uzman Danışman için sunucunun çalışma süresinin sınırlandırılabilmesi, hacmin büyük önem taşıdığı alanların bulunmasına olanak tanır. Uzman Danışmanı yazalım ve sistem hakkında sonuçlar çıkarmak için birkaç test ve tam bir analiz gerçekleştirelim. Sistemin kendisi yalnızca piyasa parametrelerini araştırmak ve aralarındaki ilişkileri incelemek için gereklidir. Her bir çubuk parametresinin kendi ağırlığına sahip olduğunu ve sistemin genel kalitesine katkıda bulunduğunu göstermek için öncelikle sisteme ihtiyaç vardır. Uzman Danışmanın kendisi makaleye eklenmiştir, böylece herkes onu kullanabilir ve gerekirse değiştirebilir.

Pozisyonlarla çalışmak için iyi bilinen kütüphanelerden başlayalım:

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_position=CPositionInfo();// trade position object
CTrade         m_trade=CTrade();          // trading object

Bunlar öncelikle kodu basitleştirmek için gereklidir. Çalışma prensiplerini açıklamama gerek olmadığını düşünüyorum. Web sitesinde konuyla ilgili çok sayıda bilgi bulunmaktadır.

Ardından, çalışma modlarını değiştirebilmek için bir numaralı liste tanımlayalım:

enum MODE_CALCULATE
   {
   MODE_1=0,
   MODE_2=1,
   MODE_3=2,
   MODE_4=3
   };

Bu, en etkili piyasa formülünü belirlemek için çeşitli modların olacağı beklentisiyle yapılır. Başlangıçta, hangi fizikten yararlanmak istediğimize dair bazı genel fikirler olmalıdır, ancak bizim durumumuz için hangi formülün en etkili olacağını bilmiyoruz. Mevcut Uzman Danışmanda dört formül varyantı uyguladım. Seçeneklerden hangisinin piyasayı mümkün olan en iyi şekilde tanımladığını göreceğiz. Çok fazla mod üretmenin bir anlamı yoktur. Varsayımımız doğruysa, bunu kesinlikle göreceğiz. Genellikle en fazla dört mod oluşturuyorum.

Devamında, girdileri ve onların hedeflerini tanımlayalım:

input MODE_CALCULATE MODEE=MODE_1;//Mode
input int TradeHour=0;//Start Trading Hour
input int TradeMinute=1;//Start Trading Minute
input int TradeHourEnd=23;//End Trading Hour
input int TradeMinuteEnd=59;//End Trading Minute

input bool bWriteValuesE=false;//Log
input int CandlesE=50;//Bars To Analyse
input int Signal=200;//Signal Power
input int PercentE=52;//Percent Signals To One Side

input bool bInvert=false;//Trade Invert

input int SLE=3000;//Stop Loss Points
input int TPE=3000;//Take Profit Points
input double Lot=0.01;//Lot

input int MagicF=15670867;//Magic

Çalışma modunu, içerisinde pozisyon açacağımız sunucu zaman koridorunu (veya işlem seansını) tanımlayan dört parametreye sahip blok takip eder. Garip görünse de bu değer çok şey ifade eder. Sonrasında, en önemli sistem değişkenlerini tanımlayan çalışma parametreleri bloğu vardır. Gerekirse, modları değiştirirken girdileri ayarlayabilmek için izlenen değerlerin mevcut durumlarına ilişkin verileri günlüğe yazabilirsiniz.

Devamında, analiz edeceğimiz piyasa segmenti vardır. Geçmişte daha derin olan tüm mumlar hesaplamada dikkate alınmaz. Ardından, her mod için farklı ölçeklere sahip sinyal gücü gelir. Bu yüzden günlüğe ihtiyacımız vardır. Son bileşen ek bir sinyal kontrol elemanıdır. Sinyal büyük olabilir, ancak sinyalin çoğunluğunun tüm sinyallere göre yüzdesini anlamadan gücünü ayarlamanın bir anlamı yoktur. Son değişkenler, ticareti tersine çevirmemize ve Zararı Durdur ve Kâr Alın yanı sıra işlem hacmini ve tüm emirlerin sihirli sayısını tanımlamamıza olanak tanır.

Önceden tanımlanmış tüm dizilerin değerlerini hızlı ve kolay bir şekilde hesaplamak için aşağıdaki fonksiyonları ekleyelim:

MqlTick LastTick;//the last tick

double High[];
double Low[];
double Close[];
double Open[];
datetime Time[];
long Volume[];

void DimensionAllMQL5Values()//prepare the arrays
   {
   ArrayResize(Time,CandlesE,0);
   ArrayResize(High,CandlesE,0);
   ArrayResize(Close,CandlesE,0);
   ArrayResize(Open,CandlesE,0);   
   ArrayResize(Low,CandlesE,0);
   ArrayResize(Volume,CandlesE,0);
   }

void CalcAllMQL5Values()//recalculate the arrays
   {
   ArraySetAsSeries(High,false);                        
   ArraySetAsSeries(Low,false);                              
   ArraySetAsSeries(Close,false);                        
   ArraySetAsSeries(Open,false);                                 
   ArraySetAsSeries(Time,false); 
   ArraySetAsSeries(Volume,false);                                   
   CopyHigh(_Symbol,_Period,0,CandlesE,High);
   CopyLow(_Symbol,_Period,0,CandlesE,Low);
   CopyClose(_Symbol,_Period,0,CandlesE,Close);
   CopyOpen(_Symbol,_Period,0,CandlesE,Open);
   CopyTime(_Symbol,_Period,0,CandlesE,Time);
   CopyTickVolume(_Symbol,_Period,0,CandlesE,Volume);
   ArraySetAsSeries(High,true);                        
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Close,true);                        
   ArraySetAsSeries(Open,true);                                 
   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(Volume,true);
   }

Bu fonksiyonlardan daha önceki makalelerde kısaltılmış bir şekilde de olsa bahsetmiştim. Ayrıca, sunucudan gelen son tikin tüm parametrelerinin değerlerini depolamak için burada LastTick değişkeni de vardır. Tıpkı MQL4'te olduğu gibi dizilere erişmek için gereklidirler.

Ana değişkenler ve mantık 'statik sınıf' içerisine yerleştirilir:

class TickBox
   {
   public:
   static int BarsUp;
   static int BarsDown;
   static double PowerUp;
   static double PowerDown;
   static double PercentUp;
   static double PercentDown;
   static double PercentPowerUp;
   static double PercentPowerDown;

   static void CalculateAll(MODE_CALCULATE MODE0)//calculate all the necessary parameters
      {
      BarsUp=0;
      BarsDown=0;
      PercentUp=0.0;
      PercentDown=0.0;
      PowerUp=0.0;
      PowerDown=0.0;
      if ( MODE0 == MODE_1 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_2 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(MathAbs(Open[i] - Close[i])/-_Point)*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_3 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_4 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            }
         }
         
      if ( BarsUp > 0 && BarsDown > 0 )
         {
         PercentUp=(double(BarsUp)/double(BarsUp+BarsDown))*100.0;
         PercentDown=(double(BarsDown)/double(BarsUp+BarsDown))*100.0;
         PercentPowerUp=(double(PowerUp)/double(PowerUp+PowerDown))*100.0;
         PercentPowerDown=(double(PowerDown)/double(PowerUp+PowerDown))*100.0;
         }         
      }
   };
   int TickBox::BarsUp=0;
   int TickBox::BarsDown=0;
   double TickBox::PowerUp=0;
   double TickBox::PowerDown=0;   
   double TickBox::PercentUp=0;
   double TickBox::PercentDown=0;
   double TickBox::PercentPowerUp=0;
   double TickBox::PercentPowerDown=0;

Tüm fonksiyonları ve değişkenleri statiktir. İhtiyacımız olmadığı için örneklerin oluşturulması sağlanmamıştır. Hesaplamanın tamamı sınıftaki tek bir fonksiyonda gerçekleştirilir. Yükselen ve düşen çubukların sayısının yanı sıra ortak bir değişkende toplanan sinyal gücünün benzer bileşenlerini tanımlar. Her mod için dört denklemin tamamı bu fonksiyonda uygulanmaktadır.

İlk iki denklem varyantı analiz edilen alanın uzak ucuna zayıflatma olmadan uygulanmıştır, sonraki ikisi tam bir kopyadır, ancak zayıflatma vardır. Bu durumda zayıflatma doğrusaldır. Her zaman başka bir zayıflatma yapabilirsiniz, ancak basitlik için başlangıçta en az hesaplama gerektireni denemek daha iyidir.

Her mum için genel toplama katkıda bulunan temel bir terim hesaplanır. İlk denklem varyantı, mumda bulunan tüm hacmin bir yönde veya başka bir yönde bir sinyal olduğunu dikkate alır. Ayrıca, son hareketin tek hareket olmaya ne kadar yakın olduğunu da hesaba katar. Mumun alt ve üst kısmındaki gölgeler son harekete göre ne kadar büyükse, hacim ağırlığı o kadar az olur. İstenirse başka oranlarda da yapabilirsiniz.

İkinci denklem varyantı toplam mum hareketini puan cinsinden hesaplar. İşaret, mumun hareket yönüne bağlıdır. Ayrıca, değer hacimle çarpılır, böylece hacmi çubuk hareketinin ne kadar güvenilir olduğunu gösteren bir ağırlık oranı olarak ele alıyoruz. Değişkenlerin geri kalanı, yukarı veya aşağı giden çubukların yüzdesini ve sinyalin kendisinin yüzdesini hesaplar.

Şimdi, pozisyonları açıp kapatacağımız ana fonksiyonu tanımlayalım:

void Trade()
   {
   SymbolInfoTick(Symbol(),LastTick);
   MqlDateTime tm;
   TimeToStruct(LastTick.time,tm);
   int MinuteEquivalent=tm.hour*60+tm.min;
   int BorderMinuteStartTrade=HourCorrect(TradeHour)*60+MinuteCorrect(TradeMinute);
   int BorderMinuteEndTrade=HourCorrect(TradeHourEnd)*60+MinuteCorrect(TradeMinuteEnd);
   if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= 1.0 && TickBox::PercentPowerUp >= 50.0 )
      {
      if ( !bInvert ) ClosePosition(POSITION_TYPE_BUY);
      else ClosePosition(POSITION_TYPE_SELL);
      }
      
   if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= 1.0 && TickBox::PercentPowerDown >= 50.0 )
      {
      if ( !bInvert ) ClosePosition(POSITION_TYPE_SELL);
      else ClosePosition(POSITION_TYPE_BUY);
      }
      
     if ( BorderMinuteStartTrade > BorderMinuteEndTrade )
        {
        if ( PositionsTotal() == 0 && !(MinuteEquivalent>=BorderMinuteEndTrade && MinuteEquivalent<= BorderMinuteStartTrade) )
           {
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerUp >= PercentE )
              {
              if ( !bInvert ) m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              else m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              }
      
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerDown >= PercentE )
              {
              if ( !bInvert ) m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              else m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              }
           }        
        }
     if ( PositionsTotal() == 0 && BorderMinuteStartTrade <= BorderMinuteEndTrade )
        {
        if ( MinuteEquivalent>=BorderMinuteStartTrade && MinuteEquivalent<= BorderMinuteEndTrade )
           {
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerUp >= PercentE )
              {
              if ( !bInvert ) m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              else m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              }
      
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerDown >= PercentE )
              {
              if ( !bInvert ) m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              else m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              }
           }        
        }
   }

Pozisyonlar, sinyal gücüne ve yüzde olarak ölçülen kalitesine göre açılır ve sinyal değişikliğine dair en azından en ufak bir ipucu varsa kapatılır.

Aşağıdaki fonksiyon sadece belirli bir yönde açık olan bir pozisyonu kapatmak için kullanılır. Çok basittir.

void ClosePosition(ENUM_POSITION_TYPE Direction)//close a position by a symbol
   {
   bool ord;
   ord=PositionSelect(Symbol());
   if ( ord && int(PositionGetInteger(POSITION_MAGIC)) == MagicF  && Direction == ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)) )
      {
      if(m_position.SelectByIndex(0)) m_trade.PositionClose(m_position.Ticket());          
      }
   }

Devamında, ana olayları ve çubuklarla çalışma fonksiyonunu tanımlayalım:

int OnInit()
  {
  m_trade.SetExpertMagicNumber(MagicF);//set the magic number for positions
  DimensionAllMQL5Values();//prepare the predefined arrays
  return(INIT_SUCCEEDED);
  }

datetime Time0;
datetime TimeX[1];
bool bNewBar()
   {
   CopyTime(_Symbol,_Period,0,1,TimeX);
   if ( Time0 < TimeX[0] )
      {
      if (Time0 != 0)
         {
         Time0=TimeX[0];
         return true;
         }
      else
         {
         Time0=TimeX[0];
         return false;
         }
      }
   else return false;
   }

void OnTick()
  {
  if ( bNewBar())//work by bars
     {
     CalcAllMQL5Values();
     TickBox::CalculateAll(MODEE);
     if (bWriteValuesE)
        {
        Print("% Sit in buy = ",TickBox::PercentUp);
        Print("% Sit in sell = ",TickBox::PercentDown);
        Print("Signal = ",MathAbs(TickBox::BarsDown-TickBox::BarsUp));
        Print("% Resistance = ",TickBox::PercentPowerUp);
        Print("% Support = ",TickBox::PercentPowerDown);        
        Print("***************************************************************************");
        }
     Trade();
     } 
  }

Uzman Danışmanı başlatırken, dizileri hazırlamamız ve büyüklerini ayarlamamız ve ayrıca pozisyonlar için sihirli sayıyı ayarlamamız gerekir. Ardından, çubuğun değişimini tespit etmek için dayanak fonksiyonunu ve çalışması için gereken değişkenleri tanımlarız. Sonrasında da ana tik olayını tanımlarız ve önceden tanımlanmış dizilerin değerlerini her çubukta yeniden hesaplarız, devamında sistem parametrelerini hesaplarız ve fonksiyonu etkinleştirdiysek ana sistem parametrelerini günlüğe yazmak için bir blok ekleriz. Elbette, isterseniz bunu farklı bir şekilde yapabilirsiniz. Önemli olan her şeyin basit ve açık olmasıdır.

Uzman Danışmanın arkasındaki fikir, her çubuğun mevcut resme katkıda bulunmasıdır. Bir sonraki adımın ne olacağını iki-üç çubukla kabaca belirlemenin bile imkansız olduğunu unutmayın. Her çubuk nihai sinyale katkıda bulunur ancak piyasa fiziği nedeniyle ağırlıkları farklıdır. Bir sonraki makalede bu konu üzerinde daha fazla duracağım.

Uzman Danışmanın test edilmesi

Uzman Danışmanı test edelim ve gelecek vaat eden özellikleri tespit etmeye çalışalım. Geçen yıldan başlayacağım ve EURUSD M5 kullanacağım. 10 yıllık geçmiş üzerinde, farklı zaman koridorlarını kullanarak ve çalışma modlarını inceleyerek aşağıdaki kabul edilebilir sonucu buldum. Uzman Danışmanı test etmek için kullanılan ayar dosyası aşağıda eklenmiştir. Sistemleri analiz etmek için kendi kurallarımı izleyerek, dönüşümlü olarak hem çalışma modlarını hem de sunucu zaman aralığını değiştirdim. Sonuç olarak, aşağıdaki parametreleri yaklaşık 30-60 dakika içerisinde tespit ettim.

Aşağıda geçen yıl üzerinde yapılan test yer almaktadır:


Ardından, 10 yıllık bir segmentin ilk yılını test ettim:


Grafik yakın segmentteki kadar iyi değildir, ancak son hareket hala korunmaktadır. Görünüşe göre burada da her şey çalışmaktadır.

Sonrasında, segmentin ortasını aldım ve sistemin orada nasıl davrandığını kontrol ettim:


Gördüğümüz üzere, burada da global bir modelin işaretleri vardır ve sadece tüm aralığı test edip global ölçekte nasıl göründüğünü görmemiz gerekiyor:


Grafik mükemmel olmaktan uzaktır, ancak çalışan segmentler görebiliyoruz. Ayrıca filtreler eklemeye veya derin optimizasyon yapmaya da çalışabiliriz. Belirli bir enstrümanın seçimi her zaman isteğe bağlıdır. Diğer çiftler üzerinde testler yaparsak, sonuç muhtemelen farklı olacaktır, ancak belirli bir süre harcandıktan sonra, büyük olasılıkla aynı anda birkaç çift için en uygun parametreleri bulacağız. Fiziği kavramayı ve güçlendirmeyi başarırsak, sonuçlar daha da büyük olacaktır.

Robot mevcut haliyle bile kabul edilebilir sonuçlar vermiştir. Çok az işlem vardı ancak Uzman Danışman birden fazla döviz üzerinde çalıştı. En basit kod bile bir fikir geliştirmek için güçlü bir temel oluşturabilir. Hatta bazı sistemler değişiklik yapılmadan da kullanılabilir.

Elbette çok dövizli olma yeteneğine sahip olmak güzel olurdu, ancak bu yoğun çalışma ve aktif değişikliklerle elde edilir. Bu makalede bunu yapmayacağım ve bu görevi okuyucuya bırakacağım. Ayrıca, sistem üzerinde çok fazla zaman harcamamanız gerektiğini de ekleyeceğim, çünkü içerisinde çalışan bir şey varsa, neredeyse hemen görünür olacaktır. Eğer sonucu göremiyorsanız, bundan bir anlam çıkarmak ve düşüncelerinizi değiştirmek daha iyidir. Bazen bir şeyi düzeltmek mümkündür, ancak bu her zaman geçerli değildir.

Tabii ki, yine de test edebilirsiniz, ancak kesinlikle tüm çubuk parametrelerinin sonucu farklı şekillerde etkilediği ve farklı döviz çiftlerinde farklı kombinasyonlarla parametrelerin ekstremumları olduğu açıktır. Tüm çiftler için aynı anda çalışan ekstremumlar da vardır, ancak onları bulmak zaman ve pratik gerektirir. MQL4 versiyonu da makaleye eklenmiştir.

Sonuç

Kodu kendi başınıza yazmaktan ve test etmekten korkmayın. Ayrıca, sisteminizin çok basit görünmesi de cesaretinizi kırmasın (görünüşte basit olan sistemler genellikle gerçekten işe yarayan sistemlerdir). Sistem ne kadar karmaşıksa, o kadar fazla serbestlik derecesine, girdiye ve öngörülemeyen çalışma şekline sahiptir. Kodunuzdaki karmaşıklıklardan olabildiğince kaçının ve mümkün olduğunca basit tutun.

Ayrıca, sistem ne kadar karmaşık olursa, test etmeniz de o kadar uzun sürer. Hiçbir şeye dayanmayan sistemler geliştirmeyin. "30 işlem gerçekleştirdim, artık her şey çalışmalı." diyenlere inanmayın. Bu profesyonelce olmayan bir yaklaşımdır. Özellikle, bazı göstergelere dayalı sistemler yazmayın. Bu, bir geliştirici olarak yapabileceğiniz en aptalca şeydir.

Genel olarak, geliştirme için ne kadar zaman harcamaya hazır olduğunuzu anladığınızdan emin olun. Bir hedefiniz ve kabul edilebilir bir zamanınız olmalıdır. Sonunda, hedefinizi daha gerçekçi hale getirmek için daraltabilirsiniz, ancak yine de bir hedefiniz olmalıdır.

Yıllarını burada geçirmiş ve hala bir şeyleri görmek için grafik üzerine binlerce gösterge ekleyen çok sayıda topluluk üyesi gördüm. Bu hiçbir yere gitmeyen bir yoldur. Öncelikle, belirli bir sonuç almak isteyip istemediğinizi veya ticaretin sadece hobiniz olup olmadığını belirlemeniz gerekir. Yıllarca sıkıcı fiyat grafiklerine bakmaktan çok daha ilginç hobiler olduğuna inanıyorum. Forex bir kara deliktir. Eğer içerisinde sıkışıp kalırsanız, bir daha asla geri dönemezsiniz.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/8410

Model aramada brute force yaklaşımı (Bölüm II): Yoğunlaşma Model aramada brute force yaklaşımı (Bölüm II): Yoğunlaşma
Bu makalede brute force yaklaşımı konusuna devam edeceğiz. Uygulamamın yeni geliştirilmiş sürümünü kullanarak modelleri daha iyi bir şekilde vurgulamaya çalışacağım. Ayrıca farklı zaman aralıkları ve zaman dilimleri kullanarak istikrar farkını bulmaya çalışacağım.
Grid ve martingale: bunlar nedir ve nasıl kullanılır? Grid ve martingale: bunlar nedir ve nasıl kullanılır?
Bu makalede, grid ve martingale'in ne olduğunu ve ortak yönlerini ayrıntılı olarak açıklamaya çalışacağım. Ayrıca, bu stratejilerin gerçekten ne kadar uygulanabilir olduğunu analiz etmeye çalışacağım. Makalede bir matematiksel bölüm ve bir de pratik bölümü yer alacaktır.
Model aramada brute force yaklaşımı (Bölüm III): Yeni ufuklar Model aramada brute force yaklaşımı (Bölüm III): Yeni ufuklar
Bu makale, brute force konusuna bir devam niteliğindedir ve program algoritmasına piyasa analizi için yeni yetenekler getirmekte, böylece analiz hızını artırmakta ve sonuçların kalitesini yükseltmektedir. Yeni eklemeler, bu yaklaşım dahilinde global modellerin en yüksek kalitede görüntülenmesini sağlamaktadır.
Model aramada brute force yaklaşımı Model aramada brute force yaklaşımı
Bu makalede, piyasa modellerini arayacağız, belirlenen modellere dayalı Uzman Danışmanlar oluşturacağız ve bu modellerin geçerliliklerini koruyup korumadıklarını, ne kadar süreyle geçerli kaldıklarını kontrol edeceğiz.