找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 6|回复: 0

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

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-25 12:49:00 | 显示全部楼层 |阅读模式
策略内容:在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);

       }

     }

  }

//+------------------------------------------------------------------+

//| 判断是否是新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 = array[i - 1];

     }

   array[position] = value;

  }

//+------------------------------------------------------------------+

//| 输入参数和全局变量                                              |

//+------------------------------------------------------------------+

input int ma_period = 14; // 均线周期

int ma_handle = INVALID_HANDLE; // 移动平均线句柄

double troughs[];

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

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-11 22:45 , Processed in 0.106299 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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