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

 
Aus der Beschreibung auf dieser Website http://impb.psn.ru/~sychyov/html/soft.shtml
Ich habe ein Programm heruntergeladen, das den Hurst-Index berechnet. Ich habe im Skript eine Datei mit den Eröffnungskursen der Bars erstellt.
Ich habe die Datei geöffnet und das Programm hat den Hearst-Index berechnet. Aber egal welche Probe ich auswähle, das Programm zeigt immer Indikatorwerte nahe 1 an. Aber das passt nicht zur Theorie, oder? Das heißt, der Messwert sollte bei verschiedenen Proben zwischen 0 und 1 liegen? Aber in diesem Programm ist dieser Parameter auf 1 geklebt :o(. Im Allgemeinen bin ich froh, dass die fertigen Berechnungsfunktionen auf der Website verfügbar sind. Und jetzt habe ich Angst, mit ihnen etwas zu berechnen.

Ich habe diesen Koeffizienten bisher im Bereich von 0,21-0,39. Ich weiß nicht, warum :o(.
Hier ist mein Code für das Skript, das ich auf Ihrem Code basiert:
//+------------------------------------------------------------------+
//|                                                        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, vielleicht können Sie einen Blick darauf werfen und mir sagen, wo ich etwas ändern muss, um den Koeffizienten korrekt zu berechnen? Schließlich sind nach der Theorie alle Berechnungen elementar und ich weiß nicht einmal, wo mein Fehler liegt :o(

 
Was wählen Sie als zentrale Variable, wenn Sie die Funktion zur Berechnung der Varianz aufrufen? Es sollte zumindest ein Array mit vorhergesagten Werten geben - Sie machen oder machen eine Vorhersage für jeden Balken, einen Rückwärtslauf und schauen Sie sich die Genauigkeit der Vorhersage an - noch zufriedenstellend oder nicht.
Und dann eine solche Anzahl von Funktionsaufrufen bei einem Algorithmus, der durch Berechnungen ohnehin nicht gerade erleichtert wird..... Meiner Meinung nach wird sie sich erheblich verlangsamen. (Der Funktionsaufruf ist die längste Prozedur, danach kommt die Gleitkommadivision).
Was ist falsch am Standardalgorithmus zur Berechnung der Standardabweichung? Es ist verfügbar, aber die Vorhersage nimmt den Wert eines muving auf der entsprechenden Bar - nehmen Sie, was Sie brauchen, das ist es und keine Funktion ruft. Sie führen einfach eine Schleife durch ein Array und quadrieren die Differenzen zwischen dem prognostizierten Preis auf einem bestimmten Balken und dem realen Preis, dann ziehen Sie einmal die Quadratwurzel - das war's.

Viel Glück und viel Erfolg mit Trends.
 
<br / translate="no">http://forex.ua/forum/viewtopic.php?t=1574
http://forex.ua/forum/viewtopic.php?t=1634&postdays=0&postorder=asc&start=50
Es gab einen kurzfristigen Vergleich der FA- und TA-Prognosen hier (nachdem einige Flam in dem Thread einfach die Nase voll hatten).
http://forex.ua/forum/viewtopic.php?t=1780

Vielen Dank für die Links! Lesen Sie selbst. Sehr informativ! Es hat mir wieder einmal bestätigt, dass ich das Wesentliche Ihrer Strategie richtig verstanden habe. Ich habe bereits begonnen, selbst etwas in dieser Richtung zu programmieren. Ich habe oben bereits über die aktuellen Probleme auf der Tagesordnung geschrieben. Aber schon die ersten Berechnungsergebnisse sind sehr beeindruckend! Solange Sie es nicht selbst ausprobiert haben, können Sie nicht verstehen, warum die Dinge wirklich so geschehen, wie Sie sagen! Das ist es, was Ihre Strategie bei der Mehrheit der Händler so unbeliebt macht. Es ist viel attraktiver, sich schöne bunte Charts verschiedener Oszillatoren anzuschauen ;o) und verschiedene bezahlte Analysten zu lesen, als seine Forex-Handelsstrategie auf Wissen zu gründen, das von Menschen über lange Zeit angesammelt wurde. Solange dieser Zustand anhält, ist es im Prinzip möglich, auf dem Forex gutes Geld zu verdienen!
 
Im Prinzip ist es jedoch möglich, am Forex gutes Geld zu verdienen, solange die Dinge so bleiben, wie sie sind!


:).

Viel Glück und gute Trends.
 
