Simple Coding Help - No Promise.

But I've read his book once before and as far as I can remember his theory, it does seem that Hurst did use future quotes and automatically corrected itself as it became aware of mistakes. If I remember right the term used was "feedback".

It is not wrong if you are able to understand that AFL is simply attempting to guess the future and AFL will auto correct as market depicts reality. If you take it as a one more "Known risk", you can trade with it.

It becomes wrong only if you take a stance that that signals once shown must not disappear.
Yep, the Feedback is used for course correction :D


:) Happy
 
Sorry Guys . . .

Can't do the conversion from MT4 to Ami,

:) Happy
 

Nehal_s143

Well-Known Member
sir I have


1. J. M. Hurst - The Profit Magic Of Stock Transaction Timing Size 8 MB
2. Cyclic.Analysis_.A.Dynamic.Approach.to.T.J.M.Hurst Size 6.5 MB
3. Ch. Grafton - Mastering Hurst Cycles Size 22.3 MB

I can send you by email or 4shared link, please let me know which one you want ?





Nehal, Pratap


I went thru my backup to find out what I had on Hurst Bands. Lot of files I had were lost due to hardware failure on my earlier computer, so I no longer have any of his PDFs. If you have the PDFs and want to share it, upload it somewhere and post links here.

But I've read his book once before and as far as I can remember his theory, it does seem that Hurst did use future quotes and automatically corrected itself as it became aware of mistakes. If I remember right the term used was "feedback".

It is not wrong if you are able to understand that AFL is simply attempting to guess the future and AFL will auto correct as market depicts reality. If you take it as a one more "Known risk", you can trade with it.

It becomes wrong only if you take a stance that that signals once shown must not disappear.

These are all the important formulas I had collected on Hurst. Total is close to 20 but these are the ones I wanted to work with. The one that matches yours is in Formula two. Some are in "Metastock" Some are in "EasyLanguage". I used to have it in MQL too but cannot find that one now

In nutshell, I am not confident that "repainting" can be called an error in this particular case and therefore fixing the repainting may actually defeat the purpose.

Please do realize that I am not discouraging you.... There is a mystery and lots of confusion around this and if you want to trade on it, you'll have to understand what you are dealing with. First, know the risks and then decide whether to take 'em or reject 'em


Code:
----------------------------------------------------- 
-FORMULA ONE ----------------------------------------
----------------------------------------------------- 
l1:=3;
m1:=1;
l2:=80;
m2:=3;

data:=mp();

mid1:=mov(data,l1,s);
mid2:=mov(data,l2,s);

atr1:=atr(l1);
atr2:=atr(l2);

ul1:=mid1+m1*atr1;
ll1:=mid1-m1*atr1;

ul2:=mid2+m2*atr2;
ll2:=mid2-m2*atr2;

{plot}
ul1;ll1;
ul2;ll2;

----------------------------------------------------- 
-FORMULA TWO ----------------------------------------
----------------------------------------------------- 

{ Hurst Channels } 
CY1:= Input("Short Cycle length",1,1000,10 )/2; 
CY2:= Input("Medium Cycle length",1,1000,80 )/2; 
M1:= Input("Short Cycle Multiplier",.01,10 ,1 ); 
M2:= Input("Medium Cycle Multiplier",.01,10,3 ); 
T1:= Ref(Mov( CLOSE ,CY1 ,TRI ),-CY1/2)+ M1*ATR(CY1 ); 
B1:= Ref(Mov( CLOSE ,CY1 ,TRI ),-CY1/2)- M1*ATR(CY1 ); 
T2:= Ref(Mov( CLOSE ,CY2 ,TRI ),-CY2/2)+ M2*ATR(CY2 ); 
B2:= Ref(Mov( CLOSE ,CY2 ,TRI ),-CY2/2)- M2*ATR(CY2 ); 
T1;B1;T2;B2; 
----------------------------------------------------- 
-FORMULA THREE --------------------------------------
----------------------------------------------------- 
Hurst Bands 
----------------------------------------------------- 
pds:= Input("LR Periods",10,100,41); 
a:= Input("Stdev Periods",10,100,30); 
s1:=Input("Smoothing Periods",2,50,10); 
r:=LinearReg(C,pds); 
x:=Mov(r,s1,S); 

