/* Algomojo - Smart Spot/Futures to Options Trading Module with Split Order Controls Created on : 07 MAR 2023. Website : www.algomojo.com */ _SECTION_BEGIN("Algomojo - Broker Controls"); // Send orders even if Amibroker is minimized or Chart is not active RequestTimedRefresh(1, False); EnableTextOutput(False); //Creating Input Controls for Setting Order Related Information broker =Paramlist("Broker","an|ab|fs|fy|fv|fp|gc|pt|sm|tc|up|zb|ze",0); ver = ParamStr("API Version ","v1"); apikey = ParamStr("apikey","xxxxxxxxxxxxxxxxxx"); //Enter your API key here apisecret = ParamStr("secretkey","xxxxxxxxxxxxxxxxxx"); //Enter your API secret key here _SECTION_END(); _SECTION_BEGIN("Algomojo - Order Controls"); strategy = ParamStr("Strategy Name", "Test Strategy"); spot = Paramlist("Spot Symbol","NIFTY|BANKNIFTY|FINNIFTY"); expiry = ParamStr("Expiry Date","29MAR23"); exchange = ParamList("Exchange","NFO|MCX",0); Symbol = ParamStr("Underlying Symbol","NIFTY-I.NFO"); iInterval= Param("Strike Interval",50,1,10000,1); StrikeCalculation = Paramlist("Strike Calculation","PREVOPEN|PREVCLOSE|TODAYSOPEN",0); LotSize = Param("Lot Size",50,1,10000,1); offsetCE = Param("CE Offset",0,-40,40,1); offsetPE = Param("PE Offset",0,-40,40,1); pricetype = ParamList("Order Type","MARKET",0); product = ParamList("Product","MIS|NRML",1); tradetype = ParamList("Option Trade Type","BUY|SELL",0); quantity = Param("quanity(Lot Size)",1,0,10000)*LotSize; price = 0; disclosed_quantity = 0; trigger_price = 0; amo = "NO"; splitorder = ParamList("To Split Orders","NO|YES",0); split_quantity = Param("Split Quantity",500,1,100000,1); VoiceAlert = ParamList("Voice Alert","Disable|Enable",1); Entrydelay = Param("Entry Delay",0,0,1,1); Exitdelay = Param("Exit Delay",0,0,1,1); EnableAlgo = ParamList("AlgoStatus","Disable|Enable|LongOnly|ShortOnly",0); resp = ""; //Static Variables for Order protection static_name_ = Name()+GetChartID()+interval(2)+strategy; static_name_algo = Name()+GetChartID()+interval(2)+strategy+"algostatus"; AlgoBuy = lastvalue(Ref(Buy,-Entrydelay)); AlgoSell = lastvalue(Ref(Sell,-Exitdelay)); AlgoShort = lastvalue(Ref(Short,-Entrydelay)); AlgoCover = lastvalue(Ref(Cover,-Exitdelay)); //Plots Dashboard GfxSelectFont( "BOOK ANTIQUA", 14, 100 ); GfxSetBkMode( 1 ); if (EnableAlgo != "") { AlgoStatus = EnableAlgo; GfxSetTextColor( IIf(EnableAlgo == "Enable", colorGreen, IIf(EnableAlgo == "LongOnly",colorYellow, IIf(EnableAlgo == "ShortOnly",colorOrange,colorRed)) )); GfxTextOut( "Algostatus : "+AlgoStatus , 20, 40); StaticVarSet(static_name_algo, IIf(EnableAlgo == "Enable", 1, IIf(EnableAlgo == "LongOnly", 2, IIf(EnableAlgo == "ShortOnly", 3, 0)))); _TRACE("Algo Status : "+EnableAlgo); } //optionCEtype = WriteIf(offsetCE == 0, "ATM CE", WriteIf(offsetCE<0,"ITM"+abs(offsetCE)+" CE","OTM"+abs(offsetCE)+" CE")); //optionPEtype = WriteIf(offsetPE == 0, "ATM PE", WriteIf(offsetPE<0,"ITM"+abs(offsetPE)+" PE","OTM"+abs(offsetPE)+" PE")); if(StrikeCalculation=="PREVOPEN") { SetForeign(Symbol); spotC = Ref(OPEN,-1); RestorePriceArrays(); } if(StrikeCalculation=="PREVCLOSE") { SetForeign(Symbol); spotC = Ref(Close,-1); RestorePriceArrays(); } if(StrikeCalculation=="TODAYSOPEN") { SetForeign(Symbol); spotC = TimeFrameGetPrice("O",inDaily); RestorePriceArrays(); } //Maintain Array to Store ATM Strikes for each and every bar strike = IIf(spotC % iInterval > iInterval/2, spotC - (spotC%iInterval) + iInterval, spotC - (spotC%iInterval)); //Entry Strikes strikeCE = strike + (offsetCE * iInterval); strikePE = strike - (offsetPE * iInterval); buycontinue = Flip(Buy,Sell); shortcontinue = Flip(Short,Cover); entrysym = ""; exitsym = ""; //Exit Strikes if(tradetype=="BUY") { ExitStrikeCE = ValueWhen(Ref(Buy,-Entrydelay),strikeCE); ExitStrikePE = ValueWhen(Ref(Short,-Entrydelay),strikePE); if(broker=="tc" OR broker=="fs" OR broker=="zb" OR broker=="fv" OR broker=="gc" OR broker=="ab" ) { entrysym = WriteIf(buycontinue OR sell,spot+expiry+"C"+strikeCE,WriteIf(shortcontinue OR cover,spot+expiry+"P"+strikePE,"")); exitsym = WriteIf(buycontinue OR sell,spot+expiry+"P"+ExitStrikePE,WriteIf(shortcontinue OR cover,spot+expiry+"C"+ExitStrikeCE,"")); } else { entrysym = WriteIf(buycontinue OR sell,spot+expiry+strikeCE+"CE",WriteIf(shortcontinue OR cover,spot+expiry+strikePE+"PE","")); exitsym = WriteIf(buycontinue OR sell,spot+expiry+ExitStrikePE+"PE",WriteIf(shortcontinue OR cover,spot+expiry+ExitStrikeCE+"CE","")); } } if(tradetype=="SELL") { ExitStrikeCE = ValueWhen(Ref(Short,-Entrydelay),strikeCE); ExitStrikePE = ValueWhen(Ref(Buy,-Entrydelay),strikePE); if(broker=="tc" OR broker =="fs") { entrysym = WriteIf(buycontinue OR sell,spot+expiry+"P"+strikePE,WriteIf(shortcontinue OR cover,spot+expiry+"C"+strikeCE,"")); exitsym = WriteIf(buycontinue OR sell,spot+expiry+"C"+ExitStrikeCE,WriteIf(shortcontinue OR cover,spot+expiry+"P"+ExitStrikePE,"")); } else { entrysym = WriteIf(buycontinue OR sell,spot+expiry+"P"+strikePE,WriteIf(shortcontinue OR cover,spot+expiry+"P"+strikeCE,"")); exitsym = WriteIf(buycontinue OR sell,spot+expiry+"C"+ExitStrikeCE,WriteIf(shortcontinue OR cover,spot+expiry+"C"+ExitStrikePE,"")); } } printf("\n\n\nEntry Symbol : "+entrysym); printf("\nExit Symbol : "+exitsym); _SECTION_END(); //Buy and Sell Order Functions function Placeorder(action,OptionType,orderqty) { algomojo=CreateObject("AMAMIBRIDGE.Main"); if(broker=="tc" OR broker=="fs" OR broker=="zb" OR broker=="fv" OR broker=="gc" ) { if(OptionType=="CE") OptType = "C"; if(OptionType=="PE") OptType = "P"; tradingsymbol = spot+expiry+OptType+VarGetText("strike"+OptionType); } else if(broker=="fp") { tradingsymbol = spot+expiry+OptType+VarGetText("strike"+OptionType)+".00"; } else { tradingsymbol = spot+expiry+VarGetText("strike"+OptionType)+OptionType; } api_data = "{ \"broker\": \""+broker+"\",\"strategy\":\""+strategy+"\",\"exchange\":\""+exchange+"\",\"symbol\":\""+tradingsymbol+"\",\"action\":\""+action+"\",\"product\":\""+product+"\",\"pricetype\":\""+pricetype+"\",\"quantity\":\""+orderqty+"\",\"price\":\""+price+"\",\"disclosed_quantity\":\""+disclosed_quantity+"\",\"trigger_price\":\""+trigger_price+"\",\"amo\":\""+amo+"\",\"splitorder\":\""+splitorder+"\",\"split_quantity\":\""+split_quantity+"\"}"; _TRACE("API Request"+api_data); resp=algomojo.AMDispatcher(apikey, apisecret,"PlaceOrder",api_data,"am",ver); _TRACE("API Response : "+resp); if(VoiceAlert == "Enable") Say( "Order Placed" ); } function ExitOrder(action,OptionType) { algomojo=CreateObject("AMAMIBRIDGE.Main"); if(broker=="tc" OR broker=="fs" OR broker=="zb" OR broker=="fv" OR broker=="gc" ) { if(OptionType=="CE") OptType = "C"; if(OptionType=="PE") OptType = "P"; tradingsymbol = spot+expiry+OptType+VarGetText("ExitStrike"+OptionType); } else if(broker=="fp") { tradingsymbol = spot+expiry+OptType+VarGetText("ExitStrike"+OptionType)+".00"; } else { tradingsymbol = spot+expiry+VarGetText("ExitStrike"+OptionType)+OptionType; } api_data = "{ \"broker\": \""+broker+"\",\"strategy\":\""+strategy+"\",\"exchange\":\""+exchange+"\",\"symbol\":\""+tradingsymbol+"\",\"action\":\""+action+"\",\"product\":\""+product+"\",\"pricetype\":\""+pricetype+"\",\"quantity\":\""+"0"+"\",\"price\":\""+price+"\",\"position_size\":\""+"0"+"\",\"disclosed_quantity\":\""+disclosed_quantity+"\",\"trigger_price\":\""+trigger_price+"\",\"amo\":\""+amo+"\",\"splitorder\":\""+splitorder+"\",\"split_quantity\":\""+split_quantity+"\"}"; _TRACE("Broker API Request"+api_data); resp=algomojo.AMDispatcher(apikey, apisecret,"PlaceSmartOrder",api_data,"am",ver); _TRACE("API Response : "+resp); if(VoiceAlert == "Enable") Say( "Order Placed" ); return resp; } 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 ) { if(tradetype=="BUY") { //Long Call and Exit Long Put Option ExitOrder("SELL","PE"); PlaceOrder("BUY","CE",quantity); } if(tradetype=="SELL") { //Short Put and Exit Short Call Option ExitOrder("BUY","CE"); PlaceOrder("SELL","PE",quantity); } 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) { if(tradetype=="BUY") { //Long Call and Exit Long Put Option PlaceOrder("BUY","CE",quantity); } if(tradetype=="SELL") { //Short Put PlaceOrder("SELL","PE",quantity); } 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) { if(tradetype=="BUY") { //Exit Long Call Option ExitOrder("SELL","CE"); } if(tradetype=="SELL") { //Exit Short Put Option ExitOrder("BUY","PE"); } 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) { if(tradetype=="BUY") { //Long Put and Exit Long Call Option ExitOrder("SELL","CE"); PlaceOrder("BUY","PE",quantity); } if(tradetype=="SELL") { //Short Call and Exit Short Put Option ExitOrder("BUY","PE"); PlaceOrder("SELL","CE",quantity); } 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) { if(tradetype=="BUY") { //Long Put PlaceOrder("BUY","PE",quantity); } if(tradetype=="SELL") { //Short Call PlaceOrder("SELL","CE",quantity); } 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) { if(tradetype=="BUY") { //Exit Long Put Option ExitOrder("SELL","PE"); } if(tradetype=="SELL") { //Exit Short Call Option ExitOrder("BUY","CE"); } 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) { if(tradetype=="BUY") { //Long Call and Exit Long Put Option PlaceOrder("BUY","CE",quantity); } if(tradetype=="SELL") { //Short Put PlaceOrder("SELL","PE",quantity); } 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) { if(tradetype=="BUY") { //Exit Long Call Option ExitOrder("SELL","CE"); } if(tradetype=="SELL") { //Exit Short Put Option ExitOrder("BUY","PE"); } StaticVarSet(static_name_+"sellAlgo",1); StaticVarSetText(static_name_+"sellAlgo_barvalue",lasttime); } 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) { if(tradetype=="BUY") { //Long Put PlaceOrder("BUY","PE",quantity); } if(tradetype=="SELL") { //Short Call PlaceOrder("SELL","CE",quantity); } 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) { if(tradetype=="BUY") { //Exit Long Put Option ExitOrder("SELL","PE"); } if(tradetype=="SELL") { //Exit Short Call Option ExitOrder("BUY","CE"); } 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();