Multi Time Frame indicator is changing Historical Values

Hello:
I coded a Multi Time Frame trend indicator but have problems with bigger time frames changing historical values. This can be seen when running "Bar Replay" feature. With Bar Replay you can see the bigger time frames moving to left instead of staying fixed with first line as I assumed. When an Indicator changes values like that I know there is some bug or code error. If I do Bar Replay of other indicator I can see it moving to left with fixed values because bars are not changing anymore (they are history).

The Code draws 6 lines of different Time Frames changing color based on direction.
The trend formula used in code is provided as an example. Is a simple WMA.
Colors used are WMA direction up = green, down=red.

Please help on this to look for error in Code:

Here is the Code:

Price = Close;
TCCount = 9;
//get multiple directions
function FTCunderPrice(price)
{
    res = WMA(price, 13);
    return res;
}

function plotLines (position, TC_Analysis, LineWidth)
{
	col_AngleNegative = colorred;
	col_AnglePositive = colorGreen; 
	color1 = IIf( TC_Analysis,col_AnglePositive, col_AngleNegative);

	//plot multi cross, line with direction colors
	Plot(position,"",color1, styleline, Null, Null, 0, 1, LineWidth );
     
}

//Month
TimeFrameSet( inMonthly ); 
    AvgWtd_m = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_m = atan(AvgWtd_m - Ref(AvgWtd_m,-1)) * 180 / 3.14159265359;

	AvgDirection_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount) , 1 , 0);
	Analysis_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount), 1 , 0);
TimeFrameRestore();

//Week
TimeFrameSet( inWeekly ); 
    AvgWtd_W = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_W = atan(AvgWtd_W - Ref(AvgWtd_W,-1)) * 180 / 3.14159265359;

	AvgDirection_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount) , 1 , 0);
	Analysis_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount), 1 , 0);
TimeFrameRestore();

//4 Days
TimeFrameSet(4*inDaily); 
    AvgWtd_4D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_4D = atan(AvgWtd_4D - Ref(AvgWtd_4D,-1)) * 180 / 3.14159265359;

	AvgDirection_4D = IIf( (AvgWtd_Angle_4D>0) or (AvgWtd_4D==TCCount) , 1 , 0);
	Analysis_4D = IIf( (AvgWtd_Angle_4D>0) or (AvgWtd_4D==TCCount), 1 , 0);
TimeFrameRestore();

//3 Days
TimeFrameSet(3*inDaily); 
    AvgWtd_3D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_3D = atan(AvgWtd_3D - Ref(AvgWtd_3D,-1)) * 180 / 3.14159265359;

	AvgDirection_3D = IIf( (AvgWtd_Angle_3D>0) or (AvgWtd_3D==TCCount) , 1 , 0);
	Analysis_3D = IIf( (AvgWtd_Angle_3D>0) or (AvgWtd_3D==TCCount), 1 , 0);
TimeFrameRestore();

//2 Days
TimeFrameSet(2*inDaily); 
    AvgWtd_2D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_2D = atan(AvgWtd_2D - Ref(AvgWtd_2D,-1)) * 180 / 3.14159265359;

	AvgDirection_2D = IIf( (AvgWtd_Angle_2D>0) or (AvgWtd_2D==TCCount) , 1 , 0);
	Analysis_2D = IIf( (AvgWtd_Angle_2D>0) or (AvgWtd_2D==TCCount), 1 , 0);
TimeFrameRestore();

TimeFrameSet(inDaily); 
    AvgWtd_D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_D = atan(AvgWtd_D - Ref(AvgWtd_D,-1)) * 180 / 3.14159265359;

	AvgDirection_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount) , 1 , 0);
	Analysis_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount), 1 , 0);
TimeFrameRestore();

Analysis_m1=TimeFrameExpand(Analysis_m ,inMonthly);
Analysis_W1=TimeFrameExpand(Analysis_W ,inWeekly);
Analysis_4D1=TimeFrameExpand(Analysis_4D ,4*inDaily);
Analysis_3D1=TimeFrameExpand(Analysis_3D ,3*inDaily);
Analysis_2D1=TimeFrameExpand(Analysis_2D ,2*inDaily);
Analysis_D1=TimeFrameExpand(Analysis_D ,inDaily);

