Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Hey, ilginç bir gösterge. Grafiklerde gerçekten bir projeksiyon modeli kullanmanın matematiksel yönünü seviyorum. Henüz kod konusunda çok deneyimli değilim, bu yüzden modeli "geri dönecek" ve belirli sayıda tik önce (diyelim ki 100) yapacağı tahmin eğrisini yapacak şekilde nasıl ayarlayacağınızı merak ediyorum. Bu şekilde çeşitli grafiklere uygulanabilir ve gerçeğin modelden ne kadar farklı olduğuna dair bir fikir verebilir, belki bunu modelin iyi çalıştığı bir pazarın bazı özelliklerini belirlemek için kullanabilirsiniz, vb.
Evet, Windows 7 kullanıyorum, bir göz atacağım
mt5'i taşınabilir modda çalıştırmak isteyebilirsiniz:
terminal.exe /portable
mevcut mt5 dizininde çalışan gösterge elde edeceksiniz - pendrive kurulumu için kullanışlıdır
tahmin yeteneğini test etmek için zamanında geri kaydırma yapmak için değişiklik:
32. satırda ekle:
input int TimeShift = 10; // kaç çubuk geriye kayar, göstergenin öngörülebilirliğini değerlendirmek için kullanışlıdır
54. satırda değiştirin:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut);
ile değiştir:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut - TimeShift);
55. satırda ekle:
PlotIndexSetInteger(1, PLOT_SHIFT, -TimeShift);
87. satırda değiştir:
if(CopyRates(NULL, 0, 0, Npast, rates) <= 0) return(0);
ile değiştir:
if(CopyRates(NULL, 0, TimeShift, Npast, rates) <= 0) return(0);
Bakmaya değer.
Bunu ticarette kim kullanıyor?
Geçmişte çalıştırdım - göstergenin eğilimi hiç hesaba katmadığı ortaya çıktı, birkaç bin beş basamaklı nokta için eğilime karşı tahmin yaptı, bence MA / CCI / Bollinger Bantları gibi bir gösterge ile kullanılmalı, ekstrapolatör sinyali onaylayacak, aksi takdirde bir drenaja dönüşebilir
En iyi şekilde daha yüksek zaman dilimlerinde kullanılması gerekiyordu, D1'de bir ay boyunca inanılmaz bir doğrulukla tahmin etti, ancak trend başladığında çok hayal kırıklığına uğradım (son paragrafa bakın).
Teşekkür ederim
Bakmaya değer.
Bunu ticarette kim kullanıyor?
Ayrıca çok merak ediyorum, TS'lerinde ekstrapolatör kullanan varsa, tam olarak nasıl? Ve Kase'yi aramanın bu yönü ne kadar umut verici?
Tamamen sezgisel olarak ihtiyaç duyulan şey bu gibi görünüyor, ancak bir şekilde bu ekstrapolatörün testleri ve tahminleri gerçeklikle çok zayıf bir şekilde ilişkili, en azından benim için öyle oldu...
Lütfen bana ekstrapolatör seçiminin ne olduğunu ve hangisinin en doğru olduğunu söyleyebilir misiniz? Demek istediğim, muhtemelen sadece Fourier serileri ayrıştırılamaz, yollar sonsuzdur. Örneğin, en basit yollardan gidebilir ve MA veya MACD'nin kesişmesinden başlayabilir ve böylece eğriyi tahmin edebilirsiniz ve eğer tembel değilseniz, o zaman farklı ampirik ayrıştırmalar, sonra ortalama ve sonra tekrar copponing.... Teorik olarak nasıl yapılacağını hayal edebiliyorum, ancak kodlamaya çalışmaya başlarsam, bir yıl içinde yapamayacağım((((
Ekstrapolatörün bir çizgi çizmek yerine yakın gelecek için olasılık dağılımını belirlemesi harika olurdu.
Ekstrapolatörün bir çizgi çizmek yerine yakın gelecek için olasılık dağılımını belirlemesi harika olurdu.
Photoshop'ta pratik yaparsanız böyle olabileceğini düşünüyorum))))
İlginç bir gösterge! Yaratıcısına teşekkürler.
Tahmininin kalitesini görmek için, koda bir tane daha Start parametresi ekledim - sıfır çubuğu yerine hangi çubuktan başlanacağı.
Ayrıca fare hareketi için bir olay işleyici ekledim.
Başlatmak için Ctrl tuşuna basmanız ve fareyi hareket ettirmeniz yeterlidir (artı işaretini etkinleştirmenizi tavsiye ederim) - grafikteki konumu Başlangıç olacaktır.
Dinamik olarak izlemek çok eğlencelidir.
Kapatmak için - Ctrl hariç herhangi bir tuşa basmanız yeterlidir
//+--------------------------------------------------------------------------------------+
//| Fourier_Extrapolator_of_Price.mq5 |
//| Copyright 2010, gpwr |
//+--------------------------------------------------------------------------------------+
// başlangıcı kaydırma imkanı eklendi (CTRL'ye basın)
#property copyright "gpwr"
#property version "1.00"
#property description "Trigonometrik (çok tonlu) model ile açık fiyatların ekstrapolasyonu"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- gelecek model çıktıları
#property indicator_label1 "Modellenmiş gelecek"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- geçmiş model çıktıları
#property indicator_label2 "Modellenmiş geçmiş"
#property indicator_type2 DRAW_LINE
#property indicator_color2 Blue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- global sabitler
#define pi 3.141592653589793238462643383279502884197169399375105820974944592
//--- gösterge girdileri
input int Npast =300; // Trigonometrik serinin takıldığı geçmiş çubuklar
input int Nfut =50; // Tahmin edilen gelecek çubuklar
input int Nharm =20; // Modeldeki narmonikler
input double FreqTOL =0.00001; // Frekans hesaplamalarının toleransı
input int Start =0; // Hangi çubuktan başlıyoruz
//--- global değişkenler
int N;
int key=0;
int start=0;
//--- gösterge tamponları
double ym[],xm[];
//+------------------------------------------------------------------+
//| Özel gösterge başlatma fonksiyonu |
//+------------------------------------------------------------------+
void OnInit()
{
//--- global değişkenleri başlat
N=MathMax(Npast,Nfut+1);
//--- gösterge tamponları eşleme
ArraySetAsSeries(xm,true);
ArraySetAsSeries(ym,true);
SetIndexBuffer(0,ym,INDICATOR_DATA);
SetIndexBuffer(1,xm,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorSetString(INDICATOR_SHORTNAME, "Fourier("+string(Npast)+")");
PlotIndexSetInteger(0,PLOT_SHIFT,Nfut);
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
start=Start;
}
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& Time[],
const double& Open[],
const double& High[],
const double& Low[],
const double& Close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
// Yetersiz veri olup olmadığını kontrol edin
if(rates_total<Npast)
{
Print("Hata: geçmişte yeterli çubuk yok!");
return(0);
}
//--- gösterge tamponlarını EMPTY_VALUE olarak başlatın
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- tüm fiyatları kullanılabilir hale getirin
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return(0);
//--- main cycle
//--- prepare input data
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}
av/=Npast;
//--- model çıktılarını başlat
for(int i=0;i<N<N;i++)
{
{ xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- trigonometrik modeli uydur ve tahminleri hesapla
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}
}
return(rates_total);
}
//--- Ctrl tuşuna basma ve fare hareketi için olay işleyici
void OnChartEvent(const int id, // olay tanımlayıcısı
const long& lparam, // long türünde olay parametresi
const double& dparam, // double türünde olay parametresi
const string& sparam // string türünde olay parametresi
)
{
double y;
int window=0;
datetime ttt;
if(id==CHARTEVENT_KEYDOWN) key=(int)lparam;
if(id==CHARTEVENT_MOUSE_MOVE && key==17)
{
ChartXYToTimePrice(0,(int)lparam,(int)dparam,window,ttt,y);
if(ttt!=0) start=iBarShift(NULL,0,ttt,false);
Comment("x = ",lparam,", y = ",dparam,", Price = ",y,", Price = ",y,", start = ",start);
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- tüm fiyatları kullanılabilir hale getirin
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return;
//--- main cycle
//--- prepare input data
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}
av/=Npast;
//--- model çıktılarını başlat
for(int i=0;i<N;i++)
{
xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- trigonometrik modeli uydur ve tahminleri hesapla
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}
}
}
}
//+------------------------------------------------------------------+
//| Quinn ve Fernandes frekans bulma algoritması |
//+------------------------------------------------------------------+
void Freq(double& x[],int n,double& w,double& m,double& a,double& b)
{
double z[];
ArrayResize(z,n);
double alpha=0.0;
double beta=2.0;
z[0]=x[0]-xm[0+start];
while(MathAbs(alpha-beta)>FreqTOL)
{
alpha=beta;
z[1]=x[1]-xm[1+start]+alpha*z[0];
double num=z[0]*z[1];
double den=z[0]*z[0];
for(int i=2;i<n;i++)
{
z[i]=x[i]-xm[i+start]+alpha*z[i-1]-z[i-2];
num+=z[i-1]*(z[i]+z[i-2]);
den+=z[i-1]*z[i-1];
}
beta=num/den;
}
w=MathArccos(beta/2.0);
TrigFit(x,n,w,m,a,b);
}
//+------------------------------------------------------------------+
//| Trigonometrik serilerin en küçük kareler uydurması |
//+------------------------------------------------------------------+
void TrigFit(double& x[],int n,double w,double& m,double& a,double& b)
{
double Sc =0.0;
double Ss=0.0;
double Scc=0.0;
double Sss=0.0;
double Scs=0.0;
double Sx=0.0;
double Sxc=0.0;
double Sxs=0.0;
for(int i=0;i<n;i++)
{
double c=MathCos(w*i);
double s=MathSin(w*i);
double dx=x[i]-xm[i+start];
Sc +=c;
Ss +=s;
Scc+=c*c;
Sss+=s*s;
Scs+=c*s;
Sx +=dx;
Sxc+=dx*c;
Sxs+=dx*s;
}
Sc /=n;
Ss /=n;
Scc/=n;
Sss/=n;
Scs/=n;
Sx /=n;
Sxc/=n;
Sxs/=n;
if(w==0.0)
{
m=Sx;
a=0.0;
b=0.0;
}
else
{
// a, b ve m'nin hesaplanması
double den=MathPow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss);
a=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den;
b=((Sxc-Sx*Sc)*(Scs-Sc*Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc*Sc))/den;
m=Sx-a*Sc-b*Ss;
}
}
int iBarShift(string symbol,int timeframe,datetime time,bool exact=false)
{
if(time<0) return(-1);
ENUM_TIMEFRAMES tf=TFMigrate(timeframe);
datetime Arr[],time1;
CopyTime(symbol,tf,0,1,Arr);
time1=Arr[0];
if(CopyTime(symbol,tf,time,time1,Arr)>0)
{
if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
if(time<time1) return(1);
else return(0);
}
else return(-1);
}
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60: return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);
case 2: return(PERIOD_M2);
case 3: return(PERIOD_M3);
case 4: return(PERIOD_M4);
case 6: return(PERIOD_M6);
case 10: return(PERIOD_M10);
case 12: return(PERIOD_M12);
case 16385: return(PERIOD_H1);
case 16386: return(PERIOD_H2);
case 16387: return(PERIOD_H3);
case 16388: return(PERIOD_H4);
case 16390: return(PERIOD_H6);
case 16392: return(PERIOD_H8);
case 16396: return(PERIOD_H12);
case 16408: return(PERIOD_D1);
case 32769: return(PERIOD_W1);
case 49153: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}
...