非标准化套利
交易对象:目前使用非标准化组合进行交易。(即黄金远近月,焦煤焦炭等等)
交易平台:易盛极星极星产品网
手续费研究:白糖期货手续费和保证金2023年09月更新 - 九期网
本人使用的期货交易公司:中信期货(幸亏资金量大,返还高,不然就是给期货公司打工。套利的间接成本很高,滑点,手续费。)
特点:1.非标准合约,双边收手续费,双边保证金。
2.底层逻辑来自基本面上,本月的黄金,10年后,他还是黄金。
3.但是,很多品种不是,比如农产品,会因为交通,运输,上下游波动等导致价差会变化。
4.难以入门,使得其成为很多高玩的选择,因为要考虑一边成交,另一边未成交等单边敞口问题
5.统计学套利和基本面套利,是套利的两大主流方向,如有其他的,欢迎补充。
统计套利,就是根据k线图,选择做多,做空价差
基本面套利,则是更具当前期货价格,现货价格,预测价差是拉大还是缩小。
我上传一段简单的黄金非标准套利代码,直接使用即可。
import talib
import talib as ta
import numpy as np
#code1 = "SPD|s|M|2311|2405"
#code1 = 'M2309-M2407'
spd = 'SPD|s|AU|2312|2402'#获取合约数据
code1='SHFE|F|AU|2312'#实际下单合约
code2 = 'SHFE|F|AU|2402'#实际下单合约g_params['n'] = 20 #滚动周期极值
g_params['m'] = 20 #ATR参数
#g_params['p'] = 20 #std周期
g_params['w'] = 'M'
g_params['T'] = 15
g_params['p3'] = 1 #止损线距离
g_params['p1'] = 20
g_params['adx'] = 20
g_params['m2'] =5
# 策略参数,全局变量,各个k线都可以调用
up1 = []
down1 = []
up2 = []
down2 = []
up3 = []
down3 = []
up4 = []
down4 = []
std = []
up_limit1 = []
down_limit1 = []
up_limit2 = []
down_limit2 = []
up_limit3 = []
down_limit3 = []
up_limit4 = []
down_limit4 = []
ran = []BKDFLG = 0
SKDFLG = 0
BPDFLG = 0
SPDFLG = 0
BKDFLG2 = 0
SKDFLG2 = 0
BPDFLG2 = 0
SPDFLG2 = 0#开仓委托
BKID = 0
SKID = 0
#平仓委托
BPID = 0
SPID = 0
#开仓标志
BKFLG = 0
SKFLG = 0
#平仓标志
BPFLG = 0
SPFLG = 0
#开仓撤单标志
BKDEL = 0
SKDEL = 0
#平仓撤单标志
BPDEL = 0
SPDEL = 0
#开仓委托手数
BKM = 0
SKM = 0
#平仓委托手数
BPM = 0
SPM = 0
#开仓委托价格
BKP = 0
SKP = 0
#平仓委托价格
BPP = 0
SPP = 0
#开仓委托时间
BKT = 0
SKT = 0
#平仓委托时间
BPT = 0
SPT = 0#开仓委托
BKID2 = 0
SKID2 = 0
#平仓委托
BPID2 = 0
SPID2 = 0
#开仓标志
BKFLG2 = 0
SKFLG2 = 0
#平仓标志
BPFLG2 = 0
SPFLG2 = 0
#开仓撤单标志
BKDEL2 = 0
SKDEL2 = 0
#平仓撤单标志
BPDEL2 = 0
SPDEL2 = 0
#开仓委托手数
BKM2 = 0
SKM2 = 0
#平仓委托手数
BPM2 = 0
SPM2 = 0
#开仓委托价格
BKP2 = 0
SKP2 = 0
#平仓委托价格
BPP2 = 0
SPP2 = 0
#开仓委托时间
BKT2 = 0
SKT2 = 0
#平仓委托时间
BPT2 = 0
SPT2 = 0def minprice(price1,price2):if price1>price2:return price2else:return price1
def maxprice(price1,price2):if price1>price2:return price1else:return price2
# 价格矫正为最小变动价整数倍
def PriceCorrect(src,tick):if tick:return (int((src+0.5*tick)/tick))*tickelse:src
# 策略开始运行时执行该函数一次
def initialize(context):SetBarInterval(spd, g_params['w'], g_params['T'],500)SetBarInterval(code1, g_params['w'], g_params['T'],500)SetBarInterval(code2, g_params['w'], g_params['T'],500)SetTriggerType(1)SetOrderWay(1)SetActual()SetAFunUseForHis()SetUserNo('Q1010422846') # 设置交易账号# 策略触发事件每次触发时都会执行该函数
def handle_data(context):#当前k线判断,内部函数#出现开平仓信号# BKDFLG = 0# SKDFLG = 0# BPDFLG = 0# SPDFLG = 0# BKFLG =0# SKFLG =0# BPFLG =0 # SPFLG =0 #全局运作,超出k线#全局变量,不受时间约束global up1global down1global up2global down2global up3global down3global up4global down4global stdglobal up_limit1 global down_limit1global up_limit2 global down_limit2global up_limit3 global down_limit3global up_limit4 global down_limit4global ranglobal BKDFLG global SKDFLG global BPDFLG global SPDFLG global BKDFLG2 global SKDFLG2 global BPDFLG2 global SPDFLG2 global BKIDglobal SKIDglobal BPIDglobal SPIDglobal BKFLGglobal SKFLGglobal BPFLGglobal SPFLGglobal BKDELglobal SKDELglobal BPDELglobal SPDELglobal BKMglobal SKMglobal BPMglobal SPMglobal BKPglobal SKPglobal BPPglobal SPPglobal BKTglobal SKTglobal BPTglobal SPTglobal BKID2global SKID2global BPID2global SPID2global BKFLG2global SKFLG2global BPFLG2global SPFLG2global BKDEL2global SKDEL2global BPDEL2global SPDEL2global BKM2global SKM2global BPM2global SPM2global BKP2global SKP2global BPP2global SPP2global BKT2global SKT2global BPT2global SPT2#确定前面有足够的数据if (CurrentBar() >= len(up1)):if (len(up1)) < 20:up1.append(0)down1.append(0)up2.append(0)down2.append(0)up3.append(0)down3.append(0)up4.append(0)down4.append(0)std.append(0)up_limit1.append(0)down_limit1.append(0)up_limit2.append(0)down_limit2.append(0)up_limit3.append(0)down_limit3.append(0)up_limit4.append(0)down_limit4.append(0)ran.append(0)# preEntryPrice.append(0)else:up1.append(up1[-1])down1.append(down1[-1])up2.append(up2[-1])down2.append(down2[-1])up3.append(up3[-1])down3.append(down3[-1])up4.append(up4[-1])down4.append(down4[-1])std.append(std[-1])up_limit1.append(up_limit1[-1])down_limit1.append(down_limit1[-1])up_limit2.append(up_limit2[-1])down_limit2.append(down_limit2[-1])up_limit3.append(up_limit3[-1])down_limit3.append(down_limit3[-1])up_limit4.append(up_limit4[-1])down_limit4.append(down_limit4[-1])ran.append(ran[-1])#从第N根k线开始进行程序运行if len(Close()) < g_params['p1']:returnm = g_params['m']m2 = g_params['m2']x = spdran[-1] = ta.ATR(High(x, str(g_params['w'] ), g_params['T'])[:-1], Low(x, str(g_params['w'] ), g_params['T'])[:-1], Close(x, str(g_params['w'] ), g_params['T'])[:-1], m)[-1] // PriceTick(x) * PriceTick(x) # 一个周期前ran# if ran[-1]>=0:# ran[-1]=0.12adx = ta.ADX(High(x, str(g_params['w'] ), g_params['T'])[:-1], Low(x, str(g_params['w'] ), g_params['T'])[:-1], Close(x, str(g_params['w'] ), g_params['T'])[:-1], m2)# if abs(High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()-up1[-1]) >= 0 and \# abs(High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()-up1[-1]) < 0.3:# up1[-1] = up1[-2] # elif abs(High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()-up1[-1])>0.3:# up1[-1] = High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max() # if abs(Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()-down1[-1])>=0 and \# abs(Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()-down1[-1])<0.3:# down1[-1] = down1[-2]# elif abs(Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()-down1[-1])>0.3:# down1[-1] = Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()PlotNumeric('ran', abs(Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()-down1[-1]),RGB_Yellow(),False)up1[-1] = Close(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max() # if abs(up1[-2]-up1[-1])==0 or abs(up1[-2]-up1[-1])>0.2:# up1[-1] = up1[-2]down1[-1] = Close(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()# if abs(down1[-2]-down1[-1])==0 or abs(down1[-2]-down1[-1])>0.2:# down1[-1] = down1[-2]# if abs(High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()-up1[-2])<=1:# up1[-1] = High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max() # else:# up1[-1] = up1[-2]# if abs(down1[-2]-Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min())<=1:# down1[-1] = Low(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()# else:# down1[-1] = down1[-2]#up1[-1] = Close(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()up_limit2[-1] = up1[-1] - ran[-1]*g_params['p3']// PriceTick(x) * PriceTick(x)#down1[-1] = Close(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].min()down_limit2[-1] = down1[-1] + ran[-1]*g_params['p3']// PriceTick(x) * PriceTick(x)#LogInfo(abs(High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()-up1[-1]))PlotNumeric('up1',up1[-1],RGB_Red(),True)PlotNumeric('up_limit2',up_limit2[-1],RGB_Blue(),True)PlotNumeric('down1',down1[-1],RGB_Green(),True)PlotNumeric('down_limit2',down_limit2[-1],RGB_Yellow(),True)#PlotNumeric('ran',abs(High(x,str(g_params['w'] ), g_params['T'])[-g_params['n']:-1].max()-up1[-2]),RGB_Yellow(),False)BKDFLG = 0SKDFLG = 0BPDFLG = 0SPDFLG = 0BKDFLG2 = 0SKDFLG2 = 0BPDFLG2 = 0SPDFLG2 = 0LogInfo(A_BuyPosition(code1,'Q1010422846'), A_SellPosition(code1,'Q1010422846'),A_BuyPosition(code2,'Q1010422846'), A_SellPosition(code2,'Q1010422846'))# LogInfo(BuyPosition(code1), SellPosition(code1),BuyPosition(code2), SellPosition(code2))# LogInfo('状态',Q_Close(spd),\# A_BuyPosition(code1),A_SellPosition(code1),\# A_BuyPosition(spd),A_SellPosition(spd), \# BKDFLG ,SKDFLG,BPDFLG,SPDFLG )if Q_Close(spd)>up1[-1]+PriceTick(spd) and \A_BuyPosition(code1,'Q1010422846')==0 and A_SellPosition(code1,'Q1010422846')==0 \and A_BuyPosition(code2,'Q1010422846')==0 and A_SellPosition(code2,'Q1010422846')==0 :if SKDFLG ==0:SKDFLG = 1if BKDFLG2 == 0:BKDFLG2 = 1elif Q_Close(spd)<up_limit2[-1]-PriceTick(spd) and \A_BuyPosition(code1,'Q1010422846')==0 and A_SellPosition(code1,'Q1010422846')>0 \and A_BuyPosition(code2,'Q1010422846')>0 and A_SellPosition(code2,'Q1010422846')==0:if BPDFLG ==0:BPDFLG = 1 # 发出止损信号if SPDFLG2 == 0:SPDFLG2 = 1 # 止损信号出现 elif (Q_Close(spd)<down1[-1]-PriceTick(spd)) and \A_BuyPosition(code1,'Q1010422846')==0 and A_SellPosition(code1,'Q1010422846')==0 \and A_BuyPosition(code2,'Q1010422846')==0 and A_SellPosition(code2,'Q1010422846')==0:if BKDFLG == 0:BKDFLG = 1if SKDFLG2 == 0:SKDFLG2 = 1elif (Q_Close(spd)>down_limit2[-1]+PriceTick(spd)) and \A_BuyPosition(code1,'Q1010422846')>0 and A_SellPosition(code1,'Q1010422846')==0 \and A_BuyPosition(code2,'Q1010422846')==0 and A_SellPosition(code2,'Q1010422846')>0:if SPDFLG == 0:SPDFLG = 1 # 止损信号出现 if BPDFLG2 ==0:BPDFLG2 = 1 # 发出止损信号ss = int(A_Assets()*0.005/(Q_Close(code1)*0.1*10))ss = 1LogInfo('状态',Q_Close(spd),\A_BuyPosition(code1,'Q1010422846'),A_SellPosition(code1,'Q1010422846'),\A_BuyPosition(spd,'Q1010422846'),A_SellPosition(spd,'Q1010422846'), \BKDFLG ,SKDFLG,BPDFLG,SPDFLG )#//------------------------历史发单------------------------//# if context.strategyStatus() != 'C':# if (Close(spd, g_params['w'], g_params['T'])[-1]<=down1[-1]) and \# BuyPosition(code1)==0 and SellPosition(code1)==0 \# and BuyPosition(code2)==0 and SellPosition(code2)==0 :# Buy(ss, Close(code1, g_params['w'], g_params['T'])[-1],code1, needCover=False) # SellShort(ss, Close(code2, g_params['w'], g_params['T'])[-1],code2, needCover=False)# elif Close(spd, g_params['w'], g_params['T'])[-1]>=up1[-1] and \# BuyPosition(code1)==0 and SellPosition(code1)==0 \# and BuyPosition(code2)==0 and SellPosition(code2)==0:# SellShort(ss,Close(code1, g_params['w'], g_params['T'])[-1], code1,needCover=False)# Buy(ss, Close(code2, g_params['w'], g_params['T'])[-1],code2, needCover=False)# elif (Close(spd, g_params['w'], g_params['T'])[-1]>=down_limit2[-1]) and \# BuyPosition(code1)==0 and SellPosition(code1)>0 \# and BuyPosition(code2)>0 and SellPosition(code2)==0:# Sell(ss, Close(code1, g_params['w'], g_params['T'])[-1],code1)# BuyToCover(ss, Close(code2, g_params['w'], g_params['T'])[-1],code2)# elif Close(spd, g_params['w'], g_params['T'])[-1]<=up_limit2[-1] and \# BuyPosition(code1)>0 and SellPosition(code1)==0 \# and BuyPosition(code2)==0 and SellPosition(code2)>0:# BuyToCover(ss,Close(code1, g_params['w'], g_params['T'])[-1], code1)# Sell(ss, Close(code2, g_params['w'], g_params['T'])[-1],code2)# return#//------------------------实时处理------------------------//# if ExchangeStatus(ExchangeName()) != '3':# return#//------------------------变量赋值------------------------//#N = int(A_Assets()*0.0005/(Q_Close()*0.1*10))#N = 10N = 1 LogInfo('N',N)#N = 1 #下单手数T = 5 #时间间隔NOW = CurrentTime() #当前时间#code1BIDP = 0 if Q_BidPrice(code1) is None else Q_BidPrice(code1) #买一价ASKP = 0 if Q_AskPrice(code1) is None else Q_AskPrice(code1) #卖一价BRP = A_BuyPositionCanCover(code1) #多头可用持仓SRP = A_SellPositionCanCover(code1) #空头可用持仓LogInfo('价格',BIDP,ASKP,BRP,SRP)#code2BIDP2 = 0 if Q_BidPrice(code2) is None else Q_BidPrice(code2) #买一价ASKP2 = 0 if Q_AskPrice(code2) is None else Q_AskPrice(code2) #卖一价BRP2 = A_BuyPositionCanCover(code2) #多头可用持仓SRP2 = A_SellPositionCanCover(code2) #空头可用持仓# if ExchangeName() == 'SHFE': #如果是上期所合约# SH = Enum_ExitToday() #平仓参数# else: #如果非上期所合约# SH = Enum_Exit() #平仓参数SH = Enum_ExitToday()#//------------------------成交判断code1------------------------//if BKFLG == 1:if A_OrderStatus(BKID) == Enum_Filled():LogInfo("BK信号:买开委托成交!")BKFLG = 0 #买开标志归0BKDEL = 0 #买开撤单标志归0elif A_OrderStatus(BKID) == Enum_Canceled():LogInfo("BK信号:买开委托已撤!")if A_OrderFilledLot(BKID) > 0: #如果买开委托部分成交BKM = BKM - A_OrderFilledLot(BKID) #买开委托手数if BKM > 0: #如果买开委托手数大于0BKP = ASKP #买开委托价格LogInfo("BK信号:买开委托追价!")retCode, BKID = A_SendOrder(Enum_Buy(),Enum_Entry(),BKM,BKP,code1) #发出买开委托BKT = NOW #买开委托时间BKDEL = 0 #买开撤单标志归0elif A_OrderStatus(BKID) == Enum_Suspended() or A_OrderStatus(BKID) == Enum_FillPart():if BKDEL == 0: #如果未撤单if TimeDiff(BKT, NOW) >= T: #如果时间间隔T秒LogInfo("BK信号:买开委托撤单!")A_DeleteOrder(BKID) #撤掉买开委托挂单BKDEL = 1 #已发出撤掉买开委托挂单if SPFLG == 1:if A_OrderStatus(SPID) == Enum_Filled():LogInfo("SP信号:卖平委托成交!")SPFLG = 0 #卖平标志归0SPDEL = 0 #卖平撤单标志归0elif A_OrderStatus(SPID) == Enum_Canceled():LogInfo("SP信号:卖平委托已撤!")if A_OrderFilledLot(SPID) > 0: #如果卖平委托部分成交SPM = SPM - A_OrderFilledLot(SPID) #卖平委托手数if BRP > 0 and SPM > 0 and SPM <= BRP: #如果卖平委托手数不超过多头可用持仓SPP = BIDP #卖平委托价格LogInfo("SP信号:卖平委托追价!")retCode, SPID = A_SendOrder(Enum_Sell(),SH,SPM,SPP,code1) #发出卖平委托SPT = NOW #卖平委托时间SPDEL = 0 #卖平撤单标志归0elif A_OrderStatus(SPID) == Enum_Suspended() or A_OrderStatus(SPID) == Enum_FillPart():if SPDEL == 0: #如果未撤单if TimeDiff(SPT, NOW) >= T: #如果时间间隔T秒LogInfo("SP信号:卖平委托撤单!")A_DeleteOrder(SPID) #撤掉卖平委托挂单SPDEL = 1 #已发出撤掉卖平委托挂单if SKFLG == 1:if A_OrderStatus(SKID) == Enum_Filled():LogInfo("SK信号:卖开委托成交!")SKFLG = 0 #卖开标志归0SKDEL = 0 #卖开撤单标志归0elif A_OrderStatus(SKID) == Enum_Canceled():LogInfo("SK信号:卖开委托已撤!")if A_OrderFilledLot(SKID) > 0: #如果卖开委托部分成交SKM = SKM - A_OrderFilledLot(SKID) #卖开委托手数if SKM > 0: #如果卖开委托手数大于0SKP = BIDP #卖开委托价格LogInfo("SK信号:卖开委托追价!")retCode, SKID = A_SendOrder(Enum_Sell(), Enum_Entry(), SKM, SKP,code1) #发出卖开委托SKT = NOW #卖开委托时间SKDEL = 0 #卖开撤单标志归0elif A_OrderStatus(SKID) == Enum_Suspended() or A_OrderStatus(SKID) == Enum_FillPart():if SKDEL == 0: #如果未撤单if TimeDiff(SKT, NOW) >= T: #如果时间间隔T秒LogInfo("SK信号:卖开委托撤单!")A_DeleteOrder(SKID) #撤掉卖开委托挂单SKDEL = 1 #已发出撤掉卖开委托挂单if BPFLG == 1:if A_OrderStatus(BPID) == Enum_Filled():LogInfo("BP信号:买平委托成交!")BPFLG = 0 #买平标志归0BPDEL = 0 #买平撤单标志归0elif A_OrderStatus(BPID) == Enum_Canceled():LogInfo("BP信号:买平委托已撤!")if A_OrderFilledLot(BPID) > 0: #如果买平委托部分成交BPM = BPM - A_OrderFilledLot(BPID) #买平委托手数if SRP > 0 and BPM > 0 and BPM <= SRP: #如果买平委托手数不超过空头可用持仓BPP = ASKP #买平委托价格LogInfo("BP信号:买平委托追价!")retCode, BPID = A_SendOrder(Enum_Buy(),SH,BPM,BPP,code1) #发出买平委托BPT = NOW #买平委托时间BPDEL = 0 #买平撤单标志归0elif A_OrderStatus(BPID) == Enum_Suspended() or A_OrderStatus(BPID) == Enum_FillPart():if BPDEL == 0: #如果未撤单if TimeDiff(BPT, NOW) >= T: #如果时间间隔T秒LogInfo("BP信号:买平委托撤单!")A_DeleteOrder(BPID) #撤掉买平委托挂单BPDEL = 1 #已发出撤掉买平委托挂单#//------------------------成交判断code2------------------------//if BKFLG2 == 1:if A_OrderStatus(BKID2) == Enum_Filled():LogInfo("BK信号:买开委托成交!")BKFLG2 = 0 #买开标志归0BKDEL2 = 0 #买开撤单标志归0elif A_OrderStatus(BKID2) == Enum_Canceled():LogInfo("BK信号:买开委托已撤!")if A_OrderFilledLot(BKID2) > 0: #如果买开委托部分成交BKM2 = BKM2 - A_OrderFilledLot(BKID2) #买开委托手数if BKM2 > 0: #如果买开委托手数大于0BKP2 = ASKP2 #买开委托价格LogInfo("BK信号:买开委托追价!")retCode2, BKID2 = A_SendOrder(Enum_Buy(),Enum_Entry(),BKM2,BKP2,code2) #发出买开委托BKT2 = NOW #买开委托时间BKDEL2 = 0 #买开撤单标志归0elif A_OrderStatus(BKID2) == Enum_Suspended() or A_OrderStatus(BKID2) == Enum_FillPart():if BKDEL2 == 0: #如果未撤单if TimeDiff(BKT2, NOW) >= T: #如果时间间隔T秒LogInfo("BK信号:买开委托撤单!")A_DeleteOrder(BKID2) #撤掉买开委托挂单BKDEL2 = 1 #已发出撤掉买开委托挂单if SPFLG2 == 1:if A_OrderStatus(SPID2) == Enum_Filled():LogInfo("SP信号:卖平委托成交!")SPFLG2 = 0 #卖平标志归0SPDEL2 = 0 #卖平撤单标志归0elif A_OrderStatus(SPID2) == Enum_Canceled():LogInfo("SP信号:卖平委托已撤!")if A_OrderFilledLot(SPID2) > 0: #如果卖平委托部分成交SPM2 = SPM2 - A_OrderFilledLot(SPID2) #卖平委托手数if BRP2 > 0 and SPM2 > 0 and SPM2 <= BRP2: #如果卖平委托手数不超过多头可用持仓SPP2 = BIDP2 #卖平委托价格LogInfo("SP信号:卖平委托追价!")retCode2, SPID2 = A_SendOrder(Enum_Sell(),SH,SPM2,SPP2,code2) #发出卖平委托SPT2 = NOW #卖平委托时间SPDEL2 = 0 #卖平撤单标志归0elif A_OrderStatus(SPID2) == Enum_Suspended() or A_OrderStatus(SPID2) == Enum_FillPart():if SPDEL2 == 0: #如果未撤单if TimeDiff(SPT2, NOW) >= T: #如果时间间隔T秒LogInfo("SP信号:卖平委托撤单!")A_DeleteOrder(SPID2) #撤掉卖平委托挂单SPDEL2 = 1 #已发出撤掉卖平委托挂单if SKFLG2 == 1:if A_OrderStatus(SKID2) == Enum_Filled():LogInfo("SK信号:卖开委托成交!")SKFLG2 = 0 #卖开标志归0SKDEL2 = 0 #卖开撤单标志归0elif A_OrderStatus(SKID2) == Enum_Canceled():LogInfo("SK信号:卖开委托已撤!")if A_OrderFilledLot(SKID2) > 0: #如果卖开委托部分成交SKM2 = SKM2 - A_OrderFilledLot(SKID2) #卖开委托手数if SKM2 > 0: #如果卖开委托手数大于0SKP2 = BIDP2 #卖开委托价格LogInfo("SK信号:卖开委托追价!")retCode2, SKID2 = A_SendOrder(Enum_Sell(), Enum_Entry(), SKM2, SKP2,code2) #发出卖开委托SKT2 = NOW #卖开委托时间SKDEL2 = 0 #卖开撤单标志归0elif A_OrderStatus(SKID2) == Enum_Suspended() or A_OrderStatus(SKID2) == Enum_FillPart():if SKDEL2 == 0: #如果未撤单if TimeDiff(SKT2, NOW) >= T: #如果时间间隔T秒LogInfo("SK信号:卖开委托撤单!")A_DeleteOrder(SKID2) #撤掉卖开委托挂单SKDEL2 = 1 #已发出撤掉卖开委托挂单if BPFLG2 == 1:if A_OrderStatus(BPID2) == Enum_Filled():LogInfo("BP信号:买平委托成交!")BPFLG2 = 0 #买平标志归0BPDEL2 = 0 #买平撤单标志归0elif A_OrderStatus(BPID2) == Enum_Canceled():LogInfo("BP信号:买平委托已撤!")if A_OrderFilledLot(BPID2) > 0: #如果买平委托部分成交BPM2 = BPM2 - A_OrderFilledLot(BPID2) #买平委托手数if SRP2 > 0 and BPM2 > 0 and BPM2 <= SRP2: #如果买平委托手数不超过空头可用持仓BPP2 = ASKP2 #买平委托价格LogInfo("BP信号:买平委托追价!")retCode2, BPID2 = A_SendOrder(Enum_Buy(),SH,BPM2,BPP2,code2) #发出买平委托BPT2 = NOW #买平委托时间BPDEL2 = 0 #买平撤单标志归0elif A_OrderStatus(BPID2) == Enum_Suspended() or A_OrderStatus(BPID2) == Enum_FillPart():if BPDEL2 == 0: #如果未撤单if TimeDiff(BPT2, NOW) >= T: #如果时间间隔T秒LogInfo("BP信号:买平委托撤单!")A_DeleteOrder(BPID2) #撤掉买平委托挂单BPDEL2 = 1 #已发出撤掉买平委托挂单#//------------------------委托处理code1------------------------//if BKDFLG == 1:if BKFLG == 0: #如果没有买开委托BKM = N #买开委托手数BKP = ASKP #买开委托价格LogInfo("BK信号:买开委托发出")retCode, BKID = A_SendOrder(Enum_Buy(),Enum_Entry(),BKM,BKP,code1) #发出买开委托BKT = NOW #买开委托时间BKFLG = 1 #已发出买开委托BKDFLG= 0if SPDFLG == 1:if SPFLG == 0: #如果没有卖平委托if BRP > 0: #如果有多头可用持仓SPM = BRP #卖平委托手数SPP = BIDP #卖平委托价格LogInfo("SP信号:卖平委托发出!")retCode, SPID = A_SendOrder(Enum_Sell(),SH,SPM,SPP,code1) #发出卖平委托SPT = NOW #卖平委托时间SPFLG = 1 #已发出卖平委托SPDFLG = 0if SKDFLG == 1:if SKFLG == 0: #如果没有卖开委托SKM = N #卖开委托手数SKP = BIDP #卖开委托价格LogInfo("SK信号:卖开委托发出!")retCode, SKID = A_SendOrder(Enum_Sell(),Enum_Entry(),SKM,SKP,code1) #发出卖开委托SKT = NOW #卖开委托时间SKFLG = 1 #已发出卖开委托SKDFLG = 0if BPDFLG == 1:if BPFLG == 0: #如果没有买平委托if SRP > 0: #如果有空头可用持仓BPM = SRP #买平委托手数BPP = ASKP #买平委托价格LogInfo("BP信号:买平委托发出!")retCode, BPID = A_SendOrder(Enum_Buy(),SH,BPM,BPP,code1) #发出买平委托BPT = NOW #买平委托时间BPFLG = 1 #已发出买平委托BPDFLG =0#//------------------------委托处理code2------------------------//if BKDFLG2 == 1:if BKFLG2 == 0: #如果没有买开委托BKM2 = N #买开委托手数BKP2 = ASKP2 #买开委托价格LogInfo("BK信号:买开委托发出")retCode2, BKID2 = A_SendOrder(Enum_Buy(),Enum_Entry(),BKM2,BKP2,code2) #发出买开委托BKT2 = NOW #买开委托时间BKFLG2 = 1 #已发出买开委托BKDFLG2 = 0if SPDFLG2 == 1:if SPFLG2 == 0: #如果没有卖平委托if BRP2 > 0: #如果有多头可用持仓SPM2 = BRP2 #卖平委托手数SPP2 = BIDP2 #卖平委托价格LogInfo("SP信号:卖平委托发出!")retCode2, SPID2 = A_SendOrder(Enum_Sell(),SH,SPM2,SPP2,code2) #发出卖平委托SPT2 = NOW #卖平委托时间SPFLG2 = 1 #已发出卖平委托SPDFLG2 = 0if SKDFLG2 == 1:if SKFLG2 == 0: #如果没有卖开委托SKM2 = N #卖开委托手数SKP2 = BIDP2 #卖开委托价格LogInfo("SK信号:卖开委托发出!")retCode2, SKID2 = A_SendOrder(Enum_Sell(),Enum_Entry(),SKM2,SKP2,code2) #发出卖开委托SKT2 = NOW #卖开委托时间SKFLG2 = 1 #已发出卖开委托SKDFLG2 = 0if BPDFLG2 == 1:if BPFLG2 == 0: #如果没有买平委托if SRP2 > 0: #如果有空头可用持仓BPM2 = SRP2 #买平委托手数BPP2 = ASKP2 #买平委托价格LogInfo("BP信号:买平委托发出!")retCode2, BPID2 = A_SendOrder(Enum_Buy(),SH,BPM2,BPP2,code2) #发出买平委托BPT2 = NOW #买平委托时间BPFLG2 = 1 #已发出买平委托BPDFLG2 =0
相关文章:
非标准化套利
交易对象:目前使用非标准化组合进行交易。(即黄金远近月,焦煤焦炭等等) 交易平台:易盛极星极星产品网 手续费研究:白糖期货手续费和保证金2023年09月更新 - 九期网 本人使用的期货交易公司:中信期货&…...

