Intraday Algo Trading Amibroker AFL

This is advanced template useful for intraday trading.

Parameters:

  1. Activate Intrade Mode? If turned yes, it makes even a positional trading or indicator based strategy for intraday trading only. To apply the intraday timings rule, you should turn this on
  2. Trade Entry From(HHMM): Time when you want to start trading, example 930
  3. Trade Entry Upto(HHMM): Time upto which you want to take fresh trades, example 1430 (for 2:30pm)
  4. Trade Exit(HHMM): Time at which you want to exit all open positions, example 1515
  5. StopLoss(%): Stoploss in percentage from Buy/Short signals
  6. Trail Stop(%): Trail Stop in percentage from Buy/Short signals
  7. Target(%): Target in percentage from Buy/Short signals
  8. Color of Modified Signals: This AFL displays on chart both original signals and modified signals, you can set colors. The stoploss, trail stop and target lines are also drawn on chart with same color.
  9. Exposure  and Quantity both parameters are available. If exposure is 0, it will take the defined Quantity. Exposure example: If you want to buy/sell each stock with Rs. 100,000, you can se the exposure =100000 and run the AFL on multiple stocks. It will automatically trade 1000 share for a 100 rs. stock, and 250 shares of a 400 rs. stock.
  10. Qty Using SL: If this is given non-zero value, it calculates quantity based on SL as defined in percentage. It will ignore Quantity given in parameter or Quantity calculated from Exposure.

How to Use:

This is not a AFL strategy but simply template for automatic trading. Take the following steps to start automatic trading with your own strategy:

  1. In Amibroker, go to Analysis, then Formula Editor
  2. In Formula Editor window, go to File -> Open and open your strategy with buy/sell code.
  3. Scroll down to bottom of code. Copy-paste here code from this strategy template.
  4. Save this file in your computer at location which you easily remember. Now this file is ready for auto trading from both Amibroker charts and Scanner.

Download Link:

Direct Code for Copy-Paste

////// section begins
/* use this afl when buy is different from cover and sell is different from short
*/
RequestTimedRefresh( 1, onlyvisible = False ) ;

_SECTION_BEGIN( "Algoji.com intraday.afl" );
intra = ParamToggle( "Activate Intraday Mode", "NO|YES" );
per10 = Param( "Trade Entry From(HHMM)", 920, 900, 2300, 1 );
per11 = Param( "Trade Entry Upto(HHMM)", 1445, 900, 2300, 1 );
per12 = Param( "Trade Exit(HHMM)", 1515, 900, 2300, 100 );
pop= ParamToggle( "Percentage or Points", "Points|Percentage");
slp = Param( "StopLoss", 0, 0, 1000, 0.1 );
tsl= Param("Trail Stop", 0, 0, 1000, 0.1);
tgtp = Param( "Target", 0, 0, 1000, 0.1 );
Col = ParamColor( "Color of Modified Signals", colorYellow );
delay= ParamToggle("Trade Intrabar?", "YES|Candle Completion");
dlong= ParamToggle("Disable Long?", "NO|YES");
dshort= ParamToggle("Disable Short?", "NO|YES");

if(dlong){Buy=Sell=0;}
if(dshort){Short=Cover=0;}
dd= DaysSince1900();
d=prof= 0;

if(delay)
{Buy=Ref(Buy,-1); Sell=Ref(Sell,-1); Short= Ref(Short,-1); Cover= Ref(Cover,-1);}

qt= Param("Trade Quantity", 0, 0, 1000000) ;
exposure= Param("Exposure", 0, 0, 1000000) ;
if(exposure>0)
qt= round(exposure/ValueWhen(Day()!=Ref(Day(),-1), C));
maxl= Param("Qty using SL (MaxLoss)",0,0,100000 );
if(maxl>0 AND !pop)
qt= round(maxl/slp);
if(maxl>0 AND pop)
{
basicprice= LastValue(ValueWhen(Day()!=Ref(Day(),-1), C));
sl= slp*basicprice/100;
qt= round(maxl/sl);
}

intraex = intra AND (TimeNum() > per12 * 100);
intraen = !intra OR ( TimeNum() <= per11 * 100 AND TimeNum() >= per10 * 100 );


Buy1 = Buy;
Sell1 = Sell;
Short1 = Short;
Cover1 = Cover;
Buy=Sell=Short=Cover=0;
bflag = sflag = sp=bp = 0;
slarr = tgtarr = qtarr= Null;

