eine Handelsstrategie auf der Grundlage der Elliott-Wellen-Theorie - Seite 28

 
Außerdem zu den Berechnungen. Ich habe vor kurzem darüber nachgedacht, ob es notwendig ist, die Normalverteilungsdichtefunktion zu verwenden, aber ich habe noch nicht damit angefangen. Ich habe auch darüber nachgedacht, wie man es machen kann, ob mit einer kniffligen Funktion oder einer tabellarischen Methode, ich war eher geneigt, die Tabelle in Excel mit Tausendstel- (oder Zehntausendstel-) Schritten zu füllen und sie als txt-Datei zu speichern, die den mq4-Code zum Füllen eines großen Arrays enthält. Dank Vladislav spart es nun auch CPU-Ressourcen.
Alles in allem habe ich eine Menge nützlicher Dinge gelernt. :)
 
<br/ translate="no"> Eines Ihrer Axiome ist, dass es eine wahre (d.h. eine einzige) Flugbahn gibt, die durch den Optimierungsprozess bestimmt wird. Wie kann eine einzige Flugbahn zu mehreren Kanälen führen?


Nochmals Entschuldigung für die späten Antworten. Bei der Annäherung an eine Trajektorie kann man nie wissen, wie viel besser eine Annäherung die Trajektorie selbst beschreibt, wenn sie im gleichen Konfidenzintervall liegen. Folglich können alle Näherungen, die in das Konfidenzintervall fallen, als gleichwertig angesehen werden. Im Prinzip ist dies der Fall. Um eine Vorhersage aus einer Reihe möglicher Annäherungen zu treffen (normalerweise erfüllt keine einzige die Auswahlkriterien, da die Fehlergrenzen festgelegt sind), ist es besser, sozusagen die "optimalste" zu wählen. Als ich den Algorithmus untersuchte, fiel mir eine weitere Besonderheit auf: Obwohl die Annäherungen unterschiedlich sind, sind die Prognosen in den allermeisten Fällen die gleichen. Ich erinnere Sie noch einmal daran, dass die Flugbahn selbst nicht erforderlich ist und ich nicht danach suche. Zu den Kanälen: Die Einzigartigkeit von Kanälen hängt mit dem "Detailgrad" (nennen wir ihn so) der untersuchten Strukturen zusammen. Wenn es also Trends gibt, können wir Pullback-Zonen identifizieren und die Wahrscheinlichkeiten von Trendenden, Durchbrüchen von Umkehrzonen usw. abschätzen. Oder einfach nur, um die unsicheren Bereiche zu identifizieren, in denen es besser ist, den Markt nicht zu betreten. Außerdem sollten Sie immer an die Begrenzung des Stichprobenumfangs denken, da das Ergebnis sonst einen zu hohen Unsicherheitsgrad aufweist.

Viel Glück und gute Trends.
 
Lieber Vladislav!

Ich habe ein Missverständnis bezüglich der Berechnung des Hurst-Koeffizienten.
Im Falle der linearen Regression gibt es 2 Varianten der Berechnung von S und R.

Variante 1.
S - können wir als Summe der Abweichungsdifferenzen entlang der gesamten Länge der linearen Regressionslinie berechnen.
Das bedeutet:

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

Und wir können R als die Differenz zwischen der maximalen und minimalen Abweichung entlang der gesamten Linie der linearen Regression berechnen.
Das heißt:

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.
Wir können S relativ zum letzten Balken mit iStdDev( ) aus dem Satz der technischen Standardindikatoren berechnen. In diesem Fall wird S jedoch in Bezug auf den letzten Balken berechnet, was der Berechnung von S in Bezug auf den Wert in der Mitte einer linearen Regressionslinie entspricht.

Und R - als Differenz zwischen Maximal- und Minimalwert in der horizontalen Projektion:

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

was nicht ganz korrekt ist, es wäre richtiger, MODE_CLOSE zu verwenden, wenn wir zunächst Close verwenden.

Soweit ich verstanden habe, wird hier die zweite Variante verwendet? Oder muss ich mich irren?

Meine Frage lautet also: Welche Variante ist für eine genauere Berechnung des Hurst-Koeffizienten die richtige?

Ich danke Ihnen im Voraus für Ihre Antwort - Alexander.
 
Alle Annäherungen, die innerhalb des Konfidenzintervalls liegen, können als gleichwertig betrachtet werden

Danke, Vladislav, diesen Punkt habe ich irgendwie nicht berücksichtigt. Aber es ist wirklich wahr. Das bedeutet, dass wir nicht mehrere Kanäle erhalten, sondern einen ganzen Bereich, der durch Linien mit dem maximalen und minimalen Winkel begrenzt wird.
Man sollte immer die Beschränkungen des Stichprobenumfangs im Auge behalten, da das Ergebnis sonst mit zu viel Unsicherheit behaftet ist.

Ich bin mir nicht ganz sicher, von welcher Unsicherheit Sie sprechen. Die andere Sache ist für mich jedoch klar. Die Stichprobe sollte einen Regressionskanal definieren, und ein Regressionskanal ist ein Trendkanal. Wenn wir sowohl den Trend als auch die Flaute in eine Stichprobe packen, würde uns eine solche Stichprobe kaum etwas Nützliches liefern. Wir stehen also vor dem Problem, den Markt in Phasen zu unterteilen und, was noch wichtiger ist, den Trend und die Flaute in den frühen Phasen, d. h. auf dem realen Markt, zu erkennen. Meiner Meinung nach ist dies eine nicht ganz einfache Aufgabe.
 
