엘리엇 파동 이론에 기반한 거래 전략 - 페이지 22

 
이 사이트의 설명을 따르고 있습니다. http://impb.psn.ru/~sychyov/html/soft.shtml
허스트 지수를 계산하는 프로그램을 다운로드했습니다. 스크립트에서 봉을 여는 가격 파일을 만들었습니다.
나는 프로그램으로 파일을 열었고 프로그램은 허스트 지수를 계산했습니다. 하지만 내가 어떤 샘플을 선택하든 프로그램은 항상 1에 가까운 지표 값을 생성합니다. 하지만 이것은 이론의 틀에 맞지 않습니까? 즉, 다른 샘플에서 판독값이 0에서 1로 변경되어야 합니까? 그리고이 프로그램에서이 표시기는 숫자 1에 고정되어 있습니다. o (. 일반적으로 기성품 계산 기능이 사이트에 게시되어 기뻤습니다. 이제 나는 그들에서 무언가를 계산하는 것이 두렵습니다.

그리고 지금까지 이 계수는 0.21-0.39 범위에 있습니다. 그리고 그 이유는 명확하지 않습니다 :o(.
다음은 귀하의 코드를 기반으로 한 스크립트 코드입니다.
//+------------------------------------------------------------------+
//|                                                        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, 아마도 계수를 올바르게 계산하기 위해 무엇을 수정해야 하는지 한 번 보고 말씀해 주시겠습니까? 결국 이론에 따르면 모든 계산은 기본적이고 어디에서 오류가 있는지조차 모릅니다.o(

 
분산을 계산하는 함수를 호출할 때 중심 변수로 무엇을 선택합니까? 거기에는 최소한 예측된 값이 포함된 배열이 있어야 합니다. 각 막대에 대해 예측을 하거나 수행하고, 역주행하고 예측의 정확도를 확인합니다. 여전히 만족스러운지 여부입니다.
그리고 알고리즘에 대한 이러한 많은 함수 호출은 이미 계산에 의해 그다지 용이하지 않습니다. IMHO는 상당히 느려질 것입니다. (함수 호출은 가장 긴 프로시저이고 부동 소수점 나누기 연산이 뒤따릅니다).
그리고 표준편차를 계산하기 위한 표준 알고리즘으로 옳지 않은 것은? 그것은 배달에 있습니다-해당 막대의 이동 평균 값이 예측으로 사용됩니다-필요한 것을 취하십시오-이것이고 함수 호출이 없습니다. 우리는 단순히 배열을 순환하고 주어진 막대의 예측 가격과 실제로 나온 값의 제곱 차이를 취한 다음 제곱근을 한 번(총 케이스 수) 가져왔습니다.

행운을 빕니다.
 

http://forex.ua/forum/viewtopic.php?t=1574
http://forex.ua/forum/viewtopic.php?t=1634&postdays=0&postorder=asc&start=50
여기에서 FA와 TA에 대한 예측의 단기 비교가 있었습니다(지점에서 일정량의 플램이 지쳐버린 후).
http://forex.ua/forum/viewtopic.php?t=1780

링크 주셔서 감사합니다! 나는 그것을 읽었다. 매우 유익합니다! 이것은 내가 당신의 전략의 본질을 올바르게 이해하고 있음을 다시 한 번 확인시켜주었습니다. 이미 그는 이 방향으로 무언가를 프로그래밍하기 시작했습니다. 나는 이미 위의 의제에 대한 현재 문제에 대해 썼습니다. 그러나 계산의 첫 번째 결과조차도 매우 인상적입니다! 실제로 직접 해보기 전까지는 왜 모든 일이 당신이 말하는 대로 실제로 일어나는지 이해할 수 없을 것입니다! 이것이 바로 많은 거래자들 사이에서 설명하기 어려운 전략의 인기가 낮은 이유입니다. 사람들이 아주 오랫동안 축적해 온 지식을 바탕으로 Forex를 플레이하는 문제에 접근하는 것보다 다양한 오실레이터의 아름다운 멀티 컬러 차트를 보고 o) 다양한 유료 분석가를 읽는 것이 훨씬 더 매력적입니다. 원칙적으로 이러한 상황은 여전히 남아 있지만 그때까지는 Forex에서 돈을 버는 것이 좋을 것입니다!
 
원칙적으로 이러한 상황은 여전히 남아 있지만 그때까지는 Forex에서 돈을 버는 것이 좋을 것입니다!


:).

