Trademinator 3: Alım Satım Makinelerinin Yükselişi
Önsöz
Bir zamanlar uzak forumların birinde (MQL5) iki makale: joo’nun "Genetik Algoritmalar - Kolay!" makalesi ve benim "Dr. Tradelove..." makalem yayınlandı. Birinci makalede, yazar, alım satım stratejileri dahil olmak üzere ihtiyacınız olan herhangi bir şeyi optimize etmek için güçlü bir araç - MQL5 dili aracılığıyla uygulanan bir genetik algoritma sağlamıştır.
Bu algoritmayı kullanarak, ikinci makalede buna dayalı olarak kendi kendini optimize eden bir Uzman Danışman geliştirmeye çalıştım. Makale, şu görevin formüle edilmesiyle sona erdi: Yalnızca belirli bir alım satım sistemi için en iyi parametreleri seçmekle kalmayıp aynı zamanda geliştirilen tüm stratejiler arasındaki en iyi stratejiyi seçebilen (elbette kendi kendini optimize edebilen) bir Uzman Danışman oluşturmak. Bunun mümkün olup olmadığını, mümkünse nasıl olduğunu görelim.
Alım Satım Robotlarıyla İlgili Hikayeler
İlk olarak, kendi kendini optimize eden bir Uzman Danışman için genel gereklilikleri formüle ediyoruz.
(Geçmiş verilere dayanarak) şunları yapabilmelidir:
- açıklananlar arasındaki en iyi stratejiyi seçmek
- en iyi finansal aracı seçmek
- kaldıraç düzeltmesi ile alım satım yapmak için en iyi para yatırma boyutunu seçmek
- seçilen stratejideki en iyi gösterge parametrelerini seçmek
Ayrıca gerçek hayatta şunları yapabilmelidir:
- pozisyonları açmak ve kapamak
- pozisyonun boyutunu seçmek
- yeni bir optimizasyonun gerekli olup olmadığına karar vermek
Aşağıdaki şekilde, önerilen Uzman Danışmanın şematik bir diyagramı gösterilmektedir.
Sınırlarla birlikte ayrıntılı bir şema, ekteki Scheme_en dosyasında yer almaktadır.
Uçsuz bucaksız olma halini kavramanın imkansızlığını göz önünde bulundurarak Uzman Danışman mantığına kısıtlamalar getiriyoruz. Şunu kabul ediyoruz (ÖNEMLİ):
- Uzman Danışman, yeni çubuk (seçtiğimiz herhangi bir zaman diliminde) göründükten sonra alım satım kararları alacaktır.
- Sayfa 1’e dayanarak ancak bununla sınırlı olmamak koşuluyla, Uzman Danışman, yalnızca Kâr Al ve Zararı Durdur’u kullanmayan ve buna bağlı olarak da İz-süren Stop’u kullanmayan gösterge sinyallerinde alım satımları kapatacaktır.
- Yeni bir optimizasyona başlama koşulu: Seviyenin başlatılması sırasında, bakiyedeki bir düşüş önceden ayarlanmış değerden daha yüksektir. Lütfen bunun benim kişisel koşulum olduğunu ve her birinizin kendi spesifik koşulunuzu seçebileceğini unutmayın.
- Bir uygunluk fonksiyonu, simüle edilmiş alım satımların bakiyesinin göreli düşüşünün önceden ayarlanmış belirli bir seviyenin altında olması koşuluyla, geçmişe dayalı alım satımı modeller ve modellenen bakiyeyi maksimize eder. Ayrıca bunun benim kişisel uygunluk fonksiyonum olduğunu ve kendinize özel olanı seçebileceğinizi unutmayın.
- Üç genel parametre (strateji, enstrüman ve mevduat payı) dışında optimize edilecek parametre sayısını gösterge arabelleklerinin parametreleri için beş ile sınırlandırıyoruz. Bu sınırlama, yerleşik teknik göstergeler için maksimum gösterge arabelleği sayısından mantıksal olarak çıkmaktadır. Çok sayıda gösterge arabelleğine sahip özel göstergeler kullanan stratejileri açıklayacaksanız, main.mq5 dosyasındaki OptParamCount değişkenini istediğiniz miktarda değiştirmeniz yeterlidir.
Artık gereklilikler belirlendiğine ve sınırlamalar seçildiğine göre, tüm bunları uygulayan koda bakabilirsiniz.
Her şeyin çalıştığı fonksiyonla başlayalım.
void OnTick() { if(isNewBars()==true) { trig=false; switch(strat) { case 0: {trig=NeedCloseMA() ; break;}; //The number of case strings must be equal to the number of strategies case 1: {trig=NeedCloseSAR() ; break;}; case 2: {trig=NeedCloseStoch(); break;}; default: {trig=NeedCloseMA() ; break;}; } if(trig==true) { if(GetRelDD()>maxDD) //If a balance drawdown is above the max allowed value: { GA(); //Call the genetic optimization function GetTrainResults(); //Get the optimized parameters maxBalance=AccountInfoDouble(ACCOUNT_BALANCE); //Now count the drawdown not from the balance maximum... //...but from the current balance } } switch(strat) { case 0: {trig=NeedOpenMA() ; break;}; //The number of case strings must be equal to the number of strategies case 1: {trig=NeedOpenSAR() ; break;}; case 2: {trig=NeedOpenStoch(); break;}; default: {trig=NeedOpenMA() ; break;}; } Print(TimeToString(TimeCurrent()),";","Main:OnTick:isNewBars(true)", ";","strat=",strat); } }
Burası ne? Diyagramda çizildiği gibi, yeni bir çubuk olup olmadığını görmek için her tike bakıyoruz. Varsa o zaman şimdi hangi stratejinin seçildiğini bilerek, açık bir pozisyon olup olmadığını kontrol etmek ve gerekirse kapatmak için özel fonksiyonunu çağırırız. Şimdi en iyi yenilik stratejisinin sırasıyla SAR olduğunu varsayalım, NeedCloseSAR fonksiyonu çağrılacaktır:
bool NeedCloseSAR() { CopyBuffer(SAR,0,0,count,SARBuffer); CopyOpen(s,tf,0,count,o); Print(TimeToString(TimeCurrent()),";","StrategySAR:NeedCloseSAR", ";","SAR[0]=",SARBuffer[0],";","SAR[1]=",SARBuffer[1],";","Open[0]=",o[0],";","Open[1]=",o[1]); if((SARBuffer[0]>o[0]&&SARBuffer[1]<o[1])|| (SARBuffer[0]<o[0]&&SARBuffer[1]>o[1])) { if(PositionsTotal()>0) { ClosePosition(); return(true); } } return(false); }
Herhangi bir pozisyon kapama fonksiyonu Boolean olmalıdır ve bir pozisyon kapatılırken true dönüşü yapmalıdır. Bu, OnTick() fonksiyonunun sonraki kod bloğunun yeni bir optimizasyonun gerekli olup olmadığına karar vermesine olanak tanır:
if(trig==true) { if(GetRelDD()>maxDD) //If the balance drawdown is above the max allowed one: { GA(); //Call the genetic optimization function GetTrainResults(); //Get optimized parameters maxBalance=AccountInfoDouble(ACCOUNT_BALANCE); //Now count the drawdown not from the balance maximum... //...but from the current balance } }
Mevcut bakiye düşüşünü alın ve bunu izin verilen maksimum bakiyeyle karşılaştırın. Maksimum değeri aşmışsa, yeni bir optimizasyon (GA()) yürütün. GA() fonksiyonuna gelince, Uzman Danışmanın özünü çağırır - GAModule.mqh modülünün FitnessFunction(int chromos) uygunluk fonksiyonu:
void FitnessFunction(int chromos) //A fitness function for the genetic optimizer:... //...selects a strategy, symbol, deposit share,... //...parameters of indicator buffers;... //...you can optimize whatever you need, but... //...watch carefully the number of genes { double ff=0.0; //The fitness function strat=(int)MathRound(Colony[GeneCount-2][chromos]*StratCount); //GA selects a strategy //For EA testing mode use the following code... z=(int)MathRound(Colony[GeneCount-1][chromos]*3); //GA selects a symbol switch(z) { case 0: {s="EURUSD"; break;}; case 1: {s="GBPUSD"; break;}; case 2: {s="USDCHF"; break;}; case 3: {s="USDJPY"; break;}; default: {s="EURUSD"; break;}; } //..for real mode, comment the previous code and uncomment the following one (symbols are selected in the MarketWatch window) /* z=(int)MathRound(Colony[GeneCount-1][chromos]*(SymbolsTotal(true)-1));//GA selects a symbol s=SymbolName(z,true); */ optF=Colony[GeneCount][chromos]; //GA selects a deposit share switch(strat) { case 0: {ff=FFMA( Colony[1][chromos], //The number of case strings must be equal to the number of strategies Colony[2][chromos], Colony[3][chromos], Colony[4][chromos], Colony[5][chromos]); break;}; case 1: {ff=FFSAR( Colony[1][chromos], Colony[2][chromos], Colony[3][chromos], Colony[4][chromos], Colony[5][chromos]); break;}; case 2: {ff=FFStoch(Colony[1][chromos], Colony[2][chromos], Colony[3][chromos], Colony[4][chromos], Colony[5][chromos]); break;}; default: {ff=FFMA( Colony[1][chromos], Colony[2][chromos], Colony[3][chromos], Colony[4][chromos], Colony[5][chromos]); break;}; } AmountStartsFF++; Colony[0][chromos]=ff; Print(TimeToString(TimeCurrent()),";","GAModule:FitnessFunction", ";","strat=",strat,";","s=",s,";","optF=",optF, ";",Colony[1][chromos],";",Colony[2][chromos],";",Colony[3][chromos],";",Colony[4][chromos],";",Colony[5][chromos]); }
Seçilmiş olan stratejiye dayanarak, belirli bir stratejiye özel olan uygunluk fonksiyonu hesaplama modülü çağrılır. Örneğin, GA bir stokastik seçmiştir, FFStoch () çağrılacaktır ve gösterge arabelleklerinin optimizasyon parametreleri buna aktarılacaktır:
double FFStoch(double par1,double par2,double par3,double par4,double par5) { int b; bool FFtrig=false; //Is there an open position? string dir=""; //Direction of the open position double OpenPrice; //Position Open price double t=cap; //Current balance double maxt=t; //Maximum balance double aDD=0.0; //Absolute drawdown double rDD=0.000001; //Relative drawdown Stoch=iStochastic(s,tf,(int)MathRound(par1*MaxStochPeriod)+1, (int)MathRound(par2*MaxStochPeriod)+1, (int)MathRound(par3*MaxStochPeriod)+1,MODE_SMA,STO_CLOSECLOSE); StochTopLimit =par4*100.0; StochBottomLimit=par5*100.0; dig=MathPow(10.0,(double)SymbolInfoInteger(s,SYMBOL_DIGITS)); leverage=AccountInfoInteger(ACCOUNT_LEVERAGE); contractSize=SymbolInfoDouble(s,SYMBOL_TRADE_CONTRACT_SIZE); b=MathMin(Bars(s,tf)-1-count-MaxMAPeriod,depth); for(from=b;from>=1;from--) //Where to start copying of history { CopyBuffer(Stoch,0,from,count,StochBufferMain); CopyBuffer(Stoch,1,from,count,StochBufferSignal); if((StochBufferMain[0]>StochBufferSignal[0]&&StochBufferMain[1]<StochBufferSignal[1])|| (StochBufferMain[0]<StochBufferSignal[0]&&StochBufferMain[1]>StochBufferSignal[1])) { if(FFtrig==true) { if(dir=="BUY") { CopyOpen(s,tf,from,count,o); if(t>0) t=t+t*optF*leverage*(o[1]-OpenPrice)*dig/contractSize; else t=0; if(t>maxt) {maxt=t; aDD=0;} else if((maxt-t)>aDD) aDD=maxt-t; if((maxt>0)&&(aDD/maxt>rDD)) rDD=aDD/maxt; } if(dir=="SELL") { CopyOpen(s,tf,from,count,o); if(t>0) t=t+t*optF*leverage*(OpenPrice-o[1])*dig/contractSize; else t=0; if(t>maxt) {maxt=t; aDD=0;} else if((maxt-t)>aDD) aDD=maxt-t; if((maxt>0)&&(aDD/maxt>rDD)) rDD=aDD/maxt; } FFtrig=false; } } if(StochBufferMain[0]>StochBufferSignal[0]&&StochBufferMain[1]<StochBufferSignal[1]&&StochBufferMain[1]>StochTopLimit) { CopyOpen(s,tf,from,count,o); OpenPrice=o[1]; dir="SELL"; FFtrig=true; } if(StochBufferMain[0]<StochBufferSignal[0]&&StochBufferMain[1]>StochBufferSignal[1]&&StochBufferMain[1]<StochBottomLimit) { CopyOpen(s,tf,from,count,o); OpenPrice=o[1]; dir="BUY"; FFtrig=true; } } Print(TimeToString(TimeCurrent()),";","StrategyStoch:FFStoch", ";","K=",(int)MathRound(par1*MaxStochPeriod)+1,";","D=",(int)MathRound(par2*MaxStochPeriod)+1, ";","Slow=",(int)MathRound(par3*MaxStochPeriod)+1,";","TopLimit=",StochTopLimit,";","BottomLimit=",StochBottomLimit, ";","rDD=",rDD,";","Cap=",t); if(rDD<=trainDD) return(t); else return(0.0); }
Stokastik uygunluk fonksiyonu, simüle edilmiş bir bakiyeyi, bunu genetik algoritmaya iletecek olan ana fonksiyona döndürür. Zaman içinde bir noktada, GS optimizasyonu durdurmaya karar verir ve GetTrainResults() fonksiyonunu kullanarak stratejinin en iyi mevcut değerlerini (örneğin, hareketli ortalamaları), sembolleri, mevduat payını ve gösterge arabelleklerinin parametrelerini temel programa döndürürüz ve daha fazla gerçek alım satım için göstergeler oluştururuz:
void GetTrainResults() //Get the best parameters { strat=(int)MathRound(Chromosome[GeneCount-2]*StratCount); //Remember the best strategy //For EA testing mode use the following code... z=(int)MathRound(Chromosome[GeneCount-1]*3); //Remember the best symbol switch(z) { case 0: {s="EURUSD"; break;}; case 1: {s="GBPUSD"; break;}; case 2: {s="USDCHF"; break;}; case 3: {s="USDJPY"; break;}; default: {s="EURUSD"; break;}; } //...for real mode, comment the previous code and uncomment the following one (symbols are selected in the MarketWatch window) /* z=(int)MathRound(Chromosome[GeneCount-1]*(SymbolsTotal(true)-1)); //Remember the best symbol s=SymbolName(z,true); */ optF=Chromosome[GeneCount]; //Remember the best deposit share switch(strat) { case 0: {GTRMA( Chromosome[1], //The number of case strings must be equal to the number of strategies Chromosome[2], Chromosome[3], Chromosome[4], Chromosome[5]) ; break;}; case 1: {GTRSAR( Chromosome[1], Chromosome[2], Chromosome[3], Chromosome[4], Chromosome[5]) ; break;}; case 2: {GTRStoch(Chromosome[1], Chromosome[2], Chromosome[3], Chromosome[4], Chromosome[5]) ; break;}; default: {GTRMA( Chromosome[1], Chromosome[2], Chromosome[3], Chromosome[4], Chromosome[5]) ; break;}; } Print(TimeToString(TimeCurrent()),";","GAModule:GetTrainResults", ";","strat=",strat,";","s=",s,";","optF=",optF, ";",Chromosome[1],";",Chromosome[2],";",Chromosome[3],";",Chromosome[4],";",Chromosome[5]); } void GTRMA(double par1,double par2,double par3,double par4,double par5) { MAshort=iMA(s,tf,(int)MathRound(par1*MaxMAPeriod)+1,0,MODE_SMA,PRICE_OPEN); MAlong =iMA(s,tf,(int)MathRound(par2*MaxMAPeriod)+1,0,MODE_SMA,PRICE_OPEN); CopyBuffer(MAshort,0,from,count,ShortBuffer); CopyBuffer(MAlong, 0,from,count,LongBuffer ); Print(TimeToString(TimeCurrent()),";","StrategyMA:GTRMA", ";","MAL=",(int)MathRound(par2*MaxMAPeriod)+1,";","MAS=",(int)MathRound(par1*MaxMAPeriod)+1); }
Artık hepsi, her şeyin çalıştığı yere geri döndü (OnTick()): Şimdi hangi stratejinin en iyisi olduğunu bilerek, markete gitme zamanının gelip gelmediği kontrol edilir:
bool NeedOpenMA() { CopyBuffer(MAshort,0,0,count,ShortBuffer); CopyBuffer(MAlong, 0,0,count,LongBuffer ); Print(TimeToString(TimeCurrent()),";","StrategyMA:NeedOpenMA", ";","LB[0]=",LongBuffer[0],";","LB[1]=",LongBuffer[1],";","SB[0]=",ShortBuffer[0],";","SB[1]=",ShortBuffer[1]); if(LongBuffer[0]>LongBuffer[1]&&ShortBuffer[0]>LongBuffer[0]&&ShortBuffer[1]<LongBuffer[1]) { request.type=ORDER_TYPE_SELL; OpenPosition(); return(false); } if(LongBuffer[0]<LongBuffer[1]&&ShortBuffer[0]<LongBuffer[0]&&ShortBuffer[1]>LongBuffer[1]) { request.type=ORDER_TYPE_BUY; OpenPosition(); return(false); } return(true); }
Çember kapandı.
Nasıl çalıştığını kontrol edelim. Dört ana çift ile 1 saatlik zaman dilimine dair bir 2011 raporu: EURUSD, GBPUSD, USDCHF, USDJPY:
Strateji Test Cihazı Raporu | ||||||||||||
InstaForex-Server (Build 567) | ||||||||||||
Ayarlar | ||||||||||||
Uzman: | Ana | |||||||||||
Sembol: | EURUSD | |||||||||||
Dönem: | H1 (2011.01.01 - 2011.12.31) | |||||||||||
Giriş Parametreleri: | trainDD=0.50000000 | |||||||||||
maxDD=0.20000000 | ||||||||||||
Broker: | InstaForex Companies Group | |||||||||||
Para birimi: | USD | |||||||||||
İlk Para Yatırma: | 10 000.00 | |||||||||||
Kaldıraç: | 1:100 | |||||||||||
Sonuçlar | ||||||||||||
Geçmiş Kalitesi: | %100 | |||||||||||
Çubuklar: | 6197 | Tikler: | 1321631 | |||||||||
Toplam Net Kâr: | -538.74 | Brüt Kâr: | 3 535.51 | Brüt Zarar: | -4 074.25 | |||||||
Kâr Faktörü: | 0.87 | Beklenen Geri Ödeme: | -89.79 | Marj Düzeyi: | %85.71 | |||||||
Kurtarma Faktörü: | -0.08 | Sharpe Oranı: | 0.07 | OnTester Sonucu: | 0 | |||||||
Bakiye Düşüşü: | ||||||||||||
Bakiye Düşüşü Mutlak: | 4 074.25 | Bakiye Düşüşü Maksimum: | 4 074.25 (%40.74) | Bakiye Düşüşü Bağıl: | %40.74 (4 074.25) | |||||||
Hisse Senedi Düşüşü: | ||||||||||||
Hisse Senedi Düşüşü Mutlak: | 4 889.56 | Hisse Senedi Düşüşü Maksimum: | 6 690.90 (%50.53) | Hisse Senedi Düşüşü Bağıl: | %50.53 (6 690.90) | |||||||
Toplam Alım Satım: | 6 | Kısa Alım Satımlar (% kazanç): | 6 (%16.67) | Uzun Alım Satımlar (% kazanç): | 0 (%0.00) | |||||||
Toplam Alım Satım: | 12 | Kâr Alım Satımları (toplamın %’si) | 1 (%16.67) | Zarar alım satımları (toplamın %’si) | 5 (%83.33) | |||||||
En Büyük Kâr Alım Satımı: | 3 535.51 | En Büyük Zarar Alım Satımı: | -1 325.40 | |||||||||
Ortalama Kâr Alım Satımı: | 3 535.51 | Ortalama Zarar Alım Satımı: | -814.85 | |||||||||
Maksimum ardışık kazançlar: | 1 (3 535.51) | Maksimum ardışık zararlar: | 5 (-4 074.25) | |||||||||
Maksimum ardışık kâr (sayı): | 3 535.51 (1) | Maksimum ardışık zarar (sayı): | -4 074.25 (5) | |||||||||
Ortalama ardışık kazançlar: | 1 | Ortalama ardışık zararlar: | 5 | |||||||||
Siparişler | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Açılış Zamanı | Sipariş | Sembol | Tür | Hacim | Fiyat | S / L | T / P | Zaman | Durum | Yorum | ||
2011.01.03 01:00 | 2 | USDCHF | satış | 28.21 / 28.21 | 0.9321 | 2011.01.03 01:00 | dolu | |||||
2011.01.03 03:00 | 3 | USDCHF | alış | 28.21 / 28.21 | 0.9365 | 2011.01.03 03:00 | dolu | |||||
2011.01.03 06:00 | 4 | USDCHF | satış | 24.47 / 24.47 | 0.9352 | 2011.01.03 06:00 | dolu | |||||
2011.01.03 09:00 | 5 | USDCHF | alış | 24.47 / 24.47 | 0.9372 | 2011.01.03 09:00 | dolu | |||||
2011.01.03 13:00 | 6 | USDCHF | satış | 22.99 / 22.99 | 0.9352 | 2011.01.03 13:00 | dolu | |||||
2011.01.03 16:00 | 7 | USDCHF | alış | 22.99 / 22.99 | 0.9375 | 2011.01.03 16:00 | dolu | |||||
2011.01.03 18:00 | 8 | USDJPY | satış | 72.09 / 72.09 | 81.57 | 2011.01.03 18:00 | dolu | |||||
2011.01.03 21:00 | 9 | USDJPY | alış | 72.09 / 72.09 | 81.66 | 2011.01.03 21:00 | dolu | |||||
2011.01.04 01:00 | 10 | USDJPY | satış | 64.54 / 64.54 | 81.67 | 2011.01.04 01:00 | dolu | |||||
2011.01.04 02:00 | 11 | USDJPY | alış | 64.54 / 64.54 | 81.78 | 2011.01.04 02:00 | dolu | |||||
2011.10.20 21:00 | 12 | USDCHF | satış | 56.30 / 56.30 | 0.8964 | 2011.10.20 21:00 | dolu | |||||
2011.10.21 12:00 | 13 | USDCHF | alış | 56.30 / 56.30 | 0.8908 | 2011.10.21 12:00 | dolu | |||||
Yatırımlar | ||||||||||||
Zaman | Yatırım | Sembol | Tür | Yön | Hacim | Fiyat | Sipariş | Komisyon | Swap | Kâr | Bakiye | Yorum |
2011.01.01 00:00 | 1 | bakiye | 0.00 | 0.00 | 10 000.00 | 10 000.00 | ||||||
2011.01.03 01:00 | 2 | USDCHF | satış | giriş | 28.21 | 0.9321 | 2 | 0.00 | 0.00 | 0.00 | 10 000.00 | |
2011.01.03 03:00 | 3 | USDCHF | alış | çıkış | 28.21 | 0.9365 | 3 | 0.00 | 0.00 | -1 325.40 | 8 674.60 | |
2011.01.03 06:00 | 4 | USDCHF | satış | giriş | 24.47 | 0.9352 | 4 | 0.00 | 0.00 | 0.00 | 8 674.60 | |
2011.01.03 09:00 | 5 | USDCHF | alış | çıkış | 24.47 | 0.9372 | 5 | 0.00 | 0.00 | -522.19 | 8 152.41 | |
2011.01.03 13:00 | 6 | USDCHF | satış | giriş | 22.99 | 0.9352 | 6 | 0.00 | 0.00 | 0.00 | 8 152.41 | |
2011.01.03 16:00 | 7 | USDCHF | alış | çıkış | 22.99 | 0.9375 | 7 | 0.00 | 0.00 | -564.02 | 7 588.39 | |
2011.01.03 18:00 | 8 | USDJPY | satış | giriş | 72.09 | 81.57 | 8 | 0.00 | 0.00 | 0.00 | 7 588.39 | |
2011.01.03 21:00 | 9 | USDJPY | alış | çıkış | 72.09 | 81.66 | 9 | 0.00 | 0.00 | -794.53 | 6 793.86 | |
2011.01.04 01:00 | 10 | USDJPY | satış | giriş | 64.54 | 81.67 | 10 | 0.00 | 0.00 | 0.00 | 6 793.86 | |
2011.01.04 02:00 | 11 | USDJPY | alış | çıkış | 64.54 | 81.78 | 11 | 0.00 | 0.00 | -868.11 | 5 925.75 | |
2011.10.20 21:00 | 12 | USDCHF | satış | giriş | 56.30 | 0.8964 | 12 | 0.00 | 0.00 | 0.00 | 5 925.75 | |
2011.10.21 12:00 | 13 | USDCHF | alış | çıkış | 56.30 | 0.8908 | 13 | 0.00 | -3.78 | 3 539.29 | 9 461.26 | |
0.00 | -3.78 | -534.96 | 9 461.26 | |||||||||
Copyright 2001-2011, MetaQuotes Yazılım Şirketi |
Grafikte işaretlenen bölgeyi açıklayayım (açıklamalar günlük analizinden alınmıştır):
- Uzman Danışman başladıktan sonra, genetik algoritma, alım satımda %28'e eşit bir mevduat payıyla USDCHF üzerinden SAR yenilik stratejisini seçti, daha sonra 3 Ocak akşamına kadar alım satım yaptı, bakiyenin %20'sinden fazlasını kaybetti ve yeniden optimize etmeye başladı.
- Daha sonra Uzman Danışman USDJPY üzerinden, ancak mevduatın tamamıyla (%98) SAR yeniliği ile alım satım yapmaya karar verdi. Doğal olarak, uzun süre alım satım yapamadı ve bu nedenle 4 Ocak sabahında üçüncü optimizasyonuna başladı.
- Bu kez, tüm mevduat için bir kez daha USDCHF üzerinden hareketli ortalamalı altın ve ölüm kesişimlerinin alım satımını yapmaya karar verdi. Ve 20 Ekim'e kadar ilk ölüm kesişimini bekledi ve maksimuma satarak kaydettiği her şeyi geri kazandı. Bundan sonra, yılın sonuna kadar Uzman Danışman markete girmek için uygun koşullar görmedi.
Devam edecek mi?
Devam edebilir mi? Yeni nesil Uzman Danışmanlar ne olacak? Stratejiler bulan ve bunlar arasından en iyisini seçen Uzman Danışman. Ve dahası, parayı yönetebiliyor, daha güçlü donanım, kanal, vs. satın alabiliyor...
Risk Uyarısı:
Bu kısa açıklama, marj üzerinden forex para birimi alım satımının tüm risklerini ve diğer önemli yönlerini tamamen açıklamaz. Alım satımın doğasını ve riske maruz kalma düzeyinizi anlamalısınız. Deneyiminiz, amaçlarınız, finansal kaynaklarını ve diğer ilgili koşullar ışığında alım satımın size uygun olup olmadığını dikkatlice gözden geçirmelisiniz.
Forex yalnızca karlı değil, aynı zamanda oldukça riskli bir piyasadır. Marj alım satımı bakımından, nispeten küçük döviz dalgalanmaları yatırımcının hesabı üzerinde önemli bir etkiye sahip olabilir, bu da başlangıçtaki mevduata ve açık pozisyonları korumak için hesaba ek olarak yatırılan fonlara eşit bir zarara neden olabilir. Kaybetmeyi göze alamayacağınız parayı yatırmamalısınız. Alım satım yapmaya karar vermeden önce lütfen tüm riskleri anladığınızdan ve deneyim seviyenizi göz önünde bulundurduğunuzdan emin olun. Gerekirse bağımsız tavsiye alın.
Lisanslar:
Modül UGAlib.mqh, Andrey Dik, diğer adıyla joo tarafından BSD lisansı altında geliştirilmiş ve dağıtılmıştır.
Bu makaleye eklenen Uzman Danışman ve yardımcı modüller, yazar Roman Rich tarafından BSD lisansı altında geliştirilmiş ve dağıtılmıştır. Lisans metni, Lic.txt dosyasında bulunmaktadır.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/350
- Ü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