x1 :=x+1*Stdev(C,a); 
x2 :=x+2*Stdev(C,a); 
x3 :=x+3*Stdev(C,a); 

y1:= x-1*Stdev(C,a); 
y2:= x-2*Stdev(C,a); 
y3:= x-3*Stdev(C,a); 

x; 
x1; 
x2; 
x3; 
y1; 
y2; 
y3; 
----------------------------------------------------- 
-FORMULA FOUR ---------------------------------------
----------------------------------------------------- 

[LegacyColorValue = TRUE];

{Hurst_Channel Indicator}       

Input:  Price1(MedianPrice of Data1);
Input:  Length1(10),
        ChanWid1(1);  {Multiplier for ATR is positive          }
                      {Percent*100 of Current price if Negative}
Input:  Price2(MedianPrice of Data1);
Input:  Length2(60),
        ChanWid2(3);
Input:  CompMode(0);  {Compute mode for extension}
                      {0 = CMA shortening        }
           {>0= 2nd degree polynomial }
Input:  StopDate(0);

Vars:   ChanHi1(0),  ChanLo1(0), WidChan1(Iff(ChanWid1>0,ChanWid1,-ChanWid1*.001)),
        Ave1(0),     ATR1(0),
        SetBack1(IntPortion((Length1-1)/2)+1);
Vars:   ChanHi2(0),  ChanLo2(0), WidChan2(Iff(ChanWid2>0,ChanWid2,-ChanWid2*.001)),
        Ave2(0),     ATR2(0),
        SetBack2(IntPortion((Length2-1)/2)+1);
Vars:   DateStop(iff(stopdate<=0,1211231,StopDate)),Ipass(0);


If Length1>0 and Ipass=0 then begin
 
  Ave1   = Average(Price1,Length1);
  If ChanWid1>0
  then ATR1   = AvgTrueRange(Length1)
  else  ATR1   = C;
  ChanHi1= Ave1+ATR1*WidChan1;
  ChanLo1= Ave1-ATR1*WidChan1;
  
  
  Plot1[SetBack1](ChanHi1,"HH1");
  Plot2[SetBack1](ChanLo1,"HL1");
  
  If LastBarOnChart or Date>=DateStop then Begin
  Value5 = (Ave1-Ave1[SetBack1])/SetBack1;
    For Value1 = SetBack1-1 downto 0 begin
      Value3=0;
      Value4=Value1*2;
      For Value2=0 to Value4 begin
        Value3=Value3+Price1[Value2];
      End;
      Ave1=Value3/(Value4+1);
   If CompMode>0 then Ave1=Ave1*.33+(Ave1[1]+Value5*(SetBack1-Value1))*.67;
      ChanHi1= Ave1+ATR1*WidChan1;
      ChanLo1= Ave1-ATR1*WidChan1;
      Plot1[Value1](ChanHi1,"HH1");
      Plot2[Value1](ChanLo1,"HL1");
    End;
  If Length2=0 then IPass=1;
  End;
End;



{Now for second channel}
If Length2>0 and Ipass=0 then begin
  Ave2   = Average(Price2,Length2);
  If ChanWid2>0
  then ATR2   = AvgTrueRange(Length2)
  else  ATR2   = C;
  ChanHi2= Ave2+ATR2*WidChan2;
  ChanLo2= Ave2-ATR2*WidChan2;
  
  Plot3[SetBack2](ChanHi2,"HH2");
  Plot4[SetBack2](ChanLo2,"HL2");
  
  If LastBarOnChart or Date>=DateStop then Begin
  Value5 = (Ave2-Ave2[SetBack2])/SetBack2;
    For Value1 = SetBack2-1 downto 0 begin
      Value3=0;
      Value4=Value1*2;
      For Value2=0 to Value4 begin
        Value3=Value3+Price2[Value2];
      End;
      Ave2=Value3/(Value4+1);
   If CompMode>0 then Ave2=Ave2*.33+(Ave2[1]+Value5*(SetBack2-Value1))*.67;
      ChanHi2= Ave2+ATR2*WidChan2;
      ChanLo2= Ave2-ATR2*WidChan2;
      Plot3[Value1](ChanHi2,"HH2");
      Plot4[Value1](ChanLo2,"HL2");
    End;
  IPass=1;
  End;
