una strategia di trading basata sulla teoria dell'onda di Elliott - pagina 28

 
Inoltre, riguardo ai calcoli. Recentemente ho pensato alla necessità di usare la funzione di densità della distribuzione normale, ma non ho ancora iniziato. Ho anche pensato a come farlo, se usando una funzione complicata o un metodo tabellare, ero più propenso a riempire la tabella in Excel con incrementi di un millesimo (o un decimillesimo) e salvarla come un file txt contenente il codice mq4 per riempire un grande array. Ora, grazie a Vladislav, risparmia anche le risorse della CPU.
Tutto sommato, ho imparato molte cose utili. :)
 
<br/ translate="no"> Uno dei vostri assiomi è che esiste una vera (cioè una sola) traiettoria, che è determinata dal processo di ottimizzazione. Come può una singola traiettoria risultare in più canali?


Scusate ancora per le risposte tardive. Quando si approssima una traiettoria non si può mai sapere quanto meglio un'approssimazione descriva la traiettoria stessa, se sono nello stesso intervallo di confidenza. E di conseguenza, tutte le approssimazioni che rientrano nell'intervallo di confidenza possono essere considerate equivalenti. In linea di principio, questo è il caso. Per fare una previsione da un insieme di approssimazioni possibili (di solito non una soddisfa i criteri di selezione, perché i limiti di errore sono fissati), è meglio scegliere quella "più" ottimale, per così dire. Mentre studiavo l'algoritmo, mi sono reso conto di un'altra peculiarità: anche se le approssimazioni sono diverse, le previsioni sono le stesse nella stragrande maggioranza dei casi. Ancora una volta vi ricordo che la traiettoria in sé non è necessaria e non la sto cercando. Per quanto riguarda i canali - l'unicità dei canali è legata al "grado di dettaglio" (chiamiamolo così) delle strutture in studio. Così, se ci sono tendenze, possiamo identificare le zone di pullback e stimare le probabilità di fine tendenza, rotture di zone di inversione, ecc. O semplicemente per identificare le aree di incertezza, quando è meglio non entrare nel mercato. Inoltre, bisogna sempre ricordare i limiti della dimensione del campione, altrimenti il risultato avrà un tasso di incertezza troppo alto.

Buona fortuna e buone tendenze.
 
Caro Vladislav!

Ho un malinteso riguardo al calcolo del coefficiente di Hurst.
Nel caso della regressione lineare abbiamo 2 varianti di calcolo di S e R.

Variante 1.
S - possiamo calcolare come la somma delle differenze di deviazione lungo tutta la lunghezza della linea di regressione lineare.
Significa:

S=0.0;
for (n=0; n<Periodo; n++) { S+ = MathPow( Close[n] - (a+b*n) , 2); }
S=MathSqrt( S / Periodo );

E possiamo calcolare R come la differenza tra la deviazione massima e minima lungo tutta la linea della regressione lineare.
Cioè:

pMax=0.0; pMin=0.0;
for (n=0; n<Period; n++)
{
dc=Close[n] - (a+b*n);
if ( dc > pMax) pMax = dc;
if ( dc < pMin) pMin = dc
}
R=MathAbs( pMax - pMin);

Option 2.
Possiamo calcolare S relativo all'ultima barra usando iStdDev( ) dall'insieme degli indicatori tecnici standard. Ma in questo caso avremo S calcolato rispetto all'ultima barra, che è equivalente al calcolo di S rispetto al valore al centro di una linea di regressione lineare.

E R - come differenza tra i valori massimo e minimo nella proiezione orizzontale:

pMax=High[Highest(NULL,0,MODE_HIGH,Period,i)];
pMin=Low[Lowest(NULL,0,MODE_Low,Period,i)];

che non è proprio corretto, sarebbe più corretto usare MODE_CLOSE se inizialmente usiamo Close.

Per quanto ho capito, qui si usa la seconda variante? O devo sbagliarmi?

Quindi la mia domanda è: quale variante è più corretta per un calcolo più accurato del coefficiente di Hurst?

