una strategia di trading basata sulla teoria dell'onda di Elliott - pagina 22
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ho scaricato un programma che calcola l'indice di Hurst. Ho creato un file con i prezzi di apertura delle barre nello script.
Ho aperto il file e il programma ha calcolato l'indice Hurst. Ma qualsiasi campione io selezioni il programma mostra sempre valori dell'indicatore vicini a 1. Ma non si adatta alla teoria, vero? Cioè, la lettura dovrebbe variare da 0 a 1 per diversi campioni? Ma in questo programma questo parametro è incollato a 1 :o(. In generale, sono contento che le funzioni di calcolo pronte siano disponibili sul sito. E ora ho paura di usarli per calcolare qualcosa.
Ho questo coefficiente finora nell'intervallo 0,21-0,39. Non so perché :o(.
Ecco il mio codice dello script, che ho basato sul vostro codice:
//+------------------------------------------------------------------+ //| Herst.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| https://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "https://www.metaquotes.net" #property show_inputs extern int start_bar=500; extern int end_bar=0; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { double viborka[10]; int size_of_array,i; size_of_array=start_bar-end_bar+1; ArrayResize(viborka, size_of_array); for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar]; double S_A=srednee_arifmeticheskoe(viborka); Print("Среднее арифметическое выборки = ",DoubleToStr(S_A,8)); double disp=dispercia(viborka,S_A); Print("Дисперсия выборки = ",DoubleToStr(disp,8)); double S=CKO(disp); Print("СКО выборки (размах) = ",DoubleToStr(S,8)); double pMin=Low[Lowest(NULL,0,MODE_LOW,size_of_array,end_bar)]; double pMax=High[Highest(NULL,0,MODE_HIGH,size_of_array,end_bar)]; double R=pMax-pMin; Print("pMin = ",pMin," pMax = ",pMax, " R = ",R); double Hrst; if( (R>0)&&(S>0)) Hrst = MathLog(R/S)/MathLog(size_of_array*0.5); Print("Хёрст = ",DoubleToStr(Hrst ,8)); return(0); } //+------------------------------------------------------------------+ //функция для расчёта СКО double CKO(double disper) { double sko=MathPow(disper,0.5); return(sko); } //функция для расчёта дисперсии double dispercia(double data[], double centr) { int k,size; double disper=0; size=ArraySize(data); for(k=size-1;k>=0;k--) disper=disper+MathPow((data[k]-centr),2); if(size>1) disper=disper/(size-1); return(disper); } //функция для подсчёта среднего арифметического значения по массиву double srednee_arifmeticheskoe(double data[]) { int k,size; double sr_arifm=0; size=ArraySize(data); for(k=size-1;k>=0;k--) sr_arifm=sr_arifm+data[k]; sr_arifm=sr_arifm/size; return(sr_arifm); }Vladislav, forse puoi dare un'occhiata e dirmi dove modificare per calcolare correttamente il coefficiente? Dopo tutto, secondo la teoria tutti i calcoli sono elementari e non so nemmeno dove sia il mio errore :o(
E poi un tale numero di chiamate di funzione su un algoritmo che già non è molto alleggerito dai calcoli..... IMHO rallenterà considerevolmente. (La chiamata di funzione è la procedura più lunga, poi viene l'operazione di divisione in virgola mobile).
Cosa c'è di sbagliato nell'algoritmo standard per calcolare la deviazione standard? È disponibile, ma la previsione prende il valore di un muving sulla barra corrispondente - prendete quello che vi serve, è questo e nessuna chiamata di funzione. Basta eseguire un ciclo attraverso un array e squadrare le differenze tra il prezzo previsto su una data barra e il prezzo reale, poi radice quadrata una volta - questo è tutto.
Buona fortuna e in bocca al lupo per le tendenze.
http://forex.ua/forum/viewtopic.php?t=1634&postdays=0&postorder=asc&start=50
C'era un confronto a breve termine delle previsioni di FA e TA qui (dopo alcuni flam nel thread appena stufato).
http://forex.ua/forum/viewtopic.php?t=1780
Grazie per i link! Leggete. Molto informativo! Ancora una volta mi ha confermato che ho compreso correttamente l'essenza della vostra strategia. Io stesso ho già iniziato a programmare qualcosa in questa direzione. Ho già scritto sopra sui problemi attuali all'ordine del giorno. Ma anche i risultati dei primi calcoli sono molto impressionanti! Infatti, finché non lo provi tu stesso non puoi capire perché le cose accadono davvero come dici tu! Questo è ciò che rende la vostra strategia così impopolare con la maggioranza dei trader. È molto più attraente guardare bei grafici multicolori di diversi oscillatori ;o) e leggere diversi analisti pagati, che basare la tua strategia di trading sul Forex sulla conoscenza accumulata da persone per molto tempo. Anche se, in linea di principio, finché questo stato di cose rimane, sarà possibile guadagnare bene sul Forex!
:).
Buona fortuna e buone tendenze.
Cosa c'è di sbagliato nell'algoritmo standard per calcolare la deviazione standard? È disponibile, ma la previsione prende il valore di un muving sulla barra corrispondente - prendi quello che ti serve, è questo e nessuna chiamata di funzione. Basta eseguire un ciclo attraverso l'array e prendere i quadrati delle differenze tra il prezzo previsto sulla barra data e quello reale, poi prendere la radice quadrata una volta - questo è tutto.
In questo esempio ho usato la media aritmetica del campione come variabile centrale.
Anche ieri ho provato a impostare una linea di regressione lineare come questa variabile. Così poi otteniamo che S=SCO degli errori di regressione lineare. Ma per qualche ragione il risultato non ha impressionato neanche me :o(.
Ecco il codice dello script, in cui prendiamo una linea di regressione lineare come previsione. Inoltre, l'attuale tendenza di EURUSD si adatta molto bene a questo.
//+------------------------------------------------------------------+ //| Herst.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property show_inputs extern int start_bar=500; extern int end_bar=0; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { double viborka[10],oshibki_lin_reg[10]; int size_of_array,i; size_of_array=start_bar-end_bar+1; ArrayResize(viborka, size_of_array); ArrayResize(oshibki_lin_reg, size_of_array); for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar]; double S_A_viborki=srednee_arifmeticheskoe(viborka); Print("Среднее арифметическое выборки = ",DoubleToStr(S_A_viborki,8)); //-----Расчёт коэффициента a уравнения линейной регрессии double sred_znach_i=(size_of_array-1)/2.0; //среднее значение по оси индекса double a_lin_regres=0;//коэффициент a линейной регрессии double buffer=0; for(i=size_of_array-1;i>=0;i--) { a_lin_regres=a_lin_regres+(i-sred_znach_i)*(viborka[i]-S_A_viborki); buffer=buffer+MathPow((i-sred_znach_i),2); } a_lin_regres=a_lin_regres/buffer; Print("a_lin_regres = ",DoubleToStr(a_lin_regres,8)); //-----Расчёт коэффициента b уравнения линейной регрессии double b_lin_regres=S_A_viborki-a_lin_regres*sred_znach_i; Print("b_lin_regres = ",DoubleToStr(b_lin_regres,8)); //-----Расчёт ошибок линейной регрессии for(i=size_of_array-1;i>=0;i--) oshibki_lin_reg[i]=viborka[i]-(a_lin_regres*i+b_lin_regres); double S_A_oshibok;//среднее значение ошибок линейной регрессии S_A_oshibok=srednee_arifmeticheskoe(oshibki_lin_reg); Print("Среднее значение ошибок = ",DoubleToStr(S_A_oshibok,8)); double disp_oshibok=dispercia_oshibok(oshibki_lin_reg,S_A_oshibok); Print("Дисперсия ошибок= ",DoubleToStr(disp_oshibok,8)); double S=CKO(disp_oshibok); Print("S= ",DoubleToStr(S,8)); double pMin=0; double pMax=0; for(i=size_of_array-1;i>=0;i--) { if(oshibki_lin_reg[i]<pMin) pMin=oshibki_lin_reg[i]; if(oshibki_lin_reg[i]>pMax) pMax=oshibki_lin_reg[i]; } double R=pMax-pMin; Print("pMin = ",pMin," pMax = ",pMax, " R = ",R); double Hrst; Hrst = MathLog(R/S)/MathLog(size_of_array*0.5); Print("Хёрст = ",DoubleToStr(Hrst ,8)); return(0); } //+------------------------------------------------------------------+ //функция для расчёта дисперсии ошибок double dispercia_oshibok(double data[], double centr) { int k,size; double disper=0; size=ArraySize(data); for(k=size-1;k>=0;k--) disper=disper+MathPow((data[k]-centr),2); if(size>1) disper=disper/(size-2); return(disper); } //функция для расчёта СКО double CKO(double disper) { double sko=MathPow(disper,0.5); return(sko); } //функция для подсчёта среднего арифметического значения по массиву double srednee_arifmeticheskoe(double data[]) { int k,size; double sr_arifm=0; size=ArraySize(data); for(k=size-1;k>=0;k--) sr_arifm=sr_arifm+data[k]; sr_arifm=sr_arifm/size; return(sr_arifm); }Prendiamo il periodo H1 su EURUSD. Prendiamo un campione di 500 barre il coefficiente di Hearst = 0,26
300 barre - 0,31, 100 barre - 0,39, 30 barre - 0,51. Non capisco perché :o(.
Proveremo il muving da te consigliato. Anche se non so ancora perché i risultati saranno fondamentalmente diversi da quelli che ho.
//+------------------------------------------------------------------+ //| Herst_lin_reg.mq4 | //| Copyright © 2006, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property show_inputs extern int start_bar=800; extern int end_bar=570; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { double viborka[10],oshibki_lin_reg[10],data_for_drawing[10]; int size_of_array,i; size_of_array=start_bar-end_bar+1; ArrayResize(viborka, size_of_array); ArrayResize(oshibki_lin_reg, size_of_array); ArrayResize(data_for_drawing, size_of_array); for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar]; double S_A_viborki=srednee_arifmeticheskoe(viborka); Print("Среднее арифметическое выборки = ",DoubleToStr(S_A_viborki,8)); //-----Расчёт коэффициента a уравнения линейной регрессии double sred_znach_i=(size_of_array-1)/2.0; //среднее значение по оси индекса double a_lin_regres=0;//коэффициент a линейной регрессии double buffer=0; for(i=size_of_array-1;i>=0;i--) { a_lin_regres=a_lin_regres+(i-sred_znach_i)*(viborka[i]-S_A_viborki); buffer=buffer+MathPow((i-sred_znach_i),2); } a_lin_regres=a_lin_regres/buffer; Print("a_lin_regres = ",DoubleToStr(a_lin_regres,8)); //-----Расчёт коэффициента b уравнения линейной регрессии double b_lin_regres=S_A_viborki-a_lin_regres*sred_znach_i; Print("b_lin_regres = ",DoubleToStr(b_lin_regres,8)); for(i=size_of_array-1;i>=0;i--) data_for_drawing[i]=a_lin_regres*i+b_lin_regres; linregres_grafic_c(0,data_for_drawing,end_bar); //-----Расчёт ошибок линейной регрессии for(i=size_of_array-1;i>=0;i--) oshibki_lin_reg[i]=viborka[i]-(a_lin_regres*i+b_lin_regres); double S_A_oshibok;//среднее значение ошибок линейной регрессии S_A_oshibok=srednee_arifmeticheskoe(oshibki_lin_reg); Print("Среднее значение ошибок = ",DoubleToStr(S_A_oshibok,8)); double disp_oshibok=dispercia_oshibok(oshibki_lin_reg,S_A_oshibok); Print("Дисперсия ошибок= ",DoubleToStr(disp_oshibok,8)); double S=CKO(disp_oshibok); Print("S= ",DoubleToStr(S,8)); double pMin=Low[Lowest(NULL,0,MODE_LOW,size_of_array,end_bar)]; double pMax=High[Highest(NULL,0,MODE_HIGH,size_of_array,end_bar)]; double R=pMax-pMin; Print("pMin = ",pMin," pMax = ",pMax, " R = ",R); double Hrst; Hrst = MathLog(R/S)/MathLog(size_of_array*0.5); Print("Хёрст = ",DoubleToStr(Hrst ,8)); Comment("Хёрст = ",DoubleToStr(Hrst ,8)); return(0); } //+------------------------------------------------------------------+ //функция для расчёта дисперсии ошибок double dispercia_oshibok(double data[], double centr) { int k,size; double disper=0; size=ArraySize(data); for(k=size-1;k>=0;k--) disper=disper+MathPow((data[k]-centr),2); if(size>1) disper=disper/(size-2); return(disper); } //функция для расчёта СКО double CKO(double disper) { double sko=MathPow(disper,0.5); return(sko); } //функция для подсчёта среднего арифметического значения по массиву double srednee_arifmeticheskoe(double data[]) { int k,size; double sr_arifm=0; size=ArraySize(data); for(k=size-1;k>=0;k--) sr_arifm=sr_arifm+data[k]; sr_arifm=sr_arifm/size; return(sr_arifm); } //функция рисования канала линейной регрессии int linregres_grafic_c(int window_number, double data[], int ended_bar) { int deletedArrows,k,size; string line_name; //очистка предыдущего рисунка deletedArrows=ObjectsDeleteAll(window_number,OBJ_TREND); //находим размер массива size=ArraySize(data); //рисуем центральную линию линейной регрессии for(k=size-1;k>=1;k--) { line_name="line_lin_reg"+k; ObjectCreate(line_name,OBJ_TREND,window_number,Time[k+ended_bar],data[k],Time[k+ended_bar-1],data[k-1]); ObjectSet(line_name,OBJPROP_COLOR,Yellow); ObjectSet(line_name,OBJPROP_STYLE,DRAW_LINE); ObjectSet(line_name,OBJPROP_WIDTH,2); ObjectSet(line_name,OBJPROP_BACK,true); ObjectSet(line_name,OBJPROP_RAY,false); } //рисуем проекцию центральной линии линейной регрессии line_name="line_lin_reg_proec"; ObjectCreate(line_name,OBJ_TREND,window_number,Time[size-1+ended_bar],data[size-1],Time[ended_bar],data[0]); ObjectSet(line_name,OBJPROP_COLOR,Red); ObjectSet(line_name,OBJPROP_STYLE,DRAW_LINE); ObjectSet(line_name,OBJPROP_WIDTH,1); ObjectSet(line_name,OBJPROP_BACK,false); ObjectSet(line_name,OBJPROP_RAY,true); return(0); }Ecco il link dove si trovano gli screenshot https://c.mql5.com/mql4/forum/2006/05/Herst.zip
All'inizio ho provato a caricare questi file di immagini sul sito, così sarebbe stato conveniente guardarli nel tema stesso, ma per qualche motivo questi file gif sul sito www.mql4.com dopo il cambiamento del motore persistono a non voler essere inseriti :o(. Non importa la cosa buona che almeno zip caricato.
Una breve spiegazione dello script. Lo script disegna una spessa linea gialla del canale di regressione lineare nel grafico e allo stesso tempo traccia la proiezione del canale nel futuro con una sottile linea rossa.
A giudicare dagli screenshot, devo avere ragione nei miei calcoli :o). Anche se dovrò ricontrollare in futuro.
PS: Vladislav, penso che il calcolo dell'indice di Hurst da parte di muving sia un po' dubbio, perché non si sa quale valore del periodo di mediazione dovrebbe essere preso. Suppongo che questo valore per ogni calcolo particolare dovrebbe in qualche modo cambiare a seconda del numero di tochets. Ecco perché per ora ho optato per un canale di regressione lineare.
Questo è quello che ho capito (probabilmente in modo errato).
//+------------------------------------------------------------------+ //| SHI_Channel.mq4 | //| Copyright © 2004, Shurka & Kevin | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, Shurka & Kevin" #property link "" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red double ExtMapBuffer1[]; //---- input parameters extern int AllBars=240; extern int BarsForFract=0; int CurrentBar=0; double Step=0; int B1=-1,B2=-1; int UpDown=0; double P1=0,P2=0,PP=0; int i=0,AB=300,BFF=0; int ishift=0; double iprice=0; datetime T1,T2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,164); SetIndexBuffer(0,ExtMapBuffer1); SetIndexEmptyValue(0,0.0); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } void DelObj() { ObjectDelete("TL1"); ObjectDelete("TL2"); ObjectDelete("MIDL"); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if ((AllBars==0) || (Bars<AllBars)) AB=Bars; else AB=AllBars; //AB-количество обсчитываемых баров if (BarsForFract>0) BFF=BarsForFract; else { switch (Period()) { case 1: BFF=12; break; case 5: BFF=48; break; case 15: BFF=24; break; case 30: BFF=24; break; case 60: BFF=12; break; case 240: BFF=15; break; case 1440: BFF=10; break; case 10080: BFF=6; break; default: DelObj(); return(-1); break; } } CurrentBar=2; //считаем с третьего бара, чтобы фрактал "закрепился B1=-1; B2=-1; UpDown=0; while(((B1==-1) || (B2==-1)) && (CurrentBar<AB)) { //UpDown=1 значит первый фрактал найден сверху, UpDown=-1 значит первый фрактал //найден снизу, UpDown=0 значит фрактал ещё не найден. //В1 и В2 - номера баров с фракталами, через них строим опорную линию. //Р1 и Р2 - соответственно цены через которые будем линию проводить if((UpDown<1) && (CurrentBar==Lowest(Symbol(),Period(),MODE_LOW,BFF*2+1,CurrentBar-BFF))) { if(UpDown==0) { UpDown=-1; B1=CurrentBar; P1=Low[B1]; } else { B2=CurrentBar; P2=Low[B2];} } if((UpDown>-1) && (CurrentBar==Highest(Symbol(),Period(),MODE_HIGH,BFF*2+1,CurrentBar-BFF))) { if(UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1]; } else { B2=CurrentBar; P2=High[B2]; } } CurrentBar++; } if((B1==-1) || (B2==-1)) {DelObj(); return(-1);} // Значит не нашли фракталов среди 300 баров 8-) Step=(P2-P1)/(B2-B1);//Вычислили шаг, если он положительный, то канал нисходящий P1=P1-B1*Step; B1=0;//переставляем цену и первый бар к нулю //А теперь опорную точку противоположной линии канала. ishift=0; iprice=0; if(UpDown==1) { PP=Low[2]-2*Step; for(i=3;i<=B2;i++) { if(Low[i]<PP+Step*i) { PP=Low[i]-i*Step; } } if(Low[0]<PP) {ishift=0; iprice=PP;} if(Low[1]<PP+Step) {ishift=1; iprice=PP+Step;} if(High[0]>P1) {ishift=0; iprice=P1;} if(High[1]>P1+Step) {ishift=1; iprice=P1+Step;} } else { PP=High[2]-2*Step; for(i=3;i<=B2;i++) { if(High[i]>PP+Step*i) { PP=High[i]-i*Step;} } if(Low[0]<P1) {ishift=0; iprice=P1;} if(Low[1]<P1+Step) {ishift=1; iprice=P1+Step;} if(High[0]>PP) {ishift=0; iprice=PP;} if(High[1]>PP+Step) {ishift=1; iprice=PP+Step;} } //Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее P2=P1+AB*Step; T1=Time[B1]; T2=Time[AB]; //Если не было пересечения канала, то 0, иначе ставим псису. if(iprice!=0) ExtMapBuffer1[ishift]=iprice; DelObj(); ObjectCreate("TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP); ObjectSet("TL1",OBJPROP_COLOR,Lime); ObjectSet("TL1",OBJPROP_WIDTH,2); ObjectSet("TL1",OBJPROP_STYLE,STYLE_SOLID); ObjectCreate("TL2",OBJ_TREND,0,T2,P2,T1,P1); ObjectSet("TL2",OBJPROP_COLOR,Lime); ObjectSet("TL2",OBJPROP_WIDTH,2); ObjectSet("TL2",OBJPROP_STYLE,STYLE_SOLID); ObjectCreate("MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2); ObjectSet("MIDL",OBJPROP_COLOR,Lime); ObjectSet("MIDL",OBJPROP_WIDTH,1); ObjectSet("MIDL",OBJPROP_STYLE,STYLE_DOT); // Comment(" Channel size = ", DoubleToStr(MathAbs(PP - P1)/Point,0), " Slope = ", DoubleToStr(-Step/Point, 2)); //---- //---- return(0); } //+------------------------------------------------------------------+Questo indicatore è tratto da questa strategia
http://fxovereasy.50webs.com/Example1.html
È possibile scaricare gli indicatori necessari per questa strategia per MT4 dal sito web.
http://fxovereasy.50webs.com/Indicators.html
Tutto sembra avere un senso a prima vista. Non c'è altra descrizione della strategia ;o).