注意,使用此函数,在考虑手续费时,无法做到统一。
import talib
import numpy as np
import EsTalib
from EsSeries import NumericSeries# 策略参数字典
g_params['p1'] = 5
g_params['p2'] = 10
g_params['p3'] = 120
g_params['ZQ'] = 5 #交易周期# 合约名称列表
HYMCLB = [ "INE|Z|SC|MAIN","INE|Z|NR|MAIN","INE|Z|LU|MAIN","ZCE|Z|PK|MAIN","ZCE|Z|PF|MAIN","ZCE|Z|SA|MAIN","ZCE|Z|CF|MAIN","ZCE|Z|AP|MAIN","ZCE|Z|UR|MAIN","ZCE|Z|CJ|MAIN", "ZCE|Z|OI|MAIN","ZCE|Z|RM|MAIN","ZCE|Z|MA|MAIN","ZCE|Z|TA|MAIN","ZCE|Z|FG|MAIN","ZCE|Z|SF|MAIN","ZCE|Z|SM|MAIN","DCE|Z|M|MAIN","DCE|Z|Y|MAIN","DCE|Z|A|MAIN","DCE|Z|B|MAIN","DCE|Z|P|MAIN","DCE|Z|C|MAIN","DCE|Z|CS|MAIN","DCE|Z|JD|MAIN","DCE|Z|L|MAIN","DCE|Z|V|MAIN","DCE|Z|EB|MAIN","DCE|Z|PP|MAIN","DCE|Z|J|MAIN","DCE|Z|JM|MAIN","DCE|Z|I|MAIN","DCE|Z|EG|MAIN","DCE|Z|PG|MAIN","DCE|Z|LH|MAIN","SHFE|Z|AU|MAIN","SHFE|Z|AG|MAIN","SHFE|Z|CU|MAIN","SHFE|Z|AL|MAIN","SHFE|Z|ZN|MAIN","SHFE|Z|NI|MAIN","SHFE|Z|SN|MAIN","SHFE|Z|PB|MAIN","SHFE|Z|RB|MAIN","SHFE|Z|SS|MAIN","SHFE|Z|HC|MAIN","SHFE|Z|FU|MAIN","SHFE|Z|BU|MAIN","SHFE|Z|RU|MAIN","SHFE|Z|SP|MAIN" ]KCSL=1 #开仓手数
HDCS=2 #滑点参数# 策略开始运行时执行该函数一次
def initialize(context): # 订阅K线周期数据for x in HYMCLB :SetBarInterval(x,'M',g_params['ZQ'],'A') # 策略触发事件每次触发时都会执行该函数
def handle_data(context):for x in HYMCLB :if CurrentBar(x,'M',g_params['ZQ']) < g_params['p3'] :returnma1 =talib.MA(Close(x,'M',g_params['ZQ']), g_params['p1'])ma2 =talib.MA(Close(x,'M',g_params['ZQ']), g_params['p2'])ma3 =talib.MA(Close(x,'M',g_params['ZQ']), g_params['p3'])# LogInfo(x,"ma1:",ma1[-1],"ma2:",ma2[-1],"ma3:",ma3[-1])if len(ma3)>g_params['p3'] and MarketPosition(x) != 1 and OpenInt(x,'M',g_params['ZQ'])[-1]>12000 \and ma1[-2]>ma3[-2] and ma1[-3]<ma3[-3] :Buy(KCSL,Open(x,'M',g_params['ZQ'])[-1]+PriceTick(x)*HDCS,x)if len(ma3)>g_params['p3'] and MarketPosition(x) ==1 and OpenInt(x,'M',g_params['ZQ'])[-1]>12000 \and BarsSinceLastBuyEntry(x)>2 and BuyPosition(x)<3 \and Close(x,'M',g_params['ZQ'])[-2]>ma3[-2] and ma1[-2]>ma2[-2] and ma1[-3]<ma2[-3] :Buy(KCSL,Open(x,'M',g_params['ZQ'])[-1]+PriceTick(x)*HDCS,x)if len(ma3)>g_params['p3'] and MarketPosition(x) != -1 and OpenInt(x,'M',g_params['ZQ'])[-1]>12000 \and ma1[-2]<ma3[-2] and ma1[-3]>ma3[-3] :SellShort(KCSL,Open(x,'M',g_params['ZQ'])[-1]-PriceTick(x)*HDCS,x)if len(ma3)>g_params['p3'] and MarketPosition(x) ==-1 and OpenInt(x,'M',g_params['ZQ'])[-1]>12000 \and BarsSinceLastSellEntry(x)>2 and SellPosition(x)<3 \and Close(x,'M',g_params['ZQ'])[-2]<ma3[-2] and ma1[-2]<ma2[-2] and ma1[-3]>ma2[-3] :SellShort(KCSL,Open(x,'M',g_params['ZQ'])[-1]-PriceTick(x)*HDCS,x)