close

新建自定義指標後,會看到如下代碼,約40行。

//+----------------------------------------------- -------------------+
//| telihai-2.mq5 |
//| Copyright 2011, telihai. |
//| http://www.telihai.com/ |
//+----------------------------------------------- -------------------+
#property copyright "Copyright 2011, telihai."
#property link "http://www.telihai.com/"
#property version "1.00"
#property indicator_chart_window
//+----------------------------------------------- -------------------+
//| Custom indicator initialization function |
//+----------------------------------------------- -------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(0);
}
//+----------------------------------------------- -------------------+
//| Custom indicator iteration 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[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+----------------------------------------------- -------------------+

第一行的雙斜線“//”,就是MQL5裡用來標識註釋用的,其後一整行的內容都不會被編譯,不會影響程序,可寫一些說明和必要信息。像“+--------------+”就是為了畫出方格好看,無實際意義。單行註釋用“//”,多行註釋以“/*”開始,以“*/”結束。比如:
//這是一個單行註釋。
/*這是
一個
多行
註釋。 */

要注意的是多行註釋不能嵌套,如下:
/*注1*/
/*釋1*/
是可以的;

/*注2
/*釋2*/
注3*/
是不可以的。

第二種裡的註釋會到“釋2”後面的“*/”結束註釋。多行註釋中只能嵌入雙斜線的單行註釋。

前面方框中一些簡單信息後開始聲明特殊參數,用“#property”標識,包含一些程序屬性:copyright(版權)、link(鏈接)、version(版本),最後一個“indicator_chart_window”表示指標是顯示在K線圖上的,如果指標是獨立窗口的話,這裡會變成“indicator_separate_window”。

再往下就是
int OnInit()
{
//--- indicator buffers mapping
//---
return(0);
}

int OnInit()是初始化函數,程序一上來就運行它後面大括號之內的部分,“int”表示這個函數的返回值是整數值型的,每個函數執行完都要返回一個值,可以是數值(如“3”)、字符串(如“abc”)、布爾值(如“true”)等等。這個函數目前不執行什麼,只返回一個0,在最後一句:“return(0);”

函數名前面聲明函數類型,後面一個小括號,放參數,一個大括號,放執行語句。參數如同函數一樣,也需要聲明類型,看後一個函數:

“int OnCalculate(...”表示這個函數是數值型的,括號裡的“const”先不用管,它表示後面給的這些參數你是不可以改變其值的,程序自動賦值。

後面的:
int rates_total, // 輸入時間序列大小,就是調用的K線總數,整數值型。
int prev_calculated, // 前一次調用處理的柱
datetime &time[], // 時間,時間型。
double &open[], // 開盤價,雙精度浮點型,支持小數點後好多位。
double &high[], // 最高價
double &low[], // 最低價
double &close[], // 收盤價
long &tick_volume[], // 訂單交易量,長數值型,支持很大的整數。
long &volume[], // 真實交易量
int &spread[] // 點差

再往後大括號裡只有一句“ return(rates_total);”會執行,也就是返回K線總數。

回顧一下程序的主要結構,最上面是一塊註釋,寫一些基本信息,往下是聲明一些特殊參數,目前是根據選項自動生成的,然後是函數,一個初始化函數“OnInit()”,一個自定義的迭代函數“OnCalculate()”。 “OnInit()”是程序一開始運行執行一次的,“OnCalculate()”可以理解為每一次價格變化就執行的,如果我們需要把某一功能或流程寫成一個函數方便重複調用,只要是寫在特殊參數後面就可以。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 oanda2016 的頭像
    oanda2016

    oanda2016的部落格

    oanda2016 發表在 痞客邦 留言(0) 人氣()