행운을 빕니다.
 
분산을 계산하는 함수를 호출할 때 중심 변수로 무엇을 선택합니까? 거기에는 최소한 예측된 값이 포함된 배열이 있어야 합니다. 각 막대에 대해 예측을 하거나 수행하고, 역주행하고 예측의 정확도를 확인합니다. 여전히 만족스러운지 여부입니다.
그리고 알고리즘에 대한 이러한 많은 함수 호출은 이미 계산에 의해 그다지 용이하지 않습니다. IMHO는 상당히 느려질 것입니다. (함수 호출은 가장 긴 프로시저이고 부동 소수점 나누기 연산이 뒤따릅니다).
그리고 표준편차를 계산하기 위한 표준 알고리즘으로 옳지 않은 것은? 그것은 배달에 있습니다-해당 막대의 이동 평균 값이 예측으로 사용됩니다-필요한 것을 취하십시오-이것이고 함수 호출이 없습니다. 우리는 단순히 배열을 순환하고 주어진 막대의 예측 가격과 실제로 나온 값의 제곱 차이를 취한 다음 제곱근을 한 번(총 케이스 수) 가져왔습니다.
전적으로 동의한다! 작은 계산에서는 아직 눈에 띄지 않지만 미래의 브레이크는 대량 계산에서 무섭습니다. 그러나 이것은 지금까지 모든 것이 계산될 알고리즘 자체의 개발로 인한 것입니다. 가장 원시적인 기능이 이렇게 풍부한 것은 단순히 알고리즘을 검색할 때 이를 사용하는 편리성(적어도 나에게는 :o)으로 인해 발생합니다. 즉, 이러한 함수 RMS, Variance, Arithmetic Mean, 나는 다른 많은 것들에서 그냥 사용합니다. 모든 것이 명확해지면 계산 대상과 방법, 계산 양은 물론 모든 것이 최적화됩니다. 그 동안 우리는 그것을 사용합니다. 말하자면 무릎에 대한 첫 번째 추정치 o).
이 예에서는 표본의 산술 평균을 중심 변수로 사용했습니다.
또한 어제 이 변수로 선형 회귀선 을 설정하려고 했습니다. 즉, 선형 회귀 오류의 S=RMSE를 얻습니다. 그러나 어떤 이유로 결과는 나에게도 깊은 인상을 주지 못했습니다 :o(.
다음은 선형 회귀선을 예측으로 사용하는 스크립트 코드입니다. 게다가, EURUSD의 현재 추세는 이에 완벽하게 맞습니다.
//+------------------------------------------------------------------+
//|                                                        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에서 H1 기간을 사용합니다. 500개 막대의 샘플을 취합니다. - 허스트 계수 = 0.26
300바 - 0.31, 100바 - 0.39, 30바 - 0.51 이유는 명확하지 않습니다 :o(.

추천해주신 이사를 해보겠습니다. 결과가 근본적으로 어떻게 다른지 아직 명확하지 않습니다.

 
만세! 허스트를 세는 방법을 알아낸 것 같습니다. 다음은 지표가 선형 회귀 채널을 기준으로 계산되는 스크립트의 텍스트입니다.
//+------------------------------------------------------------------+
//|                                                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);

}


다음은 이 링크의 스크린샷입니다. https://c.mql5.com/mql4/forum/2006/05/Herst.zip
처음에는 이 이미지 파일들을 사이트에 올려서 주제 자체를 보기 편하도록 하려고 했으나, 어째서인지 www.mql4.com 사이트에 있는 이러한 gif 파일들은 변경 후에도 지속적으로 삽입되기를 원하지 않습니다. 엔진 :o(. 괜찮습니다. 적어도 zip은 다운로드 중입니다.

스크립트에 대한 간략한 설명. 스크립트는 Hurst 지수가 계산되는 기준으로 차트에 선형 회귀 채널의 두꺼운 노란색 선을 그리고 가는 빨간색 선으로 미래에 대한 이 채널의 투영을 그립니다.
스크린샷으로 판단하면 아마도 지금 계산으로 추측했을 것입니다. o). 나중에 다시 확인해야하지만.

추신: Vladislav, 이동에 의한 Hurst 지수의 계산은 평균 기간의 값을 취해야 하는지 알 수 없기 때문에 다소 의심스러운 것 같습니다. 각 특정 계산에 대한 이 값은 포인트 수에 따라 어떻게든 변경되어야 한다고 가정합니다. 따라서 지금은 선형 회귀 채널에 정착했습니다.

 
다른 사람들이 괜찮다면 뛰어들겠습니다. 막연하게 추측하긴 하지만 블라디슬라프의 방법론에 대해 자세히 알아보지는 않았습니다. 사진 때문에 말하기로 결정했습니다. 글쎄,이 형태에는 곡물이 없습니다. 계산이 서서히 이루어져야하는 것 같습니다 (아마 Vladisla도 그렇게 제안합니다). 동일한 노란색 선을 20개(맛보기 위해 30-40 등)로 계산한다고 가정해 보겠습니다. 이 선을 위해 Hurst(RMS 등)를 계산한 다음 새 막대에서 가장 오래된 막대가 샘플에서 떨어집니다. 노란색 선이 수신됨) 새(새로 형성된) 막대가 추가되고 이 샘플(RMS 등)에 대해 Hurst가 계산됩니다. 이러한 계산이 신뢰 구간 에 맞는 한(여기서 확률은 요구) - 우리는 아무것도하지 않습니다 모든 것이 허용 한계 내에서 발전하며 간격이 위반되는 즉시 채널 및 기타 계수가 다시 계산됩니다. 즉, 시장이 재계산 명령을 내릴 때까지 의도한 경로를 따라 기어가는 크리핑 채널이 있습니다.

