- 注册时间
- 2013-9-23
- 在线时间
- 519 小时
- 最后登录
- 2022-4-4
- 阅读权限
- 200
管理员
MT4软件工程师
- 积分
- 6521
- 帖子
- 2771
- 主题
- 2761
|
TB编程教程 跟踪止损
跟踪止损有很多种方式,本模板的规则如下:当盈利达到50跳之后启动第一级跟踪止损,止损的回撤值为30跳,当盈利达到80跳之后启动第二级的跟踪止损,止损的回撤值为20跳。您也可以将这些固定的设置修改为盈利百分比,或者是某个价格的百分比。
- Vars
- Numeric MinPoint; // 一个最小变动单位,也就是一跳
- Numeric MyEntryPrice; // 开仓价格,本例是开仓均价,也可根据需要设置为某次入场的价格
- Numeric TrailingStart1(50); // 跟踪止损启动设置1
- Numeric TrailingStart2(80); // 跟踪止损启动设置2
- Numeric TrailingStop1(30); // 跟踪止损设置1
- Numeric TrailingStop2(20); // 跟踪止损设置2
- Numeric StopLossSet(50); // 止损设置
- Numeric MyExitPrice; // 平仓价格
- NumericSeries HighestAfterEntry; // 开仓后出现的最高价
- NumericSeries LowestAfterEntry; // 开仓后出现的最低价
- Begin
- ...
- If(BarsSinceentry == 0)
- {
- HighestAfterEntry = Close;
- LowestAfterEntry = Close;
- If(MarketPosition <> 0)
- {
- HighestAfterEntry = Max(HighestAfterEntry,AvgEntryPrice); // 开仓的Bar,将开仓价和当时的收盘价的较大值保留到HighestAfterEntry
- LowestAfterEntry = Min(LowestAfterEntry,AvgEntryPrice); // 开仓的Bar,将开仓价和当时的收盘价的较小值保留到LowestAfterEntry
- }
- }else
- {
- HighestAfterEntry = Max(HighestAfterEntry,High); // 记录下当前Bar的最高点,用于下一个Bar的跟踪止损判断
- LowestAfterEntry = Min(LowestAfterEntry,Low); // 记录下当前Bar的最低点,用于下一个Bar的跟踪止损判断
- }
- Commentary("HighestAfterEntry="+Text(HighestAfterEntry));
- Commentary("LowestAfterEntry="+Text(LowestAfterEntry));
- MinPoint = MinMove*PriceScale;
- MyEntryPrice = AvgEntryPrice;
- If(MarketPosition==1) // 有多仓的情况
- {
- If(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart2*MinPoint) // 第二级跟踪止损的条件表达式
- {
- If(Low <= HighestAfterEntry[1] - TrailingStop2*MinPoint)
- {
- MyExitPrice = HighestAfterEntry[1] - TrailingStop2*MinPoint;
- If(Open < MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
- Sell(0,MyExitPrice);
- }
- }else if(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart1*MinPoint)// 第一级跟踪止损的条件表达式
- {
- If(Low <= HighestAfterEntry[1] - TrailingStop1*MinPoint)
- {
- MyExitPrice = HighestAfterEntry[1] - TrailingStop1*MinPoint;
- If(Open < MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
- Sell(0,MyExitPrice);
- }
- }else if(Low <= MyEntryPrice - StopLossSet*MinPoint)//可以在这里写上初始的止损处理
- {
- MyExitPrice = MyEntryPrice - StopLossSet*MinPoint;
- If(Open < MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
- Sell(0,MyExitPrice);
- }
- }else if(MarketPosition==-1) // 有空仓的情况
- {
- If(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart2*MinPoint) // 第二级跟踪止损的条件表达式
- {
- If(High >= LowestAfterEntry[1] + TrailingStop2*MinPoint)
- {
- MyExitPrice = LowestAfterEntry[1] + TrailingStop2*MinPoint;
- If(Open > MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
- BuyToCover(0,MyExitPrice);
- }
- }else if(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart1*MinPoint)// 第一级跟踪止损的条件表达式
- {
- If(High >= LowestAfterEntry[1] + TrailingStop1*MinPoint)
- {
- MyExitPrice = LowestAfterEntry[1] + TrailingStop1*MinPoint;
- If(Open > MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
- BuyToCover(0,MyExitPrice);
- }
- }else If(High >= MyEntryPrice + StopLossSet*MinPoint)//可以在这里写上初始的止损处理
- {
- MyExitPrice = MyEntryPrice + StopLossSet*MinPoint;
- If(Open > MyExitPrice) MyExitPrice = Open; // 如果该Bar开盘价有跳空触发,则用开盘价代替
- BuyToCover(0,MyExitPrice);
- }
- }
- ...
- End
复制代码
注意事项:
- 因无法确认开仓Bar最高/低价和开仓价的先后顺序,因此以上写法一般忽略开仓Bar的处理。
- 如果某个Bar最高/低价相差很大,可能出现创新高之后跟踪止损的情况,但系统无法确认最高价和最低价的先后顺序,因此本模板只用前一个Bar的最高/低价计算最大赢利位置。
|
|