English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Trademinator 3: Alım Satım Makinelerinin Yükselişi

Trademinator 3: Alım Satım Makinelerinin Yükselişi

MetaTrader 5Ticaret | 16 Aralık 2021, 16:07
39 0
Roman Zamozhnyy
Roman Zamozhnyy

Ö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İ):

  1. Uzman Danışman, yeni çubuk (seçtiğimiz herhangi bir zaman diliminde) göründükten sonra alım satım kararları alacaktır.
  2. 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.
  3. 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.
  4. 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.
  5. Üç 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:002USDCHFsatış28.21 / 28.210.93212011.01.03 01:00dolu
2011.01.03 03:003USDCHFalış28.21 / 28.210.93652011.01.03 03:00dolu
2011.01.03 06:004USDCHFsatış24.47 / 24.470.93522011.01.03 06:00dolu
2011.01.03 09:005USDCHFalış24.47 / 24.470.93722011.01.03 09:00dolu
2011.01.03 13:006USDCHFsatış22.99 / 22.990.93522011.01.03 13:00dolu
2011.01.03 16:007USDCHFalış22.99 / 22.990.93752011.01.03 16:00dolu
2011.01.03 18:008USDJPYsatış72.09 / 72.0981.572011.01.03 18:00dolu
2011.01.03 21:009USDJPYalış72.09 / 72.0981.662011.01.03 21:00dolu
2011.01.04 01:0010USDJPYsatış64.54 / 64.5481.672011.01.04 01:00dolu
2011.01.04 02:0011USDJPYalış64.54 / 64.5481.782011.01.04 02:00dolu
2011.10.20 21:0012USDCHFsatış56.30 / 56.300.89642011.10.20 21:00dolu
2011.10.21 12:0013USDCHFalış56.30 / 56.300.89082011.10.21 12:00dolu
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:001bakiye0.000.0010 000.0010 000.00
2011.01.03 01:002USDCHFsatışgiriş28.210.932120.000.000.0010 000.00
2011.01.03 03:003USDCHFalışçıkış28.210.936530.000.00-1 325.408 674.60
2011.01.03 06:004USDCHFsatışgiriş24.470.935240.000.000.008 674.60
2011.01.03 09:005USDCHFalışçıkış24.470.937250.000.00-522.198 152.41
2011.01.03 13:006USDCHFsatışgiriş22.990.935260.000.000.008 152.41
2011.01.03 16:007USDCHFalışçıkış22.990.937570.000.00-564.027 588.39
2011.01.03 18:008USDJPYsatışgiriş72.0981.5780.000.000.007 588.39
2011.01.03 21:009USDJPYalışçıkış72.0981.6690.000.00-794.536 793.86
2011.01.04 01:0010USDJPYsatışgiriş64.5481.67100.000.000.006 793.86
2011.01.04 02:0011USDJPYalışçıkış64.5481.78110.000.00-868.115 925.75
2011.10.20 21:0012USDCHFsatışgiriş56.300.8964120.000.000.005 925.75
2011.10.21 12:0013USDCHFalışçıkış56.300.8908130.00-3.783 539.299 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):

  1. 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ı.
  2. 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ı.
  3. 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

Ekli dosyalar |
lic.txt (1.43 KB)
sheme_en.gif (147.11 KB)
gamodule.mqh (7.24 KB)
main.mq5 (4.99 KB)
musthave.mqh (7.79 KB)
strategyma.mqh (5.13 KB)
strategysar.mqh (4.09 KB)
strategystoch.mqh (6.04 KB)
ugalib.mqh (33.36 KB)
MQL5 kodunun güvenliğini sağlama: Parola Koruması, Anahtar Oluşturucular, Zaman Sınırları, Uzaktan Lisanslar ve Gelişmiş EA Lisans Anahtarı Şifreleme Teknikleri MQL5 kodunun güvenliğini sağlama: Parola Koruması, Anahtar Oluşturucular, Zaman Sınırları, Uzaktan Lisanslar ve Gelişmiş EA Lisans Anahtarı Şifreleme Teknikleri
Çoğu geliştiricinin kodlarının güvenliğini sağlaması gerekir. Bu makale, MQL5 yazılımını korumanın birkaç farklı yolunu sunacaktır - MQL5 Komut Dosyalarına, Uzman Danışmanlara ve Göstergelere lisanslama özellikleri sağlamak için yöntemler sunar. MQL5-RPC çağrılarını kullanarak parola koruması, anahtar oluşturucular, hesap lisansı, zaman sınırı değerlendirmesi ve uzaktan korumayı kapsar.
Uzman Danışman Görsel Sihirbazı’nı Kullanarak Uzman Danışmanlar Oluşturma Uzman Danışman Görsel Sihirbazı’nı Kullanarak Uzman Danışmanlar Oluşturma
MetaTrader 5 için Uzman Danışman Görsel Sihirbazı, dakikalar içinde Uzman Danışmanlar tasarlamanıza olanak tanıyan kapsamlı bir önceden tanımlanmış alım satım blokları seti ile son derece kolay anlaşılır bir grafik ortamı sağlar. Uzman Danışman Görsel Sihirbazı'nın tıkla, sürükle ve bırak yaklaşımı, kalem ve kağıtla yaptığınız gibi forex alım satım stratejilerinin ve sinyallerinin görsel temsillerini oluşturmanıza imkan verir. Bu alım satım diyagramları, bunları kullanıma hazır Uzman Danışmanlara dönüştüren Molanis’ MQL5 kod oluşturucusu tarafından otomatik olarak analiz edilir. İnteraktif grafik ortamı tasarım sürecini kolaylaştırır ve MQL5 kodu yazma ihtiyacını ortadan kaldırır.
EX5 Kitaplıklarını Kullanarak Geliştirme Projelerinizi Öne Çıkarın EX5 Kitaplıklarını Kullanarak Geliştirme Projelerinizi Öne Çıkarın
Bir .ex5 dosyasında sınıfların/fonksiyonların uygulama ayrıntılarının gizlenmesi, teknik bilgi algoritmalarınızı diğer geliştiricilerle paylaşmanıza, ortak projeler oluşturmanıza ve bunları Web'de öne çıkarmanıza olanak sağlayacaktır. Ve MetaQuotes ekibi, ex5 kitaplık sınıflarının doğrudan kalıtım olasılığını gerçekleştirmek için elinden geleni yaparken, bunu hemen şimdi uygulayacağız.
Üssel Düzeltme Kullanarak Zaman Serisi Tahmini (devamı) Üssel Düzeltme Kullanarak Zaman Serisi Tahmini (devamı)
Bu makale, daha önce oluşturulan göstergeyi yükseltmeyi amaçlamaktadır ve bootstrap ve kuantilleri kullanarak tahmin güven aralıklarını hesaplamak için bir yönteme kısaca değinmektedir. Sonuç olarak tahmin doğruluğunun tahmini için kullanılacak tahmin göstergesini ve komut dosyalarını alacağız.