for ( i = 10; i < BarCount; i++ )
{
    if ( ( Cover1[i] OR intraex[i]OR( H[i] > slarr[i-1] AND (sl>0 OR tsl>0) )  OR ( L[i] < tgtarr[i-1] AND tgt > 0 ) ) AND sflag )
    {
        Cover[i] = 1;
        CoverPrice[i]= C[i];
        sflag = 0;
        d= dd[i]; prof= sp-C[i];
    }

    if ( ( Sell1[i] OR intraex[i] OR( L[i] < slarr[i-1] AND (sl>0 OR tsl>0) ) OR ( H[i] > tgtarr[i-1] AND tgt > 0 ) ) AND bflag )
    {
        Sell[i] = 1;
        SellPrice[i]= C[i];
        bflag = 0;
        d= dd[i]; prof= C[i]- bp;
    }

    if ( Buy1[i] AND intraen[i] AND bflag == 0 )
    {
        Buy[i] = 1;
        bflag = 1;
		bp= C[i];
		sl=slp; tgt= tgtp;
		if(pop)
		{sl= slp*bp/100;
		tgt= tgtp*bp/100;}
        if ( slp )
            slarr[i] = bp-sl; 
       if ( tgtp )
            tgtarr[i] = bp+tgt;
    }

    if ( bflag AND Buy[i]==0 )
    {
        slarr[i] = slarr[i-1];
        tgtarr[i] = tgtarr[i-1];
        if(tsl>0 AND pop)
        slarr[i] = Max(slarr[i-1], H[i]*(1-tsl/100));
        if(tsl>0 AND !pop)
        slarr[i] = Max(slarr[i-1], H[i]-tsl);        
    }



    if ( Short1[i] AND intraen[i] AND sflag == 0 )
    {
        Short[i] = 1;
        sflag = 1;
        Sp= C[i];
        sl= slp; tgt= tgtp;
		if(pop)
		{sl= slp*Sp/100;
		tgt= tgtp*Sp/100;}
        if ( slp )
            slarr[i] = sp + sl;
        if ( tgtp )
            tgtarr[i] = sp - tgt;
    }

    if ( sflag AND Short[i] == 0 )
    {
        slarr[i] = slarr[i-1];
        tgtarr[i] = tgtarr[i-1];
        if(tsl>0 AND pop)
        slarr[i] = Min(slarr[i-1], L[i]*(1+tsl/100));
        if(tsl>0 AND !pop)
        slarr[i] = Min(slarr[i-1], L[i]+tsl);
    }


}


Plot( slarr, "SL", Col, styleThick );
Plot( tgtarr, "TGT", Col, styleThick );
PlotShapes( IIf( Buy, shapeUpArrow, shapeNone ), Col, 0, H, Offset = 15 );
PlotShapes( IIf( Short, shapeDownArrow, shapeNone ), Col, 0, L, Offset = 15 );
PlotShapes( IIf( Cover, shapeStar, shapeNone ), Col, 0, H, Offset = -25 );
PlotShapes( IIf( Sell, shapeStar, shapeNone ), Col, 0, L, Offset = -25 );

sig = IIf( BarsSince( Buy ) < BarsSince( Short ), 1, 0 );
messageboard = ParamToggle( "Message Board", "Show|Hide", 1 );

if ( messageboard == 1 )
{
    GfxSelectFont( "Tahoma", 13, 100 );
    GfxSetBkMode( 1 );
    GfxSetTextColor( colorWhite );

    GfxSelectSolidBrush( colorDarkTeal ); // this is the box background color


    pxHeight = Status( "pxchartheight" ) ;

    xx = Status( "pxchartwidth" );
    Left = 1100;
    width = 310;
    x = 5;
    x2 = 310;

    y = pxHeight;

    GfxSelectPen( colorGreen, 1 ); // broader color
    GfxRoundRect( x, y - 160, x2, y , 7, 7 ) ;
    GfxTextOut( ""+WriteIf(intra, "Intraday Mode Activated", "Intraday Mode Not Activated" ), 13, y-160 );    
    GfxTextOut( ( "Current Qty "+qt ), 13, y-140 );
    GfxTextOut( ( "Last" + " Signal came " + ( BarsSince( Buy OR Short ) ) * Interval() / 60 + " mins ago" ), 13, y - 120 ) ; // The text format location
    GfxTextOut( ( "" + WriteIf( sig == 1, "BUY @ " + ValueWhen(Buy,C) , "SHORT @ " + ValueWhen(Short,C) ) ), 13, y - 100 );
    GfxTextOut( "Stop Loss : " + WriteIf(slp==0, "Not Activated", ""+slarr), 13, y - 80 );
    GfxTextOut( "Target : " + WriteIf(tgtp==0, "Not Activated", ""+tgtarr), 13, y - 60 );
    GfxTextOut( ( "Current P/L : " + WriteVal( IIf( sig == 1, (C-ValueWhen(Buy,C))*qt, (ValueWhen(Short,C)-C)*qt ), 2.2 ) ), 13, y-40 );
//    GfxTextOut( ( "jhjh " ), 13, y-20 );
}


//section begins for auto trade

instr= ParamList("Instrument Name","EQ|FUTIDX|FUTSTK|OPTIDX|OPTSTK|FUTCOM"); 
stag= ParamStr("Strategy Tag", "STG1");
qty= NumToStr(qt[BarCount-1], 1.0, False) ;
    bp= sp= NumToStr(Close[BarCount-1],1.2, False);
if(dlong){Buy=Sell=0;}
if(dshort){Short=Cover=0;}

if(delay)
{Buy=Ref(Buy,-1); Sell=Ref(Sell,-1); Short= Ref(Short,-1); Cover= Ref(Cover,-1);}

global algoji;
algoji = Name() + NumToStr( Interval() / 60, 1.0, False ) ;

procedure aStaticVarSet( SName, Svalue )
{
    global algoji;

        StaticVarSet( Sname + algoji, Svalue );
}

function aStaticVarGet( SName )
{
    global algoji;
    Var = StaticVarGet( Sname + algoji );

    if ( IsNull( Var = StaticVarGet( Sname + algoji ) ) )
        Var = 0;

    return Var;
}

sym = Name();

//_TRACE("t"+t);

Checkdt=Nz(aStaticVarGet("lastdt"));
dt = LastValue( DateTime() );
Checkdtss=Nz(aStaticVarGet("lastdtss"));
dtss = LastValue( DateTime() );
Checkdtc=Nz(aStaticVarGet("lastdtc"));
dtc = LastValue( DateTime() );
Checkdts=Nz(aStaticVarGet("lastdts"));
dts = LastValue( DateTime() );
RTBuy = LastValue( Buy) AND Checkdt != dt;
RTShort = LastValue( Short) AND Checkdtss != dtss;
RTCover = LastValue( Cover) AND Checkdtc != dtc;
RTSell = LastValue( Sell) AND Checkdts != dts;

if ( RTCover )
{
	 aStaticVarSet("lastdtc",dtc );
	 StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
            _TRACE( "#"+Nz(StaticVarGet("counter"))+",SX,"+sym+",,," +bp +","+qty+","+instr+",,");
	Algoji_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "SX",sym,"M","",bp,qty,instr,stag);
}

if ( RTSell )
{
	 aStaticVarSet("lastdts",dts );
	 StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
            _TRACE( "#"+Nz(StaticVarGet("counter"))+",LX,"+sym+",,," +sp +","+qty+",,,");
	Algoji_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "LX",sym,"M","",sp,qty,instr,stag);
}

if ( RTBuy )
{
	 aStaticVarSet("lastdt",dt );
	 StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
            _TRACE( "#"+Nz(StaticVarGet("counter"))+",LE,"+sym+",,," +bp +","+qty+","+instr+",,");
	Algoji_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "LE",sym,"M","",bp,qty,instr,stag);
}

if ( RTShort )
{
	 aStaticVarSet("lastdtss",dtss );
	 StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
    sp= NumToStr(Close[BarCount-1],1.2, False);
            _TRACE( "#"+Nz(StaticVarGet("counter"))+",SE,"+sym+",,," +sp +","+qty+","+instr+",,");
	Algoji_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "SE",sym,"M","",bp,qty,instr,stag);
}

Button = ParamToggle( "Enable Button Trading", "YES|NO" );
expiry= ParamStr("Expiry","");
strike= ParamStr("Strike","");
type= ParamStr("Option Type", "");
sym = Name()+ "|"+expiry+ "|" +strike+ "|" +type;


function GetSecondNum()
{
    Time = Now( 4 );
    Seconds = int( Time % 100 );
    Minutes = int( Time / 100 % 100 );
    Hours = int( Time / 10000 % 100 );
    SecondNum = int( Hours * 60 * 60 + Minutes * 60 + Seconds );
    return SecondNum;
}
 
function PopupWindowEx( popupID, bodytext, captiontext, timeout, left, top )
{
    displayText = bodytext + captiontext;
    if ( ( StaticVarGetText( "prevPopup" + popupID ) != displayText) OR ( StaticVarGet( "prevPopupTime" + popupID ) < GetSecondNum() ) )
    {
        StaticVarSetText( "prevPopup" + popupID, displayText);
        StaticVarSet( "prevPopupTime" + popupID, GetSecondNum() + timeout );
        PopupWindow( bodytext, Captiontext + popupID, timeout, Left, top );
    }
}