//PLOTS
LineWidth = 5; 
DotsWidth = 1;

plotLines(0,Analysis_m1,LineWidth);
plotLines(1,Analysis_W1,LineWidth);
plotLines(2,Analysis_4D1,LineWidth);
plotLines(3,Analysis_3D1,LineWidth);
plotLines(4,Analysis_2D1,LineWidth);
plotLines(5,Analysis_D1,LineWidth);

I think the way you've been using the Time-Frame functions is somewhat erroneous.
For example:

followed with

could be what is creating the problem. Just use a TimeFrameCompress function, leaving the TimeFrameExpand at the bottom.
Basically,

TimeFrameCompress(inDaily);
    AvgWtd_D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_D = atan(AvgWtd_D - Ref(AvgWtd_D,-1)) * 180 / 3.14159265359;

	AvgDirection_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount) , 1 , 0);
	Analysis_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount), 1 , 0);

Analysis_D1=TimeFrameExpand(Analysis_D ,inDaily);

The reason is that Price variable is outside of TimeFrameSet procedure(s).
That's incorrect .

It needs to be inside of each one.

TCCount = 9;
//get multiple directions
function FTCunderPrice(price)
{
    res = WMA(price, 13);
    return res;
}

function plotLines (position, TC_Analysis, LineWidth)
{
	col_AngleNegative = colorred;
	col_AnglePositive = colorGreen; 
	color1 = IIf( TC_Analysis,col_AnglePositive, col_AngleNegative);

	//plot multi cross, line with direction colors
	Plot(position,"",color1, styleline, Null, Null, 0, 1, LineWidth );     
}

//SetBarsRequired(-2);

//Month
TimeFrameSet( inMonthly ); 
    Price = Close;
    AvgWtd_m = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_m = atan(AvgWtd_m - Ref(AvgWtd_m,-1)) * 180 / 3.14159265359;

	AvgDirection_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount) , 1 , 0);
	Analysis_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount), 1 , 0);
TimeFrameRestore();

//Week
TimeFrameSet( inWeekly ); 
    Price = Close;
    AvgWtd_W = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_W = atan(AvgWtd_W - Ref(AvgWtd_W,-1)) * 180 / 3.14159265359;

	AvgDirection_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount) , 1 , 0);
	Analysis_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount), 1 , 0);
TimeFrameRestore();

//4 Days
TimeFrameSet(4*inDaily); 
    Price = Close;
    AvgWtd_4D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_4D = atan(AvgWtd_4D - Ref(AvgWtd_4D,-1)) * 180 / 3.14159265359;

	AvgDirection_4D = IIf( (AvgWtd_Angle_4D>0) or (AvgWtd_4D==TCCount) , 1 , 0);
	Analysis_4D = IIf( (AvgWtd_Angle_4D>0) or (AvgWtd_4D==TCCount), 1 , 0);
TimeFrameRestore();

//3 Days
TimeFrameSet(3*inDaily); 
    Price = Close;
    AvgWtd_3D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_3D = atan(AvgWtd_3D - Ref(AvgWtd_3D,-1)) * 180 / 3.14159265359;

	AvgDirection_3D = IIf( (AvgWtd_Angle_3D>0) or (AvgWtd_3D==TCCount) , 1 , 0);
	Analysis_3D = IIf( (AvgWtd_Angle_3D>0) or (AvgWtd_3D==TCCount), 1 , 0);
TimeFrameRestore();

//2 Days
TimeFrameSet(2*inDaily); 
    Price = Close;
    AvgWtd_2D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_2D = atan(AvgWtd_2D - Ref(AvgWtd_2D,-1)) * 180 / 3.14159265359;

	AvgDirection_2D = IIf( (AvgWtd_Angle_2D>0) or (AvgWtd_2D==TCCount) , 1 , 0);
	Analysis_2D = IIf( (AvgWtd_Angle_2D>0) or (AvgWtd_2D==TCCount), 1 , 0);
TimeFrameRestore();

TimeFrameSet(inDaily); 
	Price = Close;
    AvgWtd_D = wma(FTCunderPrice(Price), 5);
    AvgWtd_Angle_D = atan(AvgWtd_D - Ref(AvgWtd_D,-1)) * 180 / 3.14159265359;

	AvgDirection_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount) , 1 , 0);
	Analysis_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount), 1 , 0);
