奔赴魔方量化 发表于 2024-11-25 15:31:02

各个周期的布林上下轨穿越警报该如何编写


由于外汇黄金交易的时间很长,我们不可能实时盯盘,经常由于错过信号而错过赚钱机会,那么有一款能够检测并发出警报的程序就很有必要了。mt5 提供的周期众多列入M1 M2 M3 M4 H1,H2,H6等比mt4多出不少,那我们如何编写优雅的警报代码呢!下面请听我徐徐道来:首先我们准备个数组 用于存储各个图表周期 各个数组名_chart_period[]ENUM_TIMEFRAMES//数据类型_chart_period[]= {PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,   PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1};然后 我们声明一个类 在类里面声明必要的bands(布林带)指标参数,和存储布林带上下轨值的数组在声明一个 working 函数用于判断值和发出警报1.for 图表周期2.引动指标赋值给句柄3.句柄拷贝到数组4.数组进行k线穿越判断5.发出警报(设置警报间隔秒数具体可以参考下文class bands{private:int               bands_h;//句柄int               bands_period;//布林周期double            dev;//偏差double            bands_mean[],bands_up[],bands_down[];//中上和下值数组
public:void            working();//工作函数
                  bands(int bands_periods=14,double devs=2)//有参构造   {   bands_period=bands_periods;      dev=devs;   }                  ~bands(){};};//+------------------------------------------------------------------void bands::working() {int len = ArraySize(_chart_period);//获取图表周期长度 for(int i=0;i<len;i++)   {   bands_h=iBands(Symbol(),_chart_period,bands_period,0,dev,PRICE_CLOSE);//获取句柄    指标.句柄至数组(bands_h,bands_mean,bands_up,bands_down,0,5);
   bool k_up = 交易.K线穿越某值(Symbol(),_chart_period,1,3,0,bands_up,bands_up);   bool K_down = 交易.K线穿越某值(Symbol(),_chart_period,2,3,0,bands_down,bands_down);
   if(k_up&&交易.单位时间do1(30))    {      Alert(Symbol()+" "+EnumToString(_chart_period)+" 向上上上穿越布林带上轨了");   }   if(K_down&&交易.单位时间do2(30))      {      Alert(Symbol()+" "+EnumToString(_chart_period)+" 向 下下下穿越布林带下轨了");       }    } }//+------------------------------------------------------------------+最后   就是调用了我们需要准备个EA模版1.引入类2.创造类对象3.调用工作函数
//+------------------------------------------------------------------+//|                                                   boll_alert.mq5 |
#include "bands.mqh"//引入类input int _boll_period = 14;//布林周期input double _devs = 2.0;//布林偏差bands bd(_boll_period,_devs);//有参构造类对象int OnInit(){//--- create timerEventSetTimer(60);
//---return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function                                 |//+------------------------------------------------------------------+void OnDeinit(const int reason) {//--- destroy timer//+------------------------------------------------------------------+
//|                                                      bands.mqh |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <M5/指标类.mqh>
指标类 指标;
#include <M5/交易类.mqh>
交易类 交易;
ENUM_TIMEFRAMES   _chart_period[]= {PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,
                                    PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1
                                     };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class bands
{
private:
   int               bands_h;//句柄
   int               bands_period;//布林周期
   double            dev;//偏差
   double            bands_mean[],bands_up[],bands_down[];//中上和下值数组

public:
   void            working();//工作函数

                     bands(int bands_periods=14,double devs=2)
   {
      bands_period=bands_periods;
      dev=devs;
   }
                  ~bands();
};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bands::~bands()
{
}
//+------------------------------------------------------------------+
void bands::working()
{
   int len = ArraySize(_chart_period);
   for(int i=0;i<len;i++)
   {
      bands_h=iBands(Symbol(),_chart_period,bands_period,0,dev,PRICE_CLOSE);
      指标.句柄至数组(bands_h,bands_mean,bands_up,bands_down,0,5);

      bool k_up = 交易.K线穿越某值(Symbol(),_chart_period,1,3,0,bands_up,bands_up);
      bool K_down = 交易.K线穿越某值(Symbol(),_chart_period,2,3,0,bands_down,bands_down);

      if(k_up&&交易.单位时间do1(30))
      {
         Alert(Symbol()+" "+EnumToString(_chart_period)+" 向上上上穿越布林带上轨了");
      }
      if(K_down&&交易.单位时间do2(30))
      {
         Alert(Symbol()+" "+EnumToString(_chart_period)+" 向 下下下穿越布林带下轨了");
      }
   }
}
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//|                                                   boll_alert.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert initialization function                                 |
//+------------------------------------------------------------------+
#include "bands.mqh"
input int _boll_period = 14;//布林周期
input double _devs = 2.0;//布林偏差
bands bd(_boll_period,_devs);
int OnInit()
{
//--- create timer
   EventSetTimer(60);
   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
   EventKillTimer();
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   bd.working();
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
   
}
//+------------------------------------------------------------------+


EventKillTimer();

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
bd.working();//调用工作函数
}
//+------------------------------------------------------------------

david6843 发表于 2024-12-11 23:39:08

VERY GOOD VERY GOOD

dyt20 发表于 2024-12-13 16:23:12

用的什么软件

david6843 发表于 2024-12-17 10:38:19

楼主辛苦了这个牛了,支持下!

wk6286999 发表于 2024-12-23 22:01:57

学习学习,谢谢分享,有用

38696828 发表于 2025-6-29 17:47:39

貌似很深奥的代码,感谢分享哦!

yangxiao 发表于 2025-6-30 13:12:40

学习长见识,谢谢分享。

kenlee1628 发表于 2025-7-1 00:14:43

学习了,谢谢

sky1803 发表于 2025-7-1 01:25:51

感谢分享!

38696828 发表于 2025-7-3 15:49:18

厉害,这样就很方便了!

yuiran 发表于 2025-7-10 15:45:30

感谢,试试。拷贝到mt4editor里面?

kenlee1628 发表于 2025-7-19 20:52:15

学习了,但现在都可以用AI做到了

奔赴魔方量化 发表于 2025-7-19 23:38:45

david6843 发表于 2024-12-17 10:38
楼主辛苦了这个牛了,支持下!

                谢谢

奔赴魔方量化 发表于 2025-7-19 23:39:03

38696828 发表于 2025-7-3 15:49
厉害,这样就很方便了!

             那必须的

xinhua123 发表于 2025-7-20 00:26:58

学习知识

kenlee1628 发表于 2025-7-24 19:48:25

学习了,但AI会更擅长

奔赴魔方量化 发表于 2025-7-24 20:51:38

david6843 发表于 2024-12-11 23:39
VERY GOOD VERY GOOD

         谢谢高评

weixi 发表于 2025-7-25 23:26:10

内伤了。。为什么不是MT4的。。。

zunshoujilv 发表于 2025-7-31 13:07:35

weixi 发表于 2025-7-25 23:26
内伤了。。为什么不是MT4的。。。

mt5好写方便
页: [1]
查看完整版本: 各个周期的布林上下轨穿越警报该如何编写