Ben böyle bir şey yaptım...

 

Bir gün, aniden basit bir şey fark ettim: en küçük kareler yaklaşımı, esasen vektörlerin doğrusal bir kombinasyonunu en aza indirgemek anlamına gelir. Yani, belirli bir evrensel tahmin fonksiyonu üretmek mümkündür. Söylemeden önce, işte fonksiyon başlığı:

 //+------------------------------------------------------------------+
//  Аппроксимация методом наименьших квадратов                       |
//+------------------------------------------------------------------+
bool LSA( double & V[], int M, int N, double & A[], double & C[]) {
// Имеется N векторов размером M
// и вектор их линейной комбинации Y размером естестственно тоже M.
// На вход функции они подаются в виде матрицы V[0..M-1][0..N],
// где Y размещён в столбце N 
// На выходе мы должны получить вектор коэффициентов C размером M.
// Нам нужна также матрица A[N][N+1] для размещения коэффициентов системы уравнений

Önemli bir ayrıntı, tüm V ve A dizileri gerçekten tek boyutludur, ancak A dizisi tamamen çalışır, ancak V dizisi doğru doldurulmalıdır.

Çalışmak için, bir lineer denklem sistemini çözmek için bir fonksiyona da ihtiyacı var. Bunu yazdığımda, MQL'de kullanılan tek bir uygulama biliyordum. Gauss polinom regresyonu için ANG3110 . Doğal olarak, en az dirençli yolu seçtim ve fonksiyon için bu özel algoritmayı kullandım. Başka bir deyişle, özellikle matris simetrik olduğu ortaya çıktığı için daha verimli algoritmalar var, ancak onlara atıfta bulunmadım.

Bu nasıl kullanılır:

İlk önce hangi fonksiyona yaklaşacağımıza karar veriyoruz. Örneğin, lineer bir regresyon olsun. Yani, A* 1 + B* X doğrusal bir kombinasyonuna, sadece iki vektöre, bir üniteye ve argümanın kendisine sahip olacağız.

Çalışan diziler oluşturalım ve init() içinde bir yere bellek ayıralım.

 double V[];
double A[],С[];

...

  ArrayResize (A, 6 );   // размер N*(N+1)
   ArrayResize (C, 2 );   // размер N
   ArrayResize (V,M* 3 );   // M*(N+1) , M - не что иное как размер выборки

V dizisini doğru bir şekilde doldurmak ve katsayıları hesaplamak için kalır. Bu şu şekilde yapılabilir:

    ind = 0 ;
    Stop = Start + M;
// Заполняем векторы
     for (pos = Start; i < Stop; i++) {
     V[ind] = 1.0 ;
     ind++;
     V[ind] = pos;
     ind++;
     V[ind] = Close[pos];   
     ind++;
    }
// Считаем коэффициенты
   LSA(V, M, N, A, C);

İş tamamlandı, doğrusal regresyon C[0] + C[1]*pos hazır.

Her şeyden önce, algoritmayı test etmemiz gerekiyor. Bunu yapmak için, ang_PR (Din)-v1.mq4 ( ANG3110 ) göstergesine dayanarak ) LSA kullanılarak bir polinom regresyon göstergesi yazılmış ve sonuçlar karşılaştırılmıştır. Sonuçlar görsel olarak eşleşti ve bu testin sonu oldu :). LSA_PR.mq4 göstergesi eklenmiştir.

Dosyalar:
pr_lsa.mq4  7 kb
 

Çok uzun zaman önceydi ve geçenlerde bunu hatırladım ve yaptığım aleti tekrar kullanmaya karar verdim.

Ortaya çıkan ilk düşünce, tırnak tablosunda periyodiklik aramaktı. Harmonikleri aramak için ayrı bir Fourier dönüşümü (DFT) olduğu için neden soru ortaya çıkabilir? Ancak DFT, yalnızca örnek uzunluğundan daha kısa bir süreye sahip harmonikler verecektir. Artık armonika fiyatlarını numune uzunluğundan daha uzun bir periyotla grafiğe sığdırmaya çalışabiliriz. Tabii ki, başarılı bir uydurma, gerçek varlığı lehine "demir" bir argüman olmayacak, belirli bir yaklaşıma olan güven derecesi sorusu ayrıca ele alınmalıdır.

