策略内容:在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[];
//+-----------------------------------------------------------------+
|