Was wählen Sie als zentrale Variable, wenn Sie die Funktion zur Berechnung der Varianz aufrufen? Es sollte zumindest ein Array mit vorhergesagten Werten vorhanden sein - Sie machen oder haben eine Vorhersage für jeden Balken gemacht, führen einen Rückwärtslauf durch und sehen sich die Genauigkeit der Vorhersage an - immer noch zufriedenstellend oder nicht. <br/ translate="no"> Und dann eine solche Anzahl von Funktionsaufrufen bei einem Algorithmus, der schon durch Berechnungen nicht gerade erleichtert wird..... Meiner Meinung nach wird sie sich erheblich verlangsamen. (Der Funktionsaufruf ist die längste Prozedur, danach kommt die Gleitkommadivision).
Was ist falsch am Standardalgorithmus zur Berechnung der Standardabweichung? Es ist verfügbar, aber die Vorhersage nimmt den Wert eines muving auf der entsprechenden Bar - nehmen Sie, was Sie brauchen, das ist es und keine Funktion ruft. Führen Sie einfach eine Schleife durch das Array und nehmen Sie die Quadrate der Differenzen zwischen dem prognostizierten Preis auf dem gegebenen Balken und dem realen Preis, dann nehmen Sie einmal die Quadratwurzel - das ist alles.
Ich stimme Ihnen voll und ganz zu! Die Verzögerungen in der Zukunft werden bei Massenberechnungen schrecklich sein, obwohl sie bei kleinen Berechnungen noch nicht auffallen. Das liegt aber an der Entwicklung des Algorithmus, mit dem dann alles berechnet wird. Eine solche Fülle von primitiven Funktionen wird einfach durch die Bequemlichkeit (zumindest scheint es mir so :o)) der Verwendung bei der Suche nach einem Algorithmus verursacht. Das heißt, diese Funktionen RMS, Dispersion, Mittelwert verwende ich einfach in vielen anderen Dingen. Wenn alles klar ist - was und wie gezählt wird und wie groß der Umfang der Berechnungen ist -, dann wird natürlich alles mitoptimiert. Bis dahin ist das, was wir haben, das, was wir benutzen - sozusagen die ersten Kurbelschätzungen ;o).
In diesem Beispiel habe ich das arithmetische Mittel der Stichprobe als zentrale Variable verwendet.
Auch gestern habe ich versucht, eine lineare Regressionslinie als diese Variable festzulegen. Daraus ergibt sich, dass S=SCO der linearen Regressionsfehler. Aber aus irgendeinem Grund hat mich das Ergebnis auch nicht beeindruckt :o(.
Hier ist der Code des Skripts, in dem wir eine lineare Regressionslinie als Vorhersage verwenden. Außerdem passt der aktuelle EURUSD-Trend sehr gut dazu.
//+------------------------------------------------------------------+
//|                                                        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);
}


Nehmen wir den H1-Zeitraum für EURUSD. Wir nehmen eine Stichprobe von 500 Takten Hearsts Koeffizient = 0,26
300 Takte - 0,31, 100 Takte - 0,39, 30 Takte - 0,51. Ich verstehe nicht warum :o(.

Wir werden das von Ihnen empfohlene Verfahren ausprobieren. Allerdings weiß ich noch nicht, warum sich die Ergebnisse grundlegend von dem unterscheiden werden, was ich habe.

 
HOORAY! Es sieht so aus, als hätte ich herausgefunden, wie man Hurst berechnet. Hier ist der Text des Skripts, in dem der Index in Bezug auf den linearen Regressionskanal berechnet wird.
//+------------------------------------------------------------------+
//|                                                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);

}


Hier ist der Link, unter dem die Screenshots zu finden sind: https://c.mql5.com/mql4/forum/2006/05/Herst.zip
Zuerst habe ich versucht, diese Bilddateien auf die Seite hochzuladen, so dass es bequem wäre, sie im Thema selbst zu sehen, aber aus irgendeinem Grund wollen diese Gif-Dateien auf der Seite www.mql4.com nach dem Motorwechsel nicht eingefügt werden :o(. Das Gute daran ist, dass wenigstens zip hochgeladen wurde.

Eine kurze Erläuterung des Drehbuchs. Das Skript zeichnet eine dicke gelbe Linie des linearen Regressionskanals in den Chart und gleichzeitig die Projektion des Kanals in die Zukunft mit einer dünnen roten Linie.
Nach den Screenshots zu urteilen, muss ich mit meinen Berechnungen richtig liegen :o). Allerdings werde ich das in Zukunft noch einmal überprüfen müssen.