Ekli LSA_SinLRR.mq4 göstergesinde, harmoniği denemeden önce doğrusal eğilim çıkarılır. Eski ufka göre hesaplanır. Belirli bir aralıktaki tüm olası numune uzunlukları sıralanır ve Numune dışı numunede (baz numunenin 1/4'ü büyüklüğünde alınan) minimum ortalama kare hatası olacak olan seçilir.

Harmonik periyot, belirli bir faktörle çarpılarak numune uzunluğuna bağlanır. Örneğin, 2'ye eşitse, harmoniğin yarım periyodu, örneğin 0,5 ise, o zaman iki periyot örneğe sığacaktır. Numune uzunluğunun kendisi, doğrusal regresyonla aynı şekilde belirlenir, yalnızca numaralandırma genç ufuk içine girer.

Hesaplama miktarını azaltmak için her ufuk kendi ayrıklaştırma adımına sahiptir.

Vektörlerin matrisi bu şekilde doldurulur.

   for (i = IntShift; i < Frame; i++) {
    pos = HShift+i*Step;
    VT[ind] = MathSin (AFreq*pos);
    ind ++;
    VT[ind] = MathCos (AFreq*pos);
    ind ++;
    VT[ind] = Resid[i];   
    ind ++;
  }   //  for(i = IntShift; i < Frame; i++)

Resid, fiyat ile eski trend arasındaki farktır.

Gösterge parametreleri:

 extern double kPer = 4.0;   // Коэффициент для определения периода
extern int LRRank = 1;      // Номер старшего горизонта, больше 3-х не ставить
extern int FShift = 120;    // Расстояние в барах, на которое производится экстраполяция в будущее
extern int HShift = 1;      // Сдвиг текущего времени индикатора в прошлое в барах, бары правее него тоже будут проэктраполированы
extern double PointFactor = 0.1;  // Масштабирование гистограммы ошибок аппроксимации, 0.1 подойдёт для минуток на пятизнаке 
extern bool PriceClose = true; // Если false, то будет считаться по HL/2


Ooo nedense yazmaktan sıkıldım :)

Özetle işin özü şudur: Bu fonksiyon optimal olduğunu iddia etmez, sadece pankek gibi yaklaşımları damgalamanıza ve hemen tavadan denemenize izin verir :) . Buna göre göstergeler bu şekilde birbirine yapışmış, yani stil ve verimlilik anlamında hiçbir şeye benzemiyorlar.

Bu durum çok hızlı çalışmaz, bu nedenle geçmiş hesaplanmaz. Yani, görselleştiricide çalışmak daha iyidir. Ama çabuk sıkıcı oluyor :). Ama sabreden birinin bundan faydalanmanın bir yolunu bulabileceği de göz ardı edilemez :).


Genel olarak, net bir açıklama yapmayı başaramadığımın farkındayım, eğer biri bununla ilgileniyorsa, büyük olasılıkla açıklamalara güvenebilecektir.


Prensip olarak, bir göstergeden daha bahsetmesi gerekiyor, sunulanlardan daha güzel tahmin ediyor ve tahmin ediyor. Yani, o kadar etkilendim ki, görünüşe göre sonunda fiyatın parçalı determinizmi pozisyonunu aldım. Bu parçaların uzunlukları henüz tespit edilemediği için gerçek bir rahatlama getirmez :) .

Ama artık yazacak gücüm yok, sadece bir iki resim verebilirim :)

Başarılı ekstrapolasyonlu bir yaklaşıklık örneği

Momentum tarafından "parçalanmış" ekstrapolasyonlu bir yaklaşım örneği

Dosyalar:
lsa_sinlr.mq4  14 kb
 
Candid :

HShift'in ayarlanmaması, ancak ilk satırın gerçek konumuna göre belirlenmesi için bir kod parçası ekleyebilir misiniz? daha kesin olarak, <0 olarak ayarlanırsa, o zaman her iki mekanizma da çalışacak ve onu grafik boyunca tarihin derinliklerine sürüklemek ve o noktadaki tahminin ondan sonra olanlarla nasıl çakıştığını analiz etmek mümkün olacak. ilginç olacak ;)

 
ForexTools :

HShift'in ayarlanmaması, ancak ilk satırın gerçek konumuna göre belirlenmesi için bir kod parçası ekleyebilir misiniz? daha kesin olarak, <0 olarak ayarlanırsa, o zaman her iki mekanizma da çalışacak ve onu grafik boyunca tarihin derinliklerine sürüklemek ve o noktadaki tahminin ondan sonra olanlarla nasıl çakıştığını analiz etmek mümkün olacak. ilginç olacak ;)