Liguster,
Kartinka mne napomnila standartnyj indikator kanalov, vot i spomnil svoju razrabotku kokda iskal filtra 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 Eigentlich habe ich diese Frage bereits oben beantwortet. Ich werde sie noch einmal beantworten - die letzte - weil ich auch faul bin ;). Die Standardabweichung sollte in Bezug auf den Näherungswert und die tatsächlich erzielten Preise berechnet werden. Wenn Sie die Schlusskurse durch einen Muving annähern, dann sollte es die Differenz zwischen Klose und dem Muving-Wert auf jedem Balken sein. Und Sie können den Standardalgorithmus - iStdDev( ) - verwenden. Wenn durch eine lineare Regression Kanal, dann zwischen dem Wert der Regressionslinie und die klose. Wenn überhaupt, dann liegt der Unterschied zwischen dem Wert der Näherungsfunktion und dem tatsächlich erhaltenen Wert. Wenn Sie sich an etwas anderes annähern, z. B. an die Rentabilität von Geschäften, dann sollten Sie andere Variablen wählen. Ich verwende iStdDev( ) nicht in meinen Berechnungen.

was nicht ganz korrekt ist, es wäre richtiger, MODE_CLOSE zu verwenden, wenn wir zunächst Close verwenden.

Der Schlüssel hierzu ist: Wenn die anfängliche Zählung von Close

2Yurixx Bezüglich der Unsicherheit - wenn die Anzahl der Freiheitsgrade in einer Stichprobe unzureichend ist, kann ihre Konvergenz nicht zuverlässig geschätzt werden, und daher können Sie statistische Analysemethoden auf eine abweichende Stichprobe anwenden, die nur auf konvergente Stichproben anwendbar sind. Daher ist das Ergebnis unsicher.

PS Der Begriff "Stichprobe" wurde hier im Sinne einer Verteilung verwendet. Korrekter wäre es zu sagen: "Die Anzahl der Freiheitsgrade einer Stichprobe beeinflusst den Grad der Zuverlässigkeit bei der Bestimmung der Konvergenz einer für diese Stichprobe gültigen Verteilung". Methoden, die für konvergente Verteilungen gelten, können auf divergente Verteilungen (oder auf Verteilungen, für die keine Konvergenz bekannt ist) angewendet werden.

Viel Glück und viel Erfolg mit Trends.
 
Liguster,

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

   deviance=iMA(Symbol(),Periode(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter); Max=High [Höchste (NULL,0,MODE_HIGH,PriceBars,counter)]; Min=Low [Niedrigste (NULL,0,MODE_LOW,PriceBars,counter)]; DevAvg=(Max + Min + deviance) / 3;



Smotrite indikator i probuite na grafik :-D

 
Lieber Vladislav! <br/ translate="no">
Ich habe ein Missverständnis bezüglich der Berechnung des Hurst-Koeffizienten.
Im Falle der linearen Regression gibt es 2 Varianten der S- und R-Berechnung.


Das ist eine interessante Frage :)
Angenommen, wir haben einen linearen Regressionskanal, z. B. einen aufsteigenden, der das RMS-Konvergenzkriterium erfüllt. Wenn der Kanal aufsteigend ist, tendiert der berechnete RMS für die darin enthaltenen Balken gegen 1,0 (da die Verschiebung offensichtlich ist). Berechnet man hingegen den RMS relativ zur Regressionsgeraden (und entfernt damit die Verschiebung), so tendiert der RMS gegen 0,5, da er nahe an der Normalverteilung liegt. Ich denke, jeder sollte dies selbst überprüfen (so ist es viel interessanter).
 
Ich konnte nicht widerstehen und habe das Skript von solandr geändert. Die Einbeziehung der RMS-Extraktion ist korrekter, wenn man das eingebaute iStdDevOnArray verwendet, da die Division durch (Anzahl der Potenzen-1) nur für Stichproben mit bis zu 30 Elementen sinnvoll ist.
//+------------------------------------------------------------------+
//|                                                     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);
}
//+------------------------------------------------------------------+



Die Extremwert-Suche basiert auf Rohdaten, nicht auf Positionen und Brüchen.

Daher ist das Kriterium etwas anders:

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: Stichproben-RMS (Spread) = 0.00438062
2006.05.28 14:53:08 Herst EURUSD,M15: Stichprobenvarianz = 0.00001919
2006.05.28 14:53:08 Herst EURUSD,M15: Stichprobenmittelwert = 1.27924631
2006.05.28 14:53:06 Herst EURUSD,M15: erfolgreich geladen
2006.05.28 14:52:59 Herst-II EURUSD,M15: entfernt
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: Stichprobe RMS (Spread) = 0.00437625
2006.05.28 14:52:59 Herst-II EURUSD,M15: Stichprobe Mittelwert = 1.27924631
2006.05.28 14:52:59 Herst-II EURUSD,M15: erfolgreich geladen
2006.05.28 14:52:54 Kompilieren von 'Herst-II'

 
Lieber Vladislav!
Ich danke Ihnen für Ihre ausführliche Antwort.