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

 找回密码
 立即注册

《周易.系辞》

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

《吕氏.春秋》

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

《晏子·霸业因时而生》

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

《周易.系辞》

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

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

《寒窑赋》

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

《周易.系辞》

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

圣人云:

君子务本,本立而道生!

 《势胜学》

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

《周易·系辞上传》:

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

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

《礼记.中庸》:

凡事预则立,不预则废!

查看: 1488|回复: 0

[【优秀推荐】曲线完美收益中等] 布林带收窄突破

[复制链接]

1653

主题

1887

帖子

1万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
11906

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

QQ
侦云取势 发表于 2025-4-7 05:38:58 | 显示全部楼层 |阅读模式
多头入场
布林带收窄:当前带宽(上轨-下轨) < 过去20日平均带宽 × 0.8到1.1期间都开单

价格突破:收盘价 > 布林带上轨

波动放大:当前ATR值 > 前5根K线平均ATR × 1.2到1.5期间

空头入场
布林带收窄:当前带宽 < 过去20日平均带宽 × 0.8到1.1期间都开单

价格突破:收盘价 < 布林带下轨

波动放大:当前ATR值 > 前5根K线平均ATR × 1.2 1.2到1.5期间

三、出场规则
止损规则
多头止损:布林带中轨 - 2 × 当前ATR

空头止损:布林带中轨 + 2 × 当前ATR

止盈规则(二选一)
选项1:固定盈亏比1:2

止盈价 = 入场价 ± (止损距离 × 2)
(例:多头止损距离=入场价-止损价,止盈价=入场价+2×止损距离)

//+------------------------------------------------------------------+
//|                                                   BB_ATR_EA.mq5 |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

input double BandRatio1      = 0.8;    // 布林带收窄下限系数
input double BandRatio2      = 1.1;    // 布林带收窄上限系数
input int    BandPeriod      = 20;     // 布林带周期
input double BandDeviation   = 2.0;    // 布林带标准差
input int    ATRPeriod       = 14;     // ATR周期
input double ATRMultiMin     = 1.2;    // ATR最小倍数
input double ATRMultiMax     = 1.5;    // ATR最大倍数
input int    ATRLookback     = 5;      // ATR比较周期
input double RiskPercent     = 2.0;    // 风险百分比
input double SLMultiplier    = 2.0;    // 止损ATR倍数
input double RRRatio         = 2.0;    // 盈亏比

int bandsHandle, atrHandle;
double upperBand[], middleBand[], lowerBand[], atrBuffer[], closePrice[];
datetime lastBarTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   bandsHandle = iBands(_Symbol, _Period, BandPeriod, 0, BandDeviation, PRICE_CLOSE);
   atrHandle = iATR(_Symbol, _Period, ATRPeriod);

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

   ArraySetAsSeries(upperBand, true);
   ArraySetAsSeries(middleBand, true);
   ArraySetAsSeries(lowerBand, true);
   ArraySetAsSeries(atrBuffer, true);
   ArraySetAsSeries(closePrice, true);

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   IndicatorRelease(bandsHandle);
   IndicatorRelease(atrHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if(!isNewBar()) return;

   // 获取最新数据
   CopyBuffer(bandsHandle, 1, 0, BandPeriod+2, upperBand);
   CopyBuffer(bandsHandle, 0, 0, BandPeriod+2, middleBand);
   CopyBuffer(bandsHandle, 2, 0, BandPeriod+2, lowerBand);
   CopyBuffer(atrHandle, 0, 0, ATRLookback+2, atrBuffer);
   CopyClose(_Symbol, _Period, 0, 2, closePrice);

   // 计算布林带带宽参数
   double currentBand = upperBand[0] - lowerBand[0];
   double avgBand = 0;
   for(int i=1; i<=BandPeriod; i++) avgBand += (upperBand - lowerBand);
   avgBand /= BandPeriod;

   // 计算ATR参数
   double currentATR = atrBuffer[0];
   double avgATR = 0;
   for(int i=1; i<=ATRLookback; i++) avgATR += atrBuffer;
   avgATR /= ATRLookback;

   // 获取当前价格
   double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   // 检查多头条件
   if(currentBand > avgBand*BandRatio1 &&
      currentBand < avgBand*BandRatio2 &&
      closePrice[1] > upperBand[1] &&
      currentATR > avgATR*ATRMultiMin &&
      currentATR < avgATR*ATRMultiMax)
   {
      double sl = middleBand[0] - SLMultiplier*currentATR;
      double tp = askPrice + (askPrice - sl)*RRRatio;
      OpenTrade(ORDER_TYPE_BUY, sl, tp);
   }

   // 检查空头条件
   if(currentBand > avgBand*BandRatio1 &&
      currentBand < avgBand*BandRatio2 &&
      closePrice[1] < lowerBand[1] &&
      currentATR > avgATR*ATRMultiMin &&
      currentATR < avgATR*ATRMultiMax)
   {
      double sl = middleBand[0] + SLMultiplier*currentATR;
      double tp = bidPrice - (sl - bidPrice)*RRRatio;
      OpenTrade(ORDER_TYPE_SELL, sl, tp);
   }
}
//+------------------------------------------------------------------+
//| 开仓函数                                                         |
//+------------------------------------------------------------------+
bool OpenTrade(ENUM_ORDER_TYPE type, double sl, double tp)
{
   if(PositionSelect(_Symbol)) return false;

   MqlTradeRequest request = {};
   MqlTradeResult result = {};
   ZeroMemory(request);
   ZeroMemory(result);

   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = LotSize();
   request.type = type;
   request.price = (type == ORDER_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
                                           : SymbolInfoDouble(_Symbol, SYMBOL_BID);
   request.sl = sl;
   request.tp = tp;
   request.deviation = 5;
   request.type_filling = ORDER_FILLING_FOK;

   if(!OrderSend(request, result)){
      Print("开仓失败 错误码:", GetLastError());
      return false;
   }
   return true;
}
//+------------------------------------------------------------------+
//| 计算手数大小                                                     |
//+------------------------------------------------------------------+
double LotSize()
{
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);
   double lot = (balance * RiskPercent/100) / 1000.0;
   return NormalizeDouble(lot, 2);
}
//+------------------------------------------------------------------+
//| 判断新K线                                                       |
//+------------------------------------------------------------------+
bool isNewBar()
{
   datetime currentBarTime = iTime(_Symbol, _Period, 0);
   if(currentBarTime != lastBarTime){
      lastBarTime = currentBarTime;
      return true;
   }
   return false;
}
//+------------------------------------------------------------------+

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

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

使用道具 举报

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

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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