Grazie in anticipo per la vostra risposta - Alexander.
 
Tutte le approssimazioni che rientrano nell'intervallo di confidenza possono essere considerate equivalenti

Grazie, Vladislav, in qualche modo non avevo preso in considerazione questo punto. Ma è proprio vero. Questo significa che in realtà non otteniamo diversi canali, ma un intero intervallo delimitato da linee con l'angolo massimo e minimo.
Si dovrebbe sempre tenere a mente i limiti della dimensione del campione, altrimenti il risultato avrà troppa incertezza

Non sono sicuro di quale incertezza stai parlando. Tuttavia, l'altra cosa è chiara per me. Il campione dovrebbe definire un canale di regressione, e un canale di regressione è un canale di tendenza. Se raggruppiamo sia la tendenza che il piatto in un campione, tale campione difficilmente ci darebbe qualcosa di utile. Pertanto, ci troviamo di fronte al problema di dividere il mercato in fasi e, cosa più importante, di identificare la tendenza e il piatto nelle fasi iniziali, cioè nel mercato reale. A mio parere, questo è un compito molto non banale.
 
Ligustro,
Kartinka mne napomnila standartnyj indikator kanalov, vot i spomnil svoju razrabotku kokda iskal filter dlia ods4iota kokda na4inajetsia bolshyjje volny Elliota - po Standart Deviation formule:



Vot kod mojevo indikatora:

//+------------------------------------------------------------------+
//|                                                   StdDevChan.mq4 |
//|                           Copyright © 2005, Arunas Pranckevicius |
//|                                      irc://irc.omnitel.net/forex |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Arunas Pranckevicius(T-1000), Lithuania"
#property link      "irc://irc.omnitel.net/forex"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Blue

//---- input parameters
extern int       PriceBars=350;
extern int       Shift;
extern bool      Comments=false;

double Support[];
double StdDev[];
double Resistance[];

//---- buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0)
{

if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName);
ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3);
ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); 
ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); 
ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); 
}


int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Resistance);
   SetIndexDrawBegin(0,0);
   SetIndexEmptyValue(0,0);
   SetIndexShift(0,0);
   SetIndexLabel(0,"Standart Deviation Support-");
//----
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,StdDev);
   SetIndexDrawBegin(1,0);
   SetIndexEmptyValue(1,0);
   SetIndexShift(1,0);
   SetIndexLabel(1,"Standart Deviation");
