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

 
Dalla descrizione su questo sito http://impb.psn.ru/~sychyov/html/soft.shtml
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(

 
Cosa selezionate come variabile centrale quando chiamate la funzione per calcolare la varianza? Ci dovrebbe essere almeno un array di valori predetti - stai facendo una previsione per ogni barra, o hai fatto, una corsa inversa e guarda la precisione della previsione - ancora soddisfacente o no.
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.
 
<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
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!
 
In linea di principio, però, finché le cose rimangono come sono, è possibile fare dei buoni soldi sul Forex!


:).

Buona fortuna e buone tendenze.
 
Cosa selezionate come variabile centrale quando chiamate la funzione per calcolare la varianza? Ci dovrebbe essere almeno un array con i valori predetti - fai o hai fatto una previsione per ogni barra, inverti l'esecuzione e guarda la precisione della previsione - ancora soddisfacente o no. <br/ translate="no"> E poi un tale numero di chiamate di funzione su un algoritmo che è già poco 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 - 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.
Completamente d'accordo con te! I ritardi in futuro saranno terribili per i calcoli di massa, anche se su piccoli calcoli non si nota ancora. Ma questo è causato dallo sviluppo dell'algoritmo, che sarà poi utilizzato per calcolare tutto. Tale abbondanza di funzioni primitive è causata semplicemente dalla comodità (almeno mi sembra così :o)) di utilizzo quando si cerca un algoritmo. Cioè queste funzioni RMS, Dispersione, Media, le uso solo in molte altre cose. Quando tutto diventa chiaro - cosa contare e come, così come il volume dei calcoli, allora, naturalmente, tutto sarà co-ottimizzato. Fino ad allora, quello che abbiamo è quello che usiamo - per così dire, le prime stime a manovella ;o).
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.

 
URRÀ! Sembra che io abbia capito come calcolare Hurst. Ecco il testo dello script, dove l'indice è calcolato rispetto al canale di regressione lineare.
//+------------------------------------------------------------------+
//|                                                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.

 
Mi unirò alla conversazione, se agli altri non dispiace. Non ho approfondito molto la metodologia di Vladislav, anche se ne ho una vaga idea. Ho deciso di parlare a causa delle immagini. Beh, non c'è grano in loro in questa forma, mi sembra che i calcoli devono essere strisciante (probabilmente così Vladislav offre). Supponiamo di calcolare la linea gialla per 20 (30-40 barre e così via, secondo il nostro gusto) barre e poi calcolare Hearst (RMS, ecc.), poi su una nuova barra lasciamo cadere la barra più vecchia dal campione (su cui è stata ottenuta la linea gialla) e aggiungiamo una nuova barra (appena formata) e usiamo questo campione per calcolare Hearst (RMS, ecc.) finché queste barre appaiono.Finché questi calcoli rientrano nell'intervallo di confidenza (ora la probabilità è diventata richiesta), non facciamo nulla e tutto si sviluppa nei limiti accettabili, appena l'intervallo viene violato, il canale e gli altri fattori vengono ricalcolati. Cioè, c'è un tale canale strisciante che striscia lungo il percorso stabilito fino a quando il mercato gli dice di ricalcolare tutto.

Questo è quello che ho capito (probabilmente in modo errato).
 
Beh, in realtà è un po' più profondo di così! Le mie immagini dello script di Hearst sono solo un'aggiunta all'essenza dell'idea di determinare i canali attualmente significativi sia della regressione lineare che dei canali ottimali in termini di forme quadratiche. Cioè, Hearst in questa strategia è solo una caratteristica di conferma, ma non la principale! Il principale - questi sono canali reali con intervalli di confidenza calcolati del 90%, 95% e 99% per esempio. E il punto della strategia - è di determinarli correttamente, cioè di prendere esattamente il numero di barre, che è ottimale per costruire un canale di azione e approssimarlo con la funzione di quell'ordine, che è il più accettabile. Naturalmente nessuno rimuoverà le vecchie barre dalla selezione perché è apparsa una nuova barra! Sono tutte sciocchezze su cui si basano TUTTI gli indicatori convenzionali. E ci sono un gran numero di indicatori basati sui canali di crawling. Per esempio, ne citerò uno qui sotto. Il delirio del suo lavoro può essere stimato dopo averlo osservato per qualche tempo. Vedrete i momenti in cui la pendenza dell'indicatore può cambiare da 45 a -45 gradi non appena appare una nuova barra (e l'ultima scompare di conseguenza)! E poi, quando ne vedi un altro puoi tornare a 45 gradi!:o)))) È vero che questo indicatore non funziona esattamente come ho scritto. Prende un periodo limitato dal numero di barre e cerca punti di riferimento - frattali. Naturalmente non prendiamo in considerazione quali siano effettivamente questi punti di riferimento - perché non stimiamo a quale intervallo di confidenza appartengano - da qui tutti gli errori di disegno delle linee dell'indicatore che ne derivano.
//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
 
Tuttavia, questo indicatore (Shi Channel) è molto interessante - l'idea di giocare con la tendenza e dai confini del canale nel piatto è sensato in sé.
 
Tuttavia, questo indicatore (Shi Channel) è molto interessante - l'idea di giocare con la tendenza e dai confini del canale nel piatto è sensato in sé.

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).
Motivazione: