Stop and Reverse Cover Orders/Bracket Orders – Automated Chart based Intraday Trading Module for Amibroker

Bracket Order and Cover Order are multi-legged orders which come with default protection with stop loss with reasonable intraday leverage. This tutorial focus on building a Plug and Play Amibroker Intraday module where traders can create their own trading strategy in Amibroker and connect their intraday trading strategies with Plug and Play Amibroker Execution Module to bring 100% automation in their intraday traders using Cover and Bracket Orders in Algomojo trading platform

Supported Brokers : Aliceblue, Tradejini, Zebu

Strategy Requirements

  • Enter Buy BO/CO order on Buy Signal
  • Enter Sell BO/CO Order on Short Signal
  • Stop and Reverse from Buy to Short on both Short Signal and Sell Signal
  • Stop and Reverse from Short to Buy on Both Buy Signal and Cover signal
  • Exit BO/CO Order on Sell Signal
  • Exit BO/CO Order on Cover Signal

Sample Donchian Intraday Trading Strategy – Amibroker AFL Code

_SECTION_BEGIN("Simple Swing Trading System");

SetChartOptions(0, chartShowArrows | chartShowDates); //x-Axis will be plottted
//plot the candles
Plot(Close,"Close",colorDefault,styleCandle | styleNoTitle);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));

N = 1;

// identify new day
dn = DateNum();
newDay = dn != Ref( dn,-1);


len = Param("Length",15,1,50,1);


signalstarttime = ParamTime( "Start Time", "09:30" );
signalendtime = ParamTime( "EndTime", "15:00" );
sqofftime = ParamTime( "Sq Off", "15:15" );


upper = HHV(High,len);
lower = LLV(Low,len);


//refer to previous channel and ignoring the current channel value
upper = Ref(upper,-1);
lower = Ref(lower,-1);


//Plot(upper,"upper",colorRed);
//Plot(lower,"lower",colorGreen);


//Touch based trading system - Trading Logic

Buy = Cross(High,upper) AND TimeNum()>=signalstarttime AND TimeNum()<=signalendtime;
Sell = Cross(lower,Low) OR TimeNum()>=sqofftime;

Buy = Buy AND Sum( Buy, BarsSince( newDay) +1 ) <= N;

Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);

//check whether signals are continuing or not

Buycontinue = Flip(Buy,Sell);
sellcontinue = Flip(Sell,Buy);


Short = Cross(lower,Low) AND TimeNum()>=signalstarttime AND TimeNum()<=signalendtime;
Cover =  Cross(High,upper) OR TimeNum()>=sqofftime;

Short = Short AND Sum( Short, BarsSince( newDay) +1 ) <= N;

Short = ExRem(Short,Cover);
Cover = ExRem(Cover,Short);


color = IIf(Buycontinue,colorGreen,IIf(sellcontinue,colorRed,colorGrey40));

tsl = IIf(Buycontinue,lower,IIf(sellcontinue,upper,null)); //trailing stoploss


Plot(tsl,"Trailing Stoploss",color,styleDashed | styleThick);


//execution logic

SetTradeDelays(0,0,0,0); //No Trade Delay - Execute as it happens

BuyPrice = max(open,upper);
SellPrice = iif(Cross(lower,Low),lower,Close);

ShortPrice = min(open,lower);
CoverPrice = IIf(Cross(High,upper),upper,Close);


//position sizing - How much to Bet


SetPositionSize(1*RoundLotSize,spsShares);


