请高手帮帮忙,翻译以下指标

Discussion in 'MetaTrader' started by halliluia, Nov 9, 2009.

  1. 以下是全部代码:
    请高手帮帮忙,主要是主函数部分弄不明白。
    #property indicator_chart_window
    #property indicator_buffers 2
    #property indicator_color1 Red
    #property indicator_color2 Blue
    //----
    extern int ATR = 20;
    extern int Coeficient = 2;
    //----
    double Up[], Dn[];
    string MODE;
    bool first;
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int init()
    {
    SetIndexBuffer(0, Up);
    SetIndexStyle (0, DRAW_LINE, 0, 2);
    SetIndexEmptyValue(0, 0.0);
    SetIndexLabel (0, "Up");
    //----
    SetIndexBuffer(1, Dn);
    SetIndexStyle (1, DRAW_LINE, 0, 2);
    SetIndexEmptyValue(1, 0.0);
    SetIndexLabel (1, "Dn");
    //----
    first=true;
    //----
    return(0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function |
    //+------------------------------------------------------------------+
    int deinit()
    {
    first = true;
    return(0);
    }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function |
    //+------------------------------------------------------------------+
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function |
    //+------------------------------------------------------------------+
    int start()
    {
    int i, limit;
    double REZ, md;
    limit = Bars - ATR - 1;
    //----
    if(first)
    {
    md = 0;
    for(i = 0; i < limit; i++)
    md += iATR(NULL, 0, ATR, i);
    REZ = Coeficient*iATR(NULL, 0, ATR, limit);
    if(iATR(NULL, 0, ATR, limit) < md / limit)
    {
    Up[limit+1] = Low[limit+1] - REZ;
    MODE = "UP";
    }
    if(iATR(NULL, 0, ATR, limit) > md / limit)
    {
    Dn[limit+1] = High[limit+1] + REZ;
    MODE = "DN";
    }
    first = false;
    }
    //----
    for(i = limit - 1; i >= 0; i--)
    {
    Dn = 0;
    Up = 0;
    REZ = Coeficient*iATR(NULL, 0, ATR, i);
    //----
    if(MODE == "DN" && Low[i+1] > Dn[i+1])
    {
    Up[i+1] = Low[i+1] - REZ;
    MODE = "UP";
    }
    //----
    if(MODE == "UP" && High[i+1] < Up[i+1])
    {
    Dn[i+1] = High[i+1] + REZ;
    MODE = "DN";
    }
    //----
    if(MODE=="UP")
    {
    if(Low[i+1] > Up[i+1] + REZ)
    {
    Up = Low[i+1] - REZ;
    Dn = 0;
    }
    else
    {
    Up = Up[i+1];
    Dn = 0;
    }
    }
    //----
    if(MODE=="DN")
    {
    if(High[i+1] < Dn[i+1] - REZ)
    {
    Dn = High[i+1] + REZ;
    Up = 0;
    }
    else
    {
    Dn = Dn[i+1];
    Up = 0;
    }
    }
    }
    return(0);
    }
     
  2. 根据mt4的缓冲区长度决定REZ的初始值。
    大概是用iATR()的平均值(从计算时间点到缓冲区的开始点)与REZ的差值正负,决定MODE是Up,或者是Down。
    最后的显示,用计算时间点的(最低价 - REZ)、或者(最高价 + REZ),设置显示的画线值。