Thư viện AFL
Thư viện AFL
Bộ lọc Phạm vi - Chiến lược giao dịch - Amibroker - Chỉ báo theo dõi xu hướng tốt hơn

Bộ lọc Phạm vi - Chiến lược giao dịch - Amibroker - Chỉ báo theo dõi xu hướng tốt hơn

Bộ lọc phạm vi là một chiến lược theo xu hướng không dựa trên ATR được lấy cảm hứng từ lập trình viên Tradingview Pinescript -

DonovanTường

. Theo ông, Range Filter là một nghiên cứu thử nghiệm được thiết kế để lọc ra các hành động giá nhỏ để có cái nhìn rõ ràng hơn về xu hướng. Đây là mã Chiến lược theo dõi xu hướng của Amibroker dựa trên Bộ lọc phạm vi.

Bộ lọc phạm vi được tính toán như thế nào?

1), phạm vi giá trung bình ổn định được tính toán dựa trên cơ sở của bộ lọc và nhân với số tiền được chỉ định.

  1. bộ lọc được tính toán bằng cách xác định các biến động giá không vượt quá phạm vi đã chỉ định.

  2. phạm vi mục tiêu được vẽ để hiển thị mức giá sẽ kích hoạt chuyển động của bộ lọc.

Khung thời gian chiến lược

: 15 phút

Biểu tượng giao dịch: Nifty Futures

Hoa hồng giao dịch

Đã sử dụng : 0,02% mỗi chân

Kiểm tra lại dữ liệu lịch sử

Thời kỳ

: 2011 – 2022

Định cỡ vị thế

: 1 Lô (Lô cố định)

Đường cong vốn chủ sở hữu

Đường cong rút tiền

Báo cáo kiểm tra lại

Bảng lợi nhuận tuyệt đối (tính bằng nghìn)

Bộ lọc phạm vi – Mã AFL của Amibroker

Liên quan

Mã nguồn (.afl)
//Coded by Rajandran R - www.marketcalls.in / www.openalgo.in
//Code Inspired from Tradingview Pinescript
//Original Coded by : DonovanWall
//Tradingview Source Code : https://in.tradingview.com/script/lut7sBgG-Range-Filter-DW/
//Coded Date : 23rd - Aug 2022

_SECTION_BEGIN("Range Filter - Trading Strategy");

SetPositionSize(1*RoundLotSize,spsShares);


src = ParamField("Source",3);

// Sampling Period

per = param("Sampling Period",15,5,200,5);

// Range Multiplier

mult = param("Range Multiplier",2.5,1,5,0.5);


upward = 0;
dnward = 0;

// Smooth Average Range

function smoothrange(x, t, m)
{

	wper = t * 2 - 1;
    avrng = ema(abs(x - Ref(x,-1)), t);
    smoothrng = ema(avrng, wper) * m;
    return smoothrng;

}

smrng = smoothrange(src, per, mult);

// Range Filter

function rngfilter(x, r)
{

	rngfilt = x;
	//rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    for(i=1;i<BarCount;i++)
    {
    
    if(x[i] > rngfilt[i-1])
    {
		if((x[i] - r[i]) < rngfilt[i-1])
		{
		rngfilt[i] = rngfilt[i-1];
		}
		else
		{
			rngfilt[i] = x[i]-r[i];
		
		}
    }
    else
    {
	  
		if((x[i] + r[i])  > rngfilt[i-1])
		{
		
		
		rngfilt[i] = rngfilt[i-1];
		
		
		}
		else
		{
		rngfilt[i] =  x[i] + r[i];
		}
		}
    }//end of for loop
 return rngfilt;
}

filt = rngfilter(src, smrng);
upward = 0;
downward = 0;
// Filter Direction

for(i=1;i<BarCount;i++)
{

if(filt[i] > filt[i-1])
{
upward[i] = upward[i-1] + 1;
}
else{

 if(filt[i] < filt[i-1])
 {
	upward[i] = 0;
 
 }
 
 else
 {
 upward[i] = upward[i-1];
 }
 
 }
  


}//end of for loop


for(i=1;i<BarCount;i++)
{

if(filt[i] < filt[i-1])
{
downward[i] = downward[i-1] + 1;
}
else{

 if(filt[i] < filt[i-1])
 {
	dnward[i] = 0;
 
 }
 
 else
 {
 dnward[i] = dnward[i-1];
 }
  


}//end of for loop



}//end of range filter function

// Target Bands

hband = filt + smrng;
lband = filt - smrng;

Plot(hband,"H-Band",colorBlue,styleLine);
Plot(lband,"L-Band",colorRed,styleLine);

longCond = (src > filt and src > Ref(src,-1) and upward > 0) or (src > filt and src < Ref(src,-1) and upward > 0);
shortCond = (src < filt and src <  Ref(src,-1) and downward > 0) or (src < filt and src > Ref(src,-1) and downward > 0);



Buy = ExRem(longCond,shortCond);
Sell = ExRem(shortCond,longCond);
Short = Sell;
Cover = Buy;

Buy = Ref(Buy,-1);
Sell = Ref(Sell,-1);
Short = Ref(Short,-1);
Cover = Ref(Cover,-1);

BuyPrice = ValueWhen(Buy,Open);
SellPrice = ValueWhen(Sell,Open);
ShortPrice = ValueWhen(Short,Open);
CoverPrice = ValueWhen(Cover,Open);



buycontinue = Flip(Buy,Sell);
shortcontinue = Flip(Short,Cover);

barcolor =  IIf(buycontinue,colorGreen,colorRed);