从CNN(卷积神经网络),又名CAM获取热图
一、说明 卷积神经网络(CNN)令人难以置信。如果你想知道它如何看待世界(图像),有一种方法是可视化它。 这个想法是,我们从最后的密集层中得到权重,然后乘以最终的CNN层。这需要全局平均…...

kafka消费者多线程开发
目录 前言 kafka consumer 设计原理 多线程的方案 参考资料 前言 目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单…...

布局设计和实现:计算器UI【TableLayout、GridLayout】
一、使用TableLayout实现计算器UI 1.新建一个空白项目布局 根据自己的需求输入其他信息 填写完成后,点击Finish即可 2. 设计UI界面 在res/layout文件夹中的XML文件中创建UI界面。在这个XML文件中,您可以使用TableLayout来设计计算器界面。 2.1 创建l…...

stack与queue的简单封装
前言: stack与queue即栈和队列,先进后出/先进先出的特性我们早已了然于心, 在学习数据结构时,我们利用c语言实现栈与队列,从结构体写起,利用数组或指针表示他们的数据成员,之后再一个个实现他们…...
ChatGPT使用技巧整理
目录 1. 让ChatGPT扮演专家角色2. 告诉ChatGPT你的身份3. 限制ChatGPT的回答长度4. 让ChatGPT一步步思考5. 明确你的要求和目的6. 提供充分的背景信息7. 始终结构化思考你的prompt1. 让ChatGPT扮演专家角色 当你们讨论的是市场营销问题时,你可以要求ChatGPT扮演一个具有20年从…...
机器学习笔记 - 维度诅咒的数学表达
1、点之间的距离 kNN分类器假设相似的点也可能有相同的标签。但是,在高维空间中,从概率分布中得出的点往往不会始终靠近在一起。 我们可以用一个简单的例子来说明这一点。 我们将在单位立方体内均匀地随机绘制点(如图所示),并研究该立方体内测试点的 k 个最近邻将占用多少…...
组合计数训练题解
CF40E 题目链接 点击打开链接 题目解法 首先,如果 n , m n,m n,m 一奇一偶,那么答案为 0 0 0 原因是从行和列的角度分析, − 1 -1 −1 个数的奇偶性不同 可以发现 k < max { n , m } k<\max\{n,m\} k<max{n,m} 的性质很微…...
P1095 [NOIP2007 普及组] 守望者的逃离
[NOIP2007 普及组] 守望者的逃离 - 洛谷 首先DP的套路就是先找状态 这题也找不出其他的状态了,只有时间一个 所以用f[i]表示时刻i能走多远 而仔细一想实际上决策只有跑、闪现、停三种决策 然而闪现的耗蓝要和跑步一同计算十分麻烦 于是把它们分开算࿱…...

