MT4編程入門1

MT4編程入門1:MT4自定義指標的基本操作

MT4自定義指標的保存目錄、指標編緝器與指標調用

一、MT4自定義指標保存在C:\Program Files\MetaTrader 4\experts\indicators這個目錄中,

該目錄中主要有二種類型的文件,

一種是mq4文件,這是MT4自定義指標的源碼文件,是一種高級語言文件,可以人工編寫修改,機器不能直接執行,但能在MT4啓動時自動編譯爲ex4可執行文件。

另一種就是ex4文件,這是MT4自定義指標的可執行文件,由mq4文件編譯得到。

mq4文件必須編譯爲ex4文件才能被MT4執行。

但ex4文件是機器碼文件,人工不可修改

另外還有一個文件是mqlcache.dat,它用來保存目錄中的文件信息,如果MT4無法自動編譯,只要刪除此文件即可解決問題

mq4文件編譯爲ex4可執行文件有兩種方法:

1、MT4啓動時,會自動把此目錄中的mq4文件編譯爲ex4文件。

2、用MQ語言編輯器打開mq4文件,點一下“編寫”按鈕,即可生成ex4文件

二、下載保存mq4文件、ex4文件

在論壇上我們經常看到有mq4文件、ex4文件可供下載,我們只要把它們保存到C:\Program Files\MetaTrader 4\experts\indicators這個目錄,也就是下面這個目錄中,就可以了。如果下載的是ex4文件,那可以直接調用;如果是mq4文件,則需要重啓動MT4,讓系統自動編譯生成ex4可執行文件。如果下載的是rar、zip等類型的壓縮文件,還必須下載後解壓到此目錄才能使用。

三、將源碼保存爲源碼文件

在論壇上,我們也經常能看到指標源碼貼在網頁上,但沒有mq4、ex4等文件可以下載,只能複製源碼。此時需要我們自己動手將源碼保存爲源碼文件,那也沒關係,非常地簡單,多點幾下鼠標就搞定。

1、打開MQ語言編輯器

2、在MQ語言編輯器中新建一個文件,文件名一定要輸,別的隨便操作都沒關係。

3、刪除新文件裏面的所有內容,成爲一個空文件,

4、接着我們就可以將網頁上源碼複製粘貼進來

試着點一下“編寫”,如果左下角出現“0錯誤,0警告”,那說明源碼沒問題,編譯通過了,成功生成了ex4可執行文件

5、還有很重要的一點,就是要把源碼文件保存到正確的目錄中

保存後,再點一下編寫。

到此,源碼保存完成。

當然,我們也還有另的辦法:

可以打開一個原已存在的mq4文件,然後另存爲你需要的文件名,再刪除文件中的所有內容成爲空文件,把網頁上的源貼到文件中保存即可

也可以在記事本中新建一個文件,把網頁上的源碼貼進記事本,然後取個文件名保存到上面提到的目錄,不過文件後綴必須輸入mq4,保存類型選擇“所以文件”

四、mt4程序調用自定義指標

這非常簡單

MT4編程入門2:指標源碼中的常用符號說明

一、註釋符:單行註釋“//”、多行註釋“/*   */”

程序不執行註釋,註釋內容僅供閱讀或保留不用的語句

在MQ語言編輯器中,註釋內容以灰色顯示

二、分號“;”

表示一個語句結束

三、逗號“,”

表示一個語句內部間隔,不結束語句。

四、等於號“=”

賦值語句,把等號後面的值賦給等號前的變量中

五、加號“+”

整數或小數,則表示值相加;字符串,則表示前後連接。

六、加加“++”

表示把符號前的變量值加1,例如:“i++;”  這實際上就是:“i=i+1;”的簡寫,表示i的值加1

七、加等於“+=”

表示把符號後的值加到符號前的變量中。例如“i+=2;”,實際上就是“i=i+2;”的簡寫,表示i的值加2

八、雙等號“==”

等於號。用於邏輯判斷,雙等號前後值相等,則返回邏輯值“真true”;雙等號前後值不相等,則返回邏輯值“假false”

九、歎號等號“!=”

不等於號。用於邏輯判斷,不等號前後值不相等,則返回邏輯值“真true”;不等號前後值相等,則返回邏輯值“假false”

十、“&&”

邏輯符“並且”

十一、“||”

邏輯符“或者”

十二、大括號“{}”

表示函數體。

{}內部爲函數體語句。

MT4編程入門3:自定義變量

一、自定義變量在使用前,必須先創建(定義),設定變量的類型和名稱。

創建時可同時賦值,也可以不賦值。名稱可以使用中文字符。

例:

int  mark;           創建一個整型變量,變量名爲“mark”。

bool 是否報警=true;  創建一個邏輯型變量,變量名爲“是否報警”,同時,賦初值“true”

二、類型和類型定義詞

自定義變量的基本類型有:

1、整形(int):就是整數,包括負整數

2、雙精度小數(double):可以簡單地理解爲帶小數位的數

3、字符串型(string)。

4、邏輯型(bool):其值分別爲“true、false”,即“真、假”,也可以寫成“1、0”(1真,0假)。

類型定義詞僅在創建變量時使用,後面使用變量時,就不能再加類型定義詞了

三、附加變量

附加變量就是在程序投入使用後,變量值允許用戶自由更改的變量,一般用作程序參數。

一般指標,例如MACD(12,26,9)參數輸入就是通過附加變量實現,(12,26,9)分別爲三個附加變量的默認值。

定義附加變量只需在變量定義語句前加“extern”

例:

extern int 週期=9;  創建一個整型附加變量,變量名爲“週期”,默認值爲9,允許用戶在程序外部修改參數值

MT4編程入門4:自定義函數

自定義函數與數學函數在本質上是一致的

例如:數學函數ft(x,y)=3x+2y (x,y爲正整數) 寫成程序語句就是:

int ft(int x,int y)

    {

     int temp;

     temp=3*x+2*y;

     return(temp);

    }

一、和自定義變量一樣,自定義函數在使用前,也必須先設立,以定義其類型、名稱、參數和運算語句。

函數類型、名稱、參數位於函數頭部(參數間以逗號分隔),

大括號中的是運算語句,也就是函數體部分。

return語句爲函數結束語句,return後面括號中的值爲函數返回值,即函數運算結果。

上例中,int爲函數類型,表示該函數的返回值(運算結果)是整數;

(x,y)爲參數,由於自定義變量使用之前都必須先創建,所以要加上類型定義詞int

ft爲函數名,有了函數名,我們就可以在別處用ft(2,1)的形式來調用此函數;

函數體部分有三句:

第一句,定義一個整形變量temp

第二句,計算temp的值

第三句,函數結束,返回調用點,以temp的值作爲本函數返回值。

此函數也可以簡寫爲:int ft(int x,int y)  {return(3*x+2*y);}

二、函數類型與類型符

函數類型就是函數返回值(運算結果)的類型,與自定義變量類型差不多

有整型(int)、雙精度型(double)、字符串型(string)、邏輯型(bool)等,

還有一種函數是以函數運行爲目的,運行結束後不需要返回值也沒有返回值的,則函數類型可以寫成void(無值型)

三、函數中如果定義了自定義變量,那麼此變量僅在本函數內部存在,函數運行結束時,自定義變量也就自動註銷。

上例中,有x、y、temp三個自定義變量,在函數運行時創建,在函數運行結束時自動消失,僅在函數內部有效,與函數外部無關。

四、函數的調用

函數調用非常簡單,只要函數名正確、參數個數一致、類型相同就能正確調用

如我們前面創建了ft(x,y)函數,則別處我們可以用ft(4,5)等樣式來調用ft(x,y)函數求值。

調用時,傳遞參數值給ft(x,y)函數(按順序把4傳給x,把5傳給y),返回結果23後繼續執行主程序。

MT4編程入門5:自定義數組

一、數組是一系列同類型變量的集合,可以同時存儲多個數值。

例:int aa[4]={4,3,2,1};

這是一個數據名爲aa、包含了4個元素的整數型數組(即數組長度爲4),可以同時存儲4個數值。

二、自定義數組也必須“先建立,後使用”

創建(定義)時,必須設定類型和名稱。

創建(定義)時,數組的元素個數也可以設定,也可以不設定

數組中第一個元素的編號爲0,第二個爲1,以此類推。編號使用方括號括起來

在這上例中aa[0]的值爲4、aa[1]的值爲3、aa[2]的值爲2、aa[3]的值爲1

創建(定義)數組的同時,可以賦初值,也可以不賦初值。

例:

int bb[];   創建數組bb,不設定數組元素個數

int cc[8];  創建數組cc,設定數組元素爲8個,不賦初值