Evet oldukça uygun, versiyonunu veriyorum. Özellikle grafik kontrolden hoşlanmadığım bir rezervasyon yapacağım, her şeyin sorunsuz olacağına dair bir garanti vermiyorum.


Bu arada, sağ alt köşedeki histogramların temel örnekte bir yaklaşım hatası ve örnek dışında bir ekstrapolasyon hatası gösterdiğini hiçbir yerde açıkça söylemedim. Bu bilgilerin durumun değerlendirilmesiyle ilgili olduğunu varsaymak mantıklıdır.


PS Evet, bir satır eklemeyi unuttum. Gösterge 11:50'de değiştirildi

Dosyalar:
 

Birkaç kelime daha. Neden eski eğilim tam olarak lineer olarak alınır? Öyle ya da böyle, gerçek trendler doğrusal görünüyor. Varsayım, bir kişinin bilinçsizce böyle bir trend değişikliği yaratabileceğidir, o zaman gerçekliğin armonikanın arkasında durabileceğine dair bir umut vardır.

Prensipte bir polinomun derecesini yükseltmek sorun değil, aslında bir parabol varyantı ile başladım. Bu, basit bir şekilde, birkaç eklenmiş ve düzeltilmiş satırda yapılır, herkes bunu bir alıştırma olarak yapmayı deneyebilir.

 

Tünaydın.

lütfen resimleri açıklayın. Interisuyut dikey çizgiler . Tahmin verilerinin mavi çizgiler arasındaki aralıkta olduğunu doğru anladım mı? kırmızı ne anlama geliyor? - tahminle tutarsızlık anı? kırmızı (mavi) tahmin satırlarında neden kesintiler var?

koda bakmadım çünkü MQL'deki programlama seviyeniz benim için ulaşılabilir değil, en azından bu seviyeye yaklaşmak bir rüya gibi

 

Prival :

lütfen resimleri açıklayın. Interisuyut dikey çizgiler. Tahmin verilerinin mavi çizgiler arasındaki aralıkta olduğunu doğru anladım mı? kırmızı ne anlama geliyor? - tahminle tutarsızlık anı? kırmızı (mavi) tahmin satırlarında neden kesintiler var?


Evet, gerçek yaklaşım mavi çizgiler arasındadır. Mavi ve kırmızı arasında ekstrapolasyon RMS hesaplanır. kırmızının sağında - en azından gösterge için sadece gelecek. Onu HShift ile hareket ettirmek (ve şimdi sadece çizgiyi grafik boyunca sürüklemek) ve neyi görmediğini görmek bizim elimizde.

Boşluklar "atık", göstergenin çalışma penceresi zamanla kayar, kuyruklar geride kalır. Bunu sabit bir pencereyle düzeltmek kolay olurdu, ancak uyum sağladığından, temizlemenin ucuz bir yolu henüz aklıma gelmedi.

Yeniden boyanmış çizgileri olan bir versiyon veriyorum.

Dosyalar:
 

yeni kodunuz beklendiği gibi çalışmadı :(

Burada haklarımı yıkmak için kendime izin verdim. özellikle ft.AutoRefresh ile eşleştirildiğinde harika çalışıyor

Dosyalar:
lsa_sinlr_1.mq4  16 kb
 

ForexTools :

Burada haklarımı almak için kendime izin verdim. özellikle ft.AutoRefresh ile eşleştirildiğinde harika çalışıyor

Eh, sizin sürümünüzün daha fazla parazit önleyici olduğunu düşünüyorum, ancak muhtemelen HShift'i oraya da eklemeniz gerekiyor, böylece kullanıcı eylemlerinin yokluğunda pencere zamanla hareket eder. Yine de, hmm, belki de bundan kaçınmak istedin?
 
Tabii ki! geçmişi analiz ederken, grafik hiçbir yere gitmemeli, çizgiyi koyduğum yerde "dur"
 
ForexTools :
Tabii ki! geçmişi analiz ederken, grafik hiçbir yere gitmemeli, çizgiyi koyduğum yerde "dur"

Eh, ilk başta sabit bir sürüm yaptım ve sonra değiştirdim :). Öncelikle yeniden çizmenin dinamikleriyle ilgilendim. Bir tür parametresi eklemek aslında çok kolay

 if (ModeMoving) HShift--;
Ama çok iyi de iyi değil, bırakın seçenek olgunlaşsın.
Neden: