Package: py5paisa
5paisa Python SDKPython SDK for 5paisa APIs natively written in VB .NETDocumentationRead the docs hostedhereFeaturesOrder placement, modification and cancellationFetching user info including holdings, positions, margin and order book.Fetching live market streaming.Placing, modifying and deleting Bracket Order.Fetching order status and trade information.Getting live data streaming using websockets.Installationpip install py5paisaUsageConfiguring API keysGet your API keys fromhttps://tradestation.5paisa.com/apidocNote:- We have deprecated the existing method which involved the use of login credentials.
Kindly go through this updated documentation of using Access token for API Access.Scrip codes reference:Note : Use these Links for getting scrip codesScrip Master - Downaload ScripMasterhereAUTHENTICATION USING OAUTHfrompy5paisaimportFivePaisaClientcred={"APP_NAME":"YOUR APP_NAME","APP_SOURCE":"YOUR APP_SOURCE","USER_ID":"YOUR USER_ID","PASSWORD":"YOUR PASSWORD","USER_KEY":"YOUR USERKEY","ENCRYPTION_KEY":"YOUR ENCRYPTION_KEY"}#This function will automatically take care of generating and sending access token for all your API'sclient=FivePaisaClient(cred=cred)# New TOTP based authenticationclient.get_totp_session('Your ClientCode','TOTP from authenticator app','Your Pin')# OAUTH Approach# First get a token by logging in to -> https://dev-openapi.5paisa.com/WebVendorLogin/VLogin/Index?VendorKey=<Your Vendor Key>&ResponseURL=<Redirect URL># VendorKey is UesrKey for individuals user# for e.g. you can use ResponseURL as https://www.5paisa.com/technology/developer-apis# Pass the token received in the response url after successful login to get an access token (this also sets the token for all the APIs you use)-# Please note that you need to copy the request token from URL and paste in this code and start the code within 30s.client.get_oauth_session('Your Response Token')Aftersuccessfulauthentication,youshouldgeta`Loggedin!!`messageinconsoleMarket Feed#NOTE : ScripData and ScripCode you can find from new Scripmaster as mentioned abovereq_list_=[{"Exch":"N","ExchType":"C","ScripData":"ITC_EQ"}]{"Exch":"N","ExchType":"C","ScripCode":"2885"}]print(client.fetch_market_feed_scrip(req_list_))Market Statusprint(client.get_market_status())Fetching user info# Fetches holdingsclient.holdings()# Fetches marginclient.margin()# Fetches positionsclient.positions()# Fetches the order book of the clientclient.order_book()# Fetches Trade bookclient.get_tradebook()Position Conversion# Convert positions# client.position_convertion(<Exchange>,<Exchange Type>,<Scrip Name>,<Buy/Sell>,<Qty>,<From Delivery/Intraday>,<From Delivery/Intraday>)client.position_convertion("N","C","BPCL_EQ","B",5,"D","I")Placing an order# Note: This is an indicative order.frompy5paisa.orderimportOrder,OrderType,Exchange#You can pass scripdata either you can pass scripcode also.# please use price = 0 for market Order#use IsIntraday= true for intraday orders#Using Scrip Data :-#Using Scrip Code :-client.place_order(OrderType='B',Exchange='N',ExchangeType='C',ScripCode=1660,Qty=1,Price=260)#Sample For SL order (for order to be treated as SL order just pass StopLossPrice)client.place_order(OrderType='B',Exchange='N',ExchangeType='C',ScripCode=1660,Qty=1,Price=350,IsIntraday=False,StopLossPrice=345)#Derivative Orderclient.place_order(OrderType='B',Exchange='N',ExchangeType='D',ScripCode=57633,Qty=50,Price=1.5)Pleasereferbelowdocumentationlinkforparamaterstobepassedincleint.place_orderfunctionhttps://www.5paisa.com/developerapi/order-request-place-orderPlacing offline orders (After Market Orders)By default all orders are normal orders, passAHPlaced=Yto place offline orders.client.place_order(OrderType='B',Exchange='N',ExchangeType='C',ScripCode=1660,Qty=1,Price=325,AHPlaced="Y")Modifying an orderclient.modify_order(ExchOrderID="1100000017861430",Qty=2,Price=261)Cancelling an orderclient.cancel_order(exch_order_id="1100000017795041")cancel_bulk=[{"ExchOrderID":"<Exchange Order ID 1>"},{"ExchOrderID":"<Exchange Order ID 2>"},client.cancel_bulk_order(cancel_bulk)Order Margin Calculationclient.Order_margin(Exch="N",ExchType="C",OrderRequestorCode="51959929",ScripCode="1660",PlaceModifyCancel="P",TransactionType="B",AtMarket="Y",LimitRate=0,Volume=5,OldTradedQty=0,ProductType="D",ExchOrderId="0",CoverPositions="N")SquareOffAll Ordersclient.squareoff_all()Bracket OrderFor placing Braket orderclient.bo_order(OrderType='B',Exchange='N',ExchangeType='C',ScripCode=1660,Qty=1,LimitPrice=330,TargetPrice=345,StopLossPrice=320,LimitPriceForSL=319,TrailingSL=1.5)For placing Cover orderclient.cover_order(OrderType='B',Exchange='N',ExchangeType='C',ScripCode=1660,Qty=1,LimitPrice=330,StopLossPrice=320,TrailingSL=1.5)Note:For placing Bracket order in FNO segment pass ExchType='D'For Modifying Bracket/Cover Order only for Initial order (entry)client.modify_bo_order(ExchOrderID="1100000017861430",LimitPrice=330)client.modify_cover_order(ExchOrderID="1100000017861430",LimitPrice=330)#Note : For cover order just pass LimitPriceProfitOrder equal to Zero.For Modifying LimitPriceProfitOrderclient.modify_bo_order(ExchOrderID="1100000017861430",TargetPrice=330)client.modify_cover_order(ExchOrderID="1100000017861430",TargetPrice=330)For Modifying TriggerPriceForSLclient.modify_bo_order(ExchOrderID="1100000017861430",LimitPriceForSL=330)client.modify_bo_order(ExchOrderID="1100000017861430",LimitPriceForSL=330)#Note : You have pass atmarket=true while modifying stoploss price, Pass ExchorderId for the particular leg to modify.Basket Orders# Create a new Basketclient.create_basket("<New Basket Name>")# Rename existing basketclient.rename_basket("<Modified Basket Name>",<ExisitingBasketID>)# Clone existing basketclient.clone_basket(<ExisitingBasketID>)# Delete bulk basketsdelete_basket_list=[{"BasketID":"<Exisiting Basket ID>"},{"BasketID":"<Exisiting Basket ID>"}]client.delete_basket(delete_basket_list)# Get list of all baskets (Open/Closed)client.get_basket()basket_list=[{"BasketID":"<Exisiting Basket ID>"},{"BasketID":"<Exisiting Basket ID>"}]order_to_basket=Basket_order("N","C",23000,"BUY",1,"1660","I")client.add_basket_order(order_to_basket,basket_list)# Get orders in basketclient.get_order_in_basket(<ExisitingBasketID>)Fetching Order Status and Trade Informationfrompy5paisa.orderimportExchangereq_list=[{"Exch":"N","ExchType":"C","ScripCode":20374,"ExchOrderID":"1000000015310807"}]# Fetches the trade detailsclient.fetch_trade_info(req_list)req_list_=[{"Exch":"N","RemoteOrderID":"90980441"}]# Fetches the order statusclient.fetch_order_status(req_list_)# Fetch Trade Historyprint(client.get_trade_history("PASS EXCHANGE ORDER ID"))Live Market Feed Streamingreq_list=[{"Exch":"N","ExchType":"C","ScripCode":1660},]req_data=client.Request_Feed('mf','s',req_list)defon_message(ws,message):print(message)client.connect(req_data)client.receive_data(on_message)Note: Use the following abbreviations :Market Feed=mfMarket Depth (upto 5)=mdIndices (Spot Feed) =iOpen Interest=oiSubscribe= sUnsubscribe=uLive Market Depth Streaming (Depth 20)a={"method":"subscribe","operation":"20depth","instruments":["NC2885"]}print(client.socket_20_depth(a))defon_message(ws,message):print(message)client.receive_data(on_message)Note:-Instrumentsinpayloadaboveisalist(array)informatas<exchange><exchangetype><scripcode>Level 5 Market Depthprint(client.fetch_market_depth_by_scrip(Exchange="N",ExchangeType="C",ScripCode="1660"))print(client.fetch_market_depth_by_scrip(Exchange="N",ExchangeType="C",ScripData="RELIANCE_EQ"))Full Market Snapshota=[{"Exchange":"N","ExchangeType":"C","ScripCode":"2885"},{"Exchange":"N","ExchangeType":"C","ScripCode":"1660"},]print(client.fetch_market_depth(a))Full Market Snapshot(By Symbol)a=[{"Exchange":"N","ExchangeType":"C","Symbol":"ITC"},{"Exchange":"N","ExchangeType":"D","Symbol":"BANKNIFTY 31 Feb 2022 CE 41600.00"},]print(client.fetch_market_depth_by_symbol(a))Option Chainclient.get_expiry("N","NIFTY")# Returns list of all active expiries# client.get_option_chain("N","NIFTY",<Pass expiry timestamp from get_expiry response>)client.get_option_chain("N","NIFTY",1647507600000)Historical Data#historical_data(<Exchange>,<Exchange Type>,<Scrip Code>,<Time Frame>,<From Data>,<To Date>)df=client.historical_data('N','C',1660,'15m','2021-05-25','2021-06-16')print(df)# Note : TimeFrame Should be from this list ['1m','5m','10m','15m','30m','60m','1d']VTT# Create VTT OrderInitialTriggerPrice-TriggerpriceofvttOrderInitialLimitPrice-LimitpriceofvttorderMatchingCondition-GT/LTGT=WhenTriggerPriceisgreaterthanLTPofstockputGL.LT=WhenTriggerPriceislessthanLTPofstockputLT.ProfitandSLLeglimitandtriggerpricefieldsInitialTriggerPrice,StopLossTriggerPrice,ProfitLimitPrice,ProfitTriggerPriceclient.vtt_order('P',Exch="N",ExchType="C",ScripCode=1660,InitialLimitPrice=490,StopLossLimitPrice=0.0,InitialTriggerPrice=489,StopLossTriggerPrice=0.0,ProfitLimitPrice=0.0,ProfitTriggerPrice=0.0,Quantity=1,BuySell="Buy",MatchingCondition="GT",Symbol="ITC")#modify VTT Orderclient.vtt_order('M',VTTOrderId=3121,InitialLimitPrice=0.0,StopLossLimitPrice=0.0,InitialTriggerPrice=337,StopLossTriggerPrice=0.0,ProfitLimitPrice=0.0,ProfitTriggerPrice=0.0,MatchingCondition="GT",Qty=1)#cancel VTT Orderclient.vtt_order('C',VTTOrderId=3121)#get all VTT Ordersclient.vtt_order('G')Strategy ExecutionList Of Strategies AvailableShort StraddleShort StrangleLong StraddleLong StrangleIron Fly(Butterfly)Iron CondorCall Calendar SpreadPut Calendar SpreadCall LadderPut LadderLadder#Import strategy packagefrompy5paisa.strategyimport*Note: These single-commands are capable of trading multiple legs of pre-defined strategies.
Like :- Short/Long Straddles and Strangles, Iron Fly and Iron Condor (many more to come)
Please use these at your own risk.#Create an Object:-cred={"APP_NAME":"YOUR APP_NAME","APP_SOURCE":YOURAPP_SOURCE,"USER_ID":"YOUR USER_ID","PASSWORD":"YOUR PASSWORD","USER_KEY":"YOUR USERKEY","ENCRYPTION_KEY":"YOUR ENCRYPTION_KEY"}--Oldapproachstrategy=strategies(user="random_email@xyz.com",passw="password",dob="YYYYMMDD",cred=cred)--NewApproachstrategy=strategies(cred=cred,request_token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjUwMDUyNzcwIiwicm9sZSI6ImdpUUlvYXR5R2NYQUR3eFYwNXVXSGlPVzJRT1dOTGNzIiwibmJmIjoxNjY3ODMwODczLCJleHAiOjE2Njc4MzA5MDMsImlhdCI6MTY2NzgzMDg3M30.iP_FZtFy-nj6QeRd0sEhaKS-jr-wu-pCwtcdYCGPeO4")Use the following to execute the strategy (note:- they are executed at market price only)#short_straddle(<symbol>,<strike price>,<qty>,<expiry>,<Order Type>)strategy.short_straddle("banknifty",'37000','50','20210610','I',tag='<Your strategy Name>')#Using tag is optional#short_strangle(<symbol>,<List of sell strike price>,<qty>,<expiry>,<Order Type>)strategy.short_strangle("banknifty",['35300','37000'],'50','20210610','D')#long_straddle(<symbol>,<strike price>,<qty>,<expiry>,<Order Type>)strategy.long_straddle("banknifty",'37000','50','20210610','I',tag='<Your strategy Name>')#Using tag is optional#long_strangle(<symbol>,<List of sell strike price>,<qty>,<expiry>,<Order Type>)strategy.long_strangle("banknifty",['35300','37000'],'50','20210610','D')#iron_condor(<symbol>,<List of buy strike prices>,<List of sell strike price>,<qty>,<expiry>,<Order Type>)strategy.iron_condor("NIFTY",["15000","15200"],["15100","15150"],"75","20210603","I")#iron_fly(<symbol>,<List of buy strike prices>,<Sell strike price>,<qty>,<expiry>,<Order Type>)strategy.iron_fly("NIFTY",["15000","15200"],"15100","75","20210610","I",tag='<Your strategy Name>')#Using tag is optional#call_calendar(<symbol>,<List of sell strike price>,<qty>,<list of expiry(first one will be bought and the second sold based on expiry)>,<Order Type>)strategy.call_calendar("nifty",'15600','75',['20210603','20210610'],'I')#put_calendar(<symbol>,<List of sell strike price>,<qty>,<list of expiry(first one will be bought and the second sold based on expiry)>,<Order Type>)strategy.put_calendar("nifty",'15600','75',['20210603','20210610'],'I')#call_ladder(<symbol>,<Buy strike prices>,<List of Sell strike price>,<qty>,<expiry>,<Order Type>)strategy.call_ladder("NIFTY","15100",["15300","15400"],"75","20210610","I")#put_ladder(<symbol>,<Buy strike prices>,<List of Sell strike price>,<qty>,<expiry>,<Order Type>)strategy.put_ladder("NIFTY","15000",["14800","14500"],"75","20210610","I",tag='<Your strategy Name>')#Using tag is optional#ladder(<symbol>,<List of Buy strike prices>,<List of Sell strike price>,<qty>,<expiry>,<Order Type>)strategy.ladder("sbin",["400","420"],["350","370","450","500"],"1500","20210729","D")SquareoffastrategyUsingtagsstrategy.squareoff('tag')# Use the same tag as used while executing the strategiesTODOWrite tests.CreditsThis package was created withCookiecutterand theaudreyr/cookiecutter-pypackageproject template.