End;
----------------------------------------------------- 
-FORMULA FIVE --------------------------------------- 
----------------------------------------------------- 
this is a misnomer, keep reading...
{Hurst_Channel Indicator}       

-- these is the user input area where the user gets to set various parameters --
SECTION 1 values
Input:  Price1(MedianPrice of Data1);
Input:  Length1(10),
        ChanWid1(1);  {Multiplier for ATR is positive          }
                      {Percent*100 of Current price if Negative}

SECTION 2 values
Input:  Price2(MedianPrice of Data1);
Input:  Length2(60),
        ChanWid2(3);

these apply to both sections
Input:  CompMode(0);  {Compute mode for extension}
                      {0 = CMA shortening        }
           {>0= 2nd degree polynomial }
Input:  StopDate(0);

this is the variable declaration area - not required in MS
Vars:   ChanHi1(0),  ChanLo1(0), WidChan1(Iff(ChanWid1>0,ChanWid1,-ChanWid1*.001)),
        Ave1(0),     ATR1(0),
        SetBack1(IntPortion((Length1-1)/2)+1);
Vars:   ChanHi2(0),  ChanLo2(0), WidChan2(Iff(ChanWid2>0,ChanWid2,-ChanWid2*.001)),
        Ave2(0),     ATR2(0),
        SetBack2(IntPortion((Length2-1)/2)+1);
Vars:   DateStop(iff(stopdate<=0,1211231,StopDate)),Ipass(0);

-- SECTION 1 --
If Length1>0 and Ipass=0 then begin
 
  Ave1   = Average(Price1,Length1);
  If ChanWid1>0
  then ATR1   = AvgTrueRange(Length1)
  else  ATR1   = C;
  ChanHi1= Ave1+ATR1*WidChan1;
  ChanLo1= Ave1-ATR1*WidChan1;
  
  this is a SMA with an ATR channel width, ala Keltner Bands and VERY similar to the results to the code posted years ago in the thread above
  Plot1[SetBack1](ChanHi1,"HH1");
  Plot2[SetBack1](ChanLo1,"HL1");
  
   this is for forecasting past the last selected date or the last bar
   only plots if CompMode>0
  If LastBarOnChart or Date>=DateStop then Begin
  Value5 = (Ave1-Ave1[SetBack1])/SetBack1;
    For Value1 = SetBack1-1 downto 0 begin
      Value3=0;
      Value4=Value1*2;
      For Value2=0 to Value4 begin
        Value3=Value3+Price1[Value2];
      End;
      Ave1=Value3/(Value4+1);
   If CompMode>0 then Ave1=Ave1*.33+(Ave1[1]+Value5*(SetBack1-Value1))*.67; this is not a 2nd degree polynomial, it's a form of IIR filter (EMA)
      ChanHi1= Ave1+ATR1*WidChan1;
      ChanLo1= Ave1-ATR1*WidChan1;
      Plot1[Value1](ChanHi1,"HH1");
      Plot2[Value1](ChanLo1,"HL1");
    End;
  If Length2=0 then IPass=1;
  End;
End;


-- SECTION 2 --
just a repeat of SECTION 1 to draw a second set of bands, with the second set of user parameters
{Now for second channel}
If Length2>0 and Ipass=0 then begin
  Ave2   = Average(Price2,Length2);
  If ChanWid2>0
  then ATR2   = AvgTrueRange(Length2)
  else  ATR2   = C;
  ChanHi2= Ave2+ATR2*WidChan2;
  ChanLo2= Ave2-ATR2*WidChan2;
  
  Plot3[SetBack2](ChanHi2,"HH2");
  Plot4[SetBack2](ChanLo2,"HL2");
  
  If LastBarOnChart or Date>=DateStop then Begin
  Value5 = (Ave2-Ave2[SetBack2])/SetBack2;
    For Value1 = SetBack2-1 downto 0 begin
      Value3=0;
      Value4=Value1*2;
      For Value2=0 to Value4 begin
        Value3=Value3+Price2[Value2];
      End;
      Ave2=Value3/(Value4+1);
   If CompMode>0 then Ave2=Ave2*.33+(Ave2[1]+Value5*(SetBack2-Value1))*.67;
      ChanHi2= Ave2+ATR2*WidChan2;
      ChanLo2= Ave2-ATR2*WidChan2;
      Plot3[Value1](ChanHi2,"HH2");
      Plot4[Value1](ChanLo2,"HL2");
    End;
  IPass=1;
  End;
