Home >  > 极智量化

极智量化

一、软件下载

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()

暧昧帖

本文暂无标签