郑重声明:使用本策略默认已清楚任何程序化自动交易都会带来不可控的风险,本人不承担任何责任。
本人自己用的实盘自动止损分享。
简单说明:
1、目前是单个交易标的的自动止盈止损。
2、可设定不同的止盈止损线。
3、首先检查是否触发止损如果是直接止损,然后检查是否有仓位且挂单止盈。
注意事项:
①不可用出有锁仓的标的。
更新:
20210420 ①更新特殊情况下问题处理;②增加根据仓位数量放大止损倍数;
'''
郑重声明:使用本策略默认已清楚任何程序化自动交易都会带来不可控的风险,本人不承担任何责任。
@author: Leo
'''
import tqsdk
import time
import sys
api = tqsdk.TqApi()
account=api.get_account()
symbol1="DCE.i2009"
quote1=api.get_quote(symbol1)
position1=api.get_position(symbol1)
trade1=tqsdk.TargetPosTask(api,symbol1)
##########
local_time=0
min_tick=0.5
stop_lost=-300
keep_profit=0.5
################class
# exit
def do_exit(close_time):
time_str = time.strftime("%Y-%m-%d", time.localtime()) + ' ' + close_time
time_stamp = time.mktime(time.strptime(time_str, "%Y-%m-%d %H:%M:%S"))
if 0 < int(time.time() - time_stamp) < 60 * 5:
# file_open = open("ag_arbitrage.txt", 'a')
# file_open.write(str(account.balance) + ",")
# file_open.close()
sys.exit()
# 非交易时间
def close_trade():
# do_exit("11:25:00")
do_exit("15:00:00")
# do_exit("22:55:00")
# get avlorderid
def get_avlorderid(code_list):
avlorderid_list = []
orders = api.get_order()
for avloid in orders.keys():
avlorderinfo = api.get_order(avloid)
for code in code_list:
if avlorderinfo.instrument_id == code.split(".")[1] and avlorderinfo.status == "ALIVE":
avlorderid_list.append(avlorderinfo.order_id)
return avlorderid_list
# close the avlposition
def close_avlposition(position, quote):
symbol = position.exchange_id + "." + position.instrument_id
if position.pos_short_today > 0:
oid = api.insert_order(symbol=symbol, direction="BUY", offset="CLOSETODAY", volume=position.pos_short,
limit_price=quote.ask_price1)
# api.cancel_order(oid)
print("BUY CLOSETODAY", local_time)
if position.pos_short_his > 0:
oid = api.insert_order(symbol=symbol, direction="BUY", offset="CLOSE", volume=position.pos_short_his,
limit_price=quote.ask_price1)
# api.cancel_order(oid)
print("BUY CLOSE", local_time)
if position.pos_long_today > 0:
oid = api.insert_order(symbol=symbol, direction="SELL", offset="CLOSETODAY", volume=position.pos_long,
limit_price=quote.bid_price1)
# api.cancel_order(oid)
print("SELL CLOSETODAY", local_time)
if position.pos_long_his > 0:
oid = api.insert_order(symbol=symbol, direction="SELL", offset="CLOSE", volume=position.pos_long_his,
limit_price=quote.bid_price1)
# api.cancel_order(oid)
print("SELL CLOSE", local_time)
# api.wait_update()
# cancel order
def cancel_order(code, quote):
avloid_list = get_avlorderid([code])
if len(avloid_list) > 0:
for avloid in avloid_list:
of = api.get_order(avloid)
if abs(of.limit_price - quote.last_price) > 5 and of.instrument_id == code.split(".")[1]:
api.cancel_order(avloid)
# api.wait_update()
print("cancel order", local_time)
while True:
close_trade()
api.wait_update()
# get some vars
local_time = time.asctime(time.localtime(time.time()))
if api.is_changing(quote1,'datetime'):
position_profit=position1.position_profit
if position_profit>0 or position_profit<0:
if position_profit <= stop_lost*abs(position1.pos):
avlorder = get_avlorderid([symbol1])
if len(avlorder) > 0:
cancel_order(symbol1, quote1)
if len(avlorder) == 0:
trade1.set_target_volume(0)
print("stop lost")
else:
avlorder = get_avlorderid([symbol1])
if len(avlorder)==0:
#position long
if position1.position_price_long!=None and position1.position_price_long>0:
api.insert_order(symbol=symbol1,direction="SELL",offset="CLOSE",volume=position1.pos_long,limit_price=position1.position_price_long+keep_profit)
print("send close long")
# position short
if position1.position_price_short != None and position1.position_price_short > 0:
api.insert_order(symbol=symbol1, direction="BUY", offset="CLOSE",volume=position1.pos_short,limit_price=position1.position_price_short - keep_profit)
print("send close short")