for( i = 0; i < BarCount; i++ ) 
 { 
if( Buy[i] ) PlotText("Buy",i,L[i],colorWhite,colorLime,-70);
if( Short[i] ) PlotText("Short",i,H[i],colorWhite,colorRed,70);
//if( Sell[i] ) PlotText( "Selln@" + C[ i ], i, H[ i ]+dist[i], colorRed, colorYellow ); 
 } 


/* Plot Buy and Sell Signal Arrows */
PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40);
PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorLime, 0,L, Offset=-50);                      
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone),colorWhite, 0,L, Offset=-45); 
PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);                      
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);


sig=0;
bars=0;
tar1=tar2=tar3=null;

for(i=BarCount-1;i>1;i--)

{

if(Buy[i] == 1)

{

entry = open[i];

sig = 1;  //flag contains 1 when buy is valid

tar1 = entry + (entry * .0050);

tar2 = entry + (entry * .0092);

tar3 = entry + (entry * .0179);

 

bars = i;

i = 0;

}

if(Short[i] == 1)

{

sig = -1; //flag contains -1 wjhen short is valid

entry = open[i];


tar1 = entry - (entry * .0050);

tar2 = entry - (entry * .0112);

tar3 = entry - (entry * .0212);

 

 

bars = i;  // i - holds the value of bar index, computing the barindex value when the signal happened

i = 0;

}

}//for loop



Offset = 20;

Clr = IIf(sig == 1, colorLime, colorRed);


 

//plot target lines

Plot(LineArray(bars-Offset, tar1, BarCount-1, tar1,1), "", Clr, styleLine|styleDots, Null, Null, Offset);

Plot(LineArray(bars-Offset, tar2, BarCount-1, tar2,1), "", Clr, styleLine|styleDots, Null, Null, Offset);

Plot(LineArray(bars-Offset, tar3, BarCount-1, tar3,1), "", Clr, styleLine|styleDots, Null, Null, Offset);






_SECTION_END();


_SECTION_BEGIN("Signal Dashboard");

messageboard = ParamToggle("Message Board","Show|Hide",1);
upcolor = ParamColor("Up Color",colorBlue);
dncolor = ParamColor("Down Color",colorRed);



if (messageboard == 1 )

{

GfxSelectFont( "Tahoma", 13, 100 );

GfxSetBkMode( 1 );

GfxSetTextColor( colorWhite );


//Dashboard color changes dynamically according to the signals continuation
color = IIf(buycontinue, upcolor, IIf(shortcontinue, dncolor, Null));



GfxSelectSolidBrush(SelectedValue(color));


pxHeight = Status( "pxchartheight" ) ;

xx = Status( "pxchartwidth");

Left = 1100;
width = 310;

x = 5;
x2 = 360;
y = pxHeight;

sigstatus = WriteIf(buycontinue,"Buy Signal @ ","Sell Signal @");

 

GfxSelectPen( colorGreen, 1); // broader color
GfxRoundRect( x, y - 98, x2, y , 7, 7 ) ;
GfxTextOut( ( "Marketcalls - Range Filter"),13,y-90);
GfxTextOut( (" "),27,y-100);

if(SelectedValue(Buycontinue))
{
GfxTextOut( ("Last " + sigstatus + " Signal came " + BarsSince(Buy) * Interval()/60 + " mins ago"), 13, y-70) ; // The text format location
GfxTextOut( ("" + sigstatus + " : " + ValueWhen(Buy,BuyPrice)), 13, y-50);
GfxTextOut( ("Profit/Loss : " + NumToStr(Close-ValueWhen(Buy,BuyPrice),1.2)), 13, y-30);
}

if(SelectedValue(Shortcontinue))
{
GfxTextOut( ("Last " + sigstatus + " Signal came " + BarsSince(short) * Interval()/60 + " mins ago"), 13, y-70) ; // The text format location
GfxTextOut( ("" + sigstatus + " : " + ValueWhen(Short,ShortPrice)), 13, y-50);
GfxTextOut( ("Current P/L : " + NumToStr(ValueWhen(Short,ShortPrice)-Close,1.2)), 13, y-30);
}


//GfxTextOut( ("Trailing SL : " + Ref(TrendSL,-1) + " (" + WriteVal(IIf(sig == -1,entry-sl,sl-entry), 2.2) + ")"), 13, y-40);





}


_SECTION_END();

_SECTION_BEGIN("Top Dashboard");

X0 = 10;
Y0 = 20;

procedure DrawData (Text, x1, y1, x2, y2, colorFrom, colorTo)
{
	GfxSetOverlayMode(0);
	GfxSelectFont("Verdana", 8.5, 700);
	GfxSetBkMode(1);
	GfxGradientRect(x1, y1, x2, y2, colorFrom, colorTo);
	GfxDrawText(Text, x1, y1, x2, y2, 32|1|4|16);
}


DrawData (Name(), X0, Y0, X0+150, Y0+20, colorGrey40, colorblack);
DrawData (Date(), X0+155, Y0, X0+320, Y0+20, colorGrey40, colorblack);
DrawData ("Open : " + Open, X0+325, Y0, X0+450, Y0+20, colorGrey40, colorblack);
DrawData ("Close : " + Close, X0+455, Y0, X0+580, Y0+20, colorGrey40, colorblack);
DrawData ("High : " + High, X0+585, Y0, X0+710, Y0+20, colorGrey40, colorblack);
DrawData ("Low : " + Low, X0+715, Y0, X0+840, Y0+20, colorGrey40, colorblack);


_SECTION_END();




_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", barcolor, styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 
_SECTION_END();

Hướng dẫn: Copy đoạn mã trên, mở AmiBroker Formula Editor, dán vào và lưu lại với tên tương ứng.