EA oluştururken kablolu Hareketli Ortalama sorunu yaşamak.. - sayfa 3

 
angreeee :
2009'dan şu anki tarihte (04.2014) çalıştırdığımda bile, grafikteki MA ile backtest'teki ima arasındaki farkın hala 0.10 olduğunu fark ettim, bu yüzden sorun devam ediyor sanırım. Diğerleri başarısız olursa, kendi iMa değiştirme işlevimi yapacağım. icustom, 2009'da başlayıp H4 grafiğinde iyi çalışırken bile D1 grafiğinde hala yalnızca sıfırlar döndürüyor.
Daha önce SMMA moduyla ilgili bir sorun olduğunu onayladım, sanırım bunu zaten Hizmet Masasına bildirdiniz? Diğer modlar bana uygun görünüyor.
 

özel hareketli ortalama göstergesinin nasıl çalıştığını analiz ederek neden böyle sorunlar olduğunu anlıyorum.

Her hareketli ortalama, denklem için sadece gerekli (bu durumda 370) kareleri saymak yerine, önceki hareketli ortalama çerçevesinden sonraki hareketli ortalama karesini sayarak kaba olmayan bir şekilde sayılır. Bu şekilde, eğer 1 MA çerçevesi yanlışsa, takip edenlerin hepsi de yanlış olacaktır. Hata çerçevesinden ne kadar uzak olursa, hata o kadar küçük olur. Baştan itibaren tüm kareler düzgün bir şekilde sayılsaydı bile düzgün çalışabilirdi, ancak bazen başlangıçta iMA rapor sıfırlarını fark ettim (hatalı ma okumalarını atmak için bir prosedürüm var, ancak iMA'nın kendisi yok) ve muhtemelen bu sıfırlar da dikkate alınıyor iMA'nın önceki karelerinden sonraki iMA karelerini sayarken.
Bu nedenle, 2013'te geriye dönük testler başlattığımda fark en büyüktü, 2012'de 2013'te başladığımdan daha küçüktü, start=2011 daha da küçüktü, vb. 2009'dan itibaren geriye dönük teste başladığımda bile fark hala görülebiliyordu, bu yüzden bu ciddi bir sorun.

 
angevoyageur :
Daha önce SMMA moduyla ilgili bir sorun olduğunu onayladım, sanırım bunu zaten Hizmet Masasına bildirdiniz? Diğer modlar bana uygun görünüyor.

Sorunu tam olarak belgeleyebilmem ve anlayabilmem için kendi iMA değiştirme prosedürümü yazmayı bitiriyorum. (sadece bu konudaki gibi görsel karşılaştırma ile değil).

ima sonuçları, ima değiştirme ve özel hareketli ortalama sonuçları, karşılaştırma için günlükte mevcut olacaktır.

not. Hatayı onaylarsanız şimdi bildiriyorum. (sorun bildirildiğinde bu konuya yeni bir yorum ekleyeceğim). Site (veya internetim) şu anda çok yavaş çalışıyor, bu yüzden servis masası sayfasına gitmekte bile sorun yaşıyorum.
 
tamam bildirildi.
 

Diğer MA türlerinin de etkilendiğini düşündüm ama daha fazla test yaptım ve dediğin gibi etkilenen tek SSMA gibi görünüyor.

ama iCustom sorununu fark ettim. SSMA ve iCustom sorunlarını test etmek için komut dosyası:

#property version      "1.1"
#property description "MA TEST"

#include <Trade/Trade.mqh>

   #define MAGICMA   20131002

double Bid;
double Ask;

   int ma_temp;
   int custom_ma_temp;
   double ma_buffer[ 20 ];
   double ima2_buffer[ 510 ];
   double ima2[ 510 ];

input int ma_period = 370 ;
input ENUM_TIMEFRAMES ma_tf = PERIOD_D1 ;
input ENUM_MA_METHOD ma_method = MODE_SMMA ;
input ENUM_APPLIED_PRICE ma_price = PRICE_OPEN ;
   
   
   
double OnTester ()
{
     double custommax = TesterStatistics ( STAT_EQUITY_DDREL_PERCENT );
     return (custommax);
}
   CTrade  trade;
   
   void OnTick ()
  {
   MqlTick last_tick;
   if ( SymbolInfoTick ( Symbol (),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
  }
  
int OnInit ()
  {
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation= 99 ;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode( false );

   return ( 0 );
  }  
  
      
      
      
void trend1()
{

   double ma;

   ma_temp= iMA ( Symbol (),ma_tf,ma_period, 0 ,ma_method,ma_price);
   CopyBuffer (ma_temp, 0 , 0 , 1 ,ma_buffer);
   ma=ma_buffer[ 0 ];
   Alert ( "ma=" , ma);

   custom_ma_temp= iCustom ( Symbol (),ma_tf, "Examples\\Custom Moving Average" , ma_period, 0 , ma_method,ma_price);
   CopyBuffer (custom_ma_temp, 0 , 0 , 1 ,ma_buffer);
   ma=ma_buffer[ 0 ];  
   Alert ( "custom ma=" , ma);

}

      


void start()
{
         trend1();
}
Dosyalar:
 
angreeee :

özel hareketli ortalama göstergesinin nasıl çalıştığını analiz ederek neden böyle sorunlar olduğunu anlıyorum.

Her hareketli ortalama, denklem için sadece gerekli (bu durumda 370) kareleri saymak yerine, önceki hareketli ortalama çerçevesinden sonraki hareketli ortalama karesini sayarak kaba olmayan bir şekilde sayılır. Bu şekilde, eğer 1 MA çerçevesi yanlışsa, takip edenlerin hepsi de yanlış olacaktır. Hata çerçevesinden ne kadar uzak olursa, hata o kadar küçük olur. Baştan itibaren tüm kareler düzgün bir şekilde sayılsaydı bile düzgün çalışabilirdi, ancak bazen başlangıçta iMA rapor sıfırlarını fark ettim (hatalı ma okumalarını atmak için bir prosedürüm var, ancak iMA'nın kendisi yok) ve muhtemelen bu sıfırlar da dikkate alınıyor iMA'nın önceki karelerinden sonraki iMA karelerini sayarken.
Bu nedenle, 2013'te geriye dönük testler başlattığımda fark en büyüktü, 2012'de 2013'te başladığımdan daha küçüktü, start=2011 daha da küçüktü, vb. 2009'dan itibaren geriye dönük teste başladığımda bile fark hala görülebiliyordu, bu yüzden bu ciddi bir sorun.

Sorunu görmüyorum. iMA performans için iyi kodlanmıştır. Bir iMA 0 rapor ederse, bunun nedeni veriniz (veya yeterli veriniz) olmamasıdır. Bu arada, sadece SMMA ile ilgili bir sorun var, nedenini bilmiyorum, ancak diğer mod için iyi çalıştığı için bu "artımlı" uygulama nedeniyle olamaz.
 
angevoyageur :
I don't see the problem. iMA is well coded for performance. If an iMA report a 0 it's because you don't have data (or enough data). By the way there is only a problem with SMMA, I don't know why, but it cannot be due to this "incremental" implementation as it's working well for other mode.

Evet haklısın çok daha yavaş olurdu. Ama gerçek şu ki, bu sayma şekli artı başlangıçta bazı boş kareler (sıfırlar) böyle problemlere yol açacaktır. (bu yüzden iMA SSMA her zaman daha küçüktür, gerçek SSMA'dan daha büyük değil) Biliyorum iMA'nın ne döndürdüğünü kontrol etmiyorum, bu yüzden gerekli bilgi eksikliğini düzgün bir şekilde ele almak yerine başlangıçta sıfır alıyorum, ama bu farklı bir konu.

Daha küçük TF'ler ile analiz edilen çok daha fazla çerçeve vardır ve problem zamanla seyreltilebilir. Her yeni karede ima SSMA gerçek SSMA'ya daha da yaklaşıyor, bu yüzden ne kadar çok çubuk geçerse sorun o kadar az görünür oluyor, bu yüzden daha önce kimsenin fark etmediğini düşünüyorum. 370 SSMA ve PERIOD_12H PERIOD_8H, vb. ile bulduğum aynı sorun.

Vaktiniz varsa lütfen iCustom işlevine bakın. Kolayca test etmek için kaynak kodunu ekledim. PERIOD_D1 - iCustom'un düzgün çalıştığını ve iMA ile aynı değerleri döndürdüğünü gösteren daha düşük TF'leri kontrol edin. PERIOD_D1'de iCustom için her zaman sıfırdır, iMA hala bazı değerleri bildirir.

Merak edilen şey, SSMA'yı maksimum PERIOD_H12'de kullandığınızda hem iMA hem de iCustom "özel hareketli ortalama" göstergesi hatalı değerler bildirir. (farkı görmek için 2014.01'den itibaren test edin)

Hata burada bir yerde olmalı: (özel hareketli ortalama oluşturun)

 void CalculateSmoothedMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
     {
      limit=InpMAPeriod+begin;
       //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for (i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit;i<rates_total && ! IsStopped ();i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i- 1 ]*(InpMAPeriod- 1 )+price[i])/InpMAPeriod;
//---
  }


FirstValue öğesinin SMA prosedüründekiyle aynı şekilde sayıldığına dikkat edin:

 void CalculateSimpleMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 ) // first calculation
     {
      limit=InpMAPeriod+begin;
       //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for (i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit;i<rates_total && ! IsStopped ();i++)
      ExtLineBuffer[i]=ExtLineBuffer[i- 1 ]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

ilkdeğer olarak = (x1 + x2 + x3 + ... + xn) / n

Bu, Basit Hareketli ortalama için "ham" denklemdir, ancak Düzgünleştirilmiş Hareketli Ortalama için değildir

belki sorunun nedeni budur?

 

o siteden:

https://mahifx.com/indicators/smoothed-moving-average-smma

Düzgünleştirilmiş Hareketli Ortalama için ilk değer, Basit Hareketli Ortalama (SMA) olarak hesaplanır:

SUM1=TOPLA (KAPAT, N)

SMMA1 = TOPLA1/ N

İkinci ve sonraki hareketli ortalamalar şu formüle göre hesaplanır:

SMMA (i) = (SUM1 – SMMA1+KAPAT (i))/ N

Neresi:

SUM1 – N dönem için kapanış fiyatlarının toplamıdır;
SMMA1 – ilk çubuğun düzleştirilmiş hareketli ortalamasıdır;
SMMA (i) – mevcut çubuğun düzleştirilmiş hareketli ortalamasıdır (birincisi hariç);
KAPAT (i) – mevcut kapanış fiyatıdır;
N – yumuşatma periyodudur.

Bu yüzden sanırım iMa ve özel hareketli ortalamalar bunu doğru şekilde yapıyor. Ancak böyle bir hesaplama, test edilen sürelere bağlı olarak büyük farklılıklara neden olan karşılaştığımız hataları üretir. İşlemlerini hareketli ortalamaya dayandıran bir EA için kesinlikle kabul edilemez. Sanırım bu nedenle Smoothed MA'yı geriye dönük test sırasında hatalı sonuçlar ürettiği için EA'mdan çıkarmam gerekecek. 2000 yılından itibaren test edip doğru yapsalar bile, müşteriler 2013'ten test edip "hesabı siliyor" diyebilir çünkü benden başka SSMA alacaklar.

Bir alıntı daha:
SMMA, son fiyatlara tarihi fiyatlara eşit ağırlık verir. Hesaplama, sabit bir döneme atıfta bulunmak yerine mevcut tüm veri serilerini dikkate alır.

bu yüzden geriye dönük test süresi her değiştiğinde farklıdır.

Indicators
Indicators
  • mahifx.com
Moving averages are commonly used to identify trends and reversals as well as identifying support and resistance levels. Moving averages such the WMA and EMA, which are more sensitive to recent prices (experience less lag with price) will turn before an SMA. They are therefore more suitable for dynamic trades, which are reactive to short term...
 
angreeee :

Lütfen alıntı içinde cevap vermeyin. Gördüğünüz gibi, sizden alıntı yapmak istediğimde artık boş.

Algoritma SMMA için iyidir, bir yerden başlamalısınız. Ancak sorunun kaynağına işaret ediyorsunuz, çünkü SMMA önceki değer üzerine kurulu olduğundan, başlangıç koşuluna duyarlıdır. Canlı bir grafikte ve farklı değerleri açıklayan Strateji test cihazında aynı başlangıç mumuna sahip olmadığınız için.

Aynısı EMA için de geçerlidir, ikinci bir kontrolden sonra (D1'de) artık SMMA'da olduğu gibi farklı değerlere sahibim.

 
angreeee :

o siteden:

https://mahifx.com/indicators/smoothed-moving-average-smma

Düzgünleştirilmiş Hareketli Ortalama için ilk değer, Basit Hareketli Ortalama (SMA) olarak hesaplanır:

SUM1=TOPLA (KAPAT, N)

SMMA1 = TOPLA1/ N

İkinci ve sonraki hareketli ortalamalar şu formüle göre hesaplanır:

SMMA (i) = (SUM1 – SMMA1+KAPAT (i))/ N

Neresi:

SUM1 – N dönem için kapanış fiyatlarının toplamıdır;
SMMA1 – ilk çubuğun düzleştirilmiş hareketli ortalamasıdır;
SMMA (i) – mevcut çubuğun düzleştirilmiş hareketli ortalamasıdır (birincisi hariç);
KAPAT (i) – mevcut kapanış fiyatıdır;
N – yumuşatma periyodudur.

Bu yüzden sanırım iMa ve özel hareketli ortalamalar bunu doğru şekilde yapıyor. Ancak böyle bir hesaplama, test edilen sürelere bağlı olarak büyük farklılıklara neden olan karşılaştığımız hataları üretir. İşlemlerini hareketli ortalamaya dayandıran bir EA için kesinlikle kabul edilemez. Sanırım bu nedenle Smoothed MA'yı geriye dönük test sırasında hatalı sonuçlar ürettiği için EA'mdan çıkarmam gerekecek. 2000 yılından itibaren test edip doğru yapsalar bile, müşteriler 2013'ten test edip "hesabı siliyor" diyebilir çünkü benden başka SSMA alacaklar.

Bağlantı için teşekkürler. Bu, önceki yazımı onaylıyor. Böyle şeylere hiç dikkat etmediğim için çok ilginç.

EMA'nın algoritmasını kontrol ederek, bu tür bir konuya da duyarlıdır, ilk testimin neden aynı değerleri aldığını bilmiyorum.

Neden: