
等级: 新手上路
- 注册:
- 2025-6-14
- 曾用名:
|
// 螺纹钢期货30分钟均线震荡突破策略(金字塔决策交易系统版)
// 适用品种:RB00(螺纹钢主力)
// 周期:30分钟
// 策略参数设置
Params
Numeric MA5_PERIOD(5); // 5日均线周期
Numeric MA10_PERIOD(10); // 10日均线周期
Numeric MA60_PERIOD(60); // 60日均线周期
Numeric ATR_PERIOD(14); // ATR计算周期
Numeric RSI_PERIOD(14); // RSI计算周期
Numeric RSI_OVERBOUGHT(70); // RSI超买阈值
Numeric RSI_OVERSOLD(30); // RSI超卖阈值
Numeric CONSOLIDATION_THRESHOLD(1.2); // 震荡区间阈值系数
Numeric CONTRACTSIZE(10); // 合约乘数(螺纹钢10吨/手)
Numeric MARGINPERCENT(0.10); // 保证金比例
Numeric COMMISSIONRATE(0.0001); // 手续费率
Numeric SLIPPAGE(2); // 滑点设置(跳)
Numeric MAXRISKPERTRADE(0.02); // 单笔交易最大风险比例
Numeric MAXPOSITIONS(3); // 最大持仓手数
Numeric ENABLE_RSI_FILTER(1); // 是否启用RSI过滤(1=启用,0=禁用)
Numeric ENABLE_TIME_FILTER(1); // 是否启用时间过滤(1=启用,0=禁用)
Numeric STOP_LOSS_POINTS(20); // 止损点数
Numeric TAKE_PROFIT_POINTS(30); // 止盈点数
Numeric EQUITY_DRAW_DOWN(0.10); // 权益回撤百分比; // 修正:添加缺失的分号
Vars
Numeric MA5_VAL;
Numeric MA10_VAL;
Numeric MA60_VAL;
Numeric ATR_VALUE;
Numeric RSI_VALUE;
Numeric PREV_HIGH;
Numeric PREV_LOW;
Numeric PRICE_VOLATILITY;
Numeric AVG_RANGE;
Numeric IN_CONSOLIDATION;
Numeric IS_TRADING_TIME;
Numeric RSI_CONDITION_LONG;
Numeric RSI_CONDITION_SHORT;
Numeric CURRENT_EQUITY;
Numeric HIGHEST_EQUITY;
Numeric CURRENT_DRAWDOWN;
Numeric MAX_DRAWDOWN;
Numeric PREV_MARKETPOSITION;
Numeric STOP_LOSS_LONG;
Numeric STOP_LOSS_SHORT;
Numeric TAKE_PROFIT_LONG;
Numeric TAKE_PROFIT_SHORT;
Numeric EQUITY_PROTECTION;
Numeric AVL_CAPITAL;
Numeric MARGIN_PER_LOT;
Numeric MAX_LOTS_MARGIN;
Numeric RISK_PER_TRADE;
Numeric RISK_PER_LOT;
Numeric MAX_LOTS_RISK;
Numeric TRADE_LOTS;
Numeric WIN_RATE;
Numeric AVG_PROFIT;
Numeric AVG_LOSS;
Numeric PROFIT_LOSS_RATIO;
Numeric MAX_POS;
Numeric LEVERAGE;
Numeric TRADE_COUNT;
Numeric WINNING_TRADES;
Numeric LOSING_TRADES;
Numeric TOTAL_PROFIT;
Begin
// 计算技术指标
MA5_VAL = MA(CLOSE, MA5_PERIOD);
MA10_VAL = MA(CLOSE, MA10_PERIOD);
MA60_VAL = MA(CLOSE, MA60_PERIOD);
ATR_VALUE = ATR(ATR_PERIOD);
RSI_VALUE = RSI(CLOSE, RSI_PERIOD);
PREV_HIGH = REF(HIGH, 1);
PREV_LOW = REF(LOW, 1);
// 计算价格波动率
PRICE_VOLATILITY = STDDEV(CLOSE, 20) / MA(CLOSE, 20);
// 计算震荡区间
AVG_RANGE = MA(HIGH-LOW, 20);
IN_CONSOLIDATION = IIF((HIGH-LOW) < AVG_RANGE * CONSOLIDATION_THRESHOLD, 1, 0);
// 交易时段过滤
IS_TRADING_TIME = 1;
If ENABLE_TIME_FILTER = 1 Then
IS_TRADING_TIME = IIF((TIME >= 900 AND TIME <= 1130) OR (TIME >= 1330 AND TIME <= 1500) OR (TIME >= 2100 AND TIME <= 2300), 1, 0);
End If;
// RSI过滤条件
RSI_CONDITION_LONG = 1;
RSI_CONDITION_SHORT = 1;
If ENABLE_RSI_FILTER = 1 Then
RSI_CONDITION_LONG = IIF(RSI_VALUE < 50, 1, 0);
RSI_CONDITION_SHORT = IIF(RSI_VALUE > 50, 1, 0);
End If;
// 更新权益数据
CURRENT_EQUITY = ACCOUNTBALANCE + MARKETPOSITION * (CLOSE - ENTRYPRICE) * CONTRACTSIZE;
// 正确更新最高权益
If CURRENT_EQUITY > HIGHEST_EQUITY Then
HIGHEST_EQUITY = CURRENT_EQUITY;
End If;
// 计算当前回撤
CURRENT_DRAWDOWN = (HIGHEST_EQUITY - CURRENT_EQUITY) / HIGHEST_EQUITY;
// 更新最大回撤
If CURRENT_DRAWDOWN > MAX_DRAWDOWN Then
MAX_DRAWDOWN = CURRENT_DRAWDOWN;
End If;
// === 交易信号处理 ===
// 记录上一周期持仓状态
PREV_MARKETPOSITION = MARKETPOSITION;
// 止损条件
STOP_LOSS_LONG = C <= (ENTRYPRICE - STOP_LOSS_POINTS * MINPRICE) AND MARKETPOSITION > 0;
STOP_LOSS_SHORT = C >= (ENTRYPRICE + STOP_LOSS_POINTS * MINPRICE) AND MARKETPOSITION < 0;
// 止盈条件
TAKE_PROFIT_LONG = C >= (ENTRYPRICE + TAKE_PROFIT_POINTS * MINPRICE) AND MARKETPOSITION > 0;
TAKE_PROFIT_SHORT = C <= (ENTRYPRICE - TAKE_PROFIT_POINTS * MINPRICE) AND MARKETPOSITION < 0;
// 权益回撤条件
EQUITY_PROTECTION = ONEYTOT <= INITMONEY * (1 - EQUITY_DRAW_DOWN);
// 平多条件
If (MARKETPOSITION > 0 AND (HIGH >= PREV_HIGH OR RSI_VALUE >= RSI_OVERBOUGHT)) OR
STOP_LOSS_LONG OR TAKE_PROFIT_LONG OR EQUITY_PROTECTION Then
// 金字塔平仓指令
Sell("平多", 1, CLOSE, LIMIT, SLIPPAGE);
PlotText("EXIT", "多单平仓", HIGH, COLOR_RED);
// 记录交易结果
If EXITPRICE > ENTRYPRICE Then
WINNING_TRADES = WINNING_TRADES + 1;
Else
LOSING_TRADES = LOSING_TRADES + 1;
End If;
TRADE_COUNT = TRADE_COUNT + 1;
TOTAL_PROFIT = TOTAL_PROFIT + (EXITPRICE - ENTRYPRICE) * CONTRACTSIZE - (ENTRYPRICE + EXITPRICE) * CONTRACTSIZE * COMMISSIONRATE;
End If;
// 平空条件
If (MARKETPOSITION < 0 AND (LOW <= PREV_LOW OR RSI_VALUE <= RSI_OVERSOLD)) OR
STOP_LOSS_SHORT OR TAKE_PROFIT_SHORT OR EQUITY_PROTECTION Then
// 金字塔平仓指令
BuyToCover("平空", 1, CLOSE, LIMIT, SLIPPAGE);
PlotText("EXIT", "空单平仓", LOW, COLOR_GREEN);
// 记录交易结果
If ENTRYPRICE > EXITPRICE Then
WINNING_TRADES = WINNING_TRADES + 1;
Else
LOSING_TRADES = LOSING_TRADES + 1;
End If;
TRADE_COUNT = TRADE_COUNT + 1;
TOTAL_PROFIT = TOTAL_PROFIT + (ENTRYPRICE - EXITPRICE) * CONTRACTSIZE - (ENTRYPRICE + EXITPRICE) * CONTRACTSIZE * COMMISSIONRATE;
End If;
// 开仓条件 - 仅当没有持仓时检查
If MARKETPOSITION = 0 AND BARINDEX > MA60_PERIOD AND IS_TRADING_TIME = 1 Then
// 仓位计算
AVL_CAPITAL = AVAILABLEFUNDS;
MARGIN_PER_LOT = CLOSE * CONTRACTSIZE * MARGINPERCENT;
MAX_LOTS_MARGIN = FLOOR(AVL_CAPITAL / MARGIN_PER_LOT);
RISK_PER_TRADE = MAXRISKPERTRADE * AVL_CAPITAL;
RISK_PER_LOT = ATR_VALUE * CONTRACTSIZE;
MAX_LOTS_RISK = FLOOR(RISK_PER_TRADE / RISK_PER_LOT);
TRADE_LOTS = MAX(0, MIN(MAXPOSITIONS, MIN(MAX_LOTS_MARGIN, MAX_LOTS_RISK)));
// 开多条件
If TRADE_LOTS > 0 AND CLOSE > MA10_VAL AND CLOSE < OPEN AND LOW >= MA5_VAL AND IN_CONSOLIDATION = 1 AND RSI_CONDITION_LONG = 1 Then
// 金字塔开多指令
Buy("开多", TRADE_LOTS, CLOSE, LIMIT, SLIPPAGE);
PlotText("ENTRY", "开多", LOW, COLOR_BLUE);
End If;
// 开空条件
If TRADE_LOTS > 0 AND CLOSE < MA10_VAL AND CLOSE > OPEN AND HIGH <= MA5_VAL AND IN_CONSOLIDATION = 1 AND RSI_CONDITION_SHORT = 1 Then
// 金字塔开空指令
SellShort("开空", TRADE_LOTS, CLOSE, LIMIT, SLIPPAGE);
PlotText("ENTRY", "开空", HIGH, COLOR_MAGENTA);
End If;
End If;
// === 图表绘制 ===
// 绘制均线
PlotLine("MA5", MA5_VAL, COLOR_YELLOW, 1);
PlotLine("MA10", MA10_VAL, COLOR_CYAN, 1);
PlotLine("MA60", MA60_VAL, COLOR_RED, 1);
// 标记震荡区间
If IN_CONSOLIDATION = 1 Then
SetPlotColor("MA10", COLOR_GREEN);
SetPlotColor("MA60", COLOR_GREEN);
End If;
// 绘制持仓状态
If MARKETPOSITION > 0 Then
PlotText("POSITION", "持多仓", LOW, COLOR_BLUE);
End If;
If MARKETPOSITION < 0 Then
PlotText("POSITION", "持空仓", HIGH, COLOR_MAGENTA);
End If;
// 绘制止损止盈水平
If MARKETPOSITION > 0 Then
PlotLine("STOP_LOSS", ENTRYPRICE - STOP_LOSS_POINTS * MINPRICE, COLOR_RED, 2, STYLE_DASH);
PlotLine("TAKE_PROFIT", ENTRYPRICE + TAKE_PROFIT_POINTS * MINPRICE, COLOR_GREEN, 2, STYLE_DASH);
End If;
If MARKETPOSITION < 0 Then
PlotLine("STOP_LOSS", ENTRYPRICE + STOP_LOSS_POINTS * MINPRICE, COLOR_RED, 2, STYLE_DASH);
PlotLine("TAKE_PROFIT", ENTRYPRICE - TAKE_PROFIT_POINTS * MINPRICE, COLOR_GREEN, 2, STYLE_DASH);
End If;
// === 回测绩效统计 ===
If ISLASTBAR Then
// 计算胜率
WIN_RATE = IIF(TRADE_COUNT > 0, WINNING_TRADES / TRADE_COUNT * 100, 0);
// 计算平均盈亏比
AVG_PROFIT = IIF(WINNING_TRADES > 0, TOTAL_PROFIT / WINNING_TRADES, 0);
AVG_LOSS = IIF(LOSING_TRADES > 0, TOTAL_PROFIT / LOSING_TRADES, 0);
PROFIT_LOSS_RATIO = IIF(AVG_LOSS < 0, ABS(AVG_PROFIT / AVG_LOSS), 0);
// 计算杠杆倍数
MAX_POS = MAX(ABS(BKPOS), ABS(SKPOS));
LEVERAGE = IIF(MAX_POS > 0, MAX_POS * CLOSE * CONTRACTSIZE * MARGINPERCENT / INITMONEY, 0);
// 绘制绩效统计
PlotLine("EQUITY", ACCOUNTBALANCE, COLOR_PURPLE, 2);
// 输出绩效报告
Comment("策略绩效统计:" + NEWLINE +
"总交易次数: " + STR(TRADE_COUNT) + NEWLINE +
"盈利交易: " + STR(WINNING_TRADES) + NEWLINE +
"亏损交易: " + STR(LOSING_TRADES) + NEWLINE +
"胜率: " + STR(ROUND(WIN_RATE, 2)) + "%" + NEWLINE +
"总盈利: " + STR(ROUND(TOTAL_PROFIT, 2)) + NEWLINE +
"最大回撤: " + STR(ROUND(MAX_DRAWDOWN * 100, 2)) + "%" + NEWLINE +
"盈亏比: " + STR(ROUND(PROFIT_LOSS_RATIO, 2)) + NEWLINE +
"最大杠杆: " + STR(ROUND(LEVERAGE, 2)));
End If;
End; |
|