My语言怎么实现DMI量化交易策略

发布时间:2022-03-25 16:58:11 作者:iii
来源:亿速云 阅读:377
# My语言怎么实现DMI量化交易策略

## 一、DMI指标原理概述

DMI(Directional Movement Index)方向移动指标是由J.Welles Wilder开发的技术分析工具,主要用于判断市场趋势强度和方向。该指标包含四个核心组件:

1. **+DI(正向指标)**:反映上升趋势强度
2. **-DI(负向指标)**:反映下降趋势强度
3. **ADX(平均趋向指数)**:衡量整体趋势强度
4. **ADXR(平均趋向指数评级)**:ADX的平滑版本

经典交易规则:
- 当+DI上穿-DI且ADX>25时,产生买入信号
- 当-DI上穿+DI且ADX>20时,产生卖出信号

## 二、My语言环境准备

### 2.1 开发环境配置
```my
// 检查并导入必要库
if not library_exists("quant") then
    import quant as q
end

// 设置回测参数
start_time = "2020-01-01"
end_time = "2023-12-31"
capital = 100000
commission = 0.0005 // 万五手续费

2.2 数据获取模块

// 获取沪深300指数数据
function get_data()
    data = q.get_history(
        symbol="000300.SH",
        start=start_time,
        end=end_time,
        frequency="1d",
        fields=["open","high","low","close","volume"]
    )
    return data
end

三、DMI核心算法实现

3.1 计算真实波幅(TR)

function calc_tr(high, low, prev_close)
    tr1 = high - low
    tr2 = abs(high - prev_close)
    tr3 = abs(low - prev_close)
    return max(tr1, tr2, tr3)
end

3.2 计算方向运动(DM)

function calc_dm(high, prev_high, low, prev_low)
    up_move = high - prev_high
    down_move = prev_low - low
    
    +dm = up_move > down_move and up_move > 0 ? up_move : 0
    -dm = down_move > up_move and down_move > 0 ? down_move : 0
    
    return +dm, -dm
end

3.3 完整DMI计算函数

function dmi(data, period=14)
    // 初始化数组
    len = length(data.close)
    +di = array(len)
    -di = array(len)
    adx = array(len)
    
    // 计算初始值
    for i = 1 to period
        +di[i] = 0
        -di[i] = 0
        adx[i] = 0
    end
    
    // 主计算循环
    for i = period+1 to len
        // 计算平滑TR和DM
        tr_sum = 0
        +dm_sum = 0
        -dm_sum = 0
        
        for j = i-period+1 to i
            tr = calc_tr(data.high[j], data.low[j], data.close[j-1])
            +dm, -dm = calc_dm(data.high[j], data.high[j-1], 
                              data.low[j], data.low[j-1])
            tr_sum += tr
            +dm_sum += +dm
            -dm_sum += -dm
        end
        
        // 计算DI值
        +di[i] = 100 * (+dm_sum / tr_sum)
        -di[i] = 100 * (-dm_sum / tr_sum)
        
        // 计算DX和ADX
        dx = 100 * abs(+di[i] - -di[i]) / (+di[i] + -di[i])
        adx[i] = i == period+1 ? dx : (adx[i-1]*(period-1) + dx)/period
    end
    
    return +di, -di, adx
end

四、交易策略实现

4.1 信号生成逻辑

function generate_signals(data)
    +di, -di, adx = dmi(data)
    
    signals = array(length(data.close))
    position = 0 // 0:空仓 1:多头 -1:空头
    
    for i = 2 to length(data.close)
        // 多头信号:+DI上穿-DI且ADX>25
        if +di[i] > -di[i] and +di[i-1] <= -di[i-1] and adx[i] > 25
            signals[i] = 1
            position = 1
        
        // 空头信号:-DI上穿+DI且ADX>20
        elseif -di[i] > +di[i] and -di[i-1] <= +di[i-1] and adx[i] > 20
            signals[i] = -1
            position = -1
        
        // 持仓延续
        else
            signals[i] = position
        end
    end
    
    return signals
end

4.2 策略回测模块

function backtest(data, signals)
    returns = array(length(data.close))
    equity = array(length(data.close))
    equity[1] = capital
    
    for i = 2 to length(data.close)
        // 计算收益率
        if signals[i-1] == 1  // 多头
            ret = (data.close[i]/data.close[i-1] - 1) - commission
        elseif signals[i-1] == -1  // 空头
            ret = (1 - data.close[i]/data.close[i-1]) - commission
        else
            ret = 0
        end
        
        returns[i] = ret
        equity[i] = equity[i-1] * (1 + ret)
    end
    
    return equity, returns
end

五、策略优化与改进

5.1 动态参数优化

function optimize_parameters(data)
    best_sharpe = -inf
    best_period = 0
    best_adx_th = 0
    
    // 参数搜索空间
    for period = 10 to 20 step 2
        for adx_th = 15 to 30 step 5
            +di, -di, adx = dmi(data, period)
            signals = generate_signals_modified(data, +di, -di, adx, adx_th)
            equity, returns = backtest(data, signals)
            sharpe = calculate_sharpe(returns)
            
            if sharpe > best_sharpe
                best_sharpe = sharpe
                best_period = period
                best_adx_th = adx_th
            end
        end
    end
    
    return best_period, best_adx_th
end

5.2 加入止损机制

function add_stoploss(signals, data, stoploss_pct=0.05)
    modified_signals = copy(signals)
    entry_price = 0
    
    for i = 2 to length(data.close)
        // 记录入场价格
        if signals[i] !=0 and signals[i-1] ==0
            entry_price = data.close[i]
        end
        
        // 检查止损
        if signals[i] ==1 and (data.close[i] < entry_price*(1-stoploss_pct))
            modified_signals[i] = 0
        elseif signals[i] ==-1 and (data.close[i] > entry_price*(1+stoploss_pct))
            modified_signals[i] = 0
        end
    end
    
    return modified_signals
end

六、策略评价指标

function evaluate(equity, returns)
    // 年化收益率
    annual_return = (equity[-1]/equity[1])^(252/length(returns)) - 1
    
    // 最大回撤
    max_drawdown = 0
    peak = equity[1]
    for i = 2 to length(equity)
        if equity[i] > peak
            peak = equity[i]
        end
        dd = (peak - equity[i])/peak
        if dd > max_drawdown
            max_drawdown = dd
        end
    end
    
    // 夏普比率
    sharpe = mean(returns)/std(returns) * sqrt(252)
    
    return {
        "annual_return": annual_return,
        "max_drawdown": max_drawdown,
        "sharpe_ratio": sharpe,
        "win_rate": calculate_win_rate(returns)
    }
end

七、完整策略执行流程

// 主程序
function main()
    // 1. 数据准备
    data = get_data()
    
    // 2. 参数优化(可选)
    best_period, best_adx_th = optimize_parameters(data)
    
    // 3. 生成信号
    +di, -di, adx = dmi(data, best_period)
    signals = generate_signals_modified(data, +di, -di, adx, best_adx_th)
    signals = add_stoploss(signals, data)
    
    // 4. 回测评估
    equity, returns = backtest(data, signals)
    metrics = evaluate(equity, returns)
    
    // 5. 结果可视化
    plot_results(data, equity, signals)
    
    return metrics
end

// 执行策略
performance = main()
print(performance)

八、注意事项

  1. 参数敏感性问题:DMI指标对周期参数(默认14)较为敏感,需进行参数优化
  2. 震荡市表现:ADX<25时市场可能处于震荡状态,建议结合其他指标过滤信号
  3. 延迟特性:作为趋势指标,DMI具有天然的滞后性
  4. 品种适配:不同交易品种需要调整ADX阈值参数
  5. 风险管理:建议单次交易风险控制在总资金的1-2%

”`

推荐阅读:
  1. AI量化交易(一)——量化交易简介
  2. c语言实现My_string

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

my语言

上一篇:My语言怎么实现SAR量化交易策略

下一篇:My语言怎么实现CTA交易系统和策略

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》