'''backteststart: 2019-07-01 09:00:00end: 2020-03-25 15:00:00period: 1dexchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]'''
import json
import re
import time
_bot = ext.NewPositionManager()
class Manager:
'策略逻辑控制类'
ACT_IDLE = 0
ACT_LONG = 1
ACT_SHORT = 2
ACT_COVER = 3
ERR_SUCCESS = 0
ERR_SET_SYMBOL = 1
ERR_GET_ORDERS = 2
ERR_GET_POS = 3
ERR_TRADE = 4
ERR_GET_DEPTH = 5
ERR_NOT_TRADING = 6
errMsg = ["成功", "切换合约失败", "获取订单失败", "获取持仓失败", "交易下单失败", "获取深度失败", "不在交易时间"]
def __init__(self, needRestore, symbol, keepBalance, fastPeriod, slowPeriod):
# 获取symbolDetail
symbolDetail = _C(exchange.SetContractType, symbol)
if symbolDetail["VolumeMultiple"] == 0 or symbolDetail["MaxLimitOrderVolume"] == 0 or symbolDetail["MinLimitOrderVolume"] == 0 or symbolDetail["LongMarginRatio"] == 0 or symbolDetail["ShortMarginRatio"] == 0:
Log(symbolDetail)
raise Exception("合约信息异常")
else :
Log("合约", symbolDetail["InstrumentName"], "一手", symbolDetail["VolumeMultiple"], "份,最大下单量", symbolDetail["MaxLimitOrderVolume"], "保证金率:", _N(symbolDetail["LongMarginRatio"]), _N(symbolDetail["ShortMarginRatio"]), "交割日期", symbolDetail["StartDelivDate"])
# 初始化
self.symbol = symbol
self.keepBalance = keepBalance
self.fastPeriod = fastPeriod
self.slowPeriod = slowPeriod
self.marketPosition = None
self.holdPrice = None
self.holdAmount = None
self.holdProfit = None
self.task = {
"action" : Manager.ACT_IDLE,
"amount" : 0,
"dealAmount" : 0,
"avgPrice" : 0,
"preCost" : 0,
"preAmount" : 0,
"init" : False,
"retry" : 0,
"desc" : "空闲",
"onFinish" : None
}
self.lastPrice = 0
self.symbolDetail = symbolDetail
# 持仓状态信息
self.status = {
"symbol" : symbol,
"recordsLen" : 0,
"vm" : [],
"open" : 0,
"cover" : 0,
"st" : 0,
"marketPosition" : 0,
"lastPrice" : 0,
"holdPrice" : 0,
"holdAmount" : 0,
"holdProfit" : 0,
"symbolDetail" : symbolDetail,
"lastErr" : "",
"lastErrTime" : "",
"isTrading" : False
}
# 对象构造时其他处理工作
vm = None
if RMode == 0:
vm = _G(self.symbol)
else:
vm = json.loads(VMStatus)[self.symbol]
if vm:
Log("准备恢复进度,当前合约状态为", vm)
self.reset(vm[0])
else:
if needRestore:
Log("没有找到" + self.symbol + "的进度恢复信息")
self.reset()
def setLastError(self, err=None):
if err is None:
self.status["lastErr"] = ""
self.status["lastErrTime"] = ""
return
t = _D()
self.status["lastErr"] = err
self.status["lastErrTime"] = t
def reset(self, marketPosition=None):
if marketPosition is not None:
self.marketPosition = marketPosition
pos = _bot.GetPosition(self.symbol, PD_LONG if marketPosition > 0 else PD_SHORT)
if pos is not None:
self.holdPrice = pos["Price"]
self.holdAmount = pos["Amount"]
Log(self.symbol, "仓位", pos)
else :
raise Exception(&