Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
40e8c0d
added gitignore file
Sep 30, 2022
b999de9
updated gitignore
Sep 30, 2022
cfa15aa
Merge branch 'main' of https://github.com/angel-one/smartapi-python
Sep 30, 2022
0d84f39
Update README.md
moizm89 Sep 30, 2022
81536b2
Added totp change
Sep 30, 2022
a564ca5
Added sample file with totp
Sep 30, 2022
071d50e
Merge pull request #2 from angel-one/totp-change
Sep 30, 2022
a6fe639
Updated Readme with new totp provision
Sep 30, 2022
5928f10
Save feedtoken during generate session
Nov 16, 2022
2a66b84
Update version.py
rohitendras Jan 18, 2023
7413abb
Merge pull request #4 from rohitendras/patch-1
moizm89 Apr 27, 2023
82a24d9
Merge pull request #3 from builder35abhishek/main
moizm89 Apr 27, 2023
243a563
Add files via upload
rimagiri Jun 5, 2023
87ca481
Update smartWebSocketV2.py
rimagiri Jun 6, 2023
85cc9ad
Update smartWebSocketV2.py
rimagiri Jun 8, 2023
9a49cfa
Update smartWebSocketV2.py
rimagiri Jun 8, 2023
6e8958c
Update smartWebSocketV2.py
rimagiri Jun 22, 2023
6322b08
Update smartConnect.py
rimagiri Jun 28, 2023
8a22a73
Update smartConnect.py
rimagiri Jun 28, 2023
0c0a788
Update sample.py
rimagiri Jun 28, 2023
a5734f9
Add files via upload
rimagiri Jun 28, 2023
deed858
Update test.py
rimagiri Jun 28, 2023
2cba8c7
Update setup.py
rimagiri Jun 28, 2023
c5bb22e
Update requirements_dev.txt
rimagiri Jun 28, 2023
cb42b5c
Update README.md
rimagiri Jun 28, 2023
73dbe88
Update smartConnect.py
rimagiri Jun 28, 2023
710bca6
Update README.md
rimagiri Jun 28, 2023
638d457
Update __init__.py
rimagiri Jun 28, 2023
42815a4
Update README.md
Jun 28, 2023
5597275
Update README.md
rimagiri Jun 29, 2023
5d581c6
Test
rimagiri1 Jun 29, 2023
4072268
conflict resolve
rimagiri Jun 29, 2023
27f5b27
Update README.md
rimagiri Jun 30, 2023
7af07ac
Update README.md
rimagiri Jun 30, 2023
007996f
Update smartConnect.py
rimagiri Jun 30, 2023
dbb515f
Update sample.py
rimagiri Jun 30, 2023
ffd38dd
Add files via upload
rimagiri Jul 6, 2023
ab79979
Delete test_sss-8.py
rimagiri Jul 6, 2023
b965328
Add files via upload
rimagiri Jul 6, 2023
4a9156e
Update setup.py
rimagiri Jul 6, 2023
2efc381
Update requirements_dev.txt
rimagiri Jul 6, 2023
f1d9d92
Delete test_sss-8.py
rimagiri Jul 6, 2023
210539b
Add files via upload
rimagiri Jul 6, 2023
b29cc7e
Delete test_sss-8.py
rimagiri Jul 6, 2023
6b04e26
Add files via upload
rimagiri Jul 6, 2023
839501e
Delete test_sss-8.py
rimagiri Jul 6, 2023
12eb2a3
Add files via upload
rimagiri Jul 6, 2023
418b88e
Update requirements_dev.txt
rimagiri Jul 11, 2023
f0329d6
Update setup.py
rimagiri Jul 11, 2023
f084a24
Delete test_sss-8.py
rimagiri Jul 12, 2023
65f2706
Update test.py
rimagiri Jul 12, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@

.pypirc
.pypirc
*.xml
.idea/smartapi-python.iml
build/*
smartapi_python.egg-info
dist/*
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

203 changes: 201 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,202 @@
# Migrated to New Github Repo https://github.com/angel-one/smartapi-python
For latest updates and bug fixes please refer to the new git repo.
# SMARTAPI-PYTHON

SMARTAPI-PYTHON is a Python library for interacting with Angel's Trading platform ,that is a set of REST-like HTTP APIs that expose many capabilities required to build stock market investment and trading platforms. It lets you execute orders in real time..


## Installation

Use the package manager [pip](https://pip.pypa.io/en/stable/) to install smartapi-python.

```bash
pip install -r requirements_dev.txt # for downloading the other required packages
pip install smartapi-python
pip install websocket-client
```

## Usage

```python
# package import statement
from SmartApi import SmartConnect #or from SmartApi.smartConnect import SmartConnect
import pyotp

api_key = 'Your Api Key'
clientId = 'Your Client Id'
pwd = 'Your Pin'
smartApi = SmartConnect(api_key)
token = "Your QR code value"
totp=pyotp.TOTP(token).now()
correlation_id = "abc123"

# login api call

data = smartApi.generateSession(clientId, pwd, totp)
# print(data)
authToken = data['data']['jwtToken']
refreshToken = data['data']['refreshToken']

# fetch the feedtoken
feedToken = smartApi.getfeedToken()

# fetch User Profile
res = smartApi.getProfile(refreshToken)
smartApi.generateToken(refreshToken)
res=res['data']['exchanges']

#place order
try:
orderparams = {
"variety": "NORMAL",
"tradingsymbol": "SBIN-EQ",
"symboltoken": "3045",
"transactiontype": "BUY",
"exchange": "NSE",
"ordertype": "LIMIT",
"producttype": "INTRADAY",
"duration": "DAY",
"price": "19500",
"squareoff": "0",
"stoploss": "0",
"quantity": "1"
}
orderId=smartApi.placeOrder(orderparams)
print("The order id is: {}".format(orderId))
except Exception as e:
print("Order placement failed: {}".format(e.message))
#gtt rule creation
try:
gttCreateParams={
"tradingsymbol" : "SBIN-EQ",
"symboltoken" : "3045",
"exchange" : "NSE",
"producttype" : "MARGIN",
"transactiontype" : "BUY",
"price" : 100000,
"qty" : 10,
"disclosedqty": 10,
"triggerprice" : 200000,
"timeperiod" : 365
}
rule_id=smartApi.gttCreateRule(gttCreateParams)
print("The GTT rule id is: {}".format(rule_id))
except Exception as e:
print("GTT Rule creation failed: {}".format(e.message))

#gtt rule list
try:
status=["FORALL"] #should be a list
page=1
count=10
lists=smartApi.gttLists(status,page,count)
except Exception as e:
print("GTT Rule List failed: {}".format(e.message))

#Historic api
try:
historicParam={
"exchange": "NSE",
"symboltoken": "3045",
"interval": "ONE_MINUTE",
"fromdate": "2021-02-08 09:00",
"todate": "2021-02-08 09:16"
}
smartApi.getCandleData(historicParam)
except Exception as e:
print("Historic Api failed: {}".format(e.message))
#logout
try:
logout=smartApi.terminateSession('Your Client Id')
print("Logout Successfull")
except Exception as e:
print("Logout failed: {}".format(e.message))

```


## Getting started with SmartAPI Websocket's

```python

from SmartApi import SmartWebSocket

# feed_token=092017047
FEED_TOKEN="YOUR_FEED_TOKEN"
CLIENT_CODE="YOUR_CLIENT_CODE"
# token="mcx_fo|224395"
token="EXCHANGE|TOKEN_SYMBOL" #SAMPLE: nse_cm|2885&nse_cm|1594&nse_cm|11536&nse_cm|3045
# token="mcx_fo|226745&mcx_fo|220822&mcx_fo|227182&mcx_fo|221599"
task="mw" # mw|sfi|dp

ss = SmartWebSocket(FEED_TOKEN, CLIENT_CODE)

def on_message(ws, message):
print("Ticks: {}".format(message))

def on_open(ws):
print("on open")
ss.subscribe(task,token)

def on_error(ws, error):
print(error)

def on_close(ws):
print("Close")

# Assign the callbacks.
ss._on_open = on_open
ss._on_message = on_message
ss._on_error = on_error
ss._on_close = on_close

ss.connect()


####### Websocket sample code ended here #######

####### Websocket V2 sample code #######

from SmartApi.smartWebSocketV2 import SmartWebSocketV2
from logzero import logger

AUTH_TOKEN = "Your Auth_Token"
API_KEY = "Your Api_Key"
CLIENT_CODE = "Your Client Code"
FEED_TOKEN = "Your Feed_Token"
correlation_id = "abc123"
action = 1
mode = 1
token_list = [
{
"exchangeType": 1,
"tokens": ["26009"]
}
]
sws = SmartWebSocketV2(AUTH_TOKEN, API_KEY, CLIENT_CODE, FEED_TOKEN)

def on_data(wsapp, message):
logger.info("Ticks: {}".format(message))
# close_connection()

def on_open(wsapp):
logger.info("on open")
sws.subscribe(correlation_id, mode, token_list)

def on_error(wsapp, error):
logger.error(error)

def on_close(wsapp):
logger.info("Close")

def close_connection():
sws.close_connection()


# Assign the callbacks.
sws.on_open = on_open
sws.on_data = on_data
sws.on_error = on_error
sws.on_close = on_close

sws.connect()

```
6 changes: 3 additions & 3 deletions SmartApi/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from __future__ import unicode_literals,absolute_import

from smartapi.smartConnect import SmartConnect
# from smartapi.webSocket import WebSocket
from smartapi.smartApiWebsocket import SmartWebSocket
from SmartApi.smartConnect import SmartConnect
# from SmartApi.webSocket import WebSocket
from SmartApi.smartApiWebsocket import SmartWebSocket

__all__ = ["SmartConnect","SmartWebSocket"]

Expand Down
33 changes: 14 additions & 19 deletions SmartApi/smartConnect.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
from six.moves.urllib.parse import urljoin
import sys
import csv
import json
import dateutil.parser
import hashlib
import logging
import datetime
import smartapi.smartExceptions as ex
import SmartApi.smartExceptions as ex
import requests
from requests import get
import re, uuid
import socket
import platform
from smartapi.version import __version__, __title__
from SmartApi.version import __version__, __title__

log = logging.getLogger(__name__)
#user_sys=platform.system()
Expand Down Expand Up @@ -222,30 +216,31 @@ def _getRequest(self, route, params=None):
"""Alias for sending a GET request."""
return self._request(route, "GET", params)

def generateSession(self,clientCode,password):
def generateSession(self,clientCode,password,totp):

params={"clientcode":clientCode,"password":password}
params={"clientcode":clientCode,"password":password,"totp":totp}
loginResultObject=self._postRequest("api.login",params)

if loginResultObject['status']==True:
jwtToken=loginResultObject['data']['jwtToken']
self.setAccessToken(jwtToken)
refreshToken=loginResultObject['data']['refreshToken']
feedToken=loginResultObject['data']['feedToken']
refreshToken = loginResultObject['data']['refreshToken']
feedToken = loginResultObject['data']['feedToken']
self.setRefreshToken(refreshToken)
self.setFeedToken(feedToken)
user=self.getProfile(refreshToken)
id=user['data']['clientcode']
#id='D88311'
user = self.getProfile(refreshToken)

id = user['data']['clientcode']
# id='D88311'
self.setUserId(id)
user['data']['jwtToken']="Bearer "+jwtToken
user['data']['refreshToken']=refreshToken
user['data']['jwtToken'] = "Bearer " + jwtToken
user['data']['refreshToken'] = refreshToken
user['data']['feedToken'] = feedToken


return user
else:
return loginResultObject

def terminateSession(self,clientCode):
logoutResponseObject=self._postRequest("api.logout",{"clientcode":clientCode})
return logoutResponseObject
Expand Down
Loading