您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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 // 万五手续费
// 获取沪深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
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
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
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
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
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
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
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)
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。