여기에서 내가 이해한 바가 있습니다(틀릴 수 있음).
 
음, 실제로는 그보다 조금 더 깊습니다! Hurst 지수를 계산하기 위한 스크립트가 있는 내 그림은 현재 시간에 중요한 채널, 즉 선형 회귀와 2차 형식의 관점에서 최적인 채널을 결정하기 위한 아이디어의 본질에 일부 추가된 것입니다. 즉, 이 전략에서 허스트는 일부 확인된 특성일 뿐이지 주요 특성은 아닙니다! 기준은 90%, 95% 및 99%와 같이 계산된 신뢰 구간 이 있는 실제 채널입니다. 그리고 전략의 의미는 그것들을 올바르게 결정하는 것, 즉 활성 채널을 구축하는 데 최적인 막대의 수를 정확히 취하고 가장 수용 가능한 정확한 순서의 함수로 근사하는 것입니다. 물론, 새로운 바가 등장했다고 해서 아무도 오래된 바를 선택에서 버리지는 않을 것입니다! 이것은 모든 기존 지표가 구축되는 모든 넌센스입니다. 따라서 크리핑 채널을 기반으로 한 지표는 이미 상당한 양으로 발명되었습니다. 예를 들어 아래는 그 중 하나입니다. 그의 작업의 모든 넌센스는 잠시 동안 그를 보면 감상 할 수 있습니다. 새 막대가 나타나면(따라서 마지막 막대가 삭제됨) 표시기의 각도가 45도에서 -45도로 변경되는 순간을 볼 수 있습니다! 그리고 또 다른 하나가 나타나면 45도까지 돌아갈 수 있습니다! :o)))) 그러나이 표시기에서는 모든 것이 내가 쓴 것처럼 정확하게 작동하지 않습니다. 거기에서 기준점이 검색되는 막대 수(프랙탈)에 따라 기간이 지정됩니다. 그리고 물론, 이러한 기준점이 실제로 무엇인지는 고려되지 않습니다. 왜냐하면 그들이 속한 신뢰 구간에 대한 평가가 이루어지지 않기 때문입니다.
//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
 
그럼에도 불구하고이 지표 (Shi Channel)는 매우 흥미 롭습니다. 트렌드와 평면에서 채널의 경계를 가지고 노는 아이디어는 그 자체로 건전합니다.
 
그럼에도 불구하고이 지표 (Shi Channel)는 매우 흥미 롭습니다. 트렌드와 평면에서 채널의 경계를 가지고 노는 아이디어는 그 자체로 건전합니다.

이 지표는 이 전략에서 가져온 것입니다.
http://fxovereasy.50webs.com/Example1.html
사이트에서 MT4에 대한 이 전략에 필요한 지표를 다운로드할 수 있습니다.
http://fxovereasy.50webs.com/Indicators.html
모든 것이 언뜻 보기에 아주 건강해 보입니다. 글쎄, 전략에 대한 다른 설명은 없습니다 ;o).
사유: