一、软件下载
https://epolestar.esunny.com.cn/download?ver=q
二、使用教程
三、问题
第一次回测的时候,发现它老是只显示今天和明天的,后来发现是因为用的系统默认的双均线策略,策略里面定死了调用k线的数量,所以是这样。
我用自己新建的策略就不会有这样的问题了。

如果要使界面添加合约生效,则屏蔽下面的代码:
SetBarInterval('ZCE|Z|SR|MAIN', 'M', 1, 4000, p2)
四、参数优化
添加参数优化的代码之后,要重新添加策略,否则相关代码不生效。
五、其他视频
https://www.bilibili.com/video/BV1PS2yBDEy7?spm_id_from=333.788.videopod.sections
六、策略
一、一个最简单的极智量化策略,用于获取白糖主力合约近20个交易日的收盘价,并通过LogInfo显示
import talib
def initialize(context):
# 设置白糖主力合约,日线周期,加载100根K线(确保足够获取20天数据)
SetBarInterval('ZCE|Z|SR|MAIN', 'D', 1, 100)
# 设置为K线触发模式
SetTriggerType(5)
def handle_data(context):
# 确保数据量足够(至少20根K线)
if CurrentBar() < 20:
return
# 获取收盘价序列
close_prices = Close()
# 取最近20个交易日的收盘价(-20到-1)
recent_20 = close_prices[-20:]
# 用LogInfo输出
LogInfo("=== 白糖主力合约最近20个交易日收盘价 ===")
for i, price in enumerate(recent_20):
LogInfo(f"第{i+1}天: {price}")


显示最近的1分钟k线的收盘价:
import talib
def initialize(context):
# 设置白糖主力合约,日线周期,加载100根K线(确保足够获取20天数据)
SetBarInterval('ZCE|Z|SR|MAIN', 'M', 1, 100)
# 设置为K线触发模式
SetTriggerType(5)
def handle_data(context):
# 确保数据量足够(至少20根K线)
if CurrentBar() < 20:
return
# 获取收盘价序列
close_prices = Close()
# 取最近20个交易日的收盘价(-20到-1)
recent_20 = close_prices[-2:-1] #如果是-1那根K线,就是会变化的,还没有走完的那根k线。
# 用LogInfo输出
LogInfo("=== 白糖主力合约前一根k线收盘价 ===")
for i, price in enumerate(recent_20):
LogInfo(f"第{i+1}根: {price}")
(二)双均线
import talib
import time
p1 = 5 # 快周期
p2 = 20 # 慢周期
qty = 1
def initialize(context):
# 设置K线稳定后发单
SetOrderWay(2)
# 设置基准合约,会覆盖界面设置的合约,建议通过界面设置(屏蔽SetBarInterval后则界面添加合约生效)
#SetBarInterval('SHFE|Z|RB|MAIN', 'D', 1, 3000, p2) 螺纹钢
#SetInitCapital(2*10000) 设置初资金为2万元
SetBarInterval('ZCE|Z|SR|MAIN', 'M', 1, 200, p2)
# 设置实盘运行
SetActual()
# 历史测回执行逻辑,定义一个函数用于回测。
def his_trigger(ma1, ma2): #ma1,ma2是一个序列
if ma1[-1] > ma2[-1] and MarketPosition() <= 0: #表示当前持仓
Buy(qty, Close()[-1])
elif ma1[-1] < ma2[-1] and MarketPosition() >= 0:
SellShort(qty, Close()[-1]) #建空仓,如果当前有多头持仓,该函数先平掉所有多仓,然后按照参数进行建空仓。
# 实盘阶段执行逻辑
def tim_trigger(ma1, ma2):
# 判断交易账号是否准备就绪 TODO
if ma1[-1] > ma2[-1] and A_TotalPosition() <= 0: #A_TotalPosition表示总持仓量,该持仓为所有持仓的合计值。MarketPosition 反映的是 “策略图表上”的理想信号仓位,用于回测;而 A_TotalPosition 反映的是 “真实账户”的持仓,用于实盘
prc = min(Q_AskPrice() + PriceTick(), Q_UpperLimit()) # 对盘超价 prc理解为price, Q_AskPrice() (卖一价),Q_UpperLimit() (涨停价)
if A_TotalPosition() < 0:
A_SendOrder(Enum_Buy(), Enum_ExitToday(), A_SellPosition(), prc) # 平空仓 A_SendOrder(买卖方向, 开平仓类型, 委托手数, 委托价格),Enum_Buy() 买入,Enum_ExitToday() 平今仓,A_SellPosition() 获取当前账户中所有的空头持仓手数
A_SendOrder(Enum_Buy(), Enum_Entry(), qty, prc) # 开多仓
elif ma1[-1] < ma2[-1] and A_TotalPosition() >= 0:
prc = max(Q_BidPrice() - PriceTick(), Q_LowLimit())
if A_TotalPosition() > 0:
A_SendOrder(Enum_Sell(), Enum_ExitToday(), A_BuyPosition(), prc) # 平多仓
A_SendOrder(Enum_Sell(), Enum_Entry(), qty, prc) # 开空仓
def handle_data(context):
if CurrentBar() < p2:
return;
ma1 = talib.MA(Close(), p1) #talib.MA(价格序列,计算周期,均线类型), talib.MA() 的返回值是一个 NumPy 一维数组
ma2 = talib.MA(Close(), p2)
his = context.strategyStatus() == 'H' #获取当前策略状态,返回值'H'表示回测阶段, 'C'表示实时数据阶段
if his:
his_trigger(ma1, ma2)
else:
tim_trigger(ma1, ma2)
PlotNumeric("ma1", ma1[-1], 0xFF0000) #后面这些是画图
PlotNumeric("ma2", ma2[-1], 0x00aa00)
fit = NetProfit() + FloatProfit() - TradeCost() if his else A_CoverProfit() + A_ProfitLoss() - A_Cost()
PlotNumeric("fit", fit, 0x0000FF, False)
四、
请参考附件中的极智量化api手册,写一个广发证券LLT指标的极智量化策略,参考代码:
参数设置中设置:
CONTRACT = 'SHFE|Z|RB|MAIN' # 基准合约(螺纹钢主连,可修改)
def initialize(context):
SetBarInterval(CONTRACT , 'D', 1, '20150101')
SetInitCapital(2*10000)
SetSlippage(2)
SetActual()