int dd[3]={9,8,7};  創建數組dd,設定數組元素爲4個,並賦初值

賦值後,dd[0]的值爲9、dd[1]的值爲8、dd[2]的值爲7

int ee[9]={0,1,2,3};   創建數組ee,設定數組元素爲9個,但只給前4個元素賦初值

三、數組使用時的賦值

數組的賦值必須指定明確的賦值對象,除了新建數組時可以批量賦值外,數組元素必須一個一個賦值

例如:dd[2]=1;

這是對數組dd的第3個元素dd[2]([0]是第1個,[2]表示第3個)重新賦值爲1

在這裏,沒有整數型變量定義符int,

這樣,數組dd原有三個值{9,8,7}就變爲{9,8,1}

四、數組的引用

數組只是一系列變量的集合,所以每次只能使用數組中的一個元素。

數組的引用必須指定明確的引用對象,一次只能引用一個。如果需要使用整列數組,則必須逐個使用。

例如:數組aa[4]的值爲{4,3,2,1}

我們用aa來引用數組aa中的值

當i=0時,aa[i]的值爲4

當i=1時,aa[i]的值爲3

當i=2時,aa[i]的值爲2

當i=3時,aa[i]的值爲1

這樣,我們在處理數列的時候,使用數組就能帶來極大的方便

MT4編程入門6:市場數據取值

一、預定義數組(MT4已經定義好的,可以直接使用)

開盤價、最高價、最低價、收盤價、成交量等歷史數據,每根K線蠟燭都各有一個,所以必須用數組來解決問題,MT4有幾個預定義數組:

開盤價Open[]、最高價High[]、最低價Low[]、收盤價close[]、成交量Volume[]、所屬時間Time[]

類型爲雙精度double型(即精確小數)

這裏有一個位置的問題,右邊第一根K線蠟燭(即最新的蠟燭)的編號爲0,第二根蠟燭編號1,第三根蠟燭編號2,也就是說從右向左倒着數過去。

Open[0]、High[0]、Low[0]、Close[0],表示最新的開盤價、最高價、最低價、收盤價

Open[1]、High[1]、Low[1]、close[1],表示第2根K線蠟燭的開盤價、最高價、最低價、收盤價

Open[2]、High[2]、Low[2]、close[2],表示第3根K線蠟燭的開盤價、最高價、最低價、收盤價

Open[3]、High[3]、Low[3]、close[3],表示第4根K線蠟燭的開盤價、最高價、最低價、收盤價

Open、High、Low、close,表示第i+1根K線蠟燭的開盤價、最高價、最低價、收盤價

以此類推。。。。。。

注意:這些是數組,用的是方括號。

二、預定義變量

買入價、賣出價是實時價格,MT4用預定義變量Ask和Bid表示,數值類型爲double雙精度

還有一些預定義變量,如:

Bars 表示圖表中的蠟燭數,類型爲int整數型

Digits 表示當前貨幣對的小數位,類型爲int整數型,無日元幣對爲4,有日元幣對爲2,黃金石油等一般也爲2

Point 表示當前貨幣對的點值,類型爲雙精度double型,無日元幣對爲0.0001,有日元幣對爲0.01。與Digits正好相反。

三、指標函數

1、價格、成交量、時間

它們都有三個參數:貨幣對名、K線週期、位置序號

開盤價:iOpen(symbol,timeframe,shift)    雙精度double型

收盤價:iClose(symbol,timeframe,shift)    雙精度double型

最高價:iHigh(symbol,timeframe,shift)    雙精度double型

最低價:iLow(symbol,timeframe,shift)    雙精度double型

成交量:iVolume(symbol,timeframe,shift)  雙精度double型

所屬時間:iTime(symbol,timeframe,shift)  日期時間datetime型

K線週期爲:1分鐘圖(PERIOD_M1)、5分鐘圖(PERIOD_M5)、15分鐘圖(PERIOD_M15)、30分鐘圖(PERIOD_M30)、

1小時圖(PERIOD_H1)、4小時圖(PERIOD_H4)、日線圖(PERIOD_D1)、周線圖(PERIOD_W1)、周線圖(PERIOD_W1)、月線圖(PERIOD_W1)

例:

iOpen("USDJPY",PERIOD_H1,0)   表示美元兌日元1小時圖最新K線蠟燭的開盤價

iClose("EURUSD",PERIOD_H4,2)  表示歐元兌美元4小時圖第3根K線蠟燭的收盤價

iClose("GBPUSD",PERIOD_H1,i)  表示英磅兌美元1小時圖第i+1根K線蠟燭的收盤價

iHigh(NULL,0,0)               既不指定商品,也不指定K線週期,用在誰就是誰,用在哪就是哪

2、移動平均值。雙精度double型

iMA(symbol, timeframe, period, ma_shift, ma_method, applied_price, shift)

參數共7個,分別爲:商品名稱、K線週期、均線週期、均線偏移、平均模式、價格種類、位置

均線週期:10天平均線的均線週期爲10,20天均線的均線週期爲20

均線偏移:均線位置整體左右移動的位置偏移量

平均模式:簡單移動平均(MODE_SMA)、指數移動平均(MODE_EMA)、平滑移動平均線(MODE_SMMA)、線性加權移動平均線(MODE_LWMA)

價格種類:收盤價(PRICE_CLOSE)、開盤價(PRICE_OPEN)、最高價(PRICE_HIGH)、最低價(PRICE_LOW)、中值(PRICE_MEDIAN)、5(PRICE_TYPICAL)、6(PRICE_WEIGHTED)

例1:iMA("EURUSD",PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE,0)

表示:歐元1小時圖上,以收盤價計算的,20小時簡單移動平均線,最新K線所對應位置的值

例2:iMA(NULL,0,20,0,MODE_EMA,PRICE_CLOSE,2)

表示:在當前商品、當前K線週期圖表上,以收盤價計算的,20(天)指數移動平均線 第3根K線所對應位置的值

其他如MACD指標、威廉指標、RSI、SAR、布林線等指標取值都與移動平均線指標相類似

3、在數組中求元素的移動平均值。雙精度double型

iMAOnArray(數組名, 總數, 平均週期, 均線偏移, 平均模式, 位置)

這也與iMA函數差不多,不過數據源變爲數組

從數組中不但可以求得移動平均值,還可以求得RSI等指標值

4、求自定義指標的值

我們經常自己編一些自定義指標,可用iCustom函數來取得自定義函數的值

iCustom(商品名,K線週期,自定義指標名稱,自定義指標參數1,參數2,參數3,,,自定義指標線編號,位置)

如果自定義指標只有一根指標線,則自定義指標線的編號爲0。

如果自定義指標有多根指標線,則第一條自定義指標線的編號爲0,第二條爲1,第三條爲2。。。

例如:iCustom(NULL,0,"mymacd",12,26,9,2,0)   (12,26,9)爲自定義指標mymacd的三個參數

表示:求當前圖表中,自定義指標mymacd(12,26,9)的第3條指標線在最新位置的值

拋磚引玉,這裏只是有代表性地列了幾個函數,詳細請查閱《MT4編程手冊》

MT4編程入門7:判斷語句

一、if語句

if語句很常用,也比較簡單。

規則:如果小括號中的條件成立,則執行大括號中的語句;如果不成立,則跳過大括號。

例如:

if(a==1)

    {

     b=c+1;

    }

我們在編寫報警指標的時候,就經常用到這一語句:

如果“價格向上達到指定價位”,則“報警”

如果“MACD上穿”,則“報警”

如果“均線金叉”,則“報警”。等等

例:

int mark=0;

if( High[1]<1.0000 && High[0]>=1.0000 && mark!=1)

    {

     Alert(symbol(),"價格向上觸及1.0000");

     mark=1;

    }

if( Low[1]>1.0000 && Low[0]<=1.0000 && mark!=2)

    {

     Alert(symbol(),"價格向下觸及1.0000");

     mark=2;

    }

這是一個價格上、下穿1.0000時報警的判斷語句:

上穿報警條件:當第二根K線最高價小於1.0000,並且最新K線最高價大等於1.0000

下穿報警條件:當第二根K線最低價大於1.0000,並且最新K線最低價小等於1.0000

這裏,mark是用作報警標記,mark的初值是0,

當上穿報警後,mark的值就改爲1;當下穿報警後,mark的值就改爲2;

當mark=0時,說明從未報過警,上、下穿都能報警;

當mark=1時,說明已經上穿報過警了,不能再上穿報警了,但仍可下穿報警;

當mark=2時,說明已經下穿報過警了,不能再下穿報警了,但仍可上穿報警。

二、if ... else語句

規則:如果小括號中的條件成立,則執行if下大括號中的語句1;如果不成立,則執行else下大括號中的語句2。

if(條件)

  {

  語句1;

  }

else

  {

  語句2;

  }

三、注意事項

1、只有語句後面纔用到語句結束符“;” 條件、大、小括號後面都不用“;”

2、語句用大括號括起來,但如果只有一行語句,則大括號可以省略

MT4編程入門8:循環

一幅K線圖有幾千上萬條K線,每根K線又各有開收盤價、最高低價等數值,而且還有很多移動平均線、MACD、RSI等指標值。

面對海量數據,我們必須用循環來實現數據的取值和賦值。

一、while循環

while(條件)

   {

   語句1

   語句2

   。。。

   }

規則:當小括號中的條件成立時,就執行大括號中的語句,執行完了再判斷條件是否成立,如果條件成立就繼續執行大括號中的語句。

只要條件成立,程序就不停地運行大括號中的語句(循環體),直到小括號中的條件不再成立時結束循環。

它與if語句的區別是:if語句是當條件爲真時運行一次;而while語句則是隻要條件爲真,循環體語句就不停地運行,直到條件爲假時結束循環。

例:

   extern int 快線=12;

   extern int 慢線=26;

   double buffer[];

   int i=0;

   while(i<1000)

     {

      buffer=  iMA(NULL,0,快線,0,MODE_EMA,PRICE_CLOSE,i)

                 -iMA(NULL,0,慢線,0,MODE_EMA,PRICE_CLOSE,i);

      i++;

     }

這裏,循環執行條件是i<1000,循環體中有兩個語句,一句是把兩條均線的差值賦給數組buffer,另一句“i++;”是每運行一次,i的值在原有基礎上增加1。這樣,隨着循環的不斷運行,i的值逐漸增加,循環1000次後,i的值也就從0變爲1000,此時“i<1000”就不再成立,循環結束。這樣,數組buffer[]中也就有了1000個值。

二、for循環

for循環與while循環在原理上是一致的,只是書寫格式上有所區別

把上面的例子改成for語句:

   extern int 快線=12;

   extern int 慢線=26;

   double buffer[];

   for(int i=0; i<1000; i++)

     {

      buffer=  iMA(NULL,0,快線,0,MODE_EMA,PRICE_CLOSE,i)

                 -iMA(NULL,0,慢線,0,MODE_EMA,PRICE_CLOSE,i);

     }

與前面相比,我們注意到:

“int i=0;”語句從“while(i<1000)”上方移到循環條件“i<1000”的前面;

“i++;”語句從循環體中移到了循環條件“i<1000”的後面;

循環執行順序與while循環一致:

第一步、先執行小括號中的第1句:int i=0;

(此語句用來定義初始變量,在循環中僅執行一次,可以爲沒有任何表達式的空操作符“;”)

第二步、再判斷小括號中的第2句是否成立:i<1000;

如果不成立,則循環結束;如果成立,則循環繼續運行,執行第三步

第三步、按順序執行大括號中的語句

第四步、執行小括號中的第1句:i++ (此語句即:每執行一次,i的值增加1)

然後回到第二步繼續執行循環。

再補充一點:如果循環體中(大括號中)只有一行語句,大括號可以省略

MT4編程入門9:MT4自定義指標的結構

MT4自定義指標一般由四個部分構成:

(1)文件頭部

(2)參數、變量和數組的定義

(3)初始化函數init()

(4)主函數start()

一、文件頭部,也稱爲預處理程序

預處理程序以“#”開頭,行尾無語句結束符“;”

常用的預處理程序有:

1、#property  indicator_chart_window

把指標顯示在主圖。如:均線、SRA等類指標用到此語句

2、#property indicator_separate_window

把指標顯示在副圖。如:MACD、RSI、威廉等類指標用到此語句

3、#property indicator_buffers 3

顯示3根指標線

4、#property indicator_color1 Red

第1根指標線的顏色爲Red

5、#property  indicator_width1  1

第1根指標線的粗細分別爲1

6、#property indicator_level1   0.00

在0.00值位置橫劃1條虛線

二、參數、變量和數組的定義

全局性的參數、變量、數組在此定義,局部變量可在start()函數中定義

三、初始化函數init()

init()在自定義指標加載時運行一次。

初始化函數的功能是“設置”。如果自定義指標需要劃線,則必然用到此函數

四、主函數start()

當數據有變動時,start()就被觸發。數據變動一次,start()就運行一次。

自定義指標的編程主要依靠此函數進行。

start()函數的作用主要是取值和給指標線賦值,報警也在此函數內發起。

另外,還有一個反初始化函數deinit()

deinit()在自定義卸載時運行一次,可用以去除指標加載時init()所做的初始化操作。

MT4編程入門10:畫一條指標線

要畫指標線,只要在程序中寫明以下幾點就可以了:

第一、明確指標線所在窗口,是主圖還是副圖

第二、要建立數組,用以保存指標線在各個位置的值。

第三、要建立指標線與數組的對應關係,哪個數組對應哪條指標線

第四、要明確指標線的線型,是曲線還是柱線或者是箭頭

第五、如果指標線是箭頭,還要說明是哪種箭頭

第六、給數組賦值

其中:

第一、二條寫在文件頭部中,

第三、四、五條寫在init()函數中(init函數僅在指標加載時運行一次)

第六條寫在start()函數中(start函數在數據發動變動時運行,變動一次運行一次)

下面以MACD爲例說明

我們知道,MACD指標由二條曲線和一組紅綠柱線組成。(下圖一)

其中:

白線是二根均線的差;

紫線是白線的移動平均線;

紅綠柱線則是白線和紫線的差,白線上穿紫線,出現紅柱,下穿則出現綠柱。

我們從簡單入手,先去除紫線和紅綠柱線,僅保留其中的那根白線,來看白線是怎樣畫出來的。

下面是全部語句:

#property indicator_separate_window

#property indicator_color1  White

#property indicator_level1  0

extern int FMA=12;

extern int SMA=26;

double     buf[];

int init()

  {

   SetIndexBuffer(0,buf);

   SetIndexStyle(0,DRAW_LINE);

   return(0);

  }

int start()

  {

   int limit=Bars-IndicatorCounted();

   for(int i=0; i<limit; i++)

    {

    buf=

        iMA(NULL,0,FMA,0,1,0,i)

       -iMA(NULL,0,SMA,0,1,0,i);

    }

   return(0);

  }

說明如下:

==============================================

==============================================

以下爲上述語句的簡要說明

#property indicator_separate_window

指標放在副圖

#property indicator_color1  White

第一條指標線爲白色

#property indicator_level1  0

在副圖中零值位置上畫一條水平橫線,

extern int FMA=12;

extern int SMA=26;

設立二個整數型變量,默認值爲12和26,允許外部修改值

double     buf[];

設立一個數組

int init()

初始化函數。該函數在指標加載時只運行一次。init是系統默認的函數名,但使用時仍需要進行創設,所以要加定義符int

  {

   SetIndexBuffer(0,buf);

   設置數組buf爲第一條指標線

   SetIndexStyle(0,DRAW_LINE);

   設置第一條指標線線型爲連續曲線

   return(0);

   函數結束語句

  }

int start()

指標觸發函數。與init函數不同,該函數在有數據變化時被觸發,如果數據被不斷更新,則該函數將不斷執行。start也是系統默認的函數名,但使用時也仍然需要進行創設,所以也要加定義符int

  {

   int limit=Bars-IndicatorCounted();

   自定義一個變量limit,並賦值

   Bars是圖表中的柱數

   IndicatorCounted()緩存中的柱數,就是已經計算過的有值的柱數

   這樣limit的值就是未經計算的柱數,這樣就可以起到優化程序的作用。

   for(int i=0; i<limit; i++)

   循環語句。

   循環從i=0開始,每循環一次i值增加1,一直循環到i<limit不滿足時結束循環

   由於循環變量i爲一個新變量,所以要先定義,加上整型變量定義符int

   下面大括中爲循環體,此例中只一條語句

    {

    buf=

        iMA(NULL,0,FMA,0,1,0,i)

       -iMA(NULL,0,SMA,0,1,0,i);

    }

   給數組buf賦值,其值分別爲相應位置上兩條均線的差

   i是水平位置序號值,即燭柱從右到左的序號,右邊第一個燭柱序號爲0

   return(0);

   start函數結束

  }

MT4編程入門11:MT4的報警

報警功能是MT4的一大特色。它可以在預定的條件達到時,發出警報。

與指標畫線相比,報警語句顯得非常簡單,

只要在判斷語句中加一個報警語句即可

