Skip to main content

用于 SAS Online Alpha Trade Web 平台的 Python API

项目描述

用于 SAS Online Alpha Trade Web 平台的 Python API

注意:: 这是非官方的 python 模块,不要向 SAS 支持团队寻求帮助,按原样使用

用于与 SAS Online Alpha Trade Web 平台通信的 Python API。

Alpha Trade Python 库在 HTTPS API 上提供了一个易于使用的 Python 包装器。

HTTP 调用已转换为方法,JSON 响应被包装到 Python 兼容的对象中。

Websocket 连接在库中自动处理。

这项工作完全基于AliceBlueOnline的 Python SDK/API 。
谢克里希纳维鲁

安装

该模块通过 pip 安装:

pip install git+https://github.com/algo2t/alphatrade.git

也可以从pypi安装

pip install alphatrade

强制升级现有安装:

pip uninstall alphatrade
pip --no-cache-dir install --upgrade alphatrade

先决条件

Python 3.x

此外,您还需要以下模块:

  • protlib
  • websocket_client
  • requests
  • pandas

模块也可以安装使用pip

示例 - 从这里开始 - 重要

请克隆此存储库并检查示例文件夹以开始使用。在这里
检查

API 入门

概述

整个图书馆只有一个类:AlphaTrade. 创建对象时,来自 SAS Online alpha 交易服务器的访问令牌存储在同一目录中的AlphaTrade文本文件中。access_token.txt访问令牌的有效期为 24 小时。请参阅带有文件的示例文件夹config.py以了解如何存储您的凭据。使用访问令牌,您可以再次实例化 AlphaTrade 对象。理想情况下,您每天只需要创建一次 access_token。

REST 文档

此 SDK 所基于的原始 REST API 可在线获取。 Alice Blue API REST 文档

使用 API

日志记录

整个库都配备了pythonlogging的调试模块。如果需要更多调试信息,请使用以下代码启用日志记录。

import logging
logging.basicConfig(level=logging.DEBUG)

获取访问令牌

  1. 导入 alphatrade
from alphatrade import *
  1. 创建config.py文件
    始终将凭据保存在单独的文件中
login_id = "RR249"
password = "SAS@249"
twofa = "rr"

try:
    access_token = open('access_token.txt', 'r').read().rstrip()
except Exception as e:
    print('Exception occurred :: {}'.format(e))
    access_token = None
  1. 导入配置
import config

创建 AlphaTrade 对象

  1. 使用您的、和/或创建AlphaTrade对象。login_idpassword2FAaccess_token

使用对象config获取login_idpassword和。twofaaccess_token

 alphatrade 导入 AlphaTrade
import config
sas  =  AlphaTrade ( login_id = config.login_id , password = config.password , twofa = config.twofa , access_token = config.access_token ) _ _ _ _ _ _ _ _   
  1. 您可以在此处运行命令来检查您的连接性
print(sas.get_balance()) # get balance / margin limits
print(sas.get_profile()) # get profile
print(sas.get_daywise_positions()) # get daywise positions
print(sas.get_netwise_positions()) # get netwise positions
print(sas.get_holding_positions()) # get holding positions

获取主合约

获取主合约允许您按代码名称搜索工具并下订单。主合约按代币编号和符号名称存储为 OrderedDict。每当您获得交易更新、订单更新或报价更新时,该库都会检查是否加载了主合约。如果是,它会将仪器对象直接附加到更新。默认情况下,将下载您个人资料中所有已启用交易所的所有主合约。即,如果您的配置文件包含以下启用的交易所['NSE', 'BSE', 'CDS', 'MCX', NFO'],所有交易所的所有合约票据将默认下载。如果您觉得下载所有交易所需要太多时间,或者您不需要下载所有交易所,您可以在创建 AlphaTrade 对象时指定要下载合约票据的交易所。

sas = AlphaTrade(login_id=config.login_id, password=config.password, twofa=config.twofa, access_token=config.access_token, master_contracts_to_download=['NSE', 'BSE'])

这将减少 AlphaTrade 对象的对象创建时间几毫秒。

获取可交易的工具

可以通过多种方式检索符号。为交易所加载主合约后,您可以通过多种方式获得工具。

按名称获取单个乐器:

tatasteel_nse_eq = sas.get_instrument_by_symbol('NSE', 'TATASTEEL')
reliance_nse_eq = sas.get_instrument_by_symbol('NSE', 'RELIANCE')
ongc_bse_eq = sas.get_instrument_by_symbol('BSE', 'ONGC')
india_vix_nse_index = sas.get_instrument_by_symbol('NSE', 'India VIX')
sensex_nse_index = sas.get_instrument_by_symbol('BSE', 'SENSEX')

通过它的代币编号获取单一工具(通常仅对 BSE 股票有用):

ongc_bse_eq = sas.get_instrument_by_token('BSE', 500312)
reliance_bse_eq = sas.get_instrument_by_token('BSE', 500325)
acc_nse_eq = sas.get_instrument_by_token('NSE', 22)

通过提及到期、行使价和看涨期权或看跌期权,轻松获取 FNO 工具。

bn_fut = sas.get_instrument_for_fno(symbol = 'BANKNIFTY', expiry_date=datetime.date(2019, 6, 27), is_fut=True, strike=None, is_call = False)
bn_call = sas.get_instrument_for_fno(symbol = 'BANKNIFTY', expiry_date=datetime.date(2019, 6, 27), is_fut=False, strike=30000, is_call = True)
bn_put = sas.get_instrument_for_fno(symbol = 'BANKNIFTY', expiry_date=datetime.date(2019, 6, 27), is_fut=False, strike=30000, is_call = False)

搜索符号

通过匹配名称搜索多个仪器。这不区分大小写,并返回其符号中包含名称的所有工具。

all_sensex_scrips = sas.search_instruments('BSE', 'sEnSeX')
print(all_sensex_scrips)

上面的代码产生了多个符号,其符号中有“sensex”。

[Instrument(exchange='BSE', token=1, symbol='SENSEX', name='SENSEX', expiry=None, lot_size=None), Instrument(exchange='BSE', token=540154, symbol='IDFSENSEXE B', name='IDFC Mutual Fund', expiry=None, lot_size=None), Instrument(exchange='BSE', token=532985, symbol='KTKSENSEX B', name='KOTAK MAHINDRA MUTUAL FUND', expiry=None, lot_size=None), Instrument(exchange='BSE', token=538683, symbol='NETFSENSEX B', name='NIPPON INDIA ETF SENSEX', expiry=None, lot_size=None), Instrument(exchange='BSE', token=535276, symbol='SBISENSEX B', name='SBI MUTUAL FUND - SBI ETF SENS', expiry=None, lot_size=None)]

通过匹配多个名称搜索多个乐器

multiple_underlying = ['BANKNIFTY','NIFTY','INFY','BHEL']
all_scripts = sas.search_instruments('NFO', multiple_underlying)

仪器对象

仪器由仪器对象表示。这些是在获取主合同时创建的命名元组。它们在下订单和搜索工具时使用。仪器元组的结构如下:

Instrument = namedtuple('Instrument', ['exchange', 'token', 'symbol',
                                      'name', 'expiry', 'lot_size'])

所有仪器都有上述字段。只要某个字段不适用于工具(例如,权益工具没有执行价格),该值将是None

报价更新

加载主合同后,您可以轻松订阅报价更新。

提供四种类型的 Feed 数据

您可以为给定的脚本订阅任何一种类型的报价更新。使用LiveFeedType枚举,您可以指定所需的实时提要类型。

  • LiveFeedType.MARKET_DATA
  • LiveFeedType.COMPACT
  • LiveFeedType.SNAPQUOTE
  • LiveFeedType.FULL_SNAPQUOTE

有关不同类型的报价更新的更多详细信息,请参阅此处的原始文档。

订阅实时提要

sas.subscribe(sas.get_instrument_by_symbol('NSE', 'TATASTEEL'), LiveFeedType.MARKET_DATA)
sas.subscribe(sas.get_instrument_by_symbol('BSE', 'RELIANCE'), LiveFeedType.COMPACT)

在一次通话中订阅多个工具。提供一系列要订阅的工具。

sas.subscribe([sas.get_instrument_by_symbol('NSE', 'TATASTEEL'), sas.get_instrument_by_symbol('NSE', 'ACC')], LiveFeedType.MARKET_DATA)

注意:总共可以订阅 250 个凭证。超过这一点,服务器可能会断开 web-socket 连接。

开始通过套接字获取实时信息

socket_opened = False
def event_handler_quote_update(message):
    print(f"quote update {message}")

def open_callback():
    global socket_opened
    socket_opened = True

sas.start_websocket(subscribe_callback=event_handler_quote_update,
                      socket_open_callback=open_callback,
                      run_in_background=True)
while(socket_opened==False):
    pass
sas.subscribe(sas.get_instrument_by_symbol('NSE', 'ONGC'), LiveFeedType.MARKET_DATA)
sleep(10)

取消订阅实时提要

取消订阅现有的实时提要

sas.unsubscribe(sas.get_instrument_by_symbol('NSE', 'TATASTEEL'), LiveFeedType.MARKET_DATA)
sas.unsubscribe(sas.get_instrument_by_symbol('BSE', 'RELIANCE'), LiveFeedType.COMPACT)

在一次通话中取消订阅多个工具。提供一系列要取消订阅的工具。

sas.unsubscribe([sas.get_instrument_by_symbol('NSE', 'TATASTEEL'), sas.get_instrument_by_symbol('NSE', 'ACC')], LiveFeedType.MARKET_DATA)

获取所有订阅的符号

sas.get_all_subscriptions() # All

市场状态消息和交换消息。

订阅市场状态消息

sas.subscribe_market_status_messages()

获取市场状态消息。

print(sas.get_market_status_messages())

示例结果get_market_status_messages()

[{'exchange': 'NSE', 'length_of_market_type': 6, 'market_type': b'NORMAL', 'length_of_status': 31, 'status': b'The Closing Session has closed.'}, {'exchange': 'NFO', 'length_of_market_type': 6, 'market_type': b'NORMAL', 'length_of_status': 45, 'status': b'The Normal market has closed for 22 MAY 2020.'}, {'exchange': 'CDS', 'length_of_market_type': 6, 'market_type': b'NORMAL', 'length_of_status': 45, 'status': b'The Normal market has closed for 22 MAY 2020.'}, {'exchange': 'BSE', 'length_of_market_type': 13, 'market_type': b'OTHER SESSION', 'length_of_status': 0, 'status': b''}]

注意:根据alice blue 文档,所有市场状态消息都应具有时间戳。但实际上服务器并没有发送时间戳,所以库现在无法获取时间戳。

订阅交换消息

sas.subscribe_exchange_messages()

获取市场状态消息。

print(sas.get_exchange_messages())

示例结果get_exchange_messages()

[{'exchange': 'NSE', 'length': 32, 'message': b'DS : Bulk upload can be started.', 'exchange_time_stamp': 1590148595}, {'exchange': 'NFO', 'length': 200, 'message': b'MARKET WIDE LIMIT FOR VEDL IS 183919959. OPEN POSITIONS IN VEDL HAVE REACHED 84 PERCENT OF THE MARKET WIDE LIMIT.                                                                                       ', 'exchange_time_stamp': 1590146132}, {'exchange': 'CDS', 'length': 54, 'message': b'DS : Regular segment Bhav copy broadcast successfully.', 'exchange_time_stamp': 1590148932}, {'exchange': 'MCX', 'length': 7, 'message': b'.......', 'exchange_time_stamp': 1590196159}]

市场状态消息和通过回调交换消息

socket_opened = False
def market_status_messages(message):
    print(f"market status messages {message}")

def exchange_messages(message):
    print(f"exchange messages {message}")

def open_callback():
    global socket_opened
    socket_opened = True

sas.start_websocket(market_status_messages_callback=market_status_messages,
					  exchange_messages_callback=exchange_messages,
                      socket_open_callback=open_callback,
                      run_in_background=True)
while(socket_opened==False):
    pass
sas.subscribe_market_status_messages()
sas.subscribe_exchange_messages()
sleep(10)

下订单

限价、行情、SL、SL-M、AMO、BO、CO订单

打印 sas.get_profile 

# TransactionType.Buy、OrderType.Market、ProductType.Delivery

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 1 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.Market , product_type = ProductType .交付,  
                        
                       
                       
                       
                     price  =  0.0 
                     trigger_price  =  None 
                     stop_loss  =  None 
                     square_off  =  None 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
   )