PS: Vladislav, ich halte die Berechnung des Hurst-Index durch muving für etwas zweifelhaft, da nicht bekannt ist, welcher Wert für die Mittelungsperiode genommen werden soll. Ich gehe davon aus, dass sich dieser Wert für jede einzelne Berechnung in Abhängigkeit von der Anzahl der Tochets irgendwie ändern sollte. Deshalb habe ich mich vorerst für einen linearen Regressionskanal entschieden.

 
Ich werde mich an der Unterhaltung beteiligen, wenn die anderen nichts dagegen haben. Ich habe mich nicht eingehend mit Vladislavs Methodik befasst, obwohl ich eine vage Vorstellung davon habe. Ich habe beschlossen, mich wegen der Bilder zu äußern. Nun, in dieser Form ist kein Korn in ihnen, es scheint mir, dass die Berechnungen schleichend sein müssen (wahrscheinlich bietet Vladislav so). Angenommen, wir berechnen die gelbe Linie für 20 (30-40 und so weiter, je nach Geschmack) Balken und berechnen dann Hearst (RMS usw.), dann lassen wir bei einem neuen Balken den ältesten Balken aus der Stichprobe fallen (bei dem die gelbe Linie ermittelt wurde) und fügen einen neuen (neu gebildeten) Balken hinzu und verwenden diese Stichprobe zur Berechnung von Hearst (RMS usw.), bis diese Balken erscheinen.Solange diese Berechnungen in das Konfidenzintervall passen (jetzt ist die Wahrscheinlichkeit gefordert), tun wir nichts und alles entwickelt sich innerhalb der akzeptablen Grenzen, sobald das Intervall verletzt wird, werden der Kanal und andere Faktoren neu berechnet. Es handelt sich um einen schleichenden Kanal, der dem gewählten Pfad folgt, bis der Markt ihn auffordert, sich neu zu berechnen.

Das ist es, was ich (wahrscheinlich falsch) verstanden habe.
 
Nun, es geht sogar noch ein bisschen tiefer als das! Mein Hearst-Skript ist nur eine Ergänzung zur Essenz der Idee, die derzeit signifikanten Kanäle sowohl der linearen Regression als auch der optimalen Kanäle in Bezug auf quadratische Formen zu bestimmen. Das heißt, Hearst ist in dieser Strategie nur ein bestätigendes Merkmal, aber nicht das wichtigste! Die wichtigste: Es handelt sich um tatsächliche Kanäle mit berechneten Konfidenzintervallen von beispielsweise 90 %, 95 % und 99 %. Und der Sinn der Strategie - ist es, sie richtig zu bestimmen, d.h. genau die Anzahl der Balken zu nehmen, die für den Aufbau eines handelnden Kanals optimal ist und sie mit der Funktion dieser Ordnung anzunähern, die am akzeptabelsten ist. Natürlich wird niemand alte Balken aus der Auswahl entfernen, nur weil ein neuer Balken erschienen ist! Das ist alles Unsinn, auf dem ALLE herkömmlichen Indikatoren beruhen. Und es gibt eine große Anzahl von Indikatoren, die auf Crawling-Kanälen basieren. Ich werde im Folgenden eines dieser Beispiele anführen. Das Delirium seiner Arbeit lässt sich nach einiger Zeit der Beobachtung abschätzen. Sie werden die Momente sehen, in denen sich die Neigung des Indikators von 45 auf -45 Grad ändern kann, sobald ein neuer Balken erscheint (und der letzte entsprechend verschwindet)! Und dann, wenn man einen anderen sieht, kann man wieder auf 45 Grad zurückgehen:o)))) Es stimmt, dass dieser Indikator nicht genau so funktioniert, wie ich es geschrieben habe. Es dauert einen durch die Anzahl der Balken begrenzten Zeitraum, um Referenzpunkte - Fraktale - zu finden. Natürlich berücksichtigen wir nicht, was diese Bezugspunkte tatsächlich sind - weil wir nicht abschätzen, zu welchem Konfidenzintervall sie gehören - daher alle auftretenden Fehler beim Zeichnen der Linien des Indikators.
//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
 
Nichtsdestotrotz ist dieser Indikator (Shi Channel) sehr interessant - die Idee, mit dem Trend und von den Grenzen des Kanals in der Wohnung zu spielen, ist an sich sinnvoll.
 
Nichtsdestotrotz ist dieser Indikator (Shi Channel) sehr interessant - die Idee, mit dem Trend und von den Grenzen des Kanals in der Wohnung zu spielen, ist an sich sinnvoll.

Dieser Indikator ist dieser Strategie entnommen
http://fxovereasy.50webs.com/Example1.html
Sie können die notwendigen Indikatoren für diese Strategie für MT4 von der Website herunterladen.
http://fxovereasy.50webs.com/Indicators.html
Auf den ersten Blick scheint alles einen Sinn zu ergeben. Eine andere Strategiebeschreibung gibt es nicht ;o).
Grund der Beschwerde: