> 基本原理
- 在当天收盘,计算两个值: 最高价-收盘价,和收盘价-最低价。然后取这两个值较大的那个,乘以k值,结果称为触发值。
- 在第二天开盘,记录开盘价,然后在价格超过(开盘+触发值)时马上买入,或者价格低于(开盘-触发值)时马上卖空。
- 这个系统是反转系统,没有单独止损。也就是说,反向信号也同时就是平仓信号。
> 图解

`Dual Thrust 策略包含完整的图表显示, 图表动态更新,模板引用等功能, 可做学习模板使用.`
var ChartCfg = {
__isStock: true,
title: {
text: 'Dual Thrust 上下轨图'
},
yAxis: {
plotLines: [{
value: 0,
color: 'red',
width: 2,
label: {
text: '上轨',
align: 'center'
},
}, {
value: 0,
color: 'green',
width: 2,
label: {
text: '下轨',
align: 'center'
},
}]
},
series: [{
type: 'candlestick',
name: '当前周期',
id: 'primary',
data: []
}, {
type: 'flags',
onSeries: 'primary',
data: [],
}]
};
var STATE_IDLE = 0;
var STATE_LONG = 1;
var STATE_SHORT = 2;
var State = STATE_IDLE;
var LastBarTime = 0;
var UpTrack = 0;
var BottomTrack = 0;
var chart = null;
var Counter = {
w: 0,
l: 0
};
var manager = null;
var logSuffix = NotifyWX ? '@' : '';
function onTick {
if {
if .length > 0) {
throw "策略启动前不能有持仓.";
}
Log, _C);
var insDetail = _C;
Log, insDetail.ShortMarginRatio.toFixed, "交割日期", insDetail.StartDelivDate);
manager = $.NewPositionManager;
}
var records = _C;
if {
return;
}
var Bar = records[records.length - 1];
if {
var HH = TA.Highest;
var HC = TA.Highest;
var LL = TA.Lowest;
var LC = TA.Lowest;
var Range = Math.max;
UpTrack = _N);
DownTrack = _N);
if {
var PreBar = records[records.length - 2];
chart.add;
} else {
for ; i > 1; i--) {
var b = records[records.length - i];
chart.add;
}
}
chart.add;
ChartCfg.yAxis.plotLines[0].value = UpTrack;
ChartCfg.yAxis.plotLines[1].value = DownTrack;
ChartCfg.subtitle = {
text: '上轨: ' + UpTrack + ' 下轨: ' + DownTrack
};
chart.update;
chart.reset;
LastBarTime = Bar.Time;
} else {
chart.add;
}
LogStatus);
var msg;
if {
if {
msg = '做多 触发价: ' + Bar.Close + ' 上轨:' + UpTrack;
if {
manager.Cover;
var profit = manager.Profit;
LogProfit;
msg += ' 平仓利润: ' + profit;
}
Log;
manager.OpenLong;
State = STATE_LONG;
chart.add;
}
}
if {
if {
msg = '做空 触发价: ' + Bar.Close + ' 下轨:' + DownTrack;
if {
manager.Cover;
var profit = manager.Profit;
LogProfit;
msg += ' 平仓利润: ' + profit;
}
Log;
manager.OpenShort;
chart.add;
State = STATE_SHORT;
}
}
}
function onexit {
var pos = _C;
if {
Log;
}
}
function main {
if !== 'Futures_CTP') {
throw "只支持传统商品期货";
}
SetErrorFilter;
LogStatus;
LogProfitReset;
chart = Chart;
chart.reset;
LoopInterval = Math.max;
while {
if ) {
onTick;
} else {
LogStatus;
}
Sleep;
}
} |