# TransactionType.Buy、OrderType.Market、ProductType.Intraday

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 2 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.Market , product_type = ProductType .盘中,  
                        
                       
                       
                       
                     price  =  0.0 
                     trigger_price  =  None 
                     stop_loss  =  None 
                     square_off  =  None 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
)

# TransactionType.Buy、OrderType.Market、ProductType.CoverOrder

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 3 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.Market , product_type = ProductType . CoverOrder ,  
                        
                       
                       
                       
                     price  =  0.0 , 
                     trigger_price  =  7.5 ,  # trigger_price 此处将 trigger_price 作为止损(提供实际金额的止损
                     stop_loss  =  None , 
                     square_off  =  None , 
                     trailing_sl  =  None , 
                     is_amo  =  False )



# TransactionType.Buy, OrderType.Limit, ProductType.BracketOrder 
# OCO 订单不能是市场类型

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 4 %%%%%%%%%%%%%%%%% %%%%%%%%%% %" ) 
print ( 
   sas .p ​​lace_order ( transaction_type = TransactionType . Buy , instrument = sas .get_instrument_by_symbol ( 'NSE' , 'INFY' ) , quantity = 1 , order_type = OrderType . Limit , product_type = ProductType . BracketOrder ,  
                        
                       
                       
                       
                     price  =  8.0 
                     trigger_price  =  None 
                     stop_loss  =  6.0 
                     square_off  =  10.0 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
)

# TransactionType.Buy、OrderType.Limit、ProductType.Intraday

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 5 %%%%%%%%%%%%%%%%%% %%%%%%%%%% %" ) 
print ( 
   sas .p ​​lace_order ( transaction_type = TransactionType . Buy , instrument = sas .get_instrument_by_symbol ( 'NSE' , 'INFY' ) , quantity = 1 , order_type = OrderType . Limit , product_type = ProductType .盘中,  
                        
                       
                       
                       
                     price  =  8.0 
                     trigger_price  =  None 
                     stop_loss  =  None 
                     square_off  =  None 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
)


# TransactionType.Buy、OrderType.Limit、ProductType.CoverOrder

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 6 %%%%%%%%%%%%%%%%% %%%%%%%%%% %" ) 
print ( 
   sas .p ​​lace_order ( transaction_type = TransactionType . Buy , instrument = sas .get_instrument_by_symbol ( 'NSE' , 'INFY' ) , quantity = 1 , order_type = OrderType . Limit , product_type = ProductType . CoverOrder ,  
                        
                       
                       
                       
                     price  =  7.0 , 
                     trigger_price  =  6.5 ,  # trigger_price 此处将 trigger_price 作为止损(提供实际金额的止损
                     stop_loss  =  None , 
                     square_off  =  None , 
                     trailing_sl  =  None , 
                     is_amo  =  False )


###############################

# TransactionType.Buy, OrderType.StopLossMarket, ProductType.Delivery

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 7 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.StopLossMarket , product_type = ProductType .交付,  
                        
                       
                       
                       
                     price  =  0.0 
                     trigger_price  =  8.0 
                     stop_loss  =  None 
                     square_off  =  None 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
)


# TransactionType.Buy, OrderType.StopLossMarket, ProductType.Intraday

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 8 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.StopLossMarket , product_type = ProductType .盘中,  
                        
                       
                       
                       
                     price  =  0.0 
                     trigger_price  =  8.0 
                     stop_loss  =  None 
                     square_off  =  None 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
)



# TransactionType.Buy, OrderType.StopLossMarket, ProductType.CoverOrder 
# CO 订单的类型为 Limit 和 And Market Only

# TransactionType.Buy, OrderType.StopLossMarket, ProductType.BO 
# BO 订单的类型为 Limit 和 And Market Only

##################################

# TransactionType.Buy, OrderType.StopLossLimit, ProductType.Delivery

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 9 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.StopLossMarket , product_type = ProductType .交付,  
                        
                       
                       
                       
                     price  =  8.0 
                     trigger_price  =  8.0 
                     stop_loss  =  None 
                     square_off  =  None 
                     trailing_sl  =  None 
                     is_amo  =  False ) 
)


# TransactionType.Buy, OrderType.StopLossLimit, ProductType.Intraday

打印 ( " %%%%%%%%%%%%%%%%%%%%%%%%%%% 10 %%%%%%%%%%%%%%%%% %%%%%%%%%% % " ) 
print ( 
   sas.place_order ( transaction_type = TransactionType . Buy , instrument = sas.get_instrument_by_symbol ( ' NSE ' , ' INFY ' ) , quantity = 1 , order_type = OrderType.StopLossLimit , product_type = ProductType .盘中,