MQL4编程入门:预定义变量详解(二)

在MQL4编程中,预定义变量为开发者提供了便捷的途径来访问图表中的各类价格数据。本文将详细介绍这些常用的数组型预定义变量,包括它们的用途、存储方式以及实际应用示例。

获取每个柱体(K线)的收盘价:Close[ ]

double Close[ ]

收盘价序列数组,包含了当前图表中每个柱子的收盘价。这些价格数据存储在数组中,且按照逆序排列:最新K线的收盘价位于下标0的位置,之前的K线则依次向后排列,最后一条K线的下标为Bars-1。

此数组为您提供了快速访问历史收盘价的途径,类似于函数iClose()的用法。

示例:

以下代码演示了如何将K线数据导出至CSV文件:

int handle = FileOpen("file.csv", FILE_CSV|FILE_WRITE, ";");
if(handle > 0)
{
    FileWrite(handle, "Time;Open;High;Low;Close;Volume");
    for(int i=0; i

获取每个柱体(K线)的开盘价:Open[ ]

double Open[ ]

开盘价序列数组,包含了当前图表中每个柱体(K线)的开盘价。与收盘价类似,这些数据也按逆序存储,最新K线的开盘价位于下标0,依次类推。

此数组的功能等同于函数iOpen()。

示例:

在计算累积指标时,您可以这样使用开盘价数组:

int i = Bars - counted_bars - 1;
while(i >= 0)
{
    double high  = High[i];
    double low   = Low[i];
    double open  = Open[i];
    double close = Close[i];
    AccumulationBuffer[i] = (close-low) - (high-close);
    if(AccumulationBuffer[i] != 0)
    {
        double diff = high - low;
        if(diff == 0)
            AccumulationBuffer[i] = 0;
        else
        {
            AccumulationBuffer[i] /= diff;
            AccumulationBuffer[i] *= Volume[i];
        }
    }
    if(i < Bars-1) AccumulationBuffer[i] += AccumulationBuffer[i+1];
    i--;
}

获取每个柱体(K线)的最高价:High[ ]

double High[ ]

最高价序列数组,包含了当前图表中每个柱体(K线)的最高价。数组同样按逆序存储,最新的最高价位于下标0。

此数组与函数iHigh()的作用相同。

示例:

查找一段时间内的最高价时,可使用如下代码:

int i = Bars - KPeriod;
if(counted_bars > KPeriod) i = Bars - counted_bars - 1;
while(i >= 0)
{
    double max = -1000000;
    int k = i + KPeriod - 1;
    while(k >= i)
    {
        double price = High[k];
        if(max < price) max = price;
        k--;
    }
    HighesBuffer[i] = max;
    i--;
}

获取每个柱体(K线)的最低价:Low[ ]

double Low[ ]

最低价序列数组,包含了当前图表中每个柱体(K线)的最低价。同样按逆序存储,最新K线的最低价下标为0。

此数组类似于函数iLow()。

示例:

查找最低价的实现方式:

int i = Bars - KPeriod;
if(counted_bars > KPeriod) i = Bars - counted_bars - 1;
while(i >= 0)
{
    double min = 1000000;
    int k = i + KPeriod - 1;
    while(k >= i)
    {
        double price = Low[k];
        if(min > price) min = price;
        k--;
    }
    LowesBuffer[i] = min;
    i--;
}

获取每个柱体(K线)的开盘时间:Time[ ]

datetime Time[ ]

开盘时间序列数组,包含了当前图表中每个柱体(K线)的开盘时间。时间以datetime型存储,表示自1970年1月1日00:00以来的总秒数。

与价格数组相似,开盘时间按逆序存储,最新K线的时间在下标0位置。

此数组等价于函数iTime()。

示例:

在计算每日支撑与阻力位时,时间数组十分有用:

for(int i=Bars-2; i>=0; i--)
{
    if(High[i+1] > LastHigh) LastHigh = High[i+1];
    if(Low[i+1] < LastLow)   LastLow  = Low[i+1];
    if(TimeDay(Time[i]) != TimeDay(Time[i+1]))
    {
        double P = (LastHigh + LastLow + Close[i+1])/3;
        double R1 = P*2 - LastLow;
        double S1 = P*2 - LastHigh;
        double R2 = P + LastHigh - LastLow;
        double S2 = P - (LastHigh - LastLow);
        double R3 = P*2 + LastHigh - LastLow*2;
        double S3 = P*2 - (LastHigh*2 - LastLow);
        LastLow  = Open[i];
        LastHigh = Open[i];
    }
    PBuffer[i]  = P;
    S1Buffer[i] = S1;
    R1Buffer[i] = R1;
    S2Buffer[i] = S2;
    R2Buffer[i] = R2;
    S3Buffer[i] = S3;
    R3Buffer[i] = R3;
}

获取每个柱体(K线)的成交量:Volume[ ]

double Volume[ ]

成交量序列数组,包含了当前图表中每个柱体(K线)的tick成交量。数组按逆序存储,最新成交量在下标0。

注意:该成交量并非实际成交手数,而是一个估计值,它反映了该K线期间tick价格变动的次数。tick变动越频繁,表明交易越活跃,成交量值越大。

此数组与函数iVolume()功能相同。

示例:

在自定义数据导出中,您可以这样使用成交量:

if(i==0 && time0 < i_time + periodseconds)
{
    d_volume += Volume[0];
    if(Low[0] < d_low)   d_low = Low[0];
    if(High[0] > d_high) d_high = High[0];
    d_close = Close[0];
}
last_fpos = FileTell(ExtHandle);
last_volume = Volume[i];
FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);

通过这些预定义变量,您可以轻松获取图表中的核心数据,为编写智能交易系统或自定义指标打下坚实基础。在实际开发中,这些数组将与循环结构配合,高效完成各类数据处理任务。