在MT4中,prev_calculated
和 IndicatorCounted()
是两个与指标计算相关的函数,它们有一些区别。让我们来详细了解一下: 1. IndicatorCounted()
: - IndicatorCounted()
是一个旧版 MQL4 内置函数,返回一个整数值。 - 它用于计算从启动指标到现在没有发生变化的柱的数量。 - 换句话说,它告诉你指标自启动以来没有更新的柱的数量。 - 这对于编写一些特定的指标逻辑非常有用。 2. prev_calculated
: - prev_calculated
是新版 MQL4 中 OnCalculate()
函数的第二个参数。 - 在新版 MQL4 中,OnCalculate()
是在每次接收到新的 tick 数据时执行的内置方法。 - prev_calculated
表示上一次调用 OnCalculate()
时的柱数。 - 它用于跟踪上一次计算的柱数,以便在新柱生成时执行特定的操作。 - 与 IndicatorCounted()
不同,prev_calculated
的值在每次调用 OnCalculate()
时都会更新。 3. 使用上的区别: - 当 tick 数据到达时,prev_calculated
的值与 rates_total
相同。 - 如果你使用 Bars - IndicatorCounted()
,在 tick 数据到达时,该值将为 1。 - 但如果你使用 rates_total - prev_calculated
,在 tick 数据到达时,该值将为 0。 - 为了实现只处理最新柱的逻辑,你可以声明一个变量,然后在每次计算时将其加 1。 - 这样,在 tick 数据到达时,rates_total - prev_calculated
将为 1,从而只执行一次处理。 总之,prev_calculated
对于避免重新绘制(repaint)指标非常有用。通过在新柱生成时执行特定操作,你可以有效地控制指标的行为。123
当你在 MT4 中编写自定义指标时,你可以使用 rates_total
和 prev_calculated
来控制指标的计算。让我为你提供一个示例:
假设你想编写一个指标,只在新柱生成时执行特定的操作。你可以使用 rates_total - prev_calculated
来判断是否有新柱出现。
以下是一个简单的示例,展示如何使用这两个参数来实现这一目标:
0) { // 在这里添加你的逻辑代码 // 例如,更新 MyBuffer 的值 MyBuffer[0] = close[0]; // 假设我们将 MyBuffer 设置为当前收盘价 } // 返回计算的柱数 return(rates_total); } >
//+------------------------------------------------------------------+
//| MyCustomIndicator |
//| Copyright 2024, Your Name or Company Name |
//| http://www.yourwebsite.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 clrDodgerBlue
// 定义指标缓冲区
double MyBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 设置指标缓冲区
SetIndexBuffer(0, MyBuffer);
// 返回成功初始化
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator calculation function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// 计算新柱的数量
int newBars = rates_total - prev_calculated;
// 在新柱生成时执行特定操作
if (newBars > 0)
{
// 在这里添加你的逻辑代码
// 例如,更新 MyBuffer 的值
MyBuffer[0] = close[0]; // 假设我们将 MyBuffer 设置为当前收盘价
}
// 返回计算的柱数
return(rates_total);
}
在这个示例中,我们在 OnCalculate
函数中检查 rates_total - prev_calculated
的值,以确定是否有新柱生成。如果有新柱,我们可以执行特定的操作,例如更新指标缓冲区的值。