Separate Entry Exit Amibroker AFL

This is a basic template used for strategies where Buy (LE), Sell (LX), Short (SE), and Cover (SX) are different. Do not use it where Buy=Cover or Sell=Short.

Parameters:

  1. Instrument Name: Select the instrument name for the market segment you want to trade
  2. Trade Intrabar: If you want to trade immediately when signal appears, select Yes. If you want to wait for signal confirmation until completion of candle, select Candle Completion
  3. Strategy Tag: You can use any strategy tag to manage signals coming from mutiple strategies in Amibroker. Eg. STG1, STG2, STG3 etc.
  4. Disable Long: If you want to disable all Long signals (use only Short side for trading), then turn this Yes
  5. Disable Short: If you want to disable all Short signals (use only Long side for trading), then turn this Yes

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 for auto trade

instr= ParamList("Instrument Name","EQ|FUTIDX|FUTSTK|OPTIDX|OPTSTK|FUTCOM"); 
delay= ParamToggle("Trade Intrabar?", "YES|Candle Completion");
stag= ParamStr("Strategy Tag", "STG1");
dlong= ParamToggle("Disable Long?", "NO|YES");
dshort= ParamToggle("Disable Short?", "NO|YES");
qty= ParamStr("Qty", "1");
    bp= sp= NumToStr(Close[BarCount-1],1.2, False);
if(dlong){Buy=Sell=0;}
if(dshort){Short=Cover=0;}

qty= "1";

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);
    }

}