基于艾略特波浪理论的交易策略 - 页 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);
}


弗拉迪斯拉夫,也许你可以看一看,告诉我哪里需要调整,以便正确计算系数?毕竟,根据理论,所有的计算都是初级的,我甚至不知道我的错误在哪里 :o(

 
当你调用函数来计算方差时,你选择什么作为中心变量?至少应该有一个带有预测值的数组--你在为每个柱子做或预测,一个反向运行,看看预测的准确性--仍然满意或不满意。
然后在一个已经没有多少轻量级计算的算法上进行如此多的函数调用,.....IMHO,它将大大减慢速度。(函数调用是最长的程序,然后是浮点除法操作)。
计算标准差 的标准算法有什么问题?它是可用的,但预测采取的是相应条形上的一个muving的值--采取你所需要的,这就是它,没有函数调用。你只需在数组中运行一个循环,将某一给定条形上的预测价格与实际价格的差异进行平方,然后进行一次平方根,就是这样。

祝您好运,并祝您在趋势方面好运。
 
<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
这里有一个短期的FA和TA预测的比较(在主题中的一些flam只是被厌倦了)。
http://forex.ua/forum/viewtopic.php?t=1780

谢谢你的链接!请阅读一下。信息量非常大!它再一次向我证实,我正确地理解了你的战略的本质。我自己已经开始在这个方向上编程了。我已经在上面写了关于目前议程上的问题。但是,即使是第一次计算结果也是非常令人印象深刻的!的确,除非你亲自尝试,否则你无法理解为什么事情真的会以你所说的方式发生。这就是你的策略不受大多数交易者欢迎的原因。看不同震荡器的美丽的多色图表;o)和阅读不同的付费分析,比把你的外汇交易策略建立在人们长期积累的知识上要有吸引力得多。尽管从原则上讲,只要这种状态不改变,就有可能在外汇市场上赚取丰厚的利润
 
但原则上,只要事情保持原样,就有可能在外汇市场上赚到好钱!"。


:).

好运和良好的趋势。
 
当你调用函数来计算方差时,你选择什么作为中心变量?至少应该有一个带有预测值的数组--你对每个柱状物进行或已经进行了预测,反向运行并查看预测的准确性--仍然满意或不满意。<br/ translate="no"> 然后在一个已经没有多少轻度计算的算法上进行如此多的函数调用.....。IMHO,它将大大减慢速度。(函数调用是最长的程序,然后是浮点除法操作)。
计算标准差的标准算法有什么问题?它是可用的,但预测采取的是相应条形上的一个muving的值--采取你所需要的,这就是它,没有函数调用。只需在数组中运行一个循环,并获取给定条形上的预测价格与实际价格之间的差异的平方,然后取一次平方根--就可以了。
完全同意你的观点!未来的滞后对于质量计算来说将是非常可怕的,尽管在小的计算上现在还不明显。但这是由算法的发展造成的,然后将用于计算一切。如此丰富的原始函数只是因为在搜索算法时使用方便(至少在我看来是这样:o))。这就是这些函数RMS、Dispersion、Average,我只是在许多其他事情上使用。当一切都变得清晰--计算什么和如何计算,以及计算量,那么当然,一切都会被共同优化。在那之前,我们所拥有的就是我们所使用的--可以说是第一个曲柄估计;o)。
在这个例子中,我使用了样本算术平均数作为中心变量。
另外,昨天我试着设置一条线性回归 线作为这个变量。因此,我们可以得到,S=SCO的线性回归误差。但由于某些原因,结果也没有给我留下深刻印象 :o(。
这里是脚本的代码,我们把线性回归线作为预测。此外,目前欧元兑美元的趋势非常符合这一点。
//+------------------------------------------------------------------+
//|                                                        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);
}


让我们以欧元兑美元的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
起初我想把这些图片文件上传到网站上,这样就可以方便地在主题中查看它们,但由于某些原因,这些GIF文件在www.mql4.com,在引擎改变后一直不愿意被插入 :o(。不要紧,好在至少有拉链上传。

对剧本的简要解释。脚本在图表中画出线性回归通道的粗黄线,同时用细红线画出该通道在未来的预测。
从截图来看,我的计算一定是正确的:o)。尽管我需要在将来仔细检查。

PS:Vladislav,我认为Muving的Hurst指数计算有点可疑,因为不知道应该取哪一个平均周期的值。我想,每个特定的计算的这个值应该以某种方式改变,这取决于抽签的数量。这就是为什么我暂时定在了线性回归通道上。

 
如果其他人不介意的话,我也会加入谈话。我没有深入研究过弗拉迪斯拉夫的方法论,虽然我有一个模糊的概念。因为这些照片,我决定说出来。好吧,在这种形式下,他们没有粮食,在我看来,计算必须是蠕动的(可能弗拉迪斯拉夫是这样提供的)。假设我们计算了20个(30-40个,以此类推,看起来是这样)条形的黄线,并进行赫斯特计算(有效值等),然后在一个新的条形上,我们放弃样本中最老的条形(在此基础上获得黄线),并增加一个新的(新形成的)条形,并使用这个样本进行赫斯特计算(有效值等),直到这些条形出现。只要这些计算符合置信区间(现在概率已经成为需求),我们什么都不做,一切都在可接受的范围内发展,一旦违反区间,通道和其他因素就会重新计算。它是一个爬行通道,沿着选定的路径,直到市场订单重新计算。

这是我的理解(可能不正确)。
 
好吧,实际上比这更深一点!我的赫斯特脚本图片只是对思想精髓的补充,以确定目前线性回归的重要通道和二次形式方面的最佳通道。也就是说,赫斯特在这个策略中只是一些确认性的特征,而不是主要的特征!主要的是--这些是实际的渠道,计算出的置信区间 为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)。