報警方式有:彈出窗口報警、音樂報警、郵件報警等。

如果郵箱開通了手機短信通知,則郵件報警的內容會即時轉發到手機上。

1、彈出窗口報警:

當(條件達到)執行此語句時,以彈出窗口警告。

格式:Alert(內容1,內容2,內容3,內容4);

報警內容爲字符串型,內容之間加逗號

例如:

Alert( Symbol(),"4小時圖MACD上穿零軸");

2、音樂報警:

當(條件達到)執行此語句時,播放一段音樂。

格式:PlaySound("音樂文件名.wav");

文件類型爲wav格式,並且保存在C:\Program Files\MetaTrader4\sounds目錄中

文件名加引號

3、郵件報警:

當(條件達到)執行此語句時,發送一個郵件。

(收發件人地址在MT4系統中設置詳見《MT4編程實例1:一個簡單的小程序,讓你的手機搖身變成外匯行情接收機》)

格式:SendMail(標題1+標題2, 內容1+內容2);

標題之間以加號連接,內容之間也以加號連接

郵件標題和郵件內容以逗號間隔

下面是《價格穿越某均線報警》舉例

+---------------------------------

#property indicator_chart_window

extern int 警戒均線=20;

int mark=0;

int start()

{

    if(   iHigh(0,0,0) >= iMA(0,0,警戒均線,0,MODE_SMA,PRICE_CLOSE,0)

       && iHigh(0,0,1) <  iMA(0,0,警戒均線,0,MODE_SMA,PRICE_CLOSE,1)

       && mark != 1   )

          {

            Alert(Symbol(),"向上觸及30均線");

            mark = 1;

          }

    if(   iLow(0,0,0) <= iMA(0,0,警戒均線,0,MODE_SMA,PRICE_CLOSE,0)

       && iLow(0,0,1) >  iMA(0,0,警戒均線,0,MODE_SMA,PRICE_CLOSE,1)

       && mark != 2   )

          {

            Alert(Symbol(),"向下觸及",警戒均線,"均線");

            mark = 2;

          }

    return(0);

}

+---------------------------------

部分語句說明:

#property indicator_chart_window

此句是把程序放在主圖,當然這此例中放在副圖也一樣

extern int    定義一個外部參數變量,整數型,允許外部值修改

int                定義一個整數型變量

int start()    定義觸發函數

if()                判斷

iHigh()        最高價值函數

iLow()         最低價值函數

iMA()           移動平均線值函數

Alert()         報警函數

Symbol()    商品名稱函數

&&              邏輯運算符“並且”

!=                邏輯運算符“不等於”

MODE_SMA     簡單移動平均模式

PRICE_CLOSE  以收盤價計算

再說一下自定義變量mark的作用:

mark的初值是0,當上穿報警時給mark賦值1,當下穿報警時給mark賦值2。

這樣當mark的值爲1時,說明已經對上穿報過警了,就不能再次對上穿報警;

當mark的值爲2時,說明已經對下穿報過警了,就不能再次對下穿報警。

這樣就起到了消除重複報警的作用。

MT4編程入門

2009-05-01 14:42 
MT4編程入門[工具篇]爲了達到MT4自由編程的目的,我們首先需要了解MT4編程工具MetaEditor,這個工具是安裝MT4後,在程序列表裏面自動出現的MT4編程工具。

4 g- k6 g1 q+ k6 S6 n   p0 x7 @外匯牌價-外匯匯率-外匯論壇-黃金-期貨-投資理財-外匯開戶-炒外匯-外匯保證金啓動MetaEditor的方法:

2 m% }   I2 D, W6 f方法一、可以從Windows—〉開始—〉所有程序---〉MetaTrader --〉MetaEditor來啓動

