Elliot Dalga Teorisine dayalı ticaret stratejisi - sayfa 22

 
Bu sitedeki açıklamayı takip ediyorum http://impb.psn.ru/~sychyov/html/soft.shtml
Hurst üssünü hesaplayan bir program indirdim. Komut dosyasında, çubukları açmak için bir fiyat dosyası oluşturdum.
Dosyayı programla açtım ve program Hurst üssünü hesapladı. Ama hangi örneği seçersem seçeyim program her zaman 1'e yaklaşan gösterge değerleri üretiyor. Ama bu teorinin çerçevesine uymuyor değil mi? Yani, farklı örneklerde okumalar 0'dan 1'e değişmelidir? Ve bu programda, bu gösterge sadece 1: o (. Genel olarak, sitede hazır hesaplama fonksiyonlarının yayınlanmasına sevindim. Ve şimdi onlar üzerinde bir şey hesaplamaktan korkuyorum.

Ve şimdiye kadar, bu katsayı 0.21-0.39 aralığındadır. Ve neden belli değil :o(.
İşte kodunuza göre komut dosyası kodum:
//+------------------------------------------------------------------+
//|                                                        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, belki sadece bir göz atıp bana katsayıyı doğru hesaplamak için neyi düzeltmeniz gerektiğini söylersiniz? Sonuçta, teoriye göre, tüm hesaplamalar basit ve nerede hata yaptığımı bile bilmiyorum :o(

 
Varyansı hesaplamak için işlevi çağırdığınızda merkez değişkeni olarak neyi seçersiniz? Orada, en azından, tahmin edilen değerlere sahip bir dizi olmalı - her çubuk için bir tahmin yaptınız veya yaptınız, ters çalıştırın ve tahminin doğruluğuna bakın - hala tatmin edici mi değil mi.
Ve sonra, hesaplamalar tarafından zaten pek kolaylaştırılmayan algoritmaya bu kadar çok sayıda işlev çağrısı ..... IMHO önemli ölçüde yavaşlayacaktır. (İşlev çağrısı en uzun prosedürdür, ardından kayan noktalı bölme işlemi gelir).
Ve standart sapmayı hesaplamak için standart algoritmaya uymayan nedir? Teslimatta - sadece orada ilgili çubuktaki hareketli ortalamanın değeri tahmin olarak alınır - ihtiyacınız olanı alın - bu kadar ve işlev çağrısı yok. Basitçe dizide dolaştık, belirli bir çubukta öngörülen fiyattan gerçekten ortaya çıkanla kare farklarını aldık, ardından bir kez karekök - toplam vaka sayısı.

İyi şanslar ve geçen trendler.
 

http://forex.ua/forum/viewtopic.php?t=1574
http://forex.ua/forum/viewtopic.php?t=1634&postdays=0&postorder=asc&start=50
Burada FA ve TA için kısa vadeli bir tahmin karşılaştırması vardı (daldaki belirli bir miktarda flam yorulduktan sonra).
http://forex.ua/forum/viewtopic.php?t=1780

Bağlantılar için teşekkürler! Onu okurum. Çok bilgilendirici! Bu, stratejinizin özünü doğru anladığımı bir kez daha doğruladı. Zaten bu yönde bir şeyler programlamaya başladı. Yukarıda gündemdeki güncel sorunları zaten yazdım. Ancak hesaplamaların ilk sonuçları bile çok etkileyici! Gerçekten de kendiniz denemeden her şeyin neden dediğiniz gibi olduğunu anlayamayacaksınız! Tüccarların büyük çoğunluğu arasında tarif edilmesi zor stratejinizin bu kadar düşük popülaritesinin nedeni tam olarak budur. Farklı osilatörlerin çok renkli güzel çizelgelerine bakmak ve çeşitli ücretli analistleri okumak, insanların çok uzun süredir biriktiği bilgisine dayanarak Forex oynama konusuna yaklaşmaktan çok daha çekici. Prensip olarak, bu durum hala devam etse de - o zamana kadar Forex'te para kazanmak muhtemelen iyi olacak!
 
Prensip olarak, bu durum hala devam etse de - o zamana kadar Forex'te para kazanmak muhtemelen iyi olacak!


:).

İyi şanslar ve geçen trendler.
 
Varyansı hesaplamak için işlevi çağırdığınızda merkez değişkeni olarak neyi seçersiniz? Orada, en azından, tahmin edilen değerlere sahip bir dizi olmalı - her çubuk için bir tahmin yaptınız veya yaptınız, ters çalıştırın ve tahminin doğruluğuna bakın - hala tatmin edici mi değil mi.
Ve sonra, hesaplamalar tarafından zaten pek kolaylaştırılmayan algoritmaya bu kadar çok sayıda işlev çağrısı ..... IMHO önemli ölçüde yavaşlayacaktır. (İşlev çağrısı en uzun prosedürdür, ardından kayan noktalı bölme işlemi gelir).
Ve standart sapmayı hesaplamak için standart algoritmaya uymayan nedir? Teslimatta - sadece orada ilgili çubuktaki hareketli ortalamanın değeri tahmin olarak alınır - ihtiyacınız olanı alın - bu kadar ve işlev çağrısı yok. Basitçe dizide dolaştık, belirli bir çubukta öngörülen fiyattan gerçekten ortaya çıkanla kare farklarını aldık, ardından bir kez karekök - toplam vaka sayısı.
Sana tamamen katılıyorum! Küçük hesaplamalarda henüz fark edilmese de, gelecekte frenler kütle hesaplamalarında ürkütücü olacaktır. Ancak bu, şimdiye kadar her şeyin hesaplanacağı algoritmanın kendisinin geliştirilmesinden kaynaklanmaktadır. En ilkel işlevlerin bu kadar bolluğu, bir algoritma ararken onu kullanmanın rahatlığından (en azından bana öyle geliyor :o) kaynaklanmaktadır. Yani bu fonksiyonları RMS, varyans, aritmetik ortalama, sadece başka birçok şeyde kullanıyorum. Her şey netleştiğinde - neyin ve nasıl sayılacağı ve ayrıca hesaplamaların miktarı, doğal olarak her şey optimize edilecektir. Bu arada - o zaman kullanırız - tabiri caizse dizde ilk tahminler var; o).
Bu örnekte, merkez değişkeni olarak örneğin aritmetik ortalamasını kullandım.
Ayrıca dün bu değişken olarak doğrusal bir regresyon çizgisi belirlemeye çalıştım. Yani, S=RMSE lineer regresyon hatalarını elde ederiz. Ama nedense sonuç beni de etkilemedi :o(.
İşte lineer regresyon çizgisini bir tahmin olarak aldığımız komut dosyasının kodu. Ayrıca, EURUSD'deki mevcut eğilim buna mükemmel bir şekilde uyuyor.
//+------------------------------------------------------------------+
//|                                                        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);
}


EURUSD'de H1 dönemini alıyoruz. 500 barlık bir örnek alıyoruz - Hurst katsayısı = 0.26
300 bar - 0,31, 100 bar - 0,39, 30 bar - 0,51. Nedeni belli değil :o(.

Önerdiğiniz taşınmayı deneyeceğiz. Her ne kadar sonuçların temelde nelerden farklı olacağı hala net değil.

 
HURRAH! Görünüşe göre Hirst'ü nasıl sayacağımı buldum. Göstergenin doğrusal regresyon kanalına göre hesaplandığı komut dosyasının metni burada.
//+------------------------------------------------------------------+
//|                                                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);

}


İşte bu bağlantıdaki ekran görüntüleri https://c.mql5.com/mql4/forum/2006/05/Herst.zip
Konunun kendisine bakmak uygun olur diye ilk başta bu resim dosyalarını siteye yüklemeye çalıştım ama nedense www.mql4.com sitesindeki bu gif dosyaları değiştirdikten sonra ısrarla eklenmek istemiyor. motor :o(. Sorun değil, en azından zip indiriliyor.

Senaryo için kısa açıklamalar. Senaryo, Hurst üssünün hesaplandığı, grafikte doğrusal regresyon kanalının kalın sarı bir çizgisini çizer ve ayrıca bu kanalın geleceğe projeksiyonunu ince bir kırmızı çizgi ile çizer.
Ekran görüntülerine bakılırsa, muhtemelen şu anda hesaplama ile tahmin ettim: o). Her ne kadar gelecekte tekrar kontrol edilmesi gerekecek olsa da.

Not: Vladislav, Hurst üssünün hareket ederek hesaplanması bana biraz şüpheli görünüyor, çünkü ortalama periyodun hangi değerinin alınması gerektiği bilinmiyor. Her belirli hesaplama için bu değerin, puan sayısına bağlı olarak bir şekilde değişmesi gerektiğini varsayıyorum. Bu yüzden şimdilik doğrusal bir regresyon kanalına karar verdim.

 
Diğerlerinin sakıncası yoksa ben atlarım. Belli belirsiz tahmin etsem de, Vladislav'ın metodolojisine pek girmedim. Resimler yüzünden konuşmaya karar verdim. Eh, bu formda içlerinde tahıl yok, bana öyle geliyor ki hesaplamalar sürünüyor olmalı (muhtemelen Vladisla da öyle öneriyor). Diyelim ki aynı sarı çizgiyi 20'ye (30-40 ve benzeri) sayıyoruz, bunun için Hurst'u (RMS, vb.) sarı bir çizgi alındı) ve yeni (yeni oluşturulmuş) bir çubuk eklenir ve bu örnek üzerinde Hurst hesaplanır (RMS vb.) Bu hesaplamalar güven aralığına uyduğu sürece (burada olasılık talep) - hiçbir şey yapmıyoruz, her şey izin verilen sınırlar içinde gelişir, aralık ihlal edilir edilmez kanal ve diğer katsayılar yeniden hesaplanır. Yani, piyasa yeniden hesaplamak için emir verene kadar amaçlanan yol boyunca sürünen böyle bir sürünen kanal.

Buradan benim anladığım şu (belki yanlış).
 
Şey, aslında bundan biraz daha derin! Hurst üssünü hesaplamak için komut dosyası içeren resimlerim, hem lineer regresyon hem de ikinci dereceden formlar açısından optimal olan kanallar olmak üzere, şu anda önemli olan kanalları belirleme fikrinin özüne sadece bazı eklerdir. Yani, bu stratejideki Hurst, yalnızca bazı onaylayıcı özelliklerdir, ancak hiçbir şekilde ana özellik değildir! Temel, %90, %95 ve %99 gibi hesaplanmış güven aralıklarına sahip gerçek kanallardır. Ve stratejinin anlamı, onları doğru bir şekilde belirlemek, yani aktif bir kanal oluşturmak için en uygun çubuk sayısını tam olarak almak ve tam olarak en kabul edilebilir sıranın bir fonksiyonu ile yaklaşık olarak tahmin etmektir. Tabii ki, hiç kimse eski çubukları seçimden atmayacak çünkü yeni bir çubuk ortaya çıktı! TÜM geleneksel göstergelerin üzerine inşa edildiği tüm saçmalık budur. Ve böylece, sürünen kanallara dayanan göstergeler zaten makul miktarda icat edildi. Örneğin, aşağıda onlardan biri. Yaptığı işin tüm saçmalıkları onu bir süre izleyerek takdir edilebilir. Yeni bir çubuk göründüğünde (ve buna göre sonuncusu silindiğinde), göstergenin açısının 45 dereceden -45 dereceye değişebileceği anları göreceksiniz! Ve sonra bir diğeri göründüğünde 45 dereceye kadar dönebiliyor! :o)))) Ancak bu göstergede her şey tam olarak yazdığım gibi çalışmıyor. Orada, referans noktalarının arandığı çubuk sayısı ile sınırlı bir süre alınır - fraktallar. Ve elbette, bu referans noktalarının gerçekte ne olduğu dikkate alınmaz - çünkü hangi güven aralığına ait olduklarına dair bir değerlendirme yapılmaz - dolayısıyla gösterge çizgilerinin oluşturulmasında ortaya çıkan tüm hatalar.
//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
 
Bununla birlikte, bu gösterge (Shi Kanalı) çok ilginç - trendle ve kanalın sınırlarından bir dairede oynama fikri kendi içinde sağlam.
 
Bununla birlikte, bu gösterge (Shi Kanalı) çok ilginç - trendle ve kanalın sınırlarından bir dairede oynama fikri kendi içinde sağlam.

Bu gösterge bu stratejiden alınmıştır
http://fxovereasy.50webs.com/Example1.html
Siteden MT4 için bu strateji için gerekli göstergeleri indirebilirsiniz.
http://fxovereasy.50webs.com/Indicators.html
İlk bakışta her şey oldukça sağlıklı görünüyor. Eh, stratejilerin başka açıklaması yok ;o).