希望祠.同舟.量化.侦云取势势能研究中心

 找回密码
 立即注册

《周易.系辞》

君子藏器于身,待时而动!

《吕氏.春秋》

君子谋时而动,顺势而为!

《晏子·霸业因时而生》

识时务者为俊杰,通机变者为英豪!

《周易.系辞》

天之所助,吉无不利,天之所助者.顺天者也!

《史记.太史公自序》
天之势,浩浩汤汤,顺之者昌,逆之者亡!

《寒窑赋》

天不得时,日月无光.地 不得时,草木不长.

《周易.系辞》

刚柔者,立本者也!变通者,识时者也!

圣人云:

君子务本,本立而道生!

 《势胜学》

不知势,无以为人也.势易而未觉,必败焉!

《周易·系辞上传》:

富有之谓大业,日新之谓盛德!

《礼记.大学》:
格物致知,正心诚意,修身齐家!

《礼记.中庸》:

凡事预则立,不预则废!

查看: 1482|回复: 0

[【优秀推荐】曲线完美收益中等] 布林突破+sar趋势过滤

[复制链接]

1653

主题

1887

帖子

1万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
11906

最佳新人活跃会员热心会员推广达人宣传达人荣誉版主勋章理事

QQ
侦云取势 发表于 2025-3-31 15:28:49 | 显示全部楼层 |阅读模式
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Bollinger Bands Squeeze with SAR Filter"

#include <Trade/Trade.mqh>

//--- 输入参数
input int      BandsPeriod = 20;           // 布林带周期
input double   BandsDeviations = 2.0;      // 标准差倍数
input double   WidthMultiplier = 1.1;      // 宽度乘数
input int      LookbackPeriod = 20;        // 回溯周期
input double   SARStep = 0.02;             // SAR步长
input double   SARMaximum = 0.2;           // SAR最大值
input double   LotSize = 0.1;              // 交易手数
input ulong    MagicNumber = 123456;       // 魔术码
input int      Slippage = 3;               // 滑点
input int      TakeProfitPoints = 6000;    // 止盈点数
input int      StopLossPoints = 5000;      // 止损点数

//--- 全局变量
int handleBands, handleSAR;
CTrade trade;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // 初始化指标句柄
   handleBands = iBands(_Symbol, _Period, BandsPeriod, 0, BandsDeviations, PRICE_CLOSE);
   handleSAR = iSAR(_Symbol, _Period, SARStep, SARMaximum);

   if(handleBands == INVALID_HANDLE || handleSAR == INVALID_HANDLE) {
      Print("指标初始化失败!");
      return(INIT_FAILED);
   }

   trade.SetExpertMagicNumber(MagicNumber);
   trade.SetDeviationInPoints(Slippage);
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 持仓检查函数                                                     |
//+------------------------------------------------------------------+
bool HasPosition()
{
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(PositionGetSymbol(i) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
         return true;
   return false;
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   static datetime prevBarTime = 0;
   datetime currentTime = iTime(_Symbol, _Period, 0);

   if(currentTime == prevBarTime) return;
   prevBarTime = currentTime;

   // 获取布林带数据
   double upper[], middle[], lower[];
   ArraySetAsSeries(upper, true);
   ArraySetAsSeries(middle, true);
   ArraySetAsSeries(lower, true);

   if(CopyBuffer(handleBands, 1, 0, LookbackPeriod+1, upper) <= 0 ||
      CopyBuffer(handleBands, 0, 0, LookbackPeriod+1, middle) <= 0 ||
      CopyBuffer(handleBands, 2, 0, LookbackPeriod+1, lower) <= 0)
   {
      Print("布林带数据获取失败!");
      return;
   }

   // 获取SAR数据
   double sarArray[];
   ArraySetAsSeries(sarArray, true);
   if(CopyBuffer(handleSAR, 0, 0, 2, sarArray) <= 0) {
      Print("SAR数据获取失败!");
      return;
   }
   double currentSAR = sarArray[0];  // 当前SAR值
   double lastSAR = sarArray[1];     // 上一根K线SAR值

   // 获取价格数据
   double lastClose = iClose(_Symbol, _Period, 1);
   double currentClose = iClose(_Symbol, _Period, 0);

   // 计算当前布林带宽度
   double currentWidth = upper[0] - lower[0];

   // 寻找过去N个宽度中的最小值
   double minWidth = DBL_MAX;
   for(int i=1; i<=LookbackPeriod; i++) {
      double w = upper - lower;
      if(w < minWidth) minWidth = w;
   }

   // SAR过滤条件
   bool sarBuyCondition = currentClose > currentSAR;  // 价格在SAR之上
   bool sarSellCondition = currentClose < currentSAR; // 价格在SAR之下

   // 交易信号检测
   if(!HasPosition() && currentWidth < minWidth * WidthMultiplier)
   {
      // 多单入场条件
      if(lastClose > upper[1] && sarBuyCondition)
      {
         double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         double sl = NormalizeDouble(ask - StopLossPoints * _Point, _Digits);
         double tp = NormalizeDouble(ask + TakeProfitPoints * _Point, _Digits);
         trade.Buy(LotSize, _Symbol, ask, sl, tp, "BB SAR Buy");
      }
      // 空单入场条件
      else if(lastClose < lower[1] && sarSellCondition)
      {
         double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
         double sl = NormalizeDouble(bid + StopLossPoints * _Point, _Digits);
         double tp = NormalizeDouble(bid - TakeProfitPoints * _Point, _Digits);
         trade.Sell(LotSize, _Symbol, bid, sl, tp, "BB SAR Sell");
      }
   }
}

  • 当布林带出现挤压形态时才会触发交易
  • 多头交易需要满足价格在SAR指标上方
  • 空头交易需要满足价格在SAR指标下方
  • 使用当前K线的SAR值进行实时判断
  • 保持原有的止盈止损和风险管理逻辑


观天之道,执天之行。
行胜于言,取时于天。

成功=艰苦劳动+正确方法+少说空话 --爱因斯坦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

人生者,生存也。
生存所需,财(钱)官(权)也。
财自食伤(子孙福德爻)生,
印星生身荫护,官财印全,适合人间生存也。
若命缺财,缺官,则失去生存权。
一旦脱离父母养育,将天天面临,
从绝望中醒来,又从绝望中睡去。来去如烟!

Archiver|小黑屋|希望祠.同舟.量化

GMT+8, 2025-5-2 21:17 , Processed in 0.022864 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表