x1= Status( "pxchartleft" )+10;
y1= Status( "pxcharttop" )+20;

if ( Button == 0 )
{
    click = GetCursorMouseButtons() == 9;
    Px = GetCursorXPosition( 1 );
    Py = GetCursorYPosition( 1 );

    x2 = x1 + 60;
    y2 = y1 + 60;
    GfxSelectSolidBrush(  ColorRGB( 0, 102, 0 ) ); //buy
    GfxSelectFont( "Tahoma", 13, 100 );
    GfxSetBkMode( 1 );
    GfxSetTextColor( colorWhite );
    GfxRoundRect( x1, y1, x2, y2 , 7, 7 ) ;
    GfxTextOut( "LE", x1 + 20, y1 + 20 );

    sx1 = x2;
    sy1 = y1;
    sx2 = sx1 + 60;
    sy2 = sy1 + 60;
    GfxSelectSolidBrush(  ColorRGB( 255, 204, 204 ) );//sell
    GfxRoundRect( sx1, sy1, sx2, sy2 , 7, 7 ) ;
    GfxSetTextColor( ColorRGB( 153, 0, 0 ) );
    GfxTextOut( "SE", sx1 + 20, sy1 + 20 );

    ex1 = x1;
    ey1 = y1+60;
    ex2 = ex1 + 60;
    ey2 = ey1 + 60;
    GfxSelectSolidBrush(  ColorRGB( 255, 204, 204 ) );//sell
    GfxRoundRect( ex1, ey1, ex2, ey2 , 7, 7 ) ;
    GfxSetTextColor( ColorRGB( 153, 0, 0 ) );
    GfxTextOut( "LX", ex1 + 20, ey1 + 20 );

    GfxSelectSolidBrush(  ColorRGB( 0, 102, 0 ) );//sell
    GfxRoundRect( ex2, ey1, ex2+60, ey2 , 7, 7 ) ;
    GfxSetTextColor( colorWhite );
    GfxTextOut( "SX", ex2 + 20, ey1 + 20 );

    if ( px > x1 AND px<x2 AND py>y1 AND py < y2 AND Click )
    {
        _TRACE( "# ," + NumToStr(Nz(StaticVarGet("counter")),0,False) + ", BUY triggered from button, "  );
		AlertIf( 1, "SOUND C:\\Windows\\Media\\tada.wav", "Audio alert", 1, 2, 1 );    
    StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
    	PopupWindowEx( "ID:1", "BUY", "Buy Triggered from Button "+Name(), 1, -1, -1 );
	AlgoJi_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "LE",sym,"M","",sp,qty,instr,stag);
	}
//https://algoji.com/
    if ( px > sx1 AND px<sx2 AND py>sy1 AND py < sy2 AND Click )
    {
        _TRACE( "# ," + NumToStr( DateTime(), formatDateTime ) + ", SHORT triggered from button, " );
		AlertIf( 2, "SOUND C:\\Windows\\Media\\tada.wav", "Audio alert", 2, 2, 1 );
    StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
	PopupWindowEx( "ID:3", "SHORT", "Short Triggered from Button "+Name(), 1, -1, -1 );
	AlgoJi_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "SE",sym,"M","",sp,qty,instr,stag);
    }
//https://algoji.com/
    if ( px > ex1 AND px<ex2 AND py>ey1 AND py<ey2 AND Click )
    {
        _TRACE( "# ," + NumToStr( DateTime(), formatDateTime ) + ", SELL triggered from button, " );
		AlertIf( 3, "SOUND C:\\Windows\\Media\\tada.wav", "Audio alert", 2, 2, 1 );
    StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );    
	PopupWindowEx( "ID:3", "SELL", "Sell Triggered from Button "+Name(), 1, -1, -1 );
	AlgoJi_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "LX",sym,"M","",sp,qty,instr,stag);
    }
//https://algoji.com/
    if ( px > ex2 AND px<(ex2+60) AND py>ey1 AND py < ey2 AND Click )
    {
        _TRACE( "# ," + NumToStr( DateTime(), formatDateTime ) + ", Cover triggered from button, " );
		AlertIf( 4, "SOUND C:\\Windows\\Media\\tada.wav", "Audio alert", 2, 2, 1 );
    StaticVarSet("counter", Nz(StaticVarGet("counter"))+1 );
	PopupWindowEx( "ID:3", "Cover", "Cover  Triggered from Button "+Name(), 1, -1, -1 );
	AlgoJi_Signal(NumToStr(Nz(StaticVarGet("counter")),0,False), "SX",sym,"M","",sp,qty,instr,stag);
    }

}