AFL CodeNguồn gốc
HalfTrend - Mã AFL Amibroker - Tốt hơn Supertrend HalfTrend - Mã AFL Amibroker - Tốt hơn Supertrend
Marketcalls đã xuất bản Supertrend với nhiều biến thể từ năm 2012 trở đi. Và lần này, chiến lược dựa trên ATR rất phổ biến Halftrend được coi là phiên bản tốt hơn của siêu xu hướng để quản lý thị trường đi ngang với ít rủi ro hơn được mã hóa trong Amibroker hoàn toàn lấy cảm hứng từ
Tradingview Halftrend
và mã nguồn Chiến lược Halftrend MQL4.
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 – 2021
Đị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
Amibroker – Mã AFL Halftrend
Liên quan
Mã nguồn (.afl)
//Coded by Rajandran R - www.marketcalls.in / www.openalgo.in
//Code Inspired from Tradingview Pinescript
//Orginal Credits : Everget
//Tradingview Url : https://www.tradingview.com/script/U1SJ8ubc-HalfTrend/
_SECTION_BEGIN("Half Trend Strategy");
SetPositionSize(1*RoundLotSize,spsShares);
amplitude = Param("Amplitude",2,1,10,1);
channelDeviation = Param("Channel Deviation",2,1,10,1);
showChannels = ParamToggle("Show ATR Channels","SHOW|HIDE",1);
main = Null;
trend = 0;
upLine = Null;
downLine = Null;
upperBand = Null;
lowerBand = Null;
atrHigh = Null;
atrLow = Null;
atr2 = ATR(100)/2;
dev = channelDeviation * atr2;
currentHigh = Ref(High, -abs(HHVBars(High,amplitude)));
currentLow = Ref(low, -abs(LLVBars(Low,amplitude)));
upperBand = MA(High,amplitude);
lowerBand = MA(Low,amplitude);
for(i=1;i<BarCount;i++)
{
// update trend direction and main Support Resistance values
if (trend[i-1] > 0) {
main[i] = max(main[i-1], currentLow[i]);
if (upperBand[i] < main[i] && Close[i] < Low[i-1]) {
trend[i] = -1;
main[i] = min(main[i-1], currentHigh[i]);
}
else trend[i] = trend[i-1] + 1;
}
else if (trend[i-1] < 0) {
main[i] = min(main[i-1], currentHigh[i]);
if (lowerBand[i] > main[i] && Close[i] > High[i-1]) {
trend[i] = 1;
main [i] = max(main[i-1], currentLow[i]);
}
else trend[i] = trend[i-1] - 1;
}
else {
// initialize the first, left-most value
if (Close[i] > Close[i-1]) {
trend[i] = 1;
main[i] = currentLow[i];
}
else {
trend[i] = -1;
main [i] = currentHigh[i];
}
}
// update Support Resistance sections
if (trend[i] > 0) {
upLine[i] = main[i];
downLine[i] = null;
atrHigh[i] = upLine[i] + dev[i];
atrLow[i] = upLine[i] - dev[i];
if (showChannels) { // make sure reversals become visible
upLine[i-1] = main[i-1];
if (trend[i-1] > 0)
downLine[i-1] = null;
}
}
else /*(trend[i] < 0)*/{
upLine[i] = null;
downLine[i] = main[i];
atrHigh[i] = downLine[i] + dev[i];
atrLow[i] = downLine[i] - dev[i];
if (showChannels) { // make sure reversals become visible
if (trend[i-1] < 0)
upLine[i-1] = Null;
downLine[i-1] = main[i-1];
}
}
}//end of for loop
Plot(upLine,"UpLine",colorgreen,styleThick);
Plot(downLine,"DownLine",colorRed,styleThick);
Plot(atrHigh,"ATR High",colorgreen,styleThick|styleDashed);
Plot(atrLow,"ATR Low",colorRed,styleThick|styleDashed);
Buy = trend == 1 ;
Sell = trend == -1 ;
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);
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);
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);
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 - Halftrend"),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", ParamColor("Color", colorDefault ), 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.