您現(xiàn)在的位置:程序化交易>> 外匯現(xiàn)貨>> MT5>> MT5知識(shí)>>正文內(nèi)容

步入新軌:MQL5的自定義指標(biāo) [MT4]

  • 原文來(lái)自MQL5官方論壇:http://articles.mql4.com/865作者:Автор: Андрей中文翻譯:bcsunwww

    --------------------------------------------------------

    介紹
    我們終于有機(jī)會(huì)試試新交易終端- MetaTrader 5了。毫無(wú)疑問(wèn),它是值得關(guān)注的,與它的前身相比,它有許多新的特性。這個(gè)平臺(tái)的重要優(yōu)勢(shì)有: 編程語(yǔ)言上的根本修改,允許用面向?qū)ο蟮姆椒ň幊獭_€允許豐富的結(jié)構(gòu)化編程。
    代碼執(zhí)行速度比MetaTrader 4快多了。
    顯示必要信息的能力有了本質(zhì)的增加。
    新終端和編程語(yǔ)言的許多新特性和能力無(wú)法一一列出,一些新鮮的東西值得我們用專門(mén)的文章分別討論。暫時(shí)還沒(méi)有面向?qū)ο蟮木幊檀a,對(duì)于開(kāi)發(fā)者而言,還有很多重要的課題。在這篇文章里,我們研究一下指標(biāo),他們的結(jié)構(gòu)、畫(huà)法、類型和編程細(xì)節(jié)等與MQL4的對(duì)比。這篇文章并不復(fù)雜,而且,這里研究的東西可以用后面的附件直接在終端里驗(yàn)證。 1、一般的結(jié)構(gòu)
    與MQL4相比,指標(biāo)的一般結(jié)構(gòu)沒(méi)有改變。
    象以前一樣,有三個(gè)函數(shù):初始化函數(shù)、數(shù)據(jù)處理過(guò)程、卸載函數(shù)
    象以前一樣,許多指標(biāo)參數(shù)可以用屬性(#property)定義。他們有許多是專門(mén)為指標(biāo)設(shè)計(jì)的,屬性和輸入?yún)?shù)象以前一樣,在全局背景下定義。
    例如,讓我們看一下彩色RSI指標(biāo)的執(zhí)行。下面的代碼是刪節(jié)版,完整版在Color_RSI.mq5里。
    //+------------------------------------------------------------------+
    //|Color_RSI.mq5 |
    //+------------------------------------------------------------------+

    // information properties
    #property copyright "TheXpert"
    #property link"theforexpert@gmail.com"
    #property version "1.00"

    // Indicator description -- the total length should not exceed 511 characters with CR symbols

    #property description "Indicator programming demo in MQL5"
    #property description "RSI indicator custom painting"

    上面指定的屬性顯示在指標(biāo)信息面板上(屬性標(biāo)簽“Common”)。看起來(lái)象下面這樣:


    // the indicator properties#property indicator_separate_window
    // indicator will be displayed in the separate subwindow
    //#property indicator_minimum 0
    //#property indicator_maximum 100#property indicator_buffers 2
    // buffers used#property indicator_plots 1
    // buffers displayed#property indicator_color1 DarkSalmon, DeepSkyBlue
    // we use 2 colors#property indicator_type1 DRAW_COLOR_LINE
    // and special color style[/pre]These properties are the indicator properties. The other properties description can be found in the help.
    //---- buffersdouble Values[]; // buffer for valuesdouble ValuesPainting[];
    // buffer for color indexesdouble BufferForCopy[];
    // additional buffer for copying
    // indicator input parameter
    sinput string _1 = "RSI Parameters";
    input intRSIPeriod= 5;
    input ENUM_APPLIED_PRICE AppliedPrice = PRICE_CLOSE;
    input string _2 = "Color settings";
    input colorDown = DarkSalmon;
    input colorUp = DeepSkyBlue;
    // variable to store indicator handleint RSIHandle;

    這里是指標(biāo)輸入?yún)?shù)和全局變量(不要和客戶終端全局變量搞混)。指標(biāo)輸入?yún)?shù)用標(biāo)識(shí)符“input”指定。
    現(xiàn)在為指標(biāo)設(shè)定枚舉是可能的了,有時(shí)對(duì)于避免選錯(cuò)參數(shù)很有用。例如:可以用下拉框把AppliedPrice數(shù)有效值列出。

    因此,所有的枚舉,包括用戶定義的,將在同一下拉框中列出。例如下面的參數(shù):

    //...enum DayOfWeek{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday};

    input DayOfWeek Day;
    //...

    將會(huì)象下面這樣顯示:

    int OnInit(){
    // set the indicator buffers
    // set Values as a buffer for displaying SetIndexBuffer(0, Values, INDICATOR_DATA);
    // set ValuesPainting as buffer for colors SetIndexBuffer(1, ValuesPainting, INDICATOR_COLOR_INDEX);
    // Set beginning of Values buffer drawing PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, RSIPeriod);
    // Set indicator name IndicatorSetString(INDICATOR_SHORTNAME, "Color RSI(" + string(RSIPeriod) + ")");
    // Set empty value for Values buffer PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
    // Set colors for the buffer PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, Down);
    PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, Up);
    RSIHandle = iRSI(NULL, 0, RSIPeriod, AppliedPrice);
    ArrayResize(BufferForCopy, 3); // Set the indexation order for buffers (as series)
    ArraySetAsSeries(Values, true);
    ArraySetAsSeries(ValuesPainting, true);
    ArraySetAsSeries(BufferForCopy, true);
    return(0);
    }
    OnInit是指標(biāo)初始化函數(shù)。在這里我們配置指標(biāo)緩存數(shù)和他們的屬性,并且定義指標(biāo)變量(不能在屬性段定義或必須動(dòng)態(tài)設(shè)定的)。還有原始數(shù)據(jù)的初始化,包括指標(biāo)句柄的分配。
    // Function for data calculation
    // note that the function parameters can be renamed
    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 toCount = (int)MathMin(rates_total, rates_total - prev_calculated + 1);

    if (prev_calculated < 0 || prev_calculated > rates_total)
    {
    toCount = rates_total;
    }

    int copied = CopyBuffer(RSIHandle, 0, 0, toCount, Values);
    if (copied == -1)
    {
    Print("Error while data copying. Error №", GetLastError());
    return 0;
    }
    // Coloring. Yes, now it became so simple
    for (int i = toCount - 2; i >= 0; --i)
    {

    if (Values[i + 1] != EMPTY_VALUE &&
    Values
    > Values[i + 1]) ValuesPainting = 1;
    else ValuesPainting = 0;
    }

    return rates_total;
    }

    OnCalculate是數(shù)據(jù)計(jì)算函數(shù)。這個(gè)函數(shù)有兩種形式。這里是它的標(biāo)準(zhǔn)形式: // the function is not obligatory in a code/*void OnDeinit(){}*/
    OnDeinit是指標(biāo)反初始化函數(shù)。通常為了釋放資源是必須的,如文件句柄。一些其他情況下不是必須的。

    2、指標(biāo)的兩種形式
    第一種是標(biāo)準(zhǔn)形式,象我們?cè)贛QL4中用過(guò)的一樣,只有一點(diǎn)修改。OnCalculate函數(shù)替代了Start函數(shù)。標(biāo)準(zhǔn)形式象下面這樣:
    int OnCalculate(const int rates_total,
    // Arrays size const int prev_calculated,
    // Bars processed on the previous callconst datetime& time[],
    // Data for the current chart and timeframe...
    const double& open[],
    const double& high[],
    const double& low[],
    const double& close[],
    const long& tick_volume[],
    const long& volume[],
    const int& spread[])
    { return rates_total;
    }
    為了減少準(zhǔn)備數(shù)據(jù)拷貝的代碼量,圖表數(shù)據(jù)作為數(shù)組直接傳入指標(biāo)參數(shù)。此外,有效K線數(shù)作為函數(shù)的第一個(gè)參數(shù),自上次調(diào)用或首次調(diào)用以來(lái)處理過(guò)的K線數(shù)作為第二個(gè)參數(shù)。 在第一次指標(biāo)調(diào)用時(shí)這個(gè)參數(shù)為0值。這個(gè)參數(shù)是IndicatorCounted()函數(shù)的替代,這對(duì)于許多開(kāi)發(fā)者來(lái)說(shuō)是不方便的。 第二種形式是MQL4里i<…>OnArray類函數(shù)的替代和擴(kuò)展。終端示例里有一個(gè)這種類型的指標(biāo)——Custom Moving Average.這類指標(biāo)是為用戶選擇的數(shù)據(jù)處理過(guò)程準(zhǔn)備的,包括自定義指標(biāo)。這類指標(biāo)數(shù)據(jù)處理函數(shù)看起來(lái)象這樣:

    int OnCalculate (const int rates_total,// the size of the price[] array
    const int prev_calculated,// bars calculated in the previous call
    const int begin,// where notional data start from
    const double& price[] // data array for calculation
    { return rates_total;}

    最后一個(gè)參數(shù)是用戶選擇的待處理數(shù)據(jù)。如果你想使用一個(gè)有很多數(shù)據(jù)緩存的指標(biāo),第一個(gè)指標(biāo)緩存將用做數(shù)據(jù)處理。


    第一個(gè)指標(biāo)的數(shù)據(jù)意味著這個(gè)指標(biāo)將被應(yīng)用到首先附加在選定圖表上的指標(biāo)。
    先前指標(biāo)的數(shù)據(jù)意味著這個(gè)指標(biāo)將被應(yīng)用到最后附加在選定圖表上的指標(biāo)。
    這些指標(biāo)可以用來(lái)組合所有堆棧。例如,用Custom Moving Average指標(biāo)可以得到三重平滑均線,利用第一條指標(biāo)數(shù)據(jù)進(jìn)行處理,然后第二個(gè)指標(biāo)平滑第一個(gè),然后第三個(gè)指標(biāo)平滑第二個(gè):


    有很多執(zhí)行這種形式的標(biāo)準(zhǔn)指標(biāo)。因此,當(dāng)你看到applied_price_or_handle這樣的指標(biāo)提示:
    它表示epY指標(biāo)的執(zhí)行方式是利用客戶數(shù)據(jù)計(jì)算——數(shù)據(jù)句柄做為applied_price_or_handle參數(shù)傳送。

    { // ... RSIHandle = iRSI(NULL, 0, RSIPeriod, AppliedPrice);
    SmoothHandle = iMA(NULL, 0, SmoothPeriod, 0, MODE_EMA, RSIHandle); // ...}

    這種形式有另一種新應(yīng)用——寫(xiě)通用指標(biāo)的能力。這樣指標(biāo)的一個(gè)例子是附件中的Direction_Brush.mq5。


    結(jié)果顯示在上圖中。這個(gè)例子中,趨勢(shì)顏色被分離到一個(gè)獨(dú)立的實(shí)體,在另一個(gè)指標(biāo)中執(zhí)行。
    當(dāng)然,他們的應(yīng)用是有限制的,因?yàn)橹荒苡迷?緩存指標(biāo)中。盡管如此,我認(rèn)為這種指標(biāo)是有用的。
    另一方面,當(dāng)你寫(xiě)一個(gè)自定義指標(biāo)時(shí),你應(yīng)該充分考慮它,因?yàn)樵?緩存指標(biāo)中主要信息處理允許避免在一個(gè)指標(biāo)中執(zhí)行多個(gè)功能。
    粗略瀏覽一下,應(yīng)用范圍并不像看起來(lái)那樣狹窄: 指標(biāo)參數(shù)表著色(頂、方向、水平、片段等),包括風(fēng)格形象;
    不同條件下的不同信號(hào);
    收集并顯示統(tǒng)計(jì)數(shù)據(jù)——例如,數(shù)據(jù)分布;
    通用指標(biāo)的結(jié)構(gòu)可以用一個(gè)緩存計(jì)算——例如,平均線、ZIGZAG。
    上面提到的特征并不全面。我想許多另人印象深刻的設(shè)計(jì)以后會(huì)被發(fā)現(xiàn)。
    3、存取數(shù)據(jù)
    在MQL5中數(shù)據(jù)存取原則已經(jīng)改變。重點(diǎn)變化在數(shù)組,做為一個(gè)結(jié)果,計(jì)算速度取得了引人注目的增長(zhǎng),現(xiàn)在,不必為每個(gè)值創(chuàng)建一個(gè)數(shù)組并調(diào)用iCustom函數(shù)了。取而代之的是,調(diào)用一個(gè)函數(shù)就可以得到必要的數(shù)據(jù)了,然后直接使用已拷貝到指定數(shù)組的想要的數(shù)據(jù)。 數(shù)據(jù)拷貝使用系統(tǒng)函數(shù)CopyBuffer執(zhí)行。在幫助文件中可以找到這個(gè)函數(shù)的描述。
    指標(biāo)和靜態(tài)數(shù)組能拷貝的最大數(shù)據(jù)量由數(shù)組的大小決定。動(dòng)態(tài)數(shù)組的大小在拷貝數(shù)據(jù)量超過(guò)它的大小時(shí)能夠改變。除此以外,還有許多存取歷史數(shù)據(jù)的函數(shù): Function
    Description
    CopyBuffer
    Gets data of a specified buffer of a certain indicator in the necessary quantity.

    CopyRates
    Gets history data of MqlRates structure of a specified symbol-period in specified quantity into the rates_array array.
    CopyTime
    The function gets to time_array history data of bar opening time for the specified symbol-period pair in the specified quantity.
    CopyOpen
    The function gets into open_array the history data of bar open prices for the selected symbol-period pair in the specified quantity.
    CopyHigh
    The function gets into high_array the history data of highest bar prices for the selected symbol-period pair in the specified quantity.
    CopyLow
    The function gets into low_array the history data of minimal bar prices for the selected symbol-period pair in the specified quantity.
    CopyClose
    The function gets into close_array the history data of bar close prices for the selected symbol-period pair in the specified quantity.
    CopyTickVolume
    The function gets into volume_array the history data of tick volumes for the selected symbol-period pair in the specified quantity.
    CopyRealVolume
    The function gets into volume_array the history data of trade volumes for the selected symbol-period pair in the specified quantity.

    CopySpread
    The function gets into spread_array the history data of spread values for the selected symbol-period pair in the specified quantity.
    祥細(xì)描述在幫助文件里有。
    這個(gè)數(shù)據(jù)只在指標(biāo)的一種形式里傳遞,其他的有他們自己的形式。
    基于歷史數(shù)據(jù)數(shù)組沒(méi)有必要雙重存在的事實(shí),建議使用一個(gè)動(dòng)態(tài)的無(wú)指標(biāo)的緩存存儲(chǔ)數(shù)據(jù)。
    4、指標(biāo)緩存
    指標(biāo)緩存數(shù)沒(méi)有限制。
    現(xiàn)在你沒(méi)有必要思考怎樣容納正確的信息、怎樣高效執(zhí)行中間計(jì)算、如何創(chuàng)建指標(biāo)組了。但是我們不能忘記緩存的存儲(chǔ)是需要內(nèi)存的。因此,如果你指定了一個(gè)歷史縱深達(dá)1000000柱的終端并在一分鐘圖表上附加上一組“厚重的”指標(biāo)組,那么,當(dāng)終端吃掉上G的內(nèi)存時(shí)你不要驚訝。 緩存的本質(zhì)經(jīng)歷了一些改變。使用的緩存數(shù)量在屬性段指定。#property indicator_buffers 2 // buffers used

    這個(gè)值相當(dāng)于緩存的數(shù)量。
    顯示的緩存數(shù)量在屬性段設(shè)定:#property indicator_plots 1 // buffers displeyed

    這里是些細(xì)節(jié)。許多繪制樣式只需要一個(gè)INDICATOR_DATA緩存來(lái)繪制。然而,有些樣式需要幾個(gè)指標(biāo)緩存來(lái)繪制。
    象下面的繪制樣式: DRAW_HISTOGRAM2 –需要2個(gè)指標(biāo)緩存(HistogramSample.mq5)


        DRAW_FILLING --需要2個(gè)指標(biāo)緩存(CrossMa.mq5)
    • ~
          DRAW_BARS --需要4個(gè)指標(biāo)緩存(BarsSample.mq5)
      • ~

        • DRAW_CANDLES --需要4個(gè)指標(biāo)緩存(CandleSample.mq5)



    現(xiàn)在所有指標(biāo)緩存可以分為三類:
      INDICATOR_DATA –在圖表上顯示數(shù)據(jù)的緩存,這些緩存為制圖和iCustom而準(zhǔn)備。他們需要事先聲明。在過(guò)于隨意的命令下,代碼編譯會(huì)成功,但附加到圖表時(shí)會(huì)失敗;
      INDICATOR_COLOR_INDEX –存儲(chǔ)顏色緩存。對(duì)于INDICATOR_DATA類型的彩色緩存索引的存儲(chǔ)是必需的有一個(gè)特殊的顏色類型。這樣的緩存(我們稱為顏色緩存)應(yīng)該在使用它的主緩存后聲明;
      INDICATOR_CALCULATIONS –這種類型緩存是為存儲(chǔ)輔助計(jì)算結(jié)果而準(zhǔn)備的。他們不在圖表上顯示。

    int OnInit()
    {
    // ...
    SetIndexBuffer(0, V2, INDICATOR_DATA);
    SetIndexBuffer(1, V2C,INDICATOR_COLOR_INDEX);
    SetIndexBuffer(2, V4, INDICATOR_DATA);
    SetIndexBuffer(3, V4C,INDICATOR_COLOR_INDEX);
    SetIndexBuffer(4, V1, INDICATOR_CALCULATIONS);
    SetIndexBuffer(5, V3, INDICATOR_CALCULATIONS);

    // ...
    return 0;
    }
    客戶指標(biāo)還有一些特征:
      圖表上顯示的指標(biāo)的是可讀的。指標(biāo)索引必須與聲明的一致;
      顏色存儲(chǔ)指標(biāo)是可讀的,但不都是,例如,上面指標(biāo)代碼中,V2C指標(biāo)可讀并可獲得必要數(shù)據(jù),但V4不能;
      象MQL4一樣,緩存不能做為中間計(jì)算,如果你想存取外部數(shù)據(jù)緩存,要聲明為INDICATOR_DATA。
    對(duì)于不可能獲得的緩存請(qǐng)求,會(huì)產(chǎn)生錯(cuò)誤碼4806。
    讓我們探討一下顏色緩存的細(xì)節(jié):
    在MQL4中,為每一個(gè)顏色建立一個(gè)緩存是必須的,但現(xiàn)在用顏色樣式,你可以為一個(gè)緩存指定63種顏色。在某些情況下,可以優(yōu)化使用的緩存數(shù)量,并節(jié)省內(nèi)存。它也打開(kāi)了書(shū)寫(xiě)指標(biāo)的新能力,特別在顯示風(fēng)格方面。
    另外,這種改革,在某些時(shí)候,與MQL4比,極大的簡(jiǎn)化了幾種顏色的應(yīng)用邏輯,最明顯的例子——用顏色區(qū)分趨勢(shì)。在MQL4里,這種簡(jiǎn)單的例子的實(shí)施需要3個(gè)緩存,并且編程復(fù)雜。

    #property indicator_color1 DarkSalmon, DeepSkyBlue // we use 2 colors
    #property indicator_type1 DRAW_COLOR_LINE
    // and special color drawing style//---- buffersdouble Values[];
    // buffer for valuesdouble ValuesPainting[];
    // buffer for color indexesint OnInit(){
    // Registering buffers
    // Values as drawing buffer SetIndexBuffer(0, Values, INDICATOR_DATA);
    // ValuesPainting as color storage buffer SetIndexBuffer(1, ValuesPainting, INDICATOR_COLOR_INDEX);
    // … return(0);}
    // function for data calculationint OnCalculate(/*…*/){ int toCount = (int)MathMin(rates_total, rates_total - prev_calculated + 1);
    int copied = CopyBuffer(RSIHandle, 0, 0, rates_total, Values);
    if (copied == -1) {Print("Error while data copying. Error №", GetLastError());return 1; }
    // Colouring. Yes, now it became so simple
    for (int i = toCount - 2; i >= 0; --i)
    {if (Values > Values[i + 1]) ValuesPainting = 1;
    else
    ValuesPainting = 0; }
    return rates_total;}

    更多的代碼,我們得到下面的圖:

    用顏色類型繪圖時(shí),你應(yīng)該注意細(xì)節(jié)。
    對(duì)于顏色緩存,當(dāng)使用動(dòng)態(tài)顏色定義表時(shí),最大的顏色數(shù)限制由indicator_colorN屬性決定。例如:
    #property indicator_color1 DarkSalmon, DeepSkyBlue // we use 2 colors
    然而,你可以象下面這樣做:
    #roperty indicator_color1Red, Red, Red, Red, Red, Red, Red, Red, //… 你可以寫(xiě)成:
    #define C Red#property indicator_color1C, C, C, C, C, C, C, C, C, C, C, C, C, C, //…
    一個(gè)緩存的最大顏色數(shù)是63。當(dāng)顏色數(shù)超過(guò)最大值時(shí),指標(biāo)不能顯示。這是一個(gè)顯示風(fēng)格的例子,使
    緩存顏色表包涵最大顏色數(shù)是2,即使你動(dòng)態(tài)設(shè)置了較大的顏色數(shù)。 你用顏色類型繪制指標(biāo)時(shí)需注意一些細(xì)節(jié)。

    總的來(lái)說(shuō),繪圖機(jī)會(huì)引人注目的增長(zhǎng)了,非常了不起。

    5、數(shù)組

    在提到數(shù)組索引之前,有必要說(shuō)明一下數(shù)據(jù)排序類型——AsSeries屬性。它不能由一些數(shù)組類型定義。
    因此,需要的顏色數(shù)要寫(xiě)在一行——屬性定義行。然后他們能動(dòng)態(tài)改變。我發(fā)現(xiàn)的最短的顏色——“紅色”。
    這個(gè)標(biāo)識(shí)不能由多維和靜態(tài)數(shù)組設(shè)定。對(duì)于傳遞到OnCalculate函數(shù)的數(shù)組類型可以設(shè)置一個(gè)這樣的標(biāo)識(shí)。使用CopyBuffer拷貝的數(shù)據(jù)不依靠AsSeries屬性。,但是,對(duì)于不同的緩存,執(zhí)行方式是不同的。
    對(duì)于指標(biāo)緩存,必須拷貝整個(gè)有效歷史縱深數(shù)據(jù)。必須記住這一點(diǎn)。
    對(duì)于動(dòng)態(tài)和靜態(tài)數(shù)組,數(shù)據(jù)拷貝方式是從現(xiàn)在拷貝到過(guò)去。
    CopyBuffer函數(shù)根據(jù)需要改變動(dòng)態(tài)緩存(除指標(biāo)的)的大小。
    不建議使用靜態(tài)數(shù)組拷貝數(shù)據(jù)。
    總而言之,我建議你經(jīng)常檢查,怎樣拷貝數(shù)據(jù)、怎樣放置他們。最簡(jiǎn)單安全的方法是: 為所有使用存儲(chǔ)歷史數(shù)據(jù)的緩存設(shè)置AsSeries屬性;
    對(duì)于不同的緩存要注意他們的結(jié)構(gòu);
    經(jīng)常檢查出錯(cuò)代碼LastError的值。
    另外,我強(qiáng)烈建議學(xué)習(xí)幫助文件,學(xué)習(xí)關(guān)于CopyBuffer函數(shù)和所有關(guān)于AsSeries屬性的函數(shù)的內(nèi)容。
    6、IndicatorCounted函數(shù)
    現(xiàn)在關(guān)于IndicatorCounted函數(shù)的辯論逐漸消失了,因?yàn)檫@個(gè)值被我們直接定義為上次函數(shù)調(diào)用的返回值。
    通常總是返回當(dāng)前函數(shù)調(diào)用所包涵的K線數(shù)rates_total值。

    int OnCalculate(const int rates_total,// array size
    const int prev_calculated,// bars processed after last call//...
    )
    { return rates_total;}

    然而,如果自從上次調(diào)用函數(shù)價(jià)格數(shù)據(jù)改變了(例如,歷史數(shù)據(jù)被調(diào)用或歷史數(shù)據(jù)空白被填充),那么輸入?yún)?shù)prev_calculated會(huì)被終端置為0值。 還有,如果OnCalculate函數(shù)返回0值,那么指標(biāo)數(shù)據(jù)不會(huì)在終端的數(shù)據(jù)窗口中顯示。因此,如果你在調(diào)用歷史數(shù)據(jù)期間或通訊失敗后看到和執(zhí)行指標(biāo),需返回1而不是0。 另一個(gè)有用的特征是可以決定在指標(biāo)中計(jì)算多少K線。這在EA中計(jì)算大量數(shù)據(jù)很有用。這個(gè)函數(shù)是BarsCalculated,它的細(xì)節(jié)在幫助文件中可以找到。
    這個(gè)函數(shù)還有一個(gè)有用的應(yīng)用。如果指標(biāo)沒(méi)有被調(diào)用,調(diào)用過(guò)程可能要花一些時(shí)間——在建立指標(biāo)句柄和使用它計(jì)算之間的時(shí)間。
    初始化和預(yù)先計(jì)算需要時(shí)間。它由計(jì)算速度和指標(biāo)細(xì)節(jié)決定。在這期間,CopyBuffer函數(shù)調(diào)用產(chǎn)生一個(gè)錯(cuò)誤碼4806——“需要的數(shù)據(jù)沒(méi)有發(fā)現(xiàn)”。
    BarsCalculated函數(shù)能用于決定指標(biāo)數(shù)據(jù)拷貝是否有效。int WPRHandle = iWPR(NULL, 0, WPRPeriod);
    int copied = CopyBuffer(WPRHandle, 0, 0, bars, Values);
    int err = GetLastError();
    if (-1 == copied) {
    if (4806 == err){
    for (int i = 0; i < 1000; ++i)
    {
    if (BarsCalculated(WPRHandle) > 0) break;
    }
    copied = CopyBuffer(WPRHandle, 0, 0, bars, Values);
    err = GetLastError();
    }
    }
    if (-1 == copied) {
    Print("Error when trying to get WPR values, last error is ", err, " bars ", bars);
    return 0; } //...

    綜上所述,我想說(shuō)在這篇文章里,只討論了一些細(xì)節(jié)。但我希望基本方面在這里已經(jīng)展現(xiàn)。如果這篇文章總能成為你找到細(xì)節(jié)信息的指引,那就太好了。如果你發(fā)現(xiàn)了文章中的任何錯(cuò)誤,或發(fā)現(xiàn)了其他重要的東西,請(qǐng)通知我,我將試著改正并盡可能提高這篇文章。我正計(jì)劃列出最近的改變,除此以外,我希望在注釋里出現(xiàn)一些有用的信息。這是我們仔細(xì)閱讀它的原因。
    附錄
    Color.mqh –包涵文件,把這個(gè)文件拷貝到MQL5/Include文件夾。這個(gè)文件是Toned_WPR指標(biāo)需要的。
    Color.mq5 --庫(kù)文件,把這個(gè)文件拷貝到MQL5/Libraries文件夾。這個(gè)文件是Toned_WPR指標(biāo)需要的
    上面的文件都是指標(biāo)。
    ACKNOWLEDGMENTS
    感謝
    另外,我要感謝Mr. Victor Rustamov (granit77)閱讀手稿,有益的討論和建議。










    概要 [ 此帖被bcsunwww在2009-11-01 00:02重新編輯 ]

【字體: 】【打印文章】【查看評(píng)論

相關(guān)文章

    沒(méi)有相關(guān)內(nèi)容
主站蜘蛛池模板: 嗯啊公交车上被群j| 成人午夜福利视频| 吃奶摸下的激烈免费视频播放| 99热国产精品| 日韩精品无码专区免费播放| 午夜福利AV无码一区二区| 91九色蝌蚪porny| 日本一区二区三区欧美在线观看| 伊人久久综在合线亚洲91| 日本成人在线看| 成人毛片一区二区| 亚洲妇熟xxxx妇色黄| 色片在线免费观看| 国产超级乱淫视频播放免费| 久久亚洲欧美国产精品| 狂野欧美激情性xxxx| 国产对白精品刺激一区二区| jizzz护士| 日韩电影免费在线观看| 免费人成年激情视频在线观看| 色婷婷激情综合| 好男人www在线视频高清视频| 亚洲专区一路线二| 精品伊人久久久香线蕉| 国产污片在线观看| yy6080一级毛片高清| 日韩高清免费在线观看| 免费在线看黄网址| 麻豆免费高清完整版视频| 大学生高清一级毛片免费| 久久亚洲AV无码精品色午夜麻豆 | 疯狂奶水freeseⅹ| 国产成人精品免费视频大全五级| www亚洲精品少妇裸乳一区二区| 日韩精品久久无码中文字幕| 人妖视频在线观看专区| 青娱乐在线视频播放| 国产超碰人人模人人爽人人喊| 中文字幕日韩哦哦哦| 欧洲乱码伦视频免费| 伊人色综合久久天天网|