//----
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Support);
   SetIndexDrawBegin(2,0);
   SetIndexEmptyValue(2,0);
   SetIndexShift(2,0);
   SetIndexLabel(2,"Standart Deviation Resistance+");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counter,counter2;
   double DevAvg=0;
   double DevPlus1=0;
   double DevMinus1=0;
   double DevPlusStart=0;
   double DevMinusStart=0;
   double DevAvgStart=0;
   double DevPlusEnd=0;
   double DevMinusEnd=0;
   double DevAvgEnd=0;
   double DevPlus2=0;
   double DevMinus2=0;
   double DevAvg1=0;
   double DevAvg2=0;
   double PriceDiff;
   double deviance,Max,Min;
   int DrawBegin = Shift;   
   int DrawEnd;
   int counted_bars=IndicatorCounted();
   DrawEnd=Bars-counted_bars;
   
   if ( DrawEnd < DrawBegin + PriceBars) DrawEnd = DrawBegin + PriceBars;
   
   if (Bars < (PriceBars * 2 + Shift)) return(0);
   
   for (counter=DrawBegin-1;counter<=DrawEnd;counter++)
   {
   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter);
   Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)];
   Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)];
   //DevAvg=MathPow((Max + Min + deviance) / 3,2);  
   DevAvg=(Max + Min + deviance) / 3;  

   for (counter2=(PriceBars + counter);counter2 >=counter;counter2--)
   {
   PriceDiff = (Max + Min + Open[counter2]) / 3;
   deviance+= MathPow((PriceDiff - DevAvg),2);   
   }

   // Calculate average deviation
   deviance = deviance / (PriceBars + 1);
   DevAvg = MathSqrt(deviance/Point) * Point; 

   // Calculate deviation channel starting/current average deviation prices
   DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + counter]) / 3) / 3;

   // Calculate deviation channel +/- starting points
   DevPlus1 = (Min+Max + Open[PriceBars + counter]) / 3 + DevAvg;
   DevMinus1 = (Min+Max + Open[PriceBars + counter]) / 3 - DevAvg;     

  // Calculate deviation channel current +/- points
   DevPlus2 = (Max + DevAvg1) / 2 + DevAvg;
   DevMinus2 = (Min + DevAvg1) / 2 - DevAvg;

   DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + DevAvg1) / 3) / 3;
   
   Resistance[counter]=DevMinus2;
   Support[counter]=DevPlus2;
   StdDev[counter]=DevAvg2;   
   //if (counter == DrawEnd && Symbol() == "EURUSD" ) Print ("DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);

   if (counter == DrawBegin)
   {
   DevPlusEnd=Resistance[counter];
   DevMinusEnd=Support[counter];
   DevAvgEnd=StdDev[counter];
//   if (Symbol() == "EURUSD" ) Print ("DrawBegin=",DrawBegin," DrawEnd=",DrawEnd," DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);
   }      
   
   if (counter == DrawBegin + PriceBars)
   {
   DevPlusStart=Resistance[counter];
   DevMinusStart=Support[counter];
   DevAvgStart=StdDev[counter];
   }      

   }
//----

   if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvgStart=",DevAvgStart," DevAvgEnd=",DevAvgEnd," DevPlusStart=",DevPlusStart," DevPlusEnd=",DevPlusEnd," DevMinusStart=",DevMinusStart," DevMinusEnd=",DevMinusEnd);
   //Draw channel
   SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlusStart,Time[Shift],DevPlusEnd,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinusStart,Time[Shift],DevMinusEnd,Red,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvgStart,Time[Shift],DevAvgEnd,White,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green);
   
   return(0);
  }
//+------------------------------------------------------------------+
 
2 ANG3110 In realtà, ho già risposto a questa domanda sopra. Risponderò di nuovo - l'ultima - perché anch'io sono pigro ;). La deviazione standard deve essere calcolata rispetto all'approssimazione e ai prezzi effettivamente ottenuti. Se approssimi i prezzi di chiusura con un muving, allora dovrebbe essere la differenza tra Klose e il valore del muving su ogni barra. E puoi usare l'algoritmo standard - iStdDev( ). Se da un canale di regressione lineare, allora tra il valore della linea di regressione e il klose. Se per altro, allora la differenza è tra il valore della funzione approssimativa e il valore effettivamente ottenuto. Se si approssima qualcos'altro, come la redditività degli scambi, allora si dovrebbero selezionare altre variabili. Non uso iStdDev( ) nei miei calcoli.

che non è del tutto corretto, sarebbe più corretto usare MODE_CLOSE se inizialmente usiamo Close.

La chiave qui è: se inizialmente contato da Close

2Yurixx Per quanto riguarda l'incertezza - se il numero di gradi di libertà in un campione è insufficiente, la sua convergenza non può essere stimata in modo affidabile, e quindi è possibile applicare metodi di analisi statistica a un campione divergente che sono applicabili solo a campioni convergenti. Di conseguenza, il risultato è incerto.

PS Qui il termine "campione" è stato usato per indicare una distribuzione. Cioè sarebbe più corretto dire "il numero di gradi di libertà di un campione influenza il grado di affidabilità nel determinare la convergenza di una distribuzione valida per quel campione". I metodi validi per le distribuzioni convergenti possono essere applicati a quelle divergenti (o a distribuzioni senza un fatto noto di convergenza).

Buona fortuna e in bocca al lupo per le tendenze.
 
Ligustro,