End;
----------------------------------------------------- 
----------------------------------------------------- 
-----------------------------------------------------
 

Nehal_s143

Well-Known Member
Sir replace with -ve or substitute a Zero, more or less both giving same result without re-painting

I also tried to remove Ref part, but the was getting wrong values, may be not able to remove correctly.


Nehal if you use future referencing in any form you cannot do away with repainting . . .

To avoid that you will have to change coding logic in your Hurst implementation . . .

One solution Pratap has provided, which instead of looking forward by 1/2 cycle, introduces a lag of 1/2 the cycle

another one can be just remove the Ref part of the code completely without replacing - with + . . . (or just substitute a 0 (zero) there so + or - does not matter)

@ Pratap, you can also try this change, and see how it works with the bands you are testing . . .

:) Happy
 
www . 4 shared . com /zip/79fy77sa/Plugins.html

Download this zip file and extract the dll to ami>plugin folder

hope now chart will work :)
Normally we (those who keep trying all those 10s of 1000 AFLs) have all the plugins already installed and so
we often don't realize that the AFL will throw tons of exceptions when the plugins may be missing . . . :D


:) Happy
 
Sir replace with -ve or substitute a Zero, more or less both giving same result without re-painting

I also tried to remove Ref part, but the was getting wrong values, may be not able to remove correctly.
Hello Nehal

Selecting Zero for length/period is same as removing the ref all together as it will chose the current bar value, instead of n bar back ones . . .

:) Happy
 
Hello

All in one Moving Average

Code:
_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorDefault ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 
_SECTION_END();

_SECTION_BEGIN("SUPER_MA");
R1 = Param("RATIO EMA",1,0,10,1);
R2 = Param("RATIO DEMA2",2,0,10,1);
R3 = Param("RATIO TEMA",3,0,10,1);
R4 = Param("RATIO WMA", 4,0,10,1);
R5 = Param("RATIO HMA", 4,0,10,1);
R6 = Param("RATIO MA",  3,0,10,1);
R7 = Param("RATIO Wilder",2,0,10,1);
R8 = Param("RATIO LinReg",1,0,10,1);

s = R1+R2+R3+R4+R5+R6+R7+R8;

function SuperMA(P, n) 
{ 
	m1	=	EMA(P,n);		m2	=	DEMA(P,n);		m3	=	TEMA(P,n);	
	m4	=	WMA(P,n);		m5	=	HMA(P,n);		m6	=	MA(P,n);	
	m7	=	Wilders(P,n);		m8	=	LinearReg(P,n);

	m  = (R1*m1+R2*m2+R3*m3+R4*m4+R5*m5+R6*m6+R7*m7+R8*m8)/s;	

   return m; 
} 


Len  = Param("PERIOD",30,2,90,1);

SMA_C = SuperMA(C,Len);	SMA_O = SuperMA(O,Len);
SMA_H = SuperMA(H,Len);	SMA_L = SuperMA(L,Len);
Col = IIf(SMA_C > SMA_O,colorBlue,colorRed);
Plot(SMA_H,"SMA_H",Col,styleThick);	
Plot(SMA_L,"SMA_L",Col,styleThick);

_SECTION_END();

Adjust the ratios, to get your type of curve, you can also select ratio as zero, if you want to suppress the effect for that type of MA



:) Happy
 
Last edited:

ethan hunt

Well-Known Member
When backtesting only partial data is being used by Amibroker, how to correct it so that all the data is backtested in one go.

Eg:
IEOD Data already imported into Amibroker: from Jan 2007 to Dec 2013
On backtesting for all quotes it only shows trades from Jan 2007 till Dec 2007.
I have to backtest again starting from Dec 2007 till date for which it shows trades till Nov 2013 & so on...
 

Similar threads