( ?: b, B( m$ I: M1 e6 U" k6 s! J富倫麥匯 外匯論壇方法二、當你已經啓動了MetaTrader的情況下,點擊MetaTrader頂部菜單的 來啓動

/ @! K/ D2 N4 @: D3 U. D$ Fwww.trader-club.cn方法三、當你雙擊一個MT4的指標源碼文件的時候,Windows會自動啓動MetaEditor並將此原文件調入MetaEditor富倫麥匯 外匯論壇' E' w4 H7 e4 E% F

MetaEditor基本使用方法:

, m' s   T/ _- q! B8 u1、 建立新指標Indicator或者智能交易Expert ,2種文件的編譯後文件後綴都是.ex4,源碼文件本身後綴都是.mq4外匯牌價,外匯匯率,外匯論壇,炒外匯,保證金交易,黃金,期貨& O0 M8 t   R6 s3 w: j7 y- ^

2、 說明:指標文件Indicator必須放置在MT4安裝目錄的\expert\indicator\目錄下;智能交易文件Expert必須放置在MT4安裝目錄的\expert\目錄下;放置在上述目錄下的.ex4(指標|智能交易)文件,會被MT4自動識別並列入程序導航條下的“智能交易”以及“自定義指標”欄目裏,當你在使用MetaTrader的時候,就可以直接附加這些技術文件到你的K線圖表上。

. S7 u8 V1 y' j- C外匯牌價,外匯匯率,外匯論壇,炒外匯,保證金交易,黃金,期貨3、 如上所述,MetaTrader只認識.ex4文件,那末當我們拿到.mq4原碼文件後,如何生成.ex4文件呢?首先用MetaEditor打開原碼文件(保證原碼文件在上述的目錄裏),點擊MetaEditor頂部橫條的Compile按鈕來編譯成.ex4文件,當MetaEditor底部的編譯結果顯示:0 error(s), 0 warning(s) 就表示程序本身沒有語法問題,並且已經編譯成同名的.ex4文件了。富倫麥匯 外匯論壇. [/ D( Q4 u( n3 b$ }8 x, k

MetaEditor新建指標|智能交易的方法:8 `% R* [5 J. y( n5 j* a+ A

一種是傳統的循規蹈矩的建立方法:

4 b6 p8 ~   c1 x- p9 S- \外匯牌價,外匯匯率,外匯論壇,炒外匯,保證金交易,黃金,期貨

1.jpg (12.19 KB)

2007-9-30 14:03

富倫麥匯 外匯論壇& j% m, l1 p3 B8 V; [

點擊MetaEditor頂部菜單的 按鈕

   j" x7 ^) W1 \2 P$ H) C& X* Hwww.trader-club.cn選擇你想創建的程序類型,在MT4裏面有很多不同作用的文件分類,放置在對應的目錄下起作用。上面圖表裏面我們經常用到的是:Expert Advisor(智能交易) Custom Indicator(自定義指標)。富倫麥匯 外匯論壇) `7 c, p& x" @& N# ^2 }

點擊下一步,根據窗口的要求輸入你想使用的文件名稱,並指定所需要的“輸入變量”和初始值,最後確認進入這個指標的原碼窗口中。

& K# r7 X) d0 u6 ^. l3 J! X, P在這裏你會看到有一部分代碼已經出現,這是MetaEditor根據你前面的選擇和輸入變量,寫入的代碼。其實完全可以不理會前面所輸入的那些變量,直接採用修改代碼的方式完成指標所有屬性的設定。這就是我們要說的第2種建立指標的反應。外匯牌價,外匯匯率,外匯論壇,炒外匯,保證金交易,黃金,期貨; L4 u6 z/ q" b0 i; U" I

第2種建立指標的方法:外匯牌價-外匯匯率-外匯論壇-黃金-期貨-投資理財-外匯開戶-炒外匯-外匯保證金7 h* J+ W7 g% A. f# n. O' h

點擊按鈕彈出窗口後,選擇你想要編制的文件類型,下一步寫入指標名稱,在下一步後面的選擇可以不管,一概下一步,最後進入指標源碼窗口,注意:這時候拷貝一個已經有的指標源碼的代碼到你這代碼窗口裏面,將相關參數進行設置,刪除不必要的代碼部分,完成基本創建。www.trader-club.cn5 b: V$ a% f" i. Y! P7 B' Y6 d

MetaEditor中幫助文件的使用方法:520FX外匯牌價,外匯匯率,投資理財,外匯論壇,炒外匯, K& c4 b9 A6 v' ?

1、 MetaEditor程序界面右側豎欄是個非常好的幫助工具區,你可以在這裏直接順序查看分類函數表、搜索函數名稱和使用方法、以及直接查看MetaTrader相關目錄下的程序文件的名稱並可以隨時調入MetaEditor。

+ s" ^   Q9 L9 e, K2 }) l: uwww.trader-club.cn2、 在MetaEditor中間的程序原碼窗口裏面,當你研究別人的原碼時,出現一個你不熟悉的函數,這時候你可以將光標移動到這個函數上面,按F1,則這個函數的使用方法,會顯示在底部的窗口裏面,這是一個非常有用的查詢方式!富倫麥匯 外匯論壇3 f) n$ `! p% x( _! Q

3、 底部窗口會顯示你查詢的函數說明、使用方法、例子等等內容。

; ~* ]. {2 R& Q% a5 w外匯牌價-外匯匯率-外匯論壇-黃金-期貨-投資理財-外匯開戶-炒外匯-外匯保證金富倫麥匯 外匯論壇8 s) T* {7 Q) I' I* \3 W

好了!看到這裏,你應該對MT4 的編程工具有了初步的瞭解,說實話,確實很簡單,很容易掌握。
 


MT4智能交易系統介紹

智能交易系統軟件是一個創新的交易工具,允許客戶對自己的交易策略進行設定並進行測試。還可以創建新的技術指標

智能交易系統軟件是用來對交易過程全程自動化,免除交易者連續對市場進行日常煩瑣的監護。 許多專業交易商利用多層交易系統,對不同的市場和在不同的環境下進行操作。通常他們在著名的分析軟件包裏對交易戰略進行編寫和測試,比如,MetaStock 和 TradeStation。

使用MetaTrader4智能交易系統軟件,招招領先,你可以把交易系統產生的信號和真實賬戶聯繫起來,這樣連接以便於能追蹤和管理你的某個時段的開倉部位,提交的訂單和止損單。

什麼是智能交易系統?它是一個用特殊的MetaQuotes 語言 4 (MQL 4)編寫的自動交易系統(ATS),和特定的圖表聯繫在一起。智能交易系統不僅能通知交易商交易機會,而且還能自動執行交易賬戶上的交易,直接發送到交易服務器。和許多的IT系統一樣,智能交易系統系統支持歷史數據戰略測試,圖表上表示的登入/登出點。而且,智能交易系統的可執行碼分別存儲於源文件和加密的執行文件中-這種安排保證了交易商所使用的邏輯隱藏(如有必要的話),而不會泄密。

編寫自己的智能交易系統軟件也非常容易:嘗試一下吧!不需要是專業編程高手,你只需要學會使用非常簡單的語言-MQL 4語言。即使用戶不能自行編寫智能交易系統規則,但是他需要熟悉最近的編程技能,不過很可能不需一個小時他便掌握了這些規則並能編寫程序。

無數的交易商爲MetaStock 和 TradeStation軟件開發了多種多樣的交易戰略。其中多數均被翻譯成MQL 4語言,這就使得用戶可以把前期累計的經驗併合到裏面去。有些即學即用智能交易系統版本可以從本頁下載。

MetaTrader4 軟件將智能交易系統在程序的根目錄/Experts 子目錄裏保存爲*.MQ4(source text) 和 *.EX4 (可執行碼)文件。交易商可以無限量地保存智能交易系統數據,這些數據可以通過導航條窗口容易地加以管理。

創建自定義智能交易系統數據的程序以及將數據和交易終端連接在MetaTrader4 用戶指南里有詳細的描述。

MetaQuotes 4 語言是用來編寫自定義智能交易系統軟件,以便使交易程序管理自動化以及執行交易商自己的交易策略。MetaQuotes 4 語言易學、易用、易創建。MetaQuotes 4 語言包括相當數量的變量,用來控制當前和前期的報價、主要的算術和邏輯運算和特徵,主要的內置指標和用來開啓和控制頭寸的命令。在語法上,該語言和由TradeStation 技術有限公司開發的簡易語言相似,但是它有其自身的一些具體特徵。

程序代碼是用MetaEditor4編輯器編寫的,它能夠用不同的色彩集中反映MQL 4語言的不同結構,因此,有助於用戶熟悉專家系統的文本。 註解開始於//符號(雙斜線)。註解也可以用“斜線-星號”-“星號-斜線”組合(/*[註解]*/, 就像在 "C"編程語言一樣)。

設定和控制操作戰略,交易商保存一份日誌文件,存儲產生的信號信息、變量輸出和已執行交易的結果。智能交易系統日誌保存在MetaTrader4 目錄下/logs/YYYYMMDD.log 文件裏。當前的日誌可以從下方的“終端”窗口(日誌標籤)直接進入。

進入MQL 4語言的目錄系統,要麼按目錄按鈕或從工具菜單打開MetaQuotes語言詞典窗口操作。這個短小的手冊包含分類、運算、存儲詞語等功能,使得用戶對該語言所用到的每個元素都有所瞭解。

1. 主要語言結構

像其他任何語言一樣,MQL4有一套構成基本結構的主要組成元素。這些組成元素以一種特殊的方式組合排列的,以便代表適當的陳述和表達。

語言的主要對象就是數據,包括三種類型:數字、邏輯和排列。 所有的數值均採用雙格式,邏輯數據可能包括真值和假值。排列就是用省略號標註的一系列字符。字符串也叫做文本串。數據可以包含在適當類型的變量之中,或直接由程序的源文本表現出來。

一個MetaQuotes 語言陳述指一個完整的用法說明。陳述可以包括保留字、運算符號、數據、變量、表達式或標點符號,而且總是以分號結尾。

保留字指具有特定或特別意義的預先設定的詞語。

運算符號指在數據、變量和(或)表達式中特定的具體運算符號。

變量是用來限制數字、排列或邏輯數據的。

表達式指保留字、變量、數據和運算符號的組合,因爲它們具有語言的3中類型(保留字、變量、數據)中的任一價值。

標點符號用來代表表達式,界定參數,區分詞語或重新排列計算順序。

2. 標點符號


字符
 
名稱
 
描述
 

;
 
分號
 
結束MetaQuotes 4語言指令
 

( )
 
圓括號
 
對表達式的值進行分組,改變計算順序。

標註函數參數並啓動變量描述表達式

標註變量的初始值並在變量描述區排列組合
 

,
 
逗號
 
提取函數值時,對參數進行區分

在變量描述區對變量進行區分

在描述排列長度時對數字進行區分

區分進入排列元素的指標
 

:
 
冒號
 
用在變量描述區,啓動變量列表
 

" "
 
引號
 
標註一個文本(字)串。
 

[ ]
 
方括號
 
標註數字,確定排列長度

標註進入某個特殊排列元素的數字(指數)

標註進入歷史數據的期間數字
 

{ }
 
波形括號
 
充當運算括號。可以用來代替 begin...end。將指令系列隔離成塊。
 

/* */
 
註解括號
 
標註註解
 

//
 
雙斜線
 
明確說明單串註解的開始
 


3. 運算符號

運算符號分成5 組:分配符號、字串符號、數學運算符號、相關符號和邏輯符號。

3.1. 分配符號

分配符號'='(等號)是用來將具體數值(數字、排列或邏輯,視變量類型而定)分配到變量中。分配值可以是表達式的結果。比如:

變量: Counter(0);

...

Counter = Counter + 1;結果,反向變量取值爲1。變量值也可以分配來對元素進行排列。

3.2. 字串符號

操作文本串,只有一個運算符可以用上: '+' (加號)。 它是用來連接兩個字串的。比如:

變量: 字串(" ");

...

字串 = "some_" + "text";

結果,字串變量包含“some_text”這樣的文本串,允許將字串與數字和邏輯值結合起來。在後面的這個例子裏,數字及或邏輯值在結合前,應轉化爲字串類型。比如:

String = "string" + 1;

因此,字串變量將包含"string1"的文本串。

操作數不僅可以是數值,也可以是相應的含有這樣數值類型的變量,以及表達式,經執行後,便產生這樣的數值。

3.3. 數學符號

4種主要的數學運算:加法- '+' (加號)、減法-'-' (減號)、乘法-'*' (星號)、除法-'/' (斜線),都用在計算數值的數學表達式裏。

數學表達式的例子:( Ask + Bid ) / 2 , High[1] + 20 * Point

3.4. 相關符號

相關符號用來對同種類型的兩個數值進行比較。 第一個數值和第二個數值進行比較,產生邏輯值“真值”或“假值”, “小於”-'<' (左小於號), “大於”-'>' (右小於號);“等於”-'=' (等號);“不等於”-'<>'; “小於或等於”-'<='; “大於或等於”-'>='。由相關表達式而取得的邏輯值用在MetaQuotes II語言的控制結構裏。比如:

if FreeMargin < 1000 then exit; 這個字串按詞典順序進行比較,即,"aaa" 字串被認爲小於字串 "zzz"。當邏輯值進行比較時,我們應該牢記:“True”的邏輯值的數值爲1,而“False”的邏輯值的數值爲“0”。

3.5. 邏輯符號

邏輯符號使用戶能夠將邏輯值結合起來。邏輯OR - '|' (垂直線或豎槓);邏輯AND-'&' (“和”符號)。邏輯符號有相應的保留字OR, AND, NOT。 比如:

If FreeMargin > 100 and FreeMargin < 1000 then print( "Free margin is ", FreeMargin );注意:當OR 和 AND運算符號是雙值時,即它們有兩個值進行運算,NOT運算符號是單值,即它之適用於單值。比如:

Variable: Condition1( True );

...

Condition1 = FreeMargin >= 1000;

If not Condition1 then exit;

下面是邏輯運算符號的結果表: 
Value1
 
Value2
 
Value1 OR Value2
 

True
 
True
 
True
 

True
 
False
 
True
 

False
 
True
 
True
 

False
 
False
 
False
 

Value1
 
Value2
 
Value1 AND Value2
 

True
 
True
 
True
 

True
 
False
 
False
 

False
 
True
 
False
 

False
 
False
 
False
 

Value1
 
 
 
NOT Value1
 

True
 
 
 
False
 

False
 
 
 
True
 


4.固定字

MetaQuotes 4 語言使用下面的幾組固定字。

1. 邏輯符號。

AND, NOT, OR.

2. MQL 4語言指令。

Array, Begin, Break, Continue, Define, Downto, Else, End, Exit, For, If, Input, Then, To, Variable, While。界定語言指令結構的固定字也叫做關鍵字。

3. 內置函數。

Abs, AccName, AccountName, Alert, Ceil, CloseOrder, Comment, Cos, CurTime, Day, DayOfWeek, DeleteOrder, Exp, Floor, Highest, Hour, iADX, iATR, iBANDS, iCCI, iMA, iMACD, iMFI, iMOM, iRSI, iSAR, iSTO, iWPR, IsDemo, IsIndirect, LastTradeTime, Log, Lowest, Minute, Mod, ModifyOrder, Month, MoveObject, NumberToStr, Ord, OrderValue, Period, Pow, Print, PrintTrade, Rand, Round, ServerAddress, SetArrow, SetObjectText, SetOrder, SetText, Sin, Sqrt, Srand, Symbol, Tan, TimeToStr, Year.

4. 預先設定用戶變量(用戶定義變量)。

Lots, StopLoss, TakeProfit, TrailingStop.

5. 預先設定交易終端變量。

AccNum, AccountNumber, Ask, Balance, Bars, Bid, Close, Credit, Equity, FreeMargin, High, Low, Margin, Open, Point, PriceAsk, PriceBid, PriceHigh, PriceLow, PriceTime, Time, TotalProfit, TotalTrades, Volume.

6. 預先設定內置函數參數(宏命令)。

MODE_CLOSE, MODE_EMA, MODE_HIGH, MODE_LOW, MODE_MAIN, MODE_MINUSDI, MODE_OPEN, MODE_PLUSDI, MODE_SIGNAL, MODE_SMA, MODE_STOPLOSS, MODE_TAKEPROFIT, MODE_VOLUME, MODE_WMA, OBJ_HLINE, OBJ_SYMBOL, OBJ_TEXT, OBJ_TRENDLINE, OBJ_VLINE, OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP, SYMBOL_ARROWDOWN, SYMBOL_ARROWUP, SYMBOL_CHECKSIGN, SYMBOL_STOPSIGN, SYMBOL_THUMBSDOWN, SYMBOL_THUMBSUP, VAL_CLOSEPRICE, VAL_CLOSETIME, VAL_COMISSION, VAL_COMMENT, VAL_LOTS, VAL_OPENPRICE, VAL_OPENTIME, VAL_PROFIT, VAL_STOPLOSS, VAL_SWAP, VAL_SYMBOL, VAL_TAKEPROFIT, VAL_TICKET, VAL_TYPE.

實際上,上述固定字爲宏記錄器,即語法分析程序用數值取而代之。宏記錄器的引入簡化了編寫用戶功能要求的程序:更加方便、無關聯的重要詞語可以用來替代一些函數參數值。同樣可以用於色彩名稱。

7. 色彩。

AliceBlue, AntiqueWhite, Aqua, Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chartreuse, Chocolate, Coral, CornflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue, DarkCyan, DarkGoldenrod, DarkGray, DarkGreen, DarkKhaki, DarkMagenta, DarkOliveGreen, DarkOrange, DarkOrchid, DarkRed, DarkSalmon, DarkSeaGreen, DarkSlateBlue, DarkSlateGray, DarkTurquoise, DarkViolet, DeepPink, DeepSkyBlue, DimGray, DodgerBlue, FireBrick, FloralWhite, ForestGreen, Fuchsia, Gainsboro, GhostWhite, Gold, Goldenrod, Gray, Green, GreenYellow, Honeydew, HotPink, IndianRed, Indigo, Ivory, Khaki, Lavender, LavenderBlush, LawnGreen, LemonChiffon, LightBlue, LightCoral, LightCyan, LightGoldenrod, LightGreen, LightGrey, LightPink, LightSalmon, LightSeaGreen, LightSkyBlue, LightSlateGray, LightSteelBlue, LightYellow, Lime, LimeGreen, Linen, Magenta, Maroon, MediumAquamarine, MediumBlue, MediumOrchid, MediumPurple, MediumSeaGreen, MediumSlateBlue, MediumSpringGreen, MediumTurquoise, MediumVioletRed, MidnightBlue, MintCream, MistyRose, Moccasin, NavajoWhite, Navy, OldLace, Olive, OliveDrab, Orange, OrangeRed, Orchid, PaleGoldenrod, PaleGreen, PaleTurquoise, PaleVioletRed, PapayaWhip, PeachPuff, Peru, Pink, Plum, PowderBlue, Purple, Red, RosyBrown, RoyalBlue, SaddleBrown, Salmon, SandyBrown, SeaGreen, Seashell, Sienna, Silver, SkyBlue, SlateBlue, SlateGray, Snow, SpringGreen, SteelBlue, Tan, Teal, Thistle, Tomato, Turquoise, Violet, Wheat, White, WhiteSmoke, Yellow, YellowGreen.

所有的固定字均是非敏感字號,即它們可以小寫也可以大寫。

4.1. 智能交易系統嚮導

智能交易系統嚮導提示MQL 4允許編寫智能交易系統、自編指標、自編腳本和從模板中進行編輯

 

預先設定參數或變量的名稱,將會自動在文本編輯欄中出現參數框架:

4.2. MetaQuotes 4 語言的指令結構

4.2.1. 變量宣告和語句

在計算過程中保存臨時數據要求使用變量。變量在本程序的開頭部分就用保留字、變量、排列和定義進行了敘述。他允許使用這些詞語的負數形式,即 “ Variables, Arrays and Defines”。 這些詞中間總有一個開始變量的宣告敘述。這些詞語的差別如下: "variable" 語句簡單變量,"array"語句排列, "define" 語句附加用戶定義的變量,類似於預先界定的用戶變量,均可以通過設置對話框進行修改,即從外部修改。然而,又不像預先界定的變量,用戶變量可以在程序內部的計算過程中進行更改。

變量宣告語法:

變量:名稱(初期值);這裏名稱就是變量的名字;“初期值”就是變量的起初值。初期值對變量的類型-數字、字串或邏輯值進行界定。

一個數字變量宣告的例子:

Variable : Counter( 0 );

一個字串變量宣告的例子:

Variable : String1( "任意字串" );

一個邏輯變量宣告的例子:

Variable : MyCondition( false );

數組聲明語法:

Array : ArrayName[Array length]( 初始值 );其中,數組長度有一個或若干(多達4)個數字-數字 - number[, number [, number [, number]]].

在MetaQuotes 4語言裏, 數組可能是1-,2-,3-,4-個元素長度,一般情況下,數組就是一組可以用同一個名稱查找到的、並按照相繼成行定位數組且給定了數組元素的序列號(數)的變量。數組方便於對同樣類型的數據排序。數組的一個典型例子就是交易終端的歷史數據,比如,收盤、開盤、高點位、低點位、交易量。這些數據作爲單一元素數組的。比如, Close[ 5 ] 指後退5個交易期間的收盤值。兩個元素的數組可能是一個簡單表格,其中第一個分量爲行而第二個分量則爲列。

Array: MyTable[ 10, 5 ]( 0 ); // 一個10行5列的表格。

...

print( MyTable[ 2, 4 ] ); // 打印第二行的第4個元素

數組可能包括任何類型的數值-數字、字串或邏輯值,但是應該爲同一類型,其中的初期值在數組被宣告時爲特定的。

附加用戶定義變量宣告語法:

定義:名稱(初期數);其中名稱爲變量名稱;初期數爲變量起初的數字值。

應該注意,附加用戶定義變量可能只爲數字類型。如上所述,用戶定義變量可以在程序的計算過程中進行修改。這些修改只能運用到智能交易系統的當前時段,直到特殊的智能交易系統從圖表中刪除或客戶終端的操作結束。當新的智能交易系統時段啓動時,用戶定義變量值將重新初始化。

4.2.2. 退出語句

退出報告中斷智能系統軟件的操作。也就是所謂的預先設定的程序終止。

4.2.3. IF-THEN條件語句

If-Then條件語句使得控制智能交易系統指令的執行順序得以可能。該語句可能有不同的方式編寫:

if Condition then Statement;or

if Condition then begin

Statement;

Statement;

...

end;其中,條件爲一個邏輯表達式,取值爲True 或 False;

"Statement" 指MetaQuotes II語言中的任何指令。符號括號Begin – End可能被波形括號{ }所替代。

條件語句可能被用在對程序進行分支。爲達到此目的,另一個關鍵字Else要用上。語法:

if Condition then Statement1 else Statement2;or

if Condition then begin

Statement;

Statement;

...

end

else

Statement;

Statement;

...

end;or

if Condition then begin

Statement;

Statement;

...

end

else Statement2;or

if Condition then Statement1

else

Statement;

Statement;

...

end;可以使用嵌套式的條件語句。一般說來,語句可能由MetaQuotes II語言的任何合法指令表示,除非變量宣告,因爲嚴格來說,變量宣告並不是一個可執行語句。

4.2.4. WHILE循環

WHILE循環確保在循環條件有效時,包含在循環主體中的語句的多次執行。一個循環可以用Break 語句提前終止。迭代可以通過使用Continue語句停止。這個語句造成循環的下一個迭代開始,即Continue後面的語句直到循環主體結束在本迭代中不得執行。在條件語句中用Break 和 Continue是合理的。語法:

while Condition begin

Statement;

[break;][continue;]

...

end;其中,條件是循環執行條件-在每個循環迭代之前計算出的一個邏輯表達式,取值爲True 或 False;

語句是MetaQuotes 4語言的任何指令。

符號括號Begin – End表示循環主體,可以被波形括號{ }替代。

“Break and Continue”描述也不是強制性的。

Example:

Counter = 1;

while Counter <= Bars begin

print( Close[ Counter - 1 ] );

Counter = Counter + 1;

end;這個例子說明一個將要執行的循環,基準次數,或者,如果基準=0,而且循環就不止一次。

4.2.5. For 循環

For循環確保在循環主體中所包含的具體次數的語句執行。語法:

for NumberVariable = InitialValue to|downto LimitValue begin

Statement;

[break;][continue;]

...

end; 其中數字變量就是在每次迭代之後循環要麼增加或者減少到1的循環變量 (視使用關鍵字To 或 Down to而定);

初期值指循環變量的起初數值。

語句指MetaQuotes 4 語言的任何指令。

To or Downto 確定循環變量增加到1(To)或者減少到1(Downto);

限值是循環變量的邊際數值。

操作符brackets Begin – End表示循環主體,可以被波形括號{}取而代之。

Break 和Continue語句並非是強制性的。

Example: 比如:

for Counter = 1 to 10 begin

if Counter > Bars then break;

print( Close[ Counter ] );

end; 這個例子說明一個可能被執行10次的環。但是,若基準值小於10, 循環就會提前終止,也就是說循環執行BARS次。

4.2.6. BREAK中斷語句

中斷語句確保一個For 循環或一個While循環早點終止。前例不僅說明循環執行,也說明了中斷語句的使用。“Break”語句不僅用於循環主體之外。循環是嵌套式的,中斷語句中離其最近的循環。換言之,中斷內部循環的語句並沒中斷外部循環。

4.2.7. CONTINUE繼續語句

CONTINUE繼續語句提前終止循環的迭代,並從循環主體開始下一個迭代。換句話說,在Continue之後語句被忽略。比如:

for Counter = 1 to 10 begin

...

if Counter > Bars then continue;

print( Close[ Counter ] );

...

end;這個例子說明一個將被執行了差不多10次的循環。但收盤值(counter)被打印不會比基準次數多。"..."代表MetaQuotes 4 語言的其他語句。

4.3.交易中斷的預選界定變量

爲了最大的方便用戶,交易中斷的一些變量可以從智能系統輸入。

AccountNumber-賬號(同義詞:AccNum)

Ask –賣價(買方出價)

Balance – 交易賬戶的餘額值

Bars – 圖表上條形的數目-說明用數據填充圖表程度的非常重要的一個變量。

Bid -買入價(賣方要價)

Close –收盤價格

Credit –信用優先

Equity –賬戶狀況,包括未實現利潤

FreeMargin –交易賬戶的自由保證金值-也用來覈查賬戶資金的可用性;

High –期間最高價位

Low -期間最低價位

Margin –用來支撐開倉部位的資金(保證金)

Open –開盤價

Point – 當前金融工具單點上的價值(此點此時智能交易系統系統運行),比如, USD/JPY - 0.01, USD/CHF - 0.0001 等。

PriceAsk –在市場觀測窗口上顯示的當前賣價。

PriceBid -在市場觀測窗口上顯示的當前買價。

PriceHigh – 當前24小時期間的最高買價。

PriceLow -當前24小時期間的最高賣價。

PriceTime -在市場觀測窗口上顯示的當前時間。

Time – 價格圖表上的條形時間的基準時間;

TotalProfit – 所有開倉部位的總未實現利潤;

TotalTrades –開倉部位的總數和交易中斷上的延遲訂單;

Volume – 交易量(期間交易的數目)

應注意到,Close, Open, High, Low, Volume, Time爲歷史數據數組(seriesarrays),在上個交易期間允許進入這些數據。

4.4. 內置函數

MetaQuotes 4語言提供許多功能,可用於多種多樣的場合。這些包括技術指標、交易功能、時間功能、數學和三角函數功能、數據轉換和輸出函數,等。

Abs –返回這個數值的絕對值(模塊)

語法:Abs函數 (n個表達式)

參數: 數值

AccountName – 返回包含用戶名的文本串 (同義詞:AccName )

Alert –產生包含用戶定義數據的對話屏

語法: Alert(...)

參數的任何非零數都可能。

Ceil – 返回代表最小接近整數的一個數字,它等於或大於特定的數值。

語法:Ceil( n個表達式 )

參數:數值

CloseOrder –收盤頭寸(部位)

語法:收盤頭寸(訂單、單位、價格、滑動量、色彩)

Parameters: 參數:

order -開倉部位的訂單數

lots – 單位數

price –優先收盤價

slippage –最大價格滑動值

color – 圖表上交叉點的色彩

Comment –在圖表的左上角產生的用戶定義數據

語法: Comment(...)

參數的任何非零數都可能。

Cos –計算和返回數值的餘弦值,代表用弧度表示的角度。

語法: Cos( n分表達式 )

參數:數值

CurTime –返回從1970年元月1日起所經過的秒數。

Day – 返回當月當前日序列號

DayOfWeek –返回當週當前日序列號。1 – 星期日, 2 – 星期一, ... , 7 – 星期六

DeleteOrder –刪除前期提交的延遲訂單

語法:DeleteOrder( 訂單 )

參數: 訂單-延遲部位的訂單數

Exp – 返回代表特定數值指數的一個數目

語法: Exp( n個表達式)

參數:數值

Floor –返回代表最大接近整數的一個數字,它等於或小於特定的數值。

語法: Floor( n個表達式)

參數:數值

Highest – 返回期間特定數間的 Open, Low, High, Close or Volume (取決於“類型”參數)的最大值。

語法: Highest( 類型、beginbar、期間 )

Parameters: 參數:

Type 類型 – 一個返回變量,可能去下列數值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUMEbeginbar –表示條形的轉換,與當前條形有關,並從中取值。

periods期間 – 計算執行依據的期間數

Hour –返回在24小時期間內當前小時的序列數。

iADX -平均指導動作目錄

語法:iADX( 期間、模式、轉換)

參數:

period – 計算的期間數;

mode – 數據類型,可以取下列數值:MODE_MAIN(主要指標)、MODE_PLUSDI(line +DI), MODE_MINUSDI(line -DI).

shift – 與當前條形有關的轉換 (後退期間數),爲數據待取值的依據。

iATR - 平均間距的指標

語法:iATR( 期間、轉換)

參數:

period – 計算期間數;

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

平均移動收斂/發散指標(iBANDS –– 布林帶指數

語法: iBANDS(期間,誤差,模式,轉換)

參數:

period – 計算的期間數;

deviation -誤差;

mode – 可以取下列值: MODE_MAIN(主線、滑移)、 MODE_LOW(下邊線), MODE_HIGH(上邊線).

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iCCI – 交易通道指標

語法: iCCI(期間、轉換)

參數:

period – 計算的期間數

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iMA – 移動平均指標

語法: iMA( 期間、模式、轉換)

參數:

period – 計算的期間數

mode – 計算模式,可以取下列值: MODE_SMA, MODE_EMA, MODE_WMA.

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iMACD -平均移動收斂/發散指標

語法: iMACD( fast_ema_period, slow_ema_period, signal_period, mode, shift )

參數:

fast_ema_period -計算'快' 平均移動期間(通常12);

slow_ema_period - number of periods for calculation of the 'slow' moving average (usually 26);

signal_period計算'慢' 平均移動期間(通常12);

mode 數據源,可以取下列值:MODE_MAIN (主要指標)、MODE_SIGNAL (信號列);

shift -與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iMFI – 現金流量指標

語法: iMFI( 期間、轉換)

參數:

period – 計算期間數;

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iMOM – 動量指標

語法:iMOM( 期間、轉換)

參數:

period – 計算期間數;

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iRSI – 相對強弱指標

語法:iRSI(期間、轉換)

參數:

期間 – 計算期間數;

iSAR -拋物線

語法: iSAR(步驟,最大值,轉換)

參數:

步驟-增量,通常是0.02;

最大值 – 最大值, 通常是0.02;

iSTO - "隨機振盪"指標

語法: iSTO( %K期間、 %D期間、 慢、方法、模式、轉換)

參數:

%Kperiod - %K線期間;

%Dperiod - %D線期間;

slowing – 慢值;

method – 計算方法,取下列值: MODE_SMA (簡單平均)、MODE_EMA (指數值)、 MODE_WMA (權重值);

mode – 數據源,可以取下列值: MODE_MAIN (主指標線), MODE_SIGNAL (信號指標線);

shift -與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

iWPR -威廉氏百分數範圍指標

語法:iWPR( 期間、轉換)

參數:

期間 – 計算期間數;

shift – 與當前條形(後退期間數)相關的轉換,爲數據待取值的依據。

IsDemo – 如果智能交易系統系統在試用帳戶運行,返回邏輯值,否則會返回錯誤值.

IsIndirect –如果使用反向方式對特定工具進行計算,會返回正確的邏輯值,否則會返回錯誤值。

LastTradeTime –返回代表最近交易執行時間的一個數字(SetOrder, DelOrder, CloseOrder, ModifyOrder),計算從1970年元月1日0點經過的秒鐘數。

Log (-特定正數值的對數

語法:日誌( n個表達式)

參數: 正數值

Lowest - 特定期間返回開倉,低,高,收盤或交易量最小值(依據"類型"參數而定) ...returns

語法:最低點(類型、beginbar、期間)

參數:

type – 可以取下列值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUME

beginbar –表示條形的轉換,與當前條形有關,並從中取值。

periods期間 – 計算執行依據的期間數

Minute –返回當前小時的分鐘序列數。

Mod -返回代表着一個接着一個的數值的整數

語法:Mod( n個表達式1, n個表達式2)

參數: 數值1、數值2

ModifyOrder –前期開倉部位或延遲訂單修改的特徵

語法:ModifyOrder( 訂單、價格、止損、獲利、色彩)

參數:

order – 開倉或延遲部位的數目或訂單;

price – 新的價格 (僅適用於延遲部位!);

stoploss – 新的止損水平線;

takeprofit – 新的獲利水平線;

color – 圖表上象形圖 的色彩

Month –返回當前月的續列號

MoveObject –移動或建立命名對象

語法:MoveObject( 名稱、類型、時間、價格、 時間2、時間2)

參數:

name – 文本串形式的名稱;

type – 對象類型,可以取下列值:OBJ_HLINE (水平線)、 OBJ_VLINE (垂直線), OBJ_TRENDLINE (趨勢線)、 OBJ_SYMBOL (設定象形圖)、 OBJ_TEXT (文本串);

time – 參照圖表第一時間;

price -參照圖表第一價格;

time2 -參照圖表第二時間;

price2 -參照圖表第二時間

NumberToStr – 返回特定數值轉換成特定準確格式的文本串。通過在十進位點數之後的其他4個數產生的數值的函數。

語法: NumberToStr(數字、準確性)

參數:

number – 特定數值;

precision – 準確格式、十進位點數的數字

OrderValue – 返回訂單特定價值的之一

語法:OrderValue(部位、模式)

參數:

position – 交易終端列表的訂單頭寸部位,從1開始;

mode – 返回數據類型,可以取下列值:VAL_TICKET (訂單數), VAL_OPENTIME (定定開倉時間), VAL_TYPE (訂單類型), VAL_LOTS (要求單位數目), VAL_SYMBOL (工具名稱,以文本串的形式), VAL_OPENPRICE (開盤價), VAL_STOPLOSS (止損水平線), VAL_TAKEPROFIT (獲利水平線), VAL_CLOSEPRICE (收盤價), VAL_COMISSION (委託交易量), VAL_SWAP (部位展期的展期費用數額), VAL_PROFIT (交易利潤數), VAL_COMMENT (以文本串形式對特殊部位的註解), VAL_CLOSETIME (訂單收盤時間)。

Ord –和OrderValue完全相同。

Period –返回界定的已用期間分鐘數

Pow – 返回由nBaseExpression數值提高到nExponentExpression 倍數而產生的數值,參見參數。

語法:Pow( nBaseExpression, nExponentExpression )

參數:數值1、數值2。

Print – 打印由用戶在系統日誌裏界定的數據。

語法: Print(...)

參數的任何非零數均可能。

PrintTrade – 存儲日誌中特殊部位的細節

語法: PrintTrade( 部位 )

參數:部位 – 在交易終端裏已開倉部位數字

Rand –返回一個產生的僞隨機數字。在使用此函數之前,僞隨機數字發生器應用Srand函數調整到初始狀態。 如果僞隨機數字發生器不用,就在啓動程序時一次調整到初始狀態。

Round – 返回代表最接近整數的特定數值

語法: Round( n個表達式)

參數: 一個數值

ServerAddress –以文本串的形式返回服務器IP地址

SetArrow –設定圖表繪圖標誌

語法: SetArrow( 時間、價格、標誌和色彩)

參數:

time -參照圖表第一時間;

price -參照圖表第一價格;

symbol -從Wingdings字體設定標誌 的數值;

color -圖表顏色

SetObjectText -指定文本串到特定的對象

語法: SetObjectText(稱,文本,字體, 尺寸,顏色)

參數:

name – 對象名稱;

text – 特定文本;

font – 字體命;

size – 字體大小;

color – 文本色彩.

SetOrder –用於開倉或設定延遲訂單的主函數。

語法:SetOrder( 操作、單位、價格、滑動、止損、獲利、色彩)

參數:

operation – 操作類型,可以取下列值:OP_BUY (開始購買部位), OP_SELL (開始出售部位), OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP (提交延遲訂單);

lots – 單位數;

price – 交易優先收盤價;

slippage - OP_BUY 和OP_SELL操作的最大價格滑動;

stoploss – 止損水平線;

takeprofit – 獲利水平線;

color – 當提取函數時,圖表上箭頭的色彩

SetText –把圖表種的文本創放到特定的位置

語法:SetText( 時間、價格、字符串、色彩 )

參數:

time -參照圖表第一時間;

price -參照圖表第一價格;

string – 文本串;

color – 文本色彩

Sin -計算並返回代表弧度角度的數值

語法:Sin( n個表達式)

參數: 數值

Sqrt -計算和返回特定正數值的平方根

語法: Sqrt( n個表達式 )

參數: 正數值

Srand – 設定僞隨機數字發生器到初始狀態。如果使用發生器,將其在啓動程序時一次性設置到初始狀態。 初始設置所用的最佳值就是時間函數迴歸的數字-在此情況下,產生順序的隨機性就增大。

語法:Srand( 時間)

參數: 正數值

Symbol –返回智能交易系統運行的金融工具名稱的文本串。

Tan -計算並返回代表角度弧度的正切數值。

語法: Tan( n個表達式)

參數: 數值

TimeToStr – 返回帶有"yyyy.mm.dd hh:mi" 類型的文本串,由代表經過1970元月1日起的秒鐘數的特定數值。

語法: TimeToStr( 時間)

參數: 正數值

Year – 返回當年數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章