Vot po4emu ja dal kod svojevo indikatora - ras4ioty idut po vsem parametram:

   devianza=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter); Max=High [massimo (NULL,0,MODE_HIGH,PriceBars,counter)]; Min=Low [minimo (NULL,0,MODE_LOW,PriceBars,counter)]; DevAvg=(Max + Min + devianza) / 3;



Smotrite indikator i probuite na grafik :-D

 
Caro Vladislav! <br/ translate="no">
Ho un malinteso sul calcolo del coefficiente di Hurst.
Nel caso della regressione lineare abbiamo 2 varianti di calcolo di S e R.


Questa è una domanda interessante :)
Supponiamo di avere un canale di regressione lineare, ad esempio ascendente, che soddisfa il criterio di convergenza RMS. Da un lato, se il canale è ascendente, allora l'RMS calcolato sulle barre incluse in esso tenderà a 1,0 (poiché lo spostamento è evidente). D'altra parte, se calcoliamo l'RMS relativamente alla linea di regressione (eliminando così lo spostamento), allora l'RMS tenderà a 0,5, perché l'RMS è vicino alla distribuzione normale. Penso che tutti dovrebbero controllare questo da soli (è molto più interessante in questo modo).
 
Non ho potuto resistere e ho modificato lo script di Solandr. Includere l'estrazione RMS è più corretto usando iStdDevOnArray integrato, poiché la divisione per (numero di potenze-1) è ragionevole solo per campioni fino a 30 elementi.
//+------------------------------------------------------------------+
//|                                                     Herst-II.mq4 |
//|                             solandr (обработал напильником Rosh) |
//|                       http://www.metaquotes.ru/forum/6839/page11 |
//+------------------------------------------------------------------+
#property copyright "solandr (обработал напильником Rosh)"
#property link      "http://www.metaquotes.ru/forum/6839/page11"
#property show_inputs

extern int start_bar=500;
extern int end_bar=0;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
double viborka[];
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=iMAOnArray(viborka,0,size_of_array,0,MODE_SMA,0);
Print("Среднее арифметическое выборки = ",DoubleToStr(S_A,8));

double S=iStdDevOnArray(viborka,0,size_of_array,MODE_SMA,0,0);

Print("СКО выборки (размах) = ",DoubleToStr(S,8));

double pMax=viborka[ArrayMaximum(viborka)];
double pMin=viborka[ArrayMinimum(viborka)];

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);
}
//+------------------------------------------------------------------+



La ricerca Extremum si basa su dati grezzi, non su posizioni e pause.

Quindi il criterio è un po' diverso:

2006.05.28 14:53:08 Herst EURUSD,M15: removed<br/ translate="no"> 2006.05.28 14:53:08 Herst EURUSD,M15: Hearst = 0.27582880
2006.05.28 14:53:08 Herst EURUSD,M15: pMin = 1.2691 pMax = 1.2892 R = 0.0201
28 14:53:08 Herst EURUSD,M15: RMS di campionamento (spread) = 0.00438062
2006.05.28 14:53:08 Herst EURUSD,M15: Varianza di campionamento = 0.00001919
2006.05.28 14:53:08 Herst EURUSD,M15: Media di campionamento = 1.27924631
2006.05.28 14:53:06 Herst EURUSD,M15: caricato con successo
2006.05.28 14:52:59 Herst-II EURUSD,M15: rimosso
2006.05.28 14:52:59 Herst-II EURUSD,M15: Hurst = 0.26196806
2006.05.28 14:52:59 Herst-II EURUSD,M15: pMin = 1.2696 pMax = 1.2882 R = 0.0186
2006.05.28 14:52:59 Herst-II EURUSD,M15: campione RMS (spread) = 0.00437625
2006.05.28 14:52:59 Herst-II EURUSD,M15: campione medio = 1.27924631
2006.05.28 14:52:59 Herst-II EURUSD,M15: caricato con successo
2006.05.28 14:52:54 Compilazione 'Herst-II'

 
Caro Vladislav!
Grazie per la sua risposta esauriente.
Motivazione: