期货实盘自动止损止盈策略 python 策略开发

郑重声明:使用本策略默认已清楚任何程序化自动交易都会带来不可控的风险,本人不承担任何责任。

本人自己用的实盘自动止损分享。

简单说明:
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")


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值