/* 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(Short, shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Short, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);
PlotShapes(IIf(Short, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);
PlotShapes(IIf(sell, shapestar, shapeNone),colorgreen, 0,L, Offset=-45);
PlotShapes(IIf(cover, shapestar, shapeNone),colorRed, 0,H, Offset=-45);


Filter = Buy OR Sell OR Short OR Cover;

AddColumn(Close,"LTP",1.2);
AddColumn(TSL,"Trailing Stop",1.2);
AddColumn(IIf(Buy,'B',IIf(Short,'S',null)),"Entry Signal",formatChar,colorWhite,IIf(Buy,colorGreen,IIf(Short,colorRed,colorGrey40)));
AddColumn(IIf(Sell,'S',IIf(Cover,'C',null)),"Exit Signal",formatChar,colorWhite,IIf(Sell,colorRed,IIf(Cover,colorGreen,colorGrey40)));
AddColumn(IIf(TimeNum()==sqofftime,1,0),"Sqoff Time",1,colorWhite,IIf(TimeNum()==sqofftime,colorOrange,colorBlack));

_SECTION_END();

Intraday Preferences Settings

Goto Amibroker ->Tools Menu -> Preferences and make sure to enable start time of interval option as shown below. It is highly recommended to use for the above coding pattern.

Amibroker Execution Module for BO/CO Orders

Amibroker Execution Module contains two parts

1)Main Chart Based Module
2)Header Module

Main Module (algomojo_chart_based_trading_bo_co_stop_reverse.afl)

//////////////////////////////////////////////
//Multi Broker Amibroker Charting BO/CO Order Module
//Coded by Algomojo
//Date : 20/03/2021
//////////////////////////////////////////////

//Note : Bracket Order and Cover Order Stop and Reverse Module is designed purely for Intraday Strategies only


#include 

_SECTION_BEGIN("Algomojo Charting BO/CO Order Module");

// Send orders even if Amibroker is minimized or Chart is not active
RequestTimedRefresh(1, False); 


//Configure Trade Execution Delay


AlgoBuy = lastvalue(Ref(Buy,-tradedelay));
AlgoSell = lastvalue(Ref(Sell,-tradedelay));
AlgoShort = lastvalue(Ref(Short,-tradedelay));
AlgoCover = lastvalue(Ref(Cover,-tradedelay));


//Static Varibales for Order Protection

static_name_ = Name()+GetChartID()+interval(2)+stgy_name;
static_name_algo = Name()+GetChartID()+interval(2)+stgy_name+"algostatus";
//StaticVarSet(static_name_algo, -1); 


//Algo Dashboard

GfxSelectFont( "BOOK ANTIQUA", 14, 100 );
GfxSetBkMode( 1 );
if(EnableAlgo == "Enable")
{
AlgoStatus = "Algo Enabled";
GfxSetTextColor( colorGreen ); 
GfxTextOut( "Algostatus : "+AlgoStatus , 20, 40); 
if(Nz(StaticVarGet(static_name_algo),0)!=1)
{
_TRACE("Algo Status : Enabled");
StaticVarSet(static_name_algo, 1);
}
}
if(EnableAlgo == "Disable")
{
AlgoStatus = "Algo Disabled";
GfxSetTextColor( colorRed ); 
GfxTextOut( "Algostatus : "+AlgoStatus , 20, 40); 
if(Nz(StaticVarGet(static_name_algo),0)!=0)
{
_TRACE("Algo Status : Disabled");
StaticVarSet(static_name_algo, 0);
}
}
if(EnableAlgo == "LongOnly")
{
AlgoStatus = "Long Only";
GfxSetTextColor( colorYellow ); 
GfxTextOut( "Algostatus : "+AlgoStatus , 20, 40); 
if(Nz(StaticVarGet(static_name_algo),0)!=2)
{
_TRACE("Algo Status : Long Only");
StaticVarSet(static_name_algo, 2);
}
}
if(EnableAlgo == "ShortOnly")
{
AlgoStatus = "Short Only";
GfxSetTextColor( colorYellow ); 
GfxTextOut( "Algostatus : "+AlgoStatus , 20, 40); 
if(Nz(StaticVarGet(static_name_algo),0)!=3)
{
_TRACE("Algo Status : Short Only");
StaticVarSet(static_name_algo, 3);
}
}


//Execution Module

if(EnableAlgo != "Disable")
    {
        lasttime = StrFormat("%0.f",LastValue(BarIndex()));
        
        SetChartBkColor(colorDarkGrey);
        if(EnableAlgo == "Enable")
        {   
            if (AlgoBuy==True AND AlgoCover == True AND StaticVarGet(static_name_+"buyCoverAlgo")==0 AND StaticVarGetText(static_name_+"buyCoverAlgo_barvalue") != lasttime )
            {
            // reverse Long Entry 
                
                resp = GetOrderBook();
				CancelOrder(resp,Tsym,Pcode); 
				BuyOrder(qty,Pcode);
                StaticVarSetText(static_name_+"buyCoverAlgo_barvalue",lasttime);  
                StaticVarSet(static_name_+"buyCoverAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Signal : Buy and Cover Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
        
            }
            else if ((AlgoBuy != True OR AlgoCover != True))
            {   
                StaticVarSet(static_name_+"buyCoverAlgo",0);
            }
            
            if (AlgoBuy==True AND AlgoCover != True AND StaticVarGet(static_name_+"buyAlgo")==0 AND StaticVarGetText(static_name_+"buyAlgo_barvalue") != lasttime)
            {
            // Long Entry 
                BuyOrder(qty,Pcode);
                StaticVarSetText(static_name_+"buyAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"buyAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Buy Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoBuy != True)
            {   
                StaticVarSet(static_name_+"buyAlgo",0);
                
            }
            if (AlgoSell==true AND AlgoShort != True AND StaticVarGet(static_name_+"sellAlgo")==0 AND StaticVarGetText(static_name_+"sellAlgo_barvalue") != lasttime)
            {     
            // Long Exit 
                resp = GetOrderBook();
				CancelOrder(resp,Tsym,Pcode); //output in string format
                StaticVarSetText(static_name_+"sellAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"sellAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Sell Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoSell != True )
            {   
                StaticVarSet(static_name_+"sellAlgo",0);
            }
            if (AlgoShort==True AND AlgoSell==True AND  StaticVarGet(static_name_+"ShortSellAlgo")==0 AND StaticVarGetText(static_name_+"ShortSellAlgo_barvalue") != lasttime)
            {
            // reverse Short Entry 
                
                resp = GetOrderBook();
				CancelOrder(resp,Tsym,Pcode); //output in string format
				SellOrder(qty,Pcode);
                StaticVarSetText(static_name_+"ShortsellAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"ShortSellAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty*2 +"  Signal : Short and Sell Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if ((AlgoShort != True OR AlgoSell != True))
            {   
                StaticVarSet(static_name_+"ShortSellAlgo",0);
            }
                
            if (AlgoShort==True  AND  AlgoSell != True AND StaticVarGet(static_name_+"ShortAlgo")==0 AND  StaticVarGetText(static_name_+"ShortAlgo_barvalue") != lasttime)
            {
            // Short Entry
                SellOrder(qty,Pcode);
                StaticVarSetText(static_name_+"ShortAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"ShortAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Short Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoShort != True )
            {   
                StaticVarSet(static_name_+"ShortAlgo",0);
            }
            if (AlgoCover==true AND AlgoBuy != True AND StaticVarGet(static_name_+"CoverAlgo")==0 AND StaticVarGetText(static_name_+"CoverAlgo_barvalue") != lasttime)
            {
            // Short Exit
                resp = GetOrderBook();
				CancelOrder(resp,Tsym,Pcode); //output in string format
                StaticVarSetText(static_name_+"CoverAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"CoverAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Cover Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoCover != True )
            {   
                StaticVarSet(static_name_+"CoverAlgo",0);
            }
        }
        
        
        
        else if(EnableAlgo == "LongOnly")
        {
            
            if (AlgoBuy==True AND StaticVarGet(static_name_+"buyAlgo")==0 AND StaticVarGetText(static_name_+"buyAlgo_barvalue") != lasttime)
            {  
            //  Long Entry
                BuyOrder(qty,Pcode);
                StaticVarSetText(static_name_+"buyAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"buyAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Buy Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoBuy != True)
            {   
                StaticVarSet(static_name_+"buyAlgo",0);
            }
            if (AlgoSell==true AND StaticVarGet(static_name_+"sellAlgo")==0 AND StaticVarGetText(static_name_+"sellAlgo_barvalue") != lasttime)
            {  
            // Long Exit
                resp = GetOrderBook();
				CancelOrder(resp,Tsym,Pcode); //output in string format
                StaticVarSetText(static_name_+"sellAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"sellAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Sell Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoSell != True )
            {   
                StaticVarSet(static_name_+"sellAlgo",0);
            }
        }
        else if(EnableAlgo == "ShortOnly")
        {
            if (AlgoShort==True AND StaticVarGet(static_name_+"ShortAlgo")==0 AND StaticVarGetText(static_name_+"ShortAlgo_barvalue") != lasttime)
            {
            // Short Entry
                SellOrder(qty,Pcode);
                StaticVarSetText(static_name_+"ShortAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"ShortAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Short Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoShort != True )
            {   
                StaticVarSet(static_name_+"ShortAlgo",0);
            }
            if (AlgoCover==true AND StaticVarGet(static_name_+"CoverAlgo")==0 AND StaticVarGetText(static_name_+"CoverAlgo_barvalue") != lasttime)
            {
            // Short Exit
                resp = GetOrderBook();
				CancelOrder(resp,Tsym,Pcode); //output in string format
                StaticVarSetText(static_name_+"CoverAlgo_barvalue",lasttime); 
                StaticVarSet(static_name_+"CoverAlgo",1); //Algo Order was triggered, no more order on this bar
                //_TRACE("Strategy : "+ stgy_name +"AlgoStatus : "+ EnableAlgo +"Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ qty +"  Signal : Cover Signal  TimeFrame : "+ Interval(2)+"  Response : "+ resp +"  ChardId : "+ GetChartID() + " Latest Price : "+LastValue(C));
            }
            else if (AlgoCover != True)
            {   
                StaticVarSet(static_name_+"CoverAlgo",0);
            }
        }
        
    }//end main if

    
_SECTION_END();

Header Module (BracketCoverOrders.afl)

save the header module under the folder /Amibroker/Formulas/Include folder

//store the file under the name - ExitBOCOOrders.afl under the Amibroker\Formulas\Include folder

uid = ParamStr("Client ID","TS2499");
user_apikey = ParamStr("user_apikey","xxxxxxxxxxxxxxxxxxxxx"); //Enter your API key here
api_secret = ParamStr("api_secret","xxxxxxxxxxxxxxxxxxxxx"); //Enter your API secret key here
s_prdt_ali = "BO:BO|CNC:CNC|CO:CO|MIS:MIS|NRML:NRML"; //Product Alias
Tsym = ParamStr("Trading Symbol","RELIANCE-EQ"); //Symbol Name
exch = ParamList("Exchange","NFO|NSE|BSE|CDS|MCX|NCDEX",1); //Exchange
Ret = "DAY"; //Retention
prctyp = ParamList("prctyp","MKT|L|SL|SL-M",0); // Pricetype
Pcode = ParamList("Pcode","BO|CO",1);
qty = Param("Quantity",1,0,100000,1); // Quantity
AMO = "NO"; //AMO Order
tradedelay = Param("Execution Delay",0,0,1); // 0 - Execution with No Delay after a signal, 1- Execution at the end of the candle
stgy_name = ParamStr("Strategy Name","Test Strategy Chart"); // Strategy Name
EnableAlgo = ParamList("Algo Mode","Disable|Enable|LongOnly|ShortOnly",0); // Algo Mode
resp = "";
broker ="tj"; //Broker Short Code - ab - aliceblue, tj - tradejini, zb - zebu, en - enrich
ver = ParamStr("API Version ","1.0");

TokenNo = ParamStr("TokenNo","11184"); //Enter the token number of the symbol here. Check the Algomojo Watchlist symbol info to get the relevant symbol token no.
ltpOratp = "LTP"; //ParamList("ltpOratp","LTP|ATP",0);


 
SqrOffAbsOrticks = "Absolute";  //ParamList("SqrOffAbsOrticks","Absolute|Ticks",0); //If you select absolute then you can enter a decimal quantity. If you selected ticks you need to enter in multiples of ticks
SLAbsOrticks = "Absolute";   //ParamList("SLAbsOrticks","Absolute|Ticks",0);

trailingSL = "N"; //ParamList("trailingSL","Y|N",0); 
tSLticks = 1000; //ParamStr("tSLticks","100"); //Trailing SL value in ticks if user has opted to use trailingSL

stops = Param("Stoploss %", 0.25,0,20,0.01);
target = Param("Target %", 0.5,0,20,0.01);
TickSz = Param("TickSize",0.05); //round off the stops and target to nearest tick size




RequestTimedRefresh(1,False);


buystops1 = (100-stops)/100 * Buyprice;
buytarget1 = (100+target)/100 * Buyprice;


buystops = TickSz * round( buystops1 / TickSz );
buytarget = TickSz * round( buytarget1 / TickSz );

shortstops1 = (100-stops)/100 * Shortprice;
shorttarget1 = (100+target)/100 * Shortprice;


shortstops = TickSz * round( shortstops1 / TickSz );
shorttarget = TickSz * round( shorttarget1 / TickSz );

BuyP = TickSz * round( BuyPrice / TickSz );
ShortP = TickSz * round( ShortPrice / TickSz );


//Buy and Sell Order Functions

function Buyorder(orderqty,Pcode)
{
	if(Pcode=="CO")
	{
    algomojo=CreateObject("AMAMIBRIDGE.Main");
    api_data ="{\"stgy_name\":\""+stgy_name+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\",\"Tsym\":\""+Tsym+"\",\"exch\":\""+exch+"\",\"Ttranstype\":\""+"B"+"\",\"Ret\":\""+Ret+"\",\"prctyp\":\""+prctyp+"\",\"qty\":\""+orderqty+"\",\"discqty\":\""+"0"+"\",\"MktPro\":\""+"NA"+"\",\"Price\":\""+"0"+"\",\"TrigPrice\":\""+BuyStops+"\",\"Pcode\":\""+Pcode+"\",\"AMO\":\""+AMO+"\"}";
    
    _TRACE("BuyOrder API Request"+api_data);
    resp=algomojo.AMDispatcher(user_apikey, api_secret,"PlaceOrder",api_data,broker,ver);
    _TRACE("BuyOrder API Response : "+resp);
    _TRACE("Strategy Name : "+stgy_name+";  AlgoStatus : "+ EnableAlgo);
    _TRACE("Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ orderqty +"  Signal : Buy Signal  TimeFrame : "+ Interval(2)+"  ChardId : "+ GetChartID() + " LTP : "+LastValue(C));
	}
	if(Pcode=="BO")
	{
	
	SqrOffvalue = abs(buytarget-BuyP); //ParamStr("SqrOffvalue","1"); 
	SLvalue = abs(BuyP-buystops) ; //ParamStr("SLvalue","30");
	SqrOffvalue = TickSz * round( SqrOffvalue / TickSz );
	SLvalue = TickSz * round( SLvalue / TickSz );
	algomojo=CreateObject("AMAMIBRIDGE.Main");
	api_data ="{\"stgy_name\":\""+stgy_name+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\",\"TokenNo\":\""+TokenNo+"\",\"exch\":\""+exch+"\",\"Ttranstype\":\""+"B"+"\",\"Ret\":\""+Ret+"\",\"prctyp\":\""+prctyp+"\",\"qty\":\""+qty+"\",\"discqty\":\""+"0"+"\",\"Price\":\""+"0"+"\",\"ltpOratp\":\""+ltpOratp+"\",\"SqrOffAbsOrticks\":\""+SqrOffAbsOrticks+"\",\"SqrOffvalue\":\""+SqrOffvalue+"\",\"SLAbsOrticks\":\""+SLAbsOrticks+"\",\"SLvalue\":\""+SLvalue+"\",\"trailingSL\":\""+trailingSL+"\",\"tSLticks\":\""+tSLticks+"\"}";
	_TRACE("BuyOrder API Request"+api_data);
	resp=algomojo.AMDispatcher(user_apikey, api_secret,"PlaceBOOrder",api_data,broker,ver);
	_TRACE("BuyOrder API Response : "+resp);
    _TRACE("Strategy Name : "+stgy_name+";  AlgoStatus : "+ EnableAlgo);
    _TRACE("Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ orderqty +"  Signal : Buy Signal  TimeFrame : "+ Interval(2)+"  ChardId : "+ GetChartID() + " LTP : "+LastValue(C));
	
	
	}
	
	
	
	//Say( "Buy Order Placed" ); 
}



function sellorder(orderqty,Pcode)
{	

	if(Pcode=="CO")
	{
    algomojo=CreateObject("AMAMIBRIDGE.Main");
    api_data ="{\"stgy_name\":\""+stgy_name+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\",\"Tsym\":\""+Tsym+"\",\"exch\":\""+exch+"\",\"Ttranstype\":\""+"S"+"\",\"Ret\":\""+Ret+"\",\"prctyp\":\""+prctyp+"\",\"qty\":\""+orderqty+"\",\"discqty\":\""+"0"+"\",\"MktPro\":\""+"NA"+"\",\"Price\":\""+"0"+"\",\"TrigPrice\":\""+Shortstops+"\",\"Pcode\":\""+Pcode+"\",\"AMO\":\""+AMO+"\"}";
    
    _TRACE("SellOrder API Request"+api_data);
    resp=algomojo.AMDispatcher(user_apikey, api_secret,"PlaceOrder",api_data,broker,ver);
    _TRACE("SellOrder API Response : "+resp);
    _TRACE("Strategy Name : "+stgy_name+"  AlgoStatus : "+ EnableAlgo);
    _TRACE("Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ orderqty +"  Signal : Sell Signal  TimeFrame : "+ Interval(2)+"  ChardId : "+ GetChartID() + " LTP : "+LastValue(C));
	}
	if(Pcode=="BO")
	{
	SqrOffvalue = abs(ShortP-shorttarget); //ParamStr("SqrOffvalue","1"); 
	SLvalue = abs(shortstops - ShortP) ; //ParamStr("SLvalue","30");
	SqrOffvalue = TickSz * round( SqrOffvalue / TickSz );
	SLvalue = TickSz * round( SLvalue / TickSz );
	algomojo=CreateObject("AMAMIBRIDGE.Main");
	api_data ="{\"stgy_name\":\""+stgy_name+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\",\"TokenNo\":\""+TokenNo+"\",\"exch\":\""+exch+"\",\"Ttranstype\":\""+"S"+"\",\"Ret\":\""+Ret+"\",\"prctyp\":\""+prctyp+"\",\"qty\":\""+qty+"\",\"discqty\":\""+"0"+"\",\"Price\":\""+"0"+"\",\"ltpOratp\":\""+ltpOratp+"\",\"SqrOffAbsOrticks\":\""+SqrOffAbsOrticks+"\",\"SqrOffvalue\":\""+SqrOffvalue+"\",\"SLAbsOrticks\":\""+SLAbsOrticks+"\",\"SLvalue\":\""+SLvalue+"\",\"trailingSL\":\""+trailingSL+"\",\"tSLticks\":\""+tSLticks+"\"}";
	_TRACE("SellOrder API Request"+api_data);
	resp=algomojo.AMDispatcher(user_apikey, api_secret,"PlaceBOOrder",api_data,broker,ver);
	_TRACE("SellOrder API Response : "+resp);
    _TRACE("Strategy Name : "+stgy_name+"  AlgoStatus : "+ EnableAlgo);
    _TRACE("Chart Symbol : "+ Name() +"  Trading Symbol : "+  Tsym +"  Quantity : "+ orderqty +"  Signal : Sell Signal  TimeFrame : "+ Interval(2)+"  ChardId : "+ GetChartID() + " LTP : "+LastValue(C));
	
	}
}


function GetOrderBook()
{

algomojo=CreateObject("AMAMIBRIDGE.Main");
api_data ="{\"uid\":\""+uid+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\"}";
resp=algomojo.AMDispatcher(user_apikey, api_secret,"OrderBook",api_data,broker,ver);
_TRACE("Order Book  : " +resp);
return resp;
}

function ExitOrder(Symbol,OrderType,Nstordno)
{

if(OrderType=="BO")
{
algomojo=CreateObject("AMAMIBRIDGE.Main");
api_data ="{\"nestordernumber\":\""+Nstordno+"\",\"SyomOrderId\":\""+""+"\",\"status\":\""+"pending"+"\"}";
resp=algomojo.AMDispatcher(user_apikey, api_secret,"ExitBOOrder",api_data,broker,ver);

}

if(OrderType=="CO")
{
algomojo=CreateObject("AMAMIBRIDGE.Main");
api_data ="{\"uid\":\""+uid+"\",\"NestOrd\":\""+Nstordno+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\"}";
resp=algomojo.AMDispatcher(user_apikey, api_secret,"ExitCOOrder",api_data,broker,ver);

}


return resp;
}

function CancelOrder(resp,Tsym,Pcode)
{

//Initialization
flag = 0;

stringinfo = "Nstordno";

for( item = 0; ( sym = StrExtract( resp, item,'{' )) != ""; item++ )
{

sym = StrTrim(sym," ");
Tsym = StrTrim(Tsym," ");

if(Pcode == "BO");
{
ordermatch = StrFind(sym,Tsym) AND StrFind(sym,Pcode) AND StrFind(sym,"complete");
}

if(Pcode == "CO");
{
ordermatch = StrFind(sym,Tsym) AND StrFind(sym,Pcode) AND (StrFind(sym,"complete") OR StrFind(sym,"open"));
}


if(ordermatch) //Matches the symbol and //Matches the Order Type
{

flag = 1; //turn on the flag

data = sym;



for( jitem = 0; ( posdetails = StrExtract( data, jitem,',' )) != ""; jitem++ )
{
  
  if(StrFind(posdetails,"\""+stringinfo+"\""))
  {
   posdetails = StrExtract(posdetails,1,':');
   Nstordno = StrTrim(posdetails,"\"");
   ExitOrder(Tsym,Pcode,Nstordno);
  }
  

} //end of for loop
} //end of if loop


}//end of for loop


_TRACE(Tsym+" "+Pcode+" Order Cancelled");

}

Now Drag and Drop the Main execution module on top of the intraday trading system and set the following parameters as shown below

1)Set the API Key and API Secret Key
2)Select the PCode to send BO or CO Orders
3)Set the token no if it is a bracket order (Can get these details from Algomojo Market Watch -> Symbol Information)
4)Set the Stoploss in percentage terms in case of cover order and set the stops and target in case of Bracket order.
5)Set the Broker, Trading Symbol, Exchange
6)Enable to AlgoTrading to start running the intraday trading system

While Coding for BO and CO Module following things needs to be noted

1)Stops and Targets are derived from the BuyPrice and ShortPrice i.e from entry price. Code the BuyPrice and Shortprice properly. Improper calculation could result in poor calculation of Stops and Target levels.

2)Make sure to follow the set of protocols to follow in case if you are building a bracket order strategy

3)Strategy is rounded off to nearest tick size by default tick size is set to 0.05. It could vary depends upon Exchanges and Trading Instruments especially for commodities and currencies.

Bingo! Now you are all set to do a complete automation on Bracket Order and Cover Order strategies.

2 thoughts on “Stop and Reverse Cover Orders/Bracket Orders – Automated Chart based Intraday Trading Module for Amibroker”

  1. VIRENDRA PRASAD

    How to trade base of tradingview stragery automation trading
    In tradingview stragery trail stop lose
    Trail traget
    Kindly reply me
    Thank you

    1. One have to right the trailing stoploss strategy in the pinescript itself and generate the signal. Later convert the signal to alert which place the orders in Algomojo Platform.

Leave a Comment

Your email address will not be published. Required fields are marked *