设为首页 收藏本站 切换语言

MT5关于波谷的代码,不知道哪里错了,请高人指点

| 发表于 3 天前 | 显示全部楼层 |复制链接
策略内容:在MQL5语言中,加载均线,当刚走完的K线对应的均线值小于前值时标记为P,出现P以后如果出现刚走完的K线对应的均线值大于前值,就把刚走完的K线对应的均线值定义为波谷,并存入数组。
打印的均线值没问题,可是打印波谷值的时候后,将上一根K线的收盘和当前K线的开盘之间的跳空波动算进去了,该如何排除?
代码:
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+


int OnInit()
  {
   // 创建移动平均线句柄
   ma_handle = iMA(NULL, 0, ma_period, 0, MODE_SMA, PRICE_CLOSE);

   // 检查句柄是否创建成功
   if (ma_handle == INVALID_HANDLE)
     {
      Print("Failed to create MA handle!");
      return(INIT_FAILED);
     }

   // 设置定时器,每1秒触发一次
   EventSetTimer(1);

   Print("Expert initialized successfully.");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    // 释放句柄
   if (ma_handle != INVALID_HANDLE)
     {
      IndicatorRelease(ma_handle);
      Print("MA handle released.");
     }
   // 删除定时器
   EventKillTimer();

   Print("Expert deinitialized.");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   // 只在每根K线结束时运行
   if (IsNewBar())
     {

      // 获取刚走完的K线和它的上一根K线的均线值
      double ma_values[ ]; // 存储刚走完的K线和它的上一根K线的均线值

      // 使用句柄获取均线值
      if (CopyBuffer(ma_handle, 0, 0, Bars(NULL, 0), ma_values) <= 0) // 从第1根K线开始复制2个值
        {
         Print("Failed to copy MA values!");
         return;
        }
      // 获取刚走完的K线和它的上一根K线的均线值
      double ma_last_completed = ma_values[Bars(NULL, 0)-2]; // 刚走完的K线的均线值
      double ma_previous = ma_values[Bars(NULL, 0)-3]; // 上一根K线的均线值

      // 打印均线值
      Print("刚走完的K线均线值: ", ma_last_completed, " | 上一根K线均线值: ", ma_previous);
      // 定义静态变量来存储状态
      static int p_state = 0; // 0: 未标记P, 1: 已标记P


      // 检查是否满足P条件
     if(ma_last_completed < ma_previous)
       {
        p_state = 1;// 标记P
    if(ma_last_completed < ma_previous)
       {
        p_state = 1;// 标记P
       }

     // 如果P条件满足且当前均线值大于前值,则标记为波谷
     if(p_state = 1 && ma_last_completed > ma_previous)
       {


      // 将波谷值存入数组
      ArrayInsert(troughs, ma_previous, 0); // 插入波谷值

      // 重置P状态
      p_state = 0;
       }

     // 打印波谷数组(用于调试)
     for(int i = 0; i < ArraySize(troughs); i++)
       {
      Print("Trough ", i, ": ", troughs[i]);
       }
     }
  }
//+------------------------------------------------------------------+
//| 判断是否是新K线                                                 |
//+------------------------------------------------------------------+
bool IsNewBar()
  {
   static datetime last_time = 0;
   datetime current_time = iTime(NULL, 0, 0);
   if (last_time != current_time)
     {
      last_time = current_time;
      return true;
     }
   return false;
  }
//+------------------------------------------------------------------+
//| 在数组中插入元素                                                 |
//+------------------------------------------------------------------+
void ArrayInsert(double &array[], double value, int position)
  {
   int size = ArraySize(array);
   ArrayResize(array, size + 1);
   for (int i = size; i > position; i--)
     {
      array[i] = array[i - 1];
     }
   array[position] = value;
  }
//+------------------------------------------------------------------+
//| 输入参数和全局变量                                              |
//+------------------------------------------------------------------+
input int ma_period = 14; // 均线周期
int ma_handle = INVALID_HANDLE; // 移动平均线句柄
double troughs[];
//+-----------------------------------------------------------------+



举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)