Python函数绘图与高等代数互融实例(八):箱线图|误差棒图|堆积图
Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 Python函数绘图与高等代数互融实例(五…...

联想y7000 y7000p 2018/2019 不插电源 不插充电器, 直接关机 ,电量一直89%/87%/86%,V0005如何解决?
这种问题,没有外力破坏的话,电池不可能突然出事。这种一般是联想的固件问题,有可能发生在系统更新,或者突然的不正常关机或长时间电池过热,原因我不是很清楚。 既然发生了,根据我收集的解决方法,…...
stm32与esp8266通信
esp8266 #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h>// 测试HTTP请求用的URL // #define URL "http://162.14.107.118:8086/PC/modifyFoodPrice/0/6"// 测试HTTP请求用的URL // 设置wifi接入信息(请根据您的WiFi信息进行修改) const char…...
组合数 2.1 2.2
O(nlogn)预处理, O(1)查询 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long long ll; typedef long double ld;const int N 1000…...
【数组的中心位置】python实现-附ChatGPT解析
1.题目 数组的中心位置 题目 给你一个整数数组 nums,请计算数组的中心位置。 数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。 数组第一个元素的左侧积为 1,最后一个元素的右侧积为 1。 如果数组有多个中心位置,应该返回最靠近左边的那一个…...

黑马JVM总结(二十三)
(1)字节码指令-init 方法体内有一些字节,对应着将来要由java虚拟机执行方法内的代码,构造方法里5个字节代码,main方法里有9个字节的代码 java虚拟机呢内部有一个解释器,这个解释器呢可以识别平台无关的字…...

AI人体行为分析:玩手机/打电话/摔倒/攀爬/扭打检测及TSINGSEE场景解决方案
一、AI人体行为分析技术概述及场景 人体姿态分析/行为分析/动作识别AI算法,是一种利用人工智能技术对人体行为进行检测、跟踪和分析的方法。通过计算机视觉、深度学习和模式识别等技术,可以实现对人体姿态、动作和行为的自动化识别与分析。 在场景应用…...

HI_NAS linux 记录
dev/root 100% 占用解决记录 通过下面的命令查看各文件夹 大小 sudo du --max-depth1 -h # 统计当前文件夹下各个文件夹的大小显示为M 最终发现Var/log 占用很大空间 发现下面两个 log 占用空间很大,直接 rm-rf 即可 HI NAS python3 记录 # 安装pip3 sudo apt u…...

计算机图形学中的几何光学
文章目录 前言一、图形学中的光学二、光照模型1、经验型(简单)2、物理型(复杂) 前言 在学习Shader光照之前了解一下计算机图形学 一、图形学中的光学 镜面反射的效果例子:物体表面高光 慢反射的效果的例子:…...

「UG/NX」BlockUI 选择小平面区域 Select Facet Region
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「DSA」数据结构与算法「File」数据文件格式 目录 控件说…...

【完全二叉树魔法:顺序结构实现堆的奇象】
本章重点 二叉树的顺序结构堆的概念及结构堆的实现堆的调整算法堆的创建堆排序TOP-K问题 1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...