TimeFrameRestore();

Analysis_m1=TimeFrameExpand(Analysis_m ,inMonthly);
Analysis_W1=TimeFrameExpand(Analysis_W ,inWeekly);
Analysis_4D1=TimeFrameExpand(Analysis_4D ,4*inDaily);
Analysis_3D1=TimeFrameExpand(Analysis_3D ,3*inDaily);
Analysis_2D1=TimeFrameExpand(Analysis_2D ,2*inDaily);
Analysis_D1=TimeFrameExpand(Analysis_D ,inDaily);

//PLOTS
LineWidth = 5; 
DotsWidth = 1;

plotLines(0,Analysis_m1,LineWidth);
plotLines(1,Analysis_W1,LineWidth);
plotLines(2,Analysis_4D1,LineWidth);
plotLines(3,Analysis_3D1,LineWidth);
plotLines(4,Analysis_2D1,LineWidth);
plotLines(5,Analysis_D1,LineWidth);

No, that's incorrect code. See TimeFrameCompress.

So I see. I completely overlooked the price issue as well. Thanks for pointing it out!

Thanks for help. In code I was just following the example in " AFL Function Reference - TIMEFRAMESET". I will try with TimeFrameCompress,

Thanks to all.
Using "TimeFrameCompress" fixed the problem.
This code can be used for drawing multi timeframe indicators.
Here is code.

Price = Close;
TCCount = 9;
//get multiple directions
function FTCunderPrice(price)
{
    res = WMA(price, 13);
    return res;
}

function plotLines (position, TC_Analysis, LineWidth)
{
	col_AngleNegative = colorred;
	col_AnglePositive = colorGreen; 
	color1 = IIf( TC_Analysis,col_AnglePositive, col_AngleNegative);

	//plot multi cross, line with direction colors
	Plot(position,"",color1, styleline, Null, Null, 0, 1, LineWidth );
     
}

//Month
AvgWtd_m = TimeFrameCompress( wma(FTCunderPrice(Price), 5) , inMonthly );
AvgWtd_Angle_m = atan(AvgWtd_m - Ref(AvgWtd_m,-1)) * 180 / 3.14159265359;

AvgDirection_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount) , 1 , 0);
Analysis_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount), 1 , 0);
Analysis_m1=TimeFrameExpand(Analysis_m ,inMonthly);
	
//Week
AvgWtd_W = TimeFrameCompress(wma(FTCunderPrice(Price), 5) ,inWeekly );
AvgWtd_Angle_W = atan(AvgWtd_W - Ref(AvgWtd_W,-1)) * 180 / 3.14159265359;

AvgDirection_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount) , 1 , 0);
Analysis_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount), 1 , 0);
Analysis_W1=TimeFrameExpand(Analysis_W ,inWeekly);

//4 Days
AvgWtd_4D = TimeFrameCompress(wma(FTCunderPrice(Price), 5) , 4*inDaily);
AvgWtd_Angle_4D = atan(AvgWtd_4D - Ref(AvgWtd_4D,-1)) * 180 / 3.14159265359;

AvgDirection_4D = IIf( (AvgWtd_Angle_4D>0) or (AvgWtd_4D==TCCount) , 1 , 0);
Analysis_4D = IIf( (AvgWtd_Angle_4D>0) or (AvgWtd_4D==TCCount), 1 , 0);
Analysis_4D1=TimeFrameExpand(Analysis_4D ,4*inDaily);

//3 Days
AvgWtd_3D = TimeFrameCompress(wma(FTCunderPrice(Price), 5) ,3*inDaily);
AvgWtd_Angle_3D = atan(AvgWtd_3D - Ref(AvgWtd_3D,-1)) * 180 / 3.14159265359;

AvgDirection_3D = IIf( (AvgWtd_Angle_3D>0) or (AvgWtd_3D==TCCount) , 1 , 0);
Analysis_3D = IIf( (AvgWtd_Angle_3D>0) or (AvgWtd_3D==TCCount), 1 , 0);
Analysis_3D1=TimeFrameExpand(Analysis_3D ,3*inDaily);

