如何编写代码:以上一根K线的SMA DOT价格作为平仓触发价
实现前一根K线SMA DOT价格实时平仓的代码方案
核心思路
- 计算每根K线闭合时的SMA值,固定保存前一根K线的SMA值(当前K线运行期间该值不会变化)
- 实时监控最新成交价格,一旦价格触及前一根K线的SMA值,立即触发平仓指令(无需等待当前K线结束)
TradingView Pine Script 示例代码
//@version=5 strategy("前K线SMA实时平仓策略", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=10000) // 自定义SMA参数 sma_period = input.int(20, title="SMA周期") // 计算当前K线的SMA sma_current = ta.sma(close, sma_period) // 保存前一根K线的SMA值:用var变量确保仅初始化一次,新K线启动时更新 var float prev_kline_sma = na if barstate.islast prev_kline_sma := sma_current[1] // 绘制前一根K线的SMA DOT(可视化验证) plotshape(prev_kline_sma, title="前K线SMA标记", location=location.belowbar, color=color.new(color.blue, 0), style=shape.circle, size=size.small) // ===== 示例开仓条件(可替换为你的策略逻辑)===== long_entry = ta.crossover(ta.sma(close, 10), ta.sma(close, 20)) if (long_entry) strategy.entry("多单", strategy.long) // ===== 实时平仓逻辑 ===== // 多单平仓:当前价格跌破前一根K线的SMA(触发立即平仓) if (strategy.position_size > 0 and ta.crossunder(close, prev_kline_sma)) strategy.close("多单") // 空单平仓示例(若需要) // short_entry = ta.crossunder(ta.sma(close, 10), ta.sma(close, 20)) // if (short_entry) // strategy.entry("空单", strategy.short) // if (strategy.position_size < 0 and ta.crossover(close, prev_kline_sma)) // strategy.close("空单")
代码关键点说明
var float prev_kline_sma = na:通过var声明变量,确保在脚本运行期间仅初始化一次,每根新K线启动时更新为前一根K线的SMA值barstate.islast:仅在新K线开始时更新前K线SMA,保证当前K线运行期间该值固定不变ta.crossunder/ta.crossover:用交叉判断代替简单的价格相等,避免价格反复触发平仓指令(可根据需求调整为直接判断close <= prev_kline_sma)
MetaTrader MQL5 示例逻辑
#property strict input int SMA_Period = 20; double prev_kline_sma; datetime last_bar_time = 0; int OnInit() { // 初始化时获取前一根K线的SMA值 prev_kline_sma = iMA(_Symbol, _Period, SMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1); return(INIT_SUCCEEDED); } void OnTick() { datetime current_bar_time = iTime(_Symbol, _Period, 0); // 新K线启动时更新前K线SMA值 if(current_bar_time != last_bar_time) { prev_kline_sma = iMA(_Symbol, _Period, SMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1); last_bar_time = current_bar_time; } double current_price = Close[0]; // 多单平仓:价格跌破前K线SMA if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && current_price <= prev_kline_sma) { PositionClose(PositionGetString(POSITION_SYMBOL)); } }
注意事项
- 滑点处理:实盘交易中建议设置微小的价格偏移(比如
prev_kline_sma - 2*Point),避免因滑点导致无法触发平仓 - 多空区分:多单平仓用跌破前K线SMA,空单平仓用突破前K线SMA,需根据策略方向调整判断逻辑
- 重复触发:若价格在SMA附近反复波动,可添加过滤条件(比如连续N个tick触及SMA再平仓)
内容的提问来源于stack exchange,提问作者MAG Fortunate
相关产品推荐
相关产品推荐

