当前位置:首页>python>程序化交易中回测模拟实盘的下单python语言函数

程序化交易中回测模拟实盘的下单python语言函数

  • 2026-09-06 18:21:05
程序化交易中回测模拟实盘的下单python语言函数
在回测与模拟环境中,自己下单的价格与手数,并不会体现在盘口,所以最佳的方式就是对价下单。否则,需要等待成交,等待期间的变化又会很多。
在实盘环境中,自己下单的价格与手数,会体现在盘口,所以最佳的方式就是排队价或加塞价下单。这样做,一是为了避免吃到钓鱼单吃大亏,二是为了降低交易的成本以较有利于自己的价格成交。尤其在商品期权交易中,交易量非常小,做市商常常以较大的价差在卖一档和买一档挂单,甚至在几乎没有成交的的盘口的挂单的价差非常荒谬,如果以对手价下单会吃亏到非常大的程度。
为了避免踩坑,自拟了如下下单函数,以天勤量化为例如下:
def get_price_order(quote, direction, run_mode):    """    计算出有效的下单价格 能用有效价下单且能防钓鱼    quote      obj  行情报价    direction  str  买卖方向 "BUY" "SELL"    run_mode   str  "backtest"回测模式 "simulated"模拟 "live"实盘    price_order = get_price_order(quote, "BUY", run_mode)    """    if quote.last_price > 0: # 有过成交、确保自己不是第一个报价者以防流动性不足吃大亏        # 回测 或 模拟 模式 只以对价下单[因为任何下单都不会提交到历史或模拟数据中]        if run_mode in ["backtest", "simulated"]:            if direction == "SELL":                if quote.bid_price1 > 0:                    return quote.bid_price1 # 对价下单                else:                    return False            if direction == "BUY":                if quote.ask_price1 > 0:                    return quote.ask_price1 # 对价下单                else:                    return False        # 实盘模式        if run_mode == "live":            # 如果是涨停时            if 0 < quote.bid_price1 == quote.upper_limit: # 涨停时涨停价下单 对价或排队价下单                return quote.bid_price1             # 如果是跌停时            if 0 < quote.ask_price1 == quote.lower_limit: # 跌停时跌停价下单 对价或排队价下单                return quote.ask_price1            if direction == "SELL":                if quote.ask_price1 > 0: # 有卖一价                    return quote.ask_price1 - quote.price_tick # 卖一价减1跳 加塞价下单                elif quote.bid_price1 > 0: # 没有卖一价但有买一价 不是涨停可能是流动性不足                    return quote.bid_price1 # 对价下单            if direction == "BUY":                if quote.bid_price1 > 0: # 有买一价                    return quote.bid_price1 + quote.price_tick # 买一价加1跳 加塞价下单                elif quote.ask_price1 > 0: # 没有买一价但有卖一价 不是跌停可能是流动性不足                    return quote.ask_price1 # 对价下单    else:        return False # 未有过成交不下单、确保自己不是第一个报价者以防流动性不足吃大亏
第一,有过成交、确保自己不是第一个报价者以防流动性不足吃大亏。在这个前提条件下,在回测或模拟模式只以对价下单,这是因为任何下单都不会提交到历史或模拟数据中。
第二,在实盘模式下,如果遇到涨停或跌停价则以涨停价或跌停价成交。这个部分的代码按理说应该是公共通用部分,但由于天勤量化在回测模式下没有涨停价和跌停价属性值,所以未在回测中考虑。也未在模拟中考虑的原因是,前面的回测与模拟中的对价下单规则已经涵盖涨停或跌停的情景了。
如果未遇到涨停或跌停价则以加塞价下单,即在盘口卖一价减去1跳或者在盘口买一价加1跳去下单,否则则以对价下单、出现这种情况大概率是这个期权合约成交稀疏,因为涨停或者跌停已经在前面的代码涵盖了。
第三,如果未有过成交,则不下单,一直等待到有成交时再判断该如何下单。
需要另外说明的是,对于回撤和模拟模式,只要订单未成交则小于对手价就撤单并重新下单;对于实盘模式,只要小于排队一档价就撤单重新下单,这是因为自己之前下达的加塞订单也许就在一档排队、也许在一档之后排队。

最新文章

随机文章