//2 Days
AvgWtd_2D = TimeFrameCompress(wma(FTCunderPrice(Price), 5) , 2*inDaily);
AvgWtd_Angle_2D = atan(AvgWtd_2D - Ref(AvgWtd_2D,-1)) * 180 / 3.14159265359;

AvgDirection_2D = IIf( (AvgWtd_Angle_2D>0) or (AvgWtd_2D==TCCount) , 1 , 0);
Analysis_2D = IIf( (AvgWtd_Angle_2D>0) or (AvgWtd_2D==TCCount), 1 , 0);
Analysis_2D1=TimeFrameExpand(Analysis_2D ,2*inDaily);

//Daily
AvgWtd_D = TimeFrameCompress(wma(FTCunderPrice(Price), 5) , inDaily);
AvgWtd_Angle_D = atan(AvgWtd_D - Ref(AvgWtd_D,-1)) * 180 / 3.14159265359;

AvgDirection_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount) , 1 , 0);
Analysis_D = IIf( (AvgWtd_Angle_D>0) or (AvgWtd_D==TCCount), 1 , 0);
Analysis_D1=TimeFrameExpand(Analysis_D ,inDaily);

//PLOTS
LineWidth = 5; 
DotsWidth = 1;

plotLines(0,Analysis_m1,LineWidth);
plotLines(1,Analysis_W1,LineWidth);
plotLines(2,Analysis_4D1,LineWidth);
plotLines(3,Analysis_3D1,LineWidth);
plotLines(4,Analysis_2D1,LineWidth);
plotLines(5,Analysis_D1,LineWidth);



No, your code is incorrect once again!
Corrected code is in Post #3 already.

Why are doing things incorrectly again instead of following correct one(s)?

No, you did not follow example precisely. The code of manual is correct. Your codes are not correct.
The code of manual clearly has price array after TimeFrameSet call.

Also your use of TimeFrameCompress is not correct.
You have to do it this way

function FTCunderPrice(price)
{
    res = WMA(price, 13);
    return res;
}

//Month
Price = TimeFrameCompress(C, inMonthly );
AvgWtd_m = WMA(FTCunderPrice(Price), 5) ;
AvgWtd_Angle_m = atan(AvgWtd_m - Ref(AvgWtd_m,-1)) * 180 / 3.14159265359;

AvgDirection_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount) , 1 , 0);
Analysis_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount), 1 , 0);
Analysis_m1=TimeFrameExpand(Analysis_m ,inMonthly);

//Week
Price = TimeFrameCompress(C ,inWeekly );
AvgWtd_W = WMA(FTCunderPrice(Price), 5);
AvgWtd_Angle_W = atan(AvgWtd_W - Ref(AvgWtd_W,-1)) * 180 / 3.14159265359;

AvgDirection_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount) , 1 , 0);
Analysis_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount), 1 , 0);
Analysis_W1=TimeFrameExpand(Analysis_W ,inWeekly);

///etc.....

Or this way

Price = C;

function FTCunderPrice(price)
{
    res = WMA(price, 13);
    return res;
}

//Month
AvgWtd_m = WMA(FTCunderPrice(TimeFrameCompress(Price, inMonthly )), 5);
AvgWtd_Angle_m = atan(AvgWtd_m - Ref(AvgWtd_m,-1)) * 180 / 3.14159265359;

AvgDirection_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount) , 1 , 0);
Analysis_m = IIf( (AvgWtd_Angle_m>0) or (AvgWtd_m==TCCount), 1 , 0);
Analysis_m1=TimeFrameExpand(Analysis_m ,inMonthly);
	
//Week
AvgWtd_W = WMA(FTCunderPrice(TimeFrameCompress(Price, inWeekly )), 5);
AvgWtd_Angle_W = atan(AvgWtd_W - Ref(AvgWtd_W,-1)) * 180 / 3.14159265359;

AvgDirection_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount) , 1 , 0);
Analysis_W = IIf( (AvgWtd_Angle_W>0) or (AvgWtd_W==TCCount), 1 , 0);
Analysis_W1=TimeFrameExpand(Analysis_W ,inWeekly);

///etc.....

As you can see you have to compress price array then you can use it in WMA.
So either use that one or code of post #3.

Once again... Yours are both incorrectly written and not following documentation.

1 Like

Thanks for correction. So first is needed to work time on price then use the calculations.