非标准化套利
交易对象:目前使用非标准化组合进行交易。(即黄金远近月,焦煤焦炭等等)
交易平台:易盛极星极星产品网
手续费研究:白糖期货手续费和保证金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.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
中科院1区顶刊|IF14:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点 当下,免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入,我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...
