// Developer: Rajandran R (Founder - Marketcalls / Co-Founder - Algomojo) // Date: 24-Dec-2021 // Website: algomojo.com / marketcalls.in _SECTION_BEGIN("Nest Broker - Broker Controls"); RequestTimedRefresh(1, False); // Send orders even if Amibroker is minimized or Chart is not active broker = Paramlist("Broker","ab|tj|zb"); //ab - aliceblue, tj - tradejini, zb - zebu ver = ParamStr("API Version ","1.0"); clnt_id = ParamStr("Client ID","xxxxxx"); //Enter your trading client ID user_apikey = ParamStr("user_apikey","xxxxxx"); //Enter your API key here api_secretkey = ParamStr("api_secretkey","xxxxxx"); //Enter your API secret key here _SECTION_END(); _SECTION_BEGIN("Nest Broker - Order Controls"); 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|BFO|MCXSXFO|MCXSX",1); //Exchange Ret = "DAY"; //Retention prctyp = ParamList("prctyp","MKT|L|SL|SL-M",0); // Pricetype Pcode = ParamList("Product code","NRML|BO|CNC|CO|MIS",4); // Product Code qty = Param("Quantity",1,0,100000,1); // Quantity AMO = "NO"; //AMO Order Entrydelay = Param("Entry Delay",0,0,1); // 0 - Execution with No Delay after a signal, 1- Execution at the end of the candle Exitdelay = Param("Exit Delay",0,0,1); strg_name = ParamStr("Strategy Name","Test Strategy Chart"); // Strategy Name EnableAlgo = ParamList("Algo Mode","Disable|Enable|LongOnly|ShortOnly",0); // Algo Mode resp = ""; static_name_ = Name()+GetChartID()+interval(2)+strg_name; static_name_algo = Name()+GetChartID()+interval(2)+strg_name+"algostatus"; //Configure Trade Execution Delay AlgoBuy = lastvalue(Ref(Buy,-Entrydelay)); AlgoSell = lastvalue(Ref(Sell,-Exitdelay)); AlgoShort = lastvalue(Ref(Short,-Entrydelay)); AlgoCover = lastvalue(Ref(Cover,-Exitdelay)); 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); } } function GetPositionsBook() { algomojo=CreateObject("AMAMIBRIDGE.Main"); api_data ="{\"uid\":\""+clnt_id+"\",\"actid\":\""+clnt_id+"\",\"type\":\""+"NET"+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\"}"; resp=algomojo.AMDispatcher(user_apikey, api_secretkey,"PositionBook",api_data,broker,ver); _TRACE("Position Book Response : " +resp); return resp; } function NetOpenPositions() { flag = 0; resp = GetPositionsBook(); posNetqty =0; for( item = 0; ( sym = StrExtract( resp, item,'{' )) != ""; item++ ) { if(Strfind(sym,Tsym) AND StrFind(sym,Pcode)) //Matches the symbol and //Matches the Order Type { flag = 1; //turn on the flag for( jitem = 0; ( posdetails = StrExtract( sym, jitem,',' )) != ""; jitem++ ) { if(Strfind(posdetails,"Tsym")) { posdetails = StrExtract(posdetails,1,':'); possym = StrTrim(posdetails,"\""); _TRACE("\nSymbol : "+possym); } if(Strfind(posdetails,"Netqty")) { posdetails = StrExtract(posdetails,1,':'); posNetqty = StrToNum(StrTrim(posdetails,"\"")); _TRACE("\nNetQty : "+posNetqty); } } //end of for loop } }//end of for loop if(flag==0) { _TRACE("\nTrading Symbol Not Found"); //posNetqty =0; _TRACE("\nNetQty : "+posNetqty); } return posNetqty; }//end of Net Open Positions function PlaceOrder(TransType,orderqty) { //Creating the Trading Bridge algomojo=CreateObject("AMAMIBRIDGE.Main"); //Preparing the API data api_data ="{\"strg_name\":\""+strg_name+"\",\"s_prdt_ali\":\""+s_prdt_ali+"\",\"Tsym\":\""+Tsym+"\",\"exch\":\""+exch+"\",\"Ttranstype\":\""+""+TransType+""+"\",\"Ret\":\""+Ret+"\",\"prctyp\":\""+"MKT"+"\",\"qty\":\""+orderqty+"\",\"discqty\":\""+"0"+"\",\"MktPro\":\""+"NA"+"\",\"Price\":\""+"0"+"\",\"TrigPrice\":\""+"0"+"\",\"Pcode\":\""+Pcode+"\",\"AMO\":\""+AMO+"\"}"; _TRACE("Broker API Request"+api_data); resp=algomojo.AMDispatcher(user_apikey, api_secretkey,"PlaceOrder",api_data,broker,ver); _TRACE("API Response : "+resp); _TRACE("Strategy Name : "+strg_name+" AlgoStatus : "+ EnableAlgo); _TRACE("Chart Symbol : "+ Name() +" Trading Symbol : "+ Tsym +"Trading Interval : "+Interval(2)+" Chard Id : "+ GetChartID()); Say( "Order Placed" ); return resp; } NewQty = Null; //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 OpenPos = NetOpenPositions(); if(OpenPos==0) { //If no open position send only x1 times of qty NewQty = qty; _TRACE("No Open Positions Exist and Hence x1 times qty will be punched"); } else if(OpenPos == -qty) { //if already short positions are running send x2 times of qty NewQty = 2*qty; _TRACE("Open Positions Exist and Hence x2 times qty will be punched"); } else { NewQty = 2*qty; _TRACE("Warning Mismatch in Trading Positions and Check Manually and Take necessary Action"); _TRACE("Open Positions Exist and Hence x2 times qty will be punched"); } PlaceOrder("B",NewQty); StaticVarSetText(static_name_+"buyCoverAlgo_barvalue",lasttime); StaticVarSet(static_name_+"buyCoverAlgo",1); //Algo Order was triggered, no more order on this bar } else if ((AlgoBuy != True OR AlgoCover != True)) { StaticVarSet(static_name_+"buyCoverAlgo",0); StaticVarSetText(static_name_+"buyCoverAlgo_barvalue",""); } if (AlgoBuy==True AND AlgoCover != True AND StaticVarGet(static_name_+"buyAlgo")==0 AND StaticVarGetText(static_name_+"buyAlgo_barvalue") != lasttime) { // Long Entry PlaceOrder("B",qty); StaticVarSetText(static_name_+"buyAlgo_barvalue",lasttime); StaticVarSet(static_name_+"buyAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoBuy != True) { StaticVarSet(static_name_+"buyAlgo",0); StaticVarSetText(static_name_+"buyAlgo_barvalue",""); } if (AlgoSell==true AND AlgoShort != True AND StaticVarGet(static_name_+"sellAlgo")==0 AND StaticVarGetText(static_name_+"sellAlgo_barvalue") != lasttime) { // Long Exit OpenPos = NetOpenPositions(); if(OpenPos == qty) { //If positive open positions are there only then exit the longs PlaceOrder("S",qty); } else if(OpenPos != 0 AND OpenPos != qty) { PlaceOrder("S",qty); _TRACE("Mismatch in Qty : Exit Order is Placed. Kindly check the positions and take necssary action"); } else { _TRACE("Warning : No Open Long Positions Exits and Hence No Sell Order is Placed to Exit the Long Position"); _TRACE("Kindly check the positions and take necssary action"); } StaticVarSetText(static_name_+"sellAlgo_barvalue",lasttime); StaticVarSet(static_name_+"sellAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoSell != True ) { StaticVarSet(static_name_+"sellAlgo",0); StaticVarSetText(static_name_+"sellAlgo_barvalue",""); } if (AlgoShort==True AND AlgoSell==True AND StaticVarGet(static_name_+"ShortSellAlgo")==0 AND StaticVarGetText(static_name_+"ShortSellAlgo_barvalue") != lasttime) { // reverse Short Entry OpenPos = NetOpenPositions(); if(OpenPos==0) { //If no open position send only x1 times of qty NewQty = qty; _TRACE("No Open Positions Exist and Hence x1 times qty will be punched"); } else if(OpenPos == qty) { //if already short positions are running send x2 times of qty NewQty = 2*qty; _TRACE("Open Positions Exist and Hence x2 times qty will be punched"); } else { NewQty = 2*qty; _TRACE("Warning Mismatch in Trading Positions and Check Manually and Take necessary Action"); _TRACE("Open Positions Exist and Hence x2 times qty will be punched"); } PlaceOrder("S",NewQty); StaticVarSetText(static_name_+"ShortsellAlgo_barvalue",lasttime); StaticVarSet(static_name_+"ShortSellAlgo",1); //Algo Order was triggered, no more order on this bar } else if ((AlgoShort != True OR AlgoSell != True)) { StaticVarSet(static_name_+"ShortSellAlgo",0); StaticVarSetText(static_name_+"ShortsellAlgo_barvalue",""); } if (AlgoShort==True AND AlgoSell != True AND StaticVarGet(static_name_+"ShortAlgo")==0 AND StaticVarGetText(static_name_+"ShortAlgo_barvalue") != lasttime) { // Short Entry PlaceOrder("S",qty); StaticVarSetText(static_name_+"ShortAlgo_barvalue",lasttime); StaticVarSet(static_name_+"ShortAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoShort != True ) { StaticVarSet(static_name_+"ShortAlgo",0); StaticVarSetText(static_name_+"ShortAlgo_barvalue",""); } if (AlgoCover==true AND AlgoBuy != True AND StaticVarGet(static_name_+"CoverAlgo")==0 AND StaticVarGetText(static_name_+"CoverAlgo_barvalue") != lasttime) { // Short Exit OpenPos = NetOpenPositions(); if(OpenPos == -qty) { //If negative open positions are there only then exit the shorts PlaceOrder("B",qty); } else if(OpenPos != 0 AND OpenPos != -qty) { PlaceOrder("B",qty); _TRACE("Mismatch in Qty : Exit Order is Placed. Kindly check the positions and take necssary action"); } else { _TRACE("Warning : No Open Long Positions Exits and Hence No Cover Order is Placed to Exit the Short Position"); _TRACE("Kindly check the positions and take necssary action"); } StaticVarSetText(static_name_+"CoverAlgo_barvalue",lasttime); StaticVarSet(static_name_+"CoverAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoCover != True ) { StaticVarSet(static_name_+"CoverAlgo",0); StaticVarSetText(static_name_+"CoverAlgo_barvalue",""); } } else if(EnableAlgo == "LongOnly") { if (AlgoBuy==True AND StaticVarGet(static_name_+"buyAlgo")==0 AND StaticVarGetText(static_name_+"buyAlgo_barvalue") != lasttime) { // Long Entry PlaceOrder("B",qty); StaticVarSetText(static_name_+"buyAlgo_barvalue",lasttime); StaticVarSet(static_name_+"buyAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoBuy != True) { StaticVarSet(static_name_+"buyAlgo",0); StaticVarSetText(static_name_+"buyAlgo_barvalue",""); } if (AlgoSell==true AND StaticVarGet(static_name_+"sellAlgo")==0 AND StaticVarGetText(static_name_+"sellAlgo_barvalue") != lasttime) { // Long Exit OpenPos = NetOpenPositions(); if(OpenPos == qty) { //If positive open positions are there only then exit the longs PlaceOrder("S",qty); } else if(OpenPos != 0 AND OpenPos != qty) { PlaceOrder("S",qty); _TRACE("Mismatch in Qty : Exit Order is Placed. Kindly check the positions and take necssary action"); } else { _TRACE("Warning : No Open Long Positions Exits and Hence No Sell Order is Placed to Exit the Long Position"); _TRACE("Kindly check the positions and take necssary action"); } StaticVarSetText(static_name_+"sellAlgo_barvalue",lasttime); StaticVarSet(static_name_+"sellAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoSell != True ) { StaticVarSet(static_name_+"sellAlgo",0); StaticVarSetText(static_name_+"sellAlgo_barvalue",""); } } else if(EnableAlgo == "ShortOnly") { if (AlgoShort==True AND StaticVarGet(static_name_+"ShortAlgo")==0 AND StaticVarGetText(static_name_+"ShortAlgo_barvalue") != lasttime) { // Short Entry PlaceOrder("S",qty); StaticVarSetText(static_name_+"ShortAlgo_barvalue",lasttime); StaticVarSet(static_name_+"ShortAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoShort != True ) { StaticVarSet(static_name_+"ShortAlgo",0); StaticVarSetText(static_name_+"ShortAlgo_barvalue",""); } if (AlgoCover==true AND StaticVarGet(static_name_+"CoverAlgo")==0 AND StaticVarGetText(static_name_+"CoverAlgo_barvalue") != lasttime) { // Short Exit OpenPos = NetOpenPositions(); if(OpenPos == -qty) { //If negative open positions are there only then exit the shorts PlaceOrder("B",qty); } else if(OpenPos != 0 AND OpenPos != -qty) { PlaceOrder("B",qty); _TRACE("Mismatch in Qty : Exit Order is Placed. Kindly check the positions and take necssary action"); } else { _TRACE("Warning : No Open Long Positions Exits and Hence No Cover Order is Placed to Exit the Short Position"); _TRACE("Kindly check the positions and take necssary action"); } StaticVarSetText(static_name_+"CoverAlgo_barvalue",lasttime); StaticVarSet(static_name_+"CoverAlgo",1); //Algo Order was triggered, no more order on this bar } else if (AlgoCover != True) { StaticVarSet(static_name_+"CoverAlgo",0); StaticVarSetText(static_name_+"CoverAlgo_barvalue",""); } } } _SECTION_END();