您现在的位置: 比特财富网 >> 财经 >  >> 外匯
MT4編程入門
外_匯_邦 WaiHuiBang.com

MT4編程入門1:MT4自定義指標的保存目錄、指標編緝

一、文件菜單中選擇“打開數據文件夾”,然後進入MQL4\Indicators 子目錄,MT4自定義指標即保存在此目錄中。www.emoneybtc.com

 

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

一種是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文件可供下載,我們只要把它們保存到環境變量\MQL4\Indicators 這個目錄,也就是下面這個目錄中,就可以了。如果下載的是ex4文件,那可以直接調用;如果是mq4文件,則需要重啟動MT4,讓系統自動編譯生成ex4可執行文件。如果下載的是rar、zip等類型的壓縮文件,還必須下載後解壓到此目錄才能使用。

   

                      

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

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

1、打開MQ語言編輯器

                 

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

                    

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

 

                         

4、接著我們就可以將網頁上源碼復制粘貼進來

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

             

        

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

 

保存後,再點一下編寫。

到此,源碼保存完成。

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

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

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

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

這非常簡單

 

 

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

 

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

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

例:

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編程入門3:自定義函數

 

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

例如:數學函數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編程入門4:自定義數組

 

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

例: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[i]來引用數組aa中的值

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

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

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

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

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

 

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

 

一、預定義數組(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[i]、High[i]、Low[i]、close[i],表示第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編程入門6:判斷語句

 

一、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、語句用大括號括起來,但如果只有一行語句,則大括號可以省略

              if(條件)    語句1;

 

MT4編程入門7:循環

 

一幅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[i]=  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[i]=  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編程入門8: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編程入門9:畫一條指標線

 

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

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

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

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

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

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

第六、給數組賦值 

其中:

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

第三、四、五條寫在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[i]=

        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[i]=

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

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

    }

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

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

   return(0);

   start函數結束

  }

 

MT4編程入門10: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時,說明已經對下穿報過警了,就不能再次對下穿報警。

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

 

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

語句簡要解釋如下:

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

 

#property indicator_chart_window

指標放在主圖

extern int 警戒均線=20;

設立一個自定義變量,允許外部值修改,整數形,變量名為"警戒均線",默認值20

int mark=0;

設立一個自定義變量,整數型,變量名為mark,並賦初值0

此變量在後面用於記錄是否報警,設計是這樣的:

如果mark=0,則從未報過警

如果mark=1,則已經向上報過警

如果mark=2,則已經向下報過警

int start()

設立觸發函數start。start為系統規定函數名,函數內容自定義。當數據變動時,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   )

      條件判斷語句。這裡用到邏輯運算符&&,就是“並且”,條件有三個,三個條件要同時成立,則整個條件才成立

      第一個條件:最高價大等於均線。iHigh是燭柱最高價取值函數,iMA是均線取值函數

      第二個條件:前一燭柱最高價小於均線

      第三個條件:mark不等於1。如果mark不等於1,就說明指標沒有對上穿報過警

          {

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

            mark = 1;

          }

          花括中為條件執行語句。Alert是報警語句,Symbol()是商品名稱取值函數

          報警語句執行後,給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);

    start函數結束語句,返回零值

}

 

MT4編程實例:箭頭符號

符號是一種斷斷續續的指標線。在指標線有值區域,指標線顯示;在指標線無值區域,指標線隱藏。例如下圖:當價格上穿、下穿均線時,均線上出現一個標記符號。 

 

  原理也很簡單:在上圖中,存在二條指標線,一條是均線,另一條是笑臉符號線。

均線在任何位置都有值,所以均線是一條連續的曲線;

當價格上、下穿均線時,符號線被賦予了均線值;而在其他位置上,符號線被賦了空值。所以只是在價格上、下穿均線的位置上,符號線才有值,才能出現笑臉符號。因為符號線只是個別位置有值,所以符號線僅在個別位置顯現。

符號也正好落在均線上,因為符號線值=均線值。如果符號線被賦了別的值,例如(符號線=均線+10點),那麼符號水平坐標不變,垂直坐標將是均線上方的10點位置。

源碼如下:

//======================================================

#property  indicator_chart_window

#property  indicator_buffers 1           

#property  indicator_color1 Yellow

extern int  均線=10;

double mk[];

double temp0,temp1;

int init()

  {

    IndicatorBuffers(1);  

    SetIndexBuffer(0,mk);

    SetIndexStyle(0,DRAW_ARROW);

    SetIndexArrow(0,204);

    IndicatorDigits(Digits);

   return(0);

  }

int start()

  {

   int limit;

   int counted_bars=IndicatorCounted();

   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars-均線;

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

      {

       temp0=iMA(NULL,0,均線,0,0,0,i);

       temp1=iMA(NULL,0,均線,0,0,0,i+1);

       mk[i]=EMPTY_VALUE;

       if(Close[i]>temp0  && Close[i+1]<temp1)  mk[i]=temp0;

       if(Close[i]<temp0  && Close[i+1]>temp1)  mk[i]=temp0;

      }

  return(0);

  }

//源碼到此已結束

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

語句簡要解釋如下:

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

#property  indicator_chart_window

指標放在主圖

#property  indicator_buffers 1           

設置指標線數為1條

#property  indicator_color1 Yellow

設置第一條指標線顏色為黃色

extern int  均線=10;

設立一個自定義變量,允許外部值修改,整數形,變量名為"均線",默認值10

double mk[];

設立一個自定義數組,雙精度型

double temp0,temp1;

設立二個自定義變量,雙精度型,變量名為temp0、temp1

int init()

設立初始化函數init。init為系統規定函數名,函數內容自定義。該函數在指標被加載時僅運行一次 

 {

    IndicatorBuffers(1);

    指標線數量為1條

  

    SetIndexBuffer(0,mk);

    第一條指標線的數組為mk

    SetIndexStyle(0,DRAW_ARROW);

    第一條指標線的線型為箭頭符號

    SetIndexArrow(0,204);

    第一條指標線的箭頭符號為第204種符號,如果換一個編號,那出現的就是另一種符號。箭頭符號的編碼詳見《MT4編程參考》

    IndicatorDigits(Digits);

    設置指標線的小數位數

    Digits=當前匯率的小數位數,如日元叉盤Digits=2,其他幣對Digits==4

   return(0);

   函數結束,返回零值

  }

int start()

設立觸發函數start。start為系統規定函數名,函數內容自定義。當數據變動時,start函數被觸發

  {

   int limit;

   設立整數型自定義變量limit

   int counted_bars=IndicatorCounted();

   設立整數型自定義變量counted_bars,並將IndicatorCounted()的值賦給counted_bars

   IndicatorCounted()為緩存數量,即已經計算過值的燭柱數

   if(counted_bars>0) counted_bars--;

   如果counted_bars大於零,則將counted_bars的值減掉1

   這是為了配合下一句,以避免limit相差1而發生出錯

   limit=Bars-counted_bars-均線;

   這是給limit賦值

   Bars為圖表中的柱數

   counted_bars為已經賦值的柱數

   這樣limit的結果就是未賦值的燭柱數

   再減去“均線”是因為圖表最右邊段均線無意義

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

   循環語句,括號中有三個語句:

   第一句int i=0; 表示循環從i=0開始

   第二句i<limit; 這是循環的條件,如果條件滿足則執行大括號中的循環體,如果條件不滿足,則中止循環,跳到大括號下面的語句執行

   第三句i++,這是循環步調控制語句,每循環一次後執行一次此語句。

   i++相當於i=i+1,即i值在原有數值上增加1

      {

       temp0=iMA(NULL,0,均線,0,0,0,i);

       把均線在i位置上的值賦給temp0

       iMA:均線取值函數

       temp1=iMA(NULL,0,均線,0,0,0,i+1);

       把均線在(i+1)位置上的值賦給temp1

       mk[i]=EMPTY_VALUE;

       給數組mk在i位置上賦空值

       EMPTY_VALUE就是空值

       if(Close[i]>temp0  && Close[i+1]<temp1)  mk[i]=temp0;

       條件判斷語句。如果在i位置上價格大於均線,並且在(i+1)位置上價格小於均線(即價格上穿均線),則給數組mk在i位置上賦該位置的均線值

       Close[i]:在i位置上收盤價。

       &&:邏輯運算符“並且”

       if(Close[i]<temp0  && Close[i+1]>temp1)  mk[i]=temp0;

       與上一句相似

      }

  return(0);

  start函數結束語句

 

MT4編程實例:在歐元圖上顯示英磅的RSI指標

 

下面這個圖是AUD圖上,疊加了英磅的RSI指標。

(當然也可以不疊加,分兩個窗口)

從RSI指標圖上我們看到,英磅強勢,而澳元很弱

 

下面是指標源碼

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

#property  indicator_separate_window

#property  indicator_buffers 1

#property  indicator_color1  Aqua

#property  indicator_level1  30

#property  indicator_level2  70

extern int RSI=12;

extern string 商品="GBPUSD";

double     ind_buffer[];

int init()

  {

   SetIndexBuffer(0,ind_buffer);

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

   IndicatorShortName("RSI("+商品+"," +RSI+")");

   return(0);

  }

int start()

  {

   int limit;

   int counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);

   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;

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

      ind_buffer[i]=iRSI(商品,0,RSI,PRICE_CLOSE,i);

   return(0);

  }

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

 

 

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

語句簡要解釋如下:

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

#property  indicator_separate_window

指標放在副圖

#property  indicator_buffers 1

設置指標線數組為1個

#property  indicator_color1  Aqua

設置第一條指標線顏色值為Aqua,即介於藍綠之間的一種顏色

#property  indicator_level1  30

在副圖中,30值位置上畫一條水平直線

#property  indicator_level2  70

在副圖中,70值位置上畫一條水平直線

extern int RSI=12;

設立一個自定義變量,允許外部值修改,整數型,變量名為"RSI",默認值12

extern string 商品="GBPUSD";

設立一個自定義變量,允許外部值修改,字符串型,變量名為"商品",默認值"GBPUSD"

double     ind_buffer[];

設立一個自定義數組,雙精度型

int init()

設立初始化函數init。init為系統規定函數名,函數內容自定義。該函數在指標被加載時運行一次

  {

   SetIndexBuffer(0,ind_buffer);

   設置第一條指標線的數組為ind_buffer

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

   設置第一條指標線的樣式,DRAW_LINE表示連續曲線,STYLE_SOLID表示實心線,1號粗線

   IndicatorShortName("RSI("+商品+"," +RSI+")");

   設置指標線的顯示簡稱

   return(0);

   初始化函數結束

  }

int start()

設立觸發函數start。start為系統規定函數名,函數內容自定義。當數據變動時,start函數被觸發

  {

   int limit;

   設立自定義變量limit,整數型

   int counted_bars=IndicatorCounted();

   設立整數型自定義變量counted_bars,並將IndicatorCounted()的值賦給counted_bars

   IndicatorCounted()為緩存數量,即已經計算過值的燭柱數

   (注:可能這裡解釋得不是很准確,大致就這個意思)

   if(counted_bars<0) return(-1);

   如果counted_bars值小於零,start函數結束

   if(counted_bars>0) counted_bars--;

   如果counted_bars值大於零,則counted_bars值減掉1。這是為了配合下一句,以避免limit相差1而出錯

   limit=Bars-counted_bars;

   給limit賦值

   Bars為圖表中的柱數

   counted_bars為已經賦值的柱數

   這樣limit的值就是未賦值的燭柱數

   這樣做的目的是避免重復運算,優化程序

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

   循環語句,括號中有三個語句:

   第一句int i=0; 表示循環從i=0開始

   第二句i<limit; 這是循環的條件,如果條件滿足則執行大括號中的循環體,如果條件不滿足,則中止循環,跳到大括號下面的語句執行

   第三句i++,這是循環步調控制語句,每循環一次後執行一次此語句。

   i++相當於i=i+1,即i值在原有數值上增加1

      ind_buffer[i]=iRSI(商品,0,RSI,PRICE_CLOSE,i);

      此語句為循環體,由於只有一個語句,所以省略花括號

      i為圖表燭柱的序號,從0開始,右邊第1柱序號為0,從右向左遞增

      iRSI為RSI指標的取值函數

   return(0);

   start函數結束

  }

 

MT4編程實例:會變色的均線

 

下面這個是示意圖:

 

均線會變色,看起來很神秘,但原理其實很簡單:

 

這裡實際上有兩條均線,一條紅線,一條綠線:

當價格在均線上方時,紅線顯示,綠線隱藏;

當價格在均線下方時,紅線隱藏,綠線顯示,

所以看起來就只是一條會變色的均線。

要隱藏一條指標線中的其中一段,也很簡單,只要把這一段指標線的值賦為空值(EMPTY_VALUE)就行了。

說說容易,但實際操作的時候,我們又遇到了一個小問題,那就是紅綠轉換點的“斷點”問題,紅線和綠線不連續了。圖:

 

這個問題著實困擾了我好一陣,後來終於想通了。

原來,畫線的條件是:前後兩個時點上都必須有值,才能畫出線來。而上圖中2和3之間應該畫上紅線,但在3點位上,紅線的值為空,所以,紅線畫不出來。

要讓紅線、綠線連續,必須使3點位上,既有綠線值又有紅線值,這樣2和3之間才能出現紅線,紅線綠才會連續。

 

為了做到這一點,我們在給指標線循環賦值的時候:

1、在 i 時點上,除了給 i 時點賦值,同時還要給 i+1時點賦同色值(以上圖為例:我們在給3時點賦綠線值時,同時給4時點賦綠線值;在給2時點賦紅線值時,同時再給3點賦紅線值;這樣3時點上就既有紅線值,又有綠線值);

2、賦值的順序為從左向右,即遞減循環,以避免前一操作所賦的值被清空。

這樣我們的目的就達到了。

下面這是經過測試的源代碼

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

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 Red

#property indicator_color2 Green

extern int  變色均線=18;

double duo[];

double kong[];

int init()

  {

   SetIndexBuffer(0,duo);

   SetIndexBuffer(1,kong);

   SetIndexStyle(0,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE);

   SetIndexDrawBegin(0,變色均線);

   SetIndexDrawBegin(1,變色均線);

   IndicatorDigits(Digits);

   return(0);

  }

int start()

  {

   double temp0,temp1;

   int limit;

   int counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);

   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;

   for(int i=limit; i>=0; i--)

      {     

      duo[i]=EMPTY_VALUE;

      kong[i]=EMPTY_VALUE;

      temp0=iMA(NULL,0,變色均線,0,MODE_SMA,PRICE_CLOSE,i);

      temp1=iMA(NULL,0,變色均線,0,MODE_SMA,PRICE_CLOSE,i+1);

      if(iClose(NULL,0,i)>=iMA(NULL,0,變色均線,0,MODE_SMA,PRICE_CLOSE,i)) 

            {duo[i]=temp0; duo[i+1]=temp1;}

      else  {kong[i]=temp0; kong[i+1]=temp1;}

      }      

   return(0);

  }

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

當然,上面這個是以價格在均線上下方為條件的,我們也可以以MACD、KDJ、RSI等指標作為均線變色的條件。我們還可以更進一步,把雙色線改為三色線等等

 

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

語句簡要解釋如下:

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

#property indicator_chart_window

指標放在主圖

#property indicator_buffers 2

設置指標線數組為2個

#property indicator_color1 Red

#property indicator_color2 Green

設置第一條指標線顏色值為Red,第二條顏色值為Green

extern int  變色均線=18;

設立一個自定義變量,允許外部值修改,整數形,變量名為"變色均線",默認值18

double duo[];

設立一個自定義數組,雙精度型,名稱為duo

該數組在後面用於存儲紅線數據

double kong[];

設立一個自定義數組,雙精度型,名稱為kong

該數組在後面用於存儲綠線數據

int init()

設立初始化函數init。init為系統規定函數名,函數內容自定義。該函數在指標被加載時運行一次

  {

   SetIndexBuffer(0,duo);

   SetIndexBuffer(1,kong);

   設置第一、二條指標線的數組為duo和kong

   SetIndexStyle(0,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE);

   設置第一、二條指標線的樣式,線型為連續曲線

   SetIndexDrawBegin(0,變色均線);

   SetIndexDrawBegin(1,變色均線);

   設置第一、二條指標線的最左邊的起始劃線位置

   IndicatorDigits(Digits);

   設置指標精確到的小數位數

   Digits是當前匯率小數位,日系Digits=2,其他幣對Digits=4

   return(0);

   init函數結束,返回零值

  }

int start()

設立觸發函數start。start為系統規定函數名,函數內容自定義。當數據變動時,start函數被觸發

  {

   double temp0,temp1;

   設立雙精度型自定義變量temp0、temp1

   int limit;

   設立自定義變量limit,整數型

   int counted_bars=IndicatorCounted();

   設立整數型自定義變量counted_bars,並將IndicatorCounted()的值賦給counted_bars

   IndicatorCounted()為緩存數,即已經計算過值的燭柱數

   if(counted_bars<0) return(-1);

   如果counted_bars值小於零,start函數結束

   if(counted_bars>0) counted_bars--;

   如果counted_bars值大於零,則counted_bars值減掉1。這是為了配合下一句,以避免limit相差1而出錯

   limit=Bars-counted_bars;

   給limit賦值

   Bars為圖表中的燭柱數

   counted_bars為緩存數,即已經運算過的燭柱數

   這樣limit的值就是未經運算的燭柱數

   這樣做的目的是避免重復運算,優化程序

   for(int i=limit; i>=0; i--)

   循環語句,括號中有三個語句:

   第一句int i=limit; 表示循環從i=limit開始

   第二句i>=0; 這是循環的條件,如果條件滿足則執行大括號中的循環體,如果條件不滿足,則中止循環,跳到大括號下面的語句執行

   第三句i--,這是循環步調控制語句,每循環一次後執行一次此語句。

   i--相當於i=i-1,即i值在原有數值上減少1

      {    

      duo[i]=EMPTY_VALUE;

      kong[i]=EMPTY_VALUE;

      給數組duo和kong在i位置上賦空值

      EMPTY_VALUE:空值

      temp0=iMA(NULL,0,變色均線,0,MODE_SMA,PRICE_CLOSE,i);

      temp1=iMA(NULL,0,變色均線,0,MODE_SMA,PRICE_CLOSE,i+1);

      把均線在i和i+1位置上均線值,分別賦給temp0和temp1

      這是為了使後面的語句看起來簡潔

      if(iClose(NULL,0,i)>=iMA(NULL,0,變色均線,0,MODE_SMA,PRICE_CLOSE,i))

      判斷條件語句:如果價格高於均線

            {duo[i]=temp0; duo[i+1]=temp1;}

            判斷執行語句:給數組元素duo[i]、duo[i+1]分別賦值

      else  {kong[i]=temp0; kong[i+1]=temp1;}

      如果判斷條件不成立,即價格低於均線:則給數組元素kong[i]、kong[i+1]分別賦值

      }     

   return(0);

   start函數結束,返回零值

  }

 

MT4編程參考

 

MT4編程參考-第一節 語法

語法 [Syntax]

代碼格式

空格建、Tab鍵、換行鍵和換頁符都可以成為代碼排版的分隔符,你能使用各種符號來增加代碼的可讀性。

 

注釋 

多行注釋使用 結束,在這之間不能夠嵌套。單行注釋使用 // 作為開始到新的一行結束,可以被嵌套到多行注釋之中。

示例:

// 單行注釋 

 

 

標識符 

標識符用來給變量、函數和數據類型進行命名,長度不能超過31個字節

你可以使用數字0-9、拉丁字母大寫A-Z和小寫a-z(大小寫有區分的)還有下劃線(_)。此外首字母不可以是數字,標識符不能和保留字沖突.

示例:

// NAME1 namel Total_5 Paper

 

保留字 

下面列出的是固定的保留字。不能使用以下任何保留字進行命名。

數據類型 存儲類型 操作符 其它

bool extern break false

color static case true

datetime   continue  

double   default  

int   else  

string   for  

void   if  

    return  

    switch  

    while  

第二節 數據類型

數據類型 [Data types]

數據類型概述

主要數據類型有:

• Integer (int) 

• Boolean (bool) 

• ëèòåðàëû (char) 

• String (string) 

• Floating-point number (double) 

• Color (color) 

• Datetime (datetime) 

我們用Integer類型數據來作為DateTime和Color數據的存儲。

使用以下方式可以進行類型站換:

int (bool,color,datetime);

double;

string;

 

Integer 類型

十進制: 數字0-9;0不能作為第一個字母

示例:

12, 111, -956 1007

十六進制: 數字0-9;拉丁字母a-f或A-F用來表示10-15;使用0x或者0X作為開始。

示例:

0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7

Integer 變量的取值范圍為-2147483648到2147483647。

 

Literal 類型

任意在單引號中的字符或十六進制的任意ASCII碼例如'\x10'都是被看作為一個字符,

一些字符例如單引號('),雙引號("),問號(?),反斜槓(\)和一些控制符都需要在之前加一個反斜槓(\)進行轉意後表示出來:

line feed NL (LF) \n

horizontal tab HT \t

carriage return CR \r

reverse slash \ \\

single quote ' \'

double quote " \"

hexadecimal ASCII-code hh \xhh

以上字符如果不經過反斜槓進行轉意將不能被使用

示例:

int a = 'A';

int b = '$';

int c = '©'; // code 0xA9

int d = '\xAE'; // symbol code ®

 

Boolean 類型

Boolean 用來表示 是 和 否, 還可以用數字 1 和 0 進行表示。True和Flase可以忽略大小寫。

示例:

bool a = true;

bool b = false;

bool c = 1;

 

Floating-point number 類型

浮點型變量在整數型後面加一個點(.)用來更精確的表示十進制數字。

示例:

double a = 12.111;

double b = -956.1007;

double c = 0.0001;

double d = 16;

浮點型的取值范圍從 2.2e-308 到 1.8e308.

 

String 類型

字符串型是用來表示連續的ASCII碼字符的使用連續的兩個雙引號來包括需要表示的內容如:"Character constant".

示例:

"This is a character string"

"Copyright symbol \t\xA9"

"this line with LF symbol \n"

"A" "1234567890" "0" "$"

 

Color 類型

顏色類型可以使用以下示例裡的幾種方式進行定義。

示例:

// symbol constants

C'128,128,128' // gray

C'0x00,0x00,0xFF' // blue

// named color

Red

Yellow

Black

// integer-valued representation

0xFFFFFF // white

16777215 // white

0x008000 // green

32768 // green

 

Datetime 類型

時間類型使用年、月、日、時、分、秒來進行定義,你可以使用以下示例中的方式來定義變量。

示例:

D'2004.01.01 00:00' // New Year

D'1980.07.19 12:30:27'

D'19.07.1980 12:30:27'

D'19.07.1980 12' //equal to D'1980.07.19 12:00:00'

D'01.01.2004' //equal to D'01.01.2004 00:00:00'

D'12:30:27' //equal to D'[compilation date] 12:30:27'

D'' //equal to D'[compilation date] 00:00:00'

第三節 運算符和表達式

運算符和表達式 [Operations & Expressions]

表達式

一個表達式可以擁有多個字符和操作符,一個表達式可以寫在幾行裡面。

示例:

a++; b = 10; x = (y*z)/w;

注:分號(;)是表達式的結束符。

 

算術運算符

Sum of values i = j + 2;

Difference of values i = j - 3;

Changing the operation sign x = - x;

Product of values z = 3 * x;

Division quotient i = j / 5;

Division remainder minutes = time % 60;

Adding 1 to the variable value i++;

Subtracting 1 from the variable value k--;

加減1的運算符不能被嵌套在表達式中

int a=3;

a++; // 可行的表達式

int b=(a++)*3; // 不可行的表達式

 

賦值運算符

注:將右側的結果賦值給左側的變量

將x的值賦值給y y = x;

將x的值加到y上面 y += x;

在y上面減去x的值 y -= x;

得到y的x倍的值 y *= x;

得到y除以x的值 y /= x;

取y除以x後的余數 y %= x;

y向右位移x位 y >>= x;

y向左位移x位 y <<= x;

得到邏輯AND的值 y &= x;

得到邏輯OR的值 y |= x;

得到邏輯非OR的值 y ^= x;

注:一個表達式只能有一個賦值運算符.

 

關系運算符

用返回0(False)或1(True)來表示兩個量之間的關系。

a是否等於b a == b;

a是否不等於b a != b;

a是否小於b a < b;

a是否大於b a > b;

a是否小於等於b a <= b;

a是否大於等於b a >= b;

 

真假運算符

否定運算符(!),用來表示真假的反面的結果。

// 如果a不是真的

if(!a)

Print("not 'a'");

邏輯運算符或(||)用來表示兩個表達式只要有一個成立即可。

示例:

if(xl)

Print("out of range");

邏輯運算符和(&&)用來表示兩個表達式要同時成立才行。

示例:

if(p!=x && p>y)

Print("true");

n++;

 

位邏輯運算符

~ 運算符對操作數執行按位求補操作。

b = ~n;

>> 運算符對操作數執行向右位移操作。

x = x >> y;

<< 運算符對操作數執行向左位移操作。

x = x << y;

一元 & 運算符返回操作數的地址

為整型和 bool 類型預定義了二進制 & 運算符。對於整型,& 計算操作數的按位“與”。對於 bool 操作數,& 計算操作數的邏輯“與”;也就是說,當且僅當兩個操作數均為 true 時,其結果才為 true。

b = ((x & y) != 0);

二進制 | 運算符是為整型和 bool 類型預定義的。對於整型,| 對操作數進行按位“或”運算。對於 bool 操作數,| 對操作數進行邏輯“或”計算,也就是說,當且僅當兩個操作數均為 false 時,其結果才為 false。

b = x | y;

為整型和 bool 類型預定義了 ^ 二進制操作數。對於整型,^ 計算操作數的按位“異或”。對於 bool 操作數,^ 計算操作數的邏輯“異或”;也就是說,當且僅當只有一個操作數為 true 時,其結果才為 true。

b = x ^ y;

注:位邏輯運算符只作用於Integers類型

 

其它運算符

索引。定位在數組中i位置的值。

array[i] = 3;

//將3負值到array數組第i位置上

使用 x1,x2,...,xn 這樣的方法將各種值傳送到function中進行運算。

示例:

double SL=Ask-25*Point;

double TP=Ask+25*Point;

int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,TP,

"My comment",123,0,Red);

 

優先級規則

下面是從上到下的運算優先規則,優先級高的將先被運算。

() Function call From left to right

[] Array element selection

! Negation From left to right

~ Bitwise negation

- Sign changing operation

* Multiplication From left to right

/ Division

% Module division

+ Addition From left to right

- Subtraction

<< Left shift From left to right

>> Right shift

< Less than From left to right

<= Less than or equals

> Greater than

>= Greater than or equals

== Equals From left to right

!= Not equal

& Bitwise AND operation From left to right

^ Bitwise exclusive OR From left to right

| Bitwise OR operation From left to right

&& Logical AND From left to right

|| Logical OR From left to right

= Assignment From right to left

+= Assignment addition

-= Assignment subtraction

*= Assignment multiplication

/= Assignment division

%= Assignment module

>>= Assignment right shift

<<= Assignment left shift

&= Assignment bitwise AND

|= Assignment bitwise OR

^= Assignment exclusive OR

, Comma From left to right

第四節 操作符

操作符 [Operators] 

格式和嵌套

格式.一個操作符可以占用一行或者多行,兩個或多個操作符可以占用更多的行。

嵌套.執行控制符(if, if-else, switch, while and for)可以進行任意嵌套.

 

復合操作符

一個復合操作符有一個(一個區段)和由一個或多個任何類型的操作符組成的的附件{}. 每個表達式使用分號作為結束(;)

示例:

if(x==0)

{

x=1; y=2; z=3;

}

 

表達式操作符

任何以分號(;)結束的表達式都被視為是一個操作符。

Assignment operator.

Identifier=expression;

標識符=表達式;

示例:

x=3;

y=x=3; // 這是錯誤的

一個操作符中只能有一個表達式。

調用函數操作符

Function_name(argument1,..., argumentN);

函數名稱(參數1,...,參數N);

示例:

fclose(file);

空操作符

只有一個分號組成(;).我們用它來表示沒有任何表達式的空操作符.

 

停止操作符

一個break; , 我們將其放在嵌套內的指定位置,用來在指定情況下跳出循環操作.

示例:

// 從0開始搜索數組

for(i=0;i<ARRAY_SIZE;I++)

if((array[i]==0)

break;

 

繼續操作符

一個continue;我們將其放在嵌套內的指定位置,用來在指定情況下跳過接下來的運算,直接跳入下一次的循環。

示例:

// summary of nonzero elements of array

int func(int array[])

{

int array_size=ArraySize(array);

int sum=0;

for(int i=0;i

{

if(a[i]==0) continue;

sum+=a[i];

}

return(sum);

}

 

返回操作符

一個return;將需要返回的結果放在return後面的()中。

示例:

return(x+y);

 

條件操作符 if

if (expression)

operator;

如果表達式為真那麼執行操作。

示例:

if(a==x)

temp*=3;

temp=MathAbs(temp);

 

條件操作符 if-else

if (expression)

operator1

else

operator2

如果表達式為真那麼執行operator1,如果為假執行operator2,else後還可以跟進多個if執行多項選擇。詳見示例。

示例:

if(x>1)

if(y==2)

z=5;

else

z=6;

if(x>l)

{

if(y==2) z=5;

}

else

{

z=6;

}

// 多項選擇

if(x=='a')

{

y=1;

}

else if(x=='b')

{

y=2;

z=3;

}

else if(x=='c')

{

y = 4;

}

else

{

Print("ERROR");

}

 

選擇操作符 switch

switch (expression)

{

case constant1: operators; break;

case constant2: operators; break;

...

default: operators; break;

}

當表達式expression的值等於結果之一時,執行其結果下的操作。不管結果如何都將執行default中的操作。

示例:

case 3+4: //正確的

case X+Y: //錯誤的

被選擇的結果只可以是常數,不可為變量或表達式。

示例:

switch(x)

{

case 'A':

Print("CASE A\n");

break;

case 'B':

case 'C':

Print("CASE B or C\n");

break;

default:

Print("NOT A, B or C\n");

break;

}

 

循環操作符 while

while (expression)

operator;

只要表達式expression為真就執行操作operator

示例:

while(k<N)

{

y=y*x;

k++;

}

 

循環操作符 for

for (expression1; expression2; expression3)

operator;

用表達式1(expression1)來定義初始變量,當表達式2(expression2)為真的時候執行操作operator,在每次循環結束後執行表達式3(expression3)

用while可以表示為這樣:

expression1;

while (expression2)

{

operator;

expression3;

};

示例:

for(x=1;x<=7;x++)

Print(MathPower(x,2));

使用for(;;)可以造成一個死循環如同while(true)一樣.

表達式1和表達式3都可以內嵌多個用逗號(,)分割的表達式。

示例:

for(i=0,j=n-l;i<N;I++,J--)

a[i]=a[j];

第五節 函數

函數 [Function]

函數定義

一個函數是由返回值、輸入參數、內嵌操作所組成的。

示例:

double // 返回值類型

linfunc (double x, double a, double b) // 函數名和輸入參數

{

// 內嵌的操作

return (a*x + b); // 返回值

}

如果沒有返回值那麼返回值的類型可以寫為void

示例:

void errmesg(string s)

{

Print("error: "+s);

}

 

函數調用

function_name (x1,x2,...,xn)

示例:

int somefunc()

{

double a=linfunc(0.3, 10.5, 8);

}

double linfunc(double x, double a, double b)

{

return (a*x + b);

}

 

特殊函數 init()、deinit()和start()

init()在載入時調用,可以用此函數在開始自定義指標或者自動交易之前做初始化操作。

deinit()在卸載時調用,可以用此函數在去處自定義指標或者自動交易之前做初始化操作。

start()當數據變動時觸發,對於自定義指標或者自動交易的編程主要依靠此函數進行。

 

第六節 變量

變量 [Variables]

定義變量

定義基本類型

基本類型包括

• string - 字符串型; 

• int - 整數型; 

• double - 雙精度浮點數型; 

• bool - 布爾型 

示例:

string MessageBox;

int Orders;

double SymbolPrice;

bool bLog;

 

定義附加類型

附加類型包括

• datetime - 時間型,使用無符號整型數字存儲,是1970.1.1 0:0:0開始的秒數 

• color - 顏色,使用三色的整型數字編碼而成 

示例:

extern datetime tBegin_Data = D'2004.01.01 00:00';

extern color cModify_Color = C'0x44,0xB9,0xE6';

 

定義數組類型

示例:

int a[50]; //一個一維由五十個int組成的數組

double m[7][50]; //一個兩維由7x50個double組成的數組

內部變量定義

內部變量顧名思義是在內部使用的,可以理解為在當前嵌套內所使用的變量。

 

函數參數定義

示例:

void func(int x, double y, bool z)

{

...

}

函數的參數內的變量只能在函數內才生效,在函數外無法使用,而且在函數內對變量進行的修改在函數外無法生效。

調用函數示例:

func(123, 0.5);

如果有需要在變量傳入由參數傳入函數內操作後保留修改在函數外生效的情況的話,可以在參數定義的類型名稱後加上修飾符(&)。

示例:

void func(int& x, double& y, double& z[])

{

...

}

 

靜態變量定義

在數據類型前加上static就可以將變量定義成靜態變量

示例:

{

static int flag

}

 

全局變量定義

全局變量是指在整個程序中都能夠調用的變量,只需將變量定義卸載所有嵌套之外即可。

示例:

int Global_flag;

int start()

{

...

}

 

附加變量定義

附加變量可以允許由用戶自己輸入。

示例:

extern double InputParameter1 = 1.0;

int init()

{

...

}

 

初始化變量

變量必須經過初始化才可以使用。

 

基本類型

示例:

int mt = 1; // integer 初始化

// double 初始化

double p = MarketInfo(Symbol(),MODE_POINT);

// string 初始化

string s = "hello";

 

數組類型

示例:

int mta[6] = {1,4,9,16,25,36};

 

外部函數引用

示例:

#import "user32.dll"

int MessageBoxA(int hWnd ,string szText,

string szCaption,int nType);

int SendMessageA(int hWnd,int Msg,int wParam,int lParam);

#import "lib.ex4"

double round(double value);

#import

第七節 預處理程序

預定義變量 [Pre-defined Variables] 

double Ask

通貨的買入價

示例:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)

{

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My order #2",3,D'2005.10.10 12:30',Red);

return;

}

 

int Bars

返回圖表中的柱數

示例:

int counter=1;

for(int i=1;i<=Bars;i++)

{

Print(Close[i-1]);

}

 

double Bid

通貨的賣價

示例:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)

{

OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"My order #2",3,D'2005.10.10 12:30',Red);

return(0);

}

 

double Close[]

返回指定索引位置的收盤價格

示例:

int handle, bars=Bars;

handle=FileOpen("file.csv",FILE_CSV|FILE_WRITE,';');

if(handle>0)

{

// write table columns headers

FileWrite(handle, "Time;Open;High;Low;Close;Volume");

// write data

for(int i=0; i

FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);

FileClose(handle);

}

 

int Digits

返回當前通貨的匯率小數位

示例:

Print(DoubleToStr(Close[i-1], Digits));

 

double High[]

返回指定索引位置的最高價格

示例:

int handle, bars=Bars;

handle=FileOpen("file.csv", FILE_CSV|FILE_WRITE, ';');

if(handle>0)

{

// write table columns headers

FileWrite(handle, "Time;Open;High;Low;Close;Volume");

// write data

for(int i=0; i

FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);

FileClose(handle);

}

 

double Low[]

返回指定索引位置的最低價格

示例:

int handle, bars=Bars;

handle=FileOpen("file.csv", FILE_CSV|FILE_WRITE, ";");

if(handle>0)

{

// write table columns headers

FileWrite(handle, "Time;Open;High;Low;Close;Volume");

// write data

for(int i=0; i

FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);

FileClose(handle);

}

 

double Open[]

返回指定索引位置的開盤價格

示例:

int handle, bars=Bars;

handle=FileOpen("file.csv", FILE_CSV|FILE_WRITE, ';');

if(handle>0)

{

// write table columns headers

FileWrite(handle, "Time;Open;High;Low;Close;Volume");

// write data

for(int i=0; i

FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);

FileClose(handle);

}

 

double Point

返回當前圖表的點值

示例:

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,Red);

 

datetime Time[]

返回指定索引位置的時間

示例:

int handle, bars=Bars;

handle=FileOpen("file.csv", FILE_CSV|FILE_WRITE, ';');

if(handle>0)

{

// write table columns headers

FileWrite(handle, "Time;Open;High;Low;Close;Volume");

// write data

for(int i=0; i

FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);

FileClose(handle);

}

 

double Volume[]

返回指定索引位置的成交量

示例:

int handle, bars=Bars;

handle=FileOpen("file.csv", FILE_CSV|FILE_WRITE, ';');

if(handle>0)

{

// write table columns headers

FileWrite(handle, "Time;Open;High;Low;Close;Volume");

// erite data

for(int i=0; i

FileWrite(handle, Time[i], Open[i], High[i], Low[i], Close[i], Volume[i]);

FileClose(handle);

)

字符串函數 [String Functions]

string StringConcatenate( ... ) 

字符串連接

:: 輸入參數

... - 任意值,用逗號分割

示例:

string text;

text=StringConcatenate("Account free margin is ", AccountFreeMargin(), "Current time is ", TimeToStr(CurTime()));

// slow text="Account free margin is " + AccountFreeMargin() + "Current time is " + TimeToStr(CurTime())

Print(text);

 

int StringFind( string text, string matched_text, int start=0)

在字符串中尋找符合條件的字符串返回索引位置

:: 輸入參數

text - 被搜索的字符串 

matched_text - 需要搜索的字符串

start - 搜索開始索引位置

示例:

string text="The quick brown dog jumps over the lazy fox";

int index=StringFind(text, "dog jumps", 0);

if(index!=16)

Print("oops!");

 

int StringGetChar( string text, int pos)

取字符串中的某一個字符

:: 輸入參數

text - 字符串 

pos - 取字符的位置

示例:

int char_code=StringGetChar("abcdefgh", 3);

// char code 'c' is 99

 

int StringLen( string text)

返回字符串長度

:: 輸入參數

text - 字符串

示例:

string str="some text";

if(StringLen(str)<5) return(0);

 

string StringSetChar( string text, int pos, int value)

在字符串中設置一個字符

:: 輸入參數

text - 字符串 

pos - 設置字符的位置

value - 新的字符

示例:

string str="abcdefgh";

string str1=StringSetChar(str, 3, 'D');

// str1 is "abcDefgh"

 

string StringSubstr( string text, int start, int count=EMPTY)

從字符串中截取一段字符串

:: 輸入參數

text - 字符串 

start - 開始索引位置

count - 截取字符數

示例:

string text="The quick brown dog jumps over the lazy fox";

string substr=StringSubstr(text, 4, 5);

// subtracted string is "quick" word

 

string StringTrimLeft( string text)

字符串左側去空格

:: 輸入參數

text - 字符串

示例:

string str1=" Hello world ";

string str2=StringTrimLeft(str);

// after trimming the str2 variable will be "Hello World "

 

string StringTrimRight( string text)

字符串右側去空格

:: 輸入參數

text - 字符串

示例:

string str1=" Hello world ";

string str2=StringTrimRight(str);

// after trimming the str2 variable will be " Hello World"

第八節 帳戶信息

賬戶信息 [Account Information]

double AccountBalance()

返回賬戶余額

示例:

Print("Account balance = ",AccountBalance());

 

double AccountCredit()

返回賬戶信用點數

示例:

Print("Account number ", AccountCredit());

 

string AccountCompany()

返回賬戶公司名

示例:

Print("Account company name ", AccountCompany());

 

string AccountCurrency()

返回賬戶所用的通貨名稱

示例:

Print("account currency is ", AccountCurrency());

 

double AccountEquity()

返回資產淨值

示例:

Print("Account equity = ",AccountEquity());

 

double AccountFreeMargin()

Returns free margin value of the current account.

示例:

Print("Account free margin = ",AccountFreeMargin());

 

int AccountLeverage()

返回槓桿比率

示例:

Print("Account #",AccountNumber(), " leverage is ", AccountLeverage());

 

double AccountMargin()

Returns margin value of the current account.

示例:

Print("Account margin ", AccountMargin());

 

string AccountName()

返回賬戶名稱

示例:

Print("Account name ", AccountName());

 

int AccountNumber()

返回賬戶數字

示例:

Print("account number ", AccountNumber());

 

double AccountProfit()

返回賬戶利潤

示例:

Print("Account profit ", AccountProfit());

第九節 數組函數

數組函數 [Array Functions]

int ArrayBsearch( double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND)

搜索一個值在數組中的位置

此函數不能用在字符型或連續數字的數組上.

:: 輸入參數

array[] - 需要搜索的數組

value - 將要搜索的值 

count - 搜索的數量,默認搜索所有的數組

start - 搜索的開始點,默認從頭開始

direction - 搜索的方向,MODE_ASCEND 順序搜索 MODE_DESCEND 倒序搜索

示例:

datetime daytimes[];

int shift=10,dayshift;

// All the Time[] timeseries are sorted in descendant mode

ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);

if(Time[shift]&gt>=daytimes[0]) dayshift=0;

else

{

dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);

if(Period()<PERIOD_D1)

dayshift++;

}

Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ",

TimeToStr(daytimes[dayshift]));

 

int ArrayCopy( object& dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)

復制一個數組到另外一個數組。

只有double[], int[], datetime[], color[], 和 bool[] 這些類型的數組可以被復制。

:: 輸入參數

dest[] - 目標數組 

source[] - 源數組 

start_dest - 從目標數組的第幾位開始寫入,默認為0

start_source - 從源數組的第幾位開始讀取,默認為0

count - 讀取多少位的數組

示例:

double array1[][6];

double array2[10][6];

// fill array with some data

ArrayCopyRates(array1);

ArrayCopy(array2, array1,0,Bars-9,10);

// now array2 has first 10 bars in the history

 

int ArrayCopyRates( double& dest_array[], string symbol=NULL, int timeframe=0)

復制一段走勢圖上的數據到一個二維數組,數組的第二維只有6個項目分別是:

0 - 時間,

1 - 開盤價,

2 - 最低價,

3 - 最高價,

4 - 收盤價,

5 - 成交量.

:: 輸入參數

dest_array[] - 目標數組

symbol - 標示,當前所需要的通貨的標示

timeframe - 圖表的時間線

示例:

double array1[][6];

ArrayCopyRates(array1,"EURUSD", PERIOD_H1);

Print("Current bar ",TimeToStr(array1[0][0]),"Open", array1[0][1]);

 

int ArrayCopySeries( double& array[], int series_index, string symbol=NULL, int timeframe=0)

復制一個系列的走勢圖數據到數組上

注: 如果series_index是MODE_TIME, 那麼第一個參數必須是日期型的數組

:: 輸入參數

dest_array[] - 目標數組

series_index - 想要取的系列的名稱或編號,0-5

symbol - 標示,當前所需要的通貨的標示

timeframe - 圖表的時間線

示例:

datetime daytimes[];

int shift=10,dayshift;

// All the Time[] timeseries are sorted in descendant mode

ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);

if(Time[shift]>=daytimes[0]) dayshift=0;

else

{

dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);

if(Period()

}

Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ", TimeToStr(daytimes[dayshift]));

 

int ArrayDimension( int array[])

返回數組的維數

:: 輸入參數

array[] - 需要檢查的數組

示例:

int num_array[10][5];

int dim_size;

dim_size=ArrayDimension(num_array);

// dim_size is 2

 

bool ArrayGetAsSeries(object array[])

檢查數組是否是有組織序列的數組(是否從最後到最開始排序過的),如果不是返回否

:: 輸入參數

array[] - 需要檢查的數組

示例:

if(ArrayGetAsSeries(array1)==true)

Print("array1 is indexed as a series array");

else

Print("array1 is indexed normally (from left to right)");

 

int ArrayInitialize( double& array[], double value)

對數組進行初始化,返回經過初始化的數組項的個數

:: 輸入參數

array[] - 需要初始化的數組

value - 新的數組項的值

示例:

//---- 把所有數組項的值設置為2.1

double myarray[10];

ArrayInitialize(myarray,2.1);

 

bool ArrayIsSeries( object array[])

檢查數組是否連續的(time,open,close,high,low, or volume).

:: 輸入參數

array[] - 需要檢查的數組

示例:

if(ArrayIsSeries(array1)==false)

ArrayInitialize(array1,0);

else

{

Print("Series array cannot be initialized!");

return(-1);

}

 

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)

找出數組中最大值的定位

:: 輸入參數

array[] - 需要檢查的數組

count - 搜索數組中項目的個數

start - 搜索的開始點

示例:

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};

int maxValueIdx=ArrayMaximum(num_array);

Print("Max value = ", num_array[maxValueIdx]);

 

int ArrayMinimum( double array[], int count=WHOLE_ARRAY, int start=0)

找出數組中最小值的定位

:: 輸入參數

array[] - 需要檢查的數組

count - 搜索數組中項目的個數

start - 搜索的開始點

示例:

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};

double minValueidx=ArrayMinimum(num_array);

Print("Min value = ", num_array[minValueIdx]);

 

int ArrayRange( object array[], int range_index)

取數組中指定維數中項目的數量。

:: 輸入參數

array[] - 需要檢查的數組

range_index - 指定的維數

示例:

int dim_size;

double num_array[10,10,10];

dim_size=ArrayRange(num_array, 1);

 

int ArrayResize( object& array[], int new_size)

重定義數組大小

:: 輸入參數

array[] - 需要檢查的數組

new_size - 第一維中數組的新大小

示例:

double array1[][4];

int element_count=ArrayResize(array, 20);

// 數組中總項目數為80

 

bool ArraySetAsSeries( double& array[], bool set)

設置指數數組為系列數組,數組0位的值是最後的值。返回之前的數組狀態

:: 輸入參數

array[] - 需要處理的數組

set - 是否是設置為系列數組,true或者false

示例:

double macd_buffer[300];

double signal_buffer[300];

int i,limit=ArraySize(macd_buffer);

ArraySetAsSeries(macd_buffer,true);

for(i=0; i

 

macd_buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);

for(i=0; i

signal_buffer[i]=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);

 

int ArraySize( object array[])

返回數組的項目數

:: 輸入參數

array[] - 需要處理的數組

示例:

int count=ArraySize(array1);

for(int i=0; i

{

// do some calculations.

}

 

int ArraySort( double& array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)

對數組進行排序,系列數組不可進行排序

:: 輸入參數

array[] - 需要處理的數組

count - 對多少個數組項進行排序

start - 排序的開始點

sort_dir - 排序方式,MODE_ASCEND順序排列 MODE_DESCEND倒序排列

示例:

double num_array[5]={4,1,6,3,9};

// now array contains values 4,1,6,3,9

ArraySort(num_array);

// now array is sorted 1,3,4,6,9

ArraySort(num_array,MODE_DESCEND);

// now array is sorted 9,6,4,3,1

類型轉換函數 [Conversion Functions]

string CharToStr( int char_code) 

將字符型轉換成字符串型結果返回

:: 輸入參數

char_code - 字符的ACSII碼

示例:

string str="WORL" + CharToStr(44); // 44 is code for 'D'

// resulting string will be WORLD

 

string DoubleToStr( double value, int digits)

將雙精度浮點型轉換成字符串型結果返回

:: 輸入參數

value - 浮點型數字

digits - 小數點後多少位,0-8

示例:

string value=DoubleToStr(1.28473418, 5);

// value is 1.28473

 

double NormalizeDouble( double value, int digits)

將雙精度浮點型格式化後結果返回

:: 輸入參數

value - 浮點型數字

digits - 小數點後多少位,0-8

示例:

double var1=0.123456789;

Print(NormalizeDouble(var1,5));

// output: 0.12346

 

double StrToDouble( string value)

將字符串型轉換成雙精度浮點型結果返回

:: 輸入參數

value - 數字的字符串

示例:

double var=StrToDouble("103.2812");

 

int StrToInteger( string value)

將字符串型轉換成整型結果返回

:: 輸入參數

value - 數字的字符串

示例:

int var1=StrToInteger("1024");

 

datetime StrToTime( string value)

將字符串型轉換成時間型結果返回,輸入格式為 yyyy.mm.dd hh:mi

:: 輸入參數

value - 時間的字符串

示例:

datetime var1;

var1=StrToTime("2003.8.12 17:35");

var1=StrToTime("17:35"); // returns with current date

var1=StrToTime("2003.8.12"); // returns with midnight time "00:00"

 

string TimeToStr( datetime value, int mode=TIME_DATE|TIME_MINUTES)

將時間型轉換成字符串型返回

:: 輸入參數

value - 時間的數字,從1970.1.1 0:0:0 到現在的秒數

mode - 返回字符串的格式TIME_DATE(yyyy.mm.dd),TIME_MINUTES(hh:mi),TIME_SECONDS(hh:mi:ss)

示例:

strign var1=TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS);

第十節 公用函數

公用函數 [Common Functions]

void Alert( ... ) 

彈出一個顯示信息的警告窗口

:: 輸入參數

... - 任意值,如有多個可用逗號分割

示例:

if(Close[0]>SignalLevel)

Alert("Close price coming ", Close[0],"!!!");

 

string ClientTerminalName()

返回客戶終端名稱

示例:

Print("Terminal name is ",ClientTerminalName());

 

string CompanyName()

返回公司名稱

示例:

Print("Company name is ",CompanyName());

 

void Comment( ... )

顯示信息在走勢圖左上角

:: 輸入參數

... - 任意值,如有多個可用逗號分割

示例:

double free=AccountFreeMargin();

Comment("Account free margin is ",DoubleToStr(free,2),"\n","Current time is ",TimeToStr(CurTime()));

 

int GetLastError()

取最後錯誤在錯誤中的索引位置

示例:

int err;

int handle=FileOpen("somefile.dat", FILE_READ|FILE_BIN);

if(handle<1)

{

err=GetLastError();

Print("error(",err,"): ",ErrorDescription(err));

return(0);

}

 

int GetTickCount()

取時間標記,函數取回用毫秒標示的時間標記。

示例:

int start=GetTickCount();

// do some hard calculation...

Print("Calculation time is ", GetTickCount()-start, " milliseconds.");

 

void HideTestIndicators(bool hide)

使用此函數設置一個在Expert Advisor的開關,在測試完成之前指標不回顯示在圖表上。

:: 輸入參數

hide - 是否隱藏 True或者False

示例:

HideTestIndicators(true);

 

bool IsConnected()

返回客戶端是否已連接

示例:

if(!IsConnected())

{

Print("Connection is broken!");

return(0);

}

// Expert body that need opened connection

// ...

 

bool IsDemo()

返回是否是模擬賬戶

示例:

if(IsDemo()) Print("I am working on demo account");

else Print("I am working on real account");

 

bool IsDllsAllowed()

返回是否允許載入Dll文件

示例:

#import "user32.dll"

int MessageBoxA(int hWnd ,string szText, string szCaption,int nType);

...

...

if(IsDllsAllowed()==false)

{

Print("DLL call is not allowed. Experts cannot run.");

return(0);

}

// expert body that calls external DLL functions

MessageBoxA(0,"an message","Message",MB_OK);

 

bool IsLibrariesAllowed()

返回是否允許載入庫文件

示例:

#import "somelibrary.ex4"

int somefunc();

...

...

if(IsLibrariesAllowed()==false)

{

Print("Library call is not allowed. Experts cannot run.");

return(0);

}

// expert body that calls external DLL functions

somefunc();

 

bool IsStopped()

返回是否處於停止狀態

示例:

while(expr!=false)

{

if(IsStopped()==true) return(0);

// long time procesing cycle

// ...

}

 

bool IsTesting()

返回是否處於測試模式

示例:

if(IsTesting()) Print("I am testing now");

 

bool IsTradeAllowed()

返回是否允許交易

示例:

if(IsTradeAllowed()) Print("Trade allowed");

 

double MarketInfo( string symbol, int type)

返回市場當前情況

:: 輸入參數

symbol - 通貨代碼

type - 返回結果的類型

示例:

double var;

var=MarketInfo("EURUSD",MODE_BID);

 

int MessageBox( string text=NULL, string caption=NULL, int flags=EMPTY)

彈出消息窗口,返回消息窗口的結果

:: 輸入參數

text - 窗口顯示的文字

caption - 窗口上顯示的標題

flags - 窗口選項開關

示例:

#include

if(ObjectCreate("text_object", OBJ_TEXT, 0, D'2004.02.20 12:30', 1.0045)==false)

{

int ret=MessageBox("ObjectCreate() fails with code "+GetLastError()+"\nContinue?", "Question", MB_YESNO|MB_ICONQUESTION);

if(ret==IDNO) return(false);

}

// continue

 

int Period()

返回圖表時間線的類型

示例:

Print("Period is ", Period());

 

void PlaySound( string filename)

播放音樂文件

:: 輸入參數

filename - 音頻文件名

示例:

if(IsDemo()) PlaySound("alert.wav");

 

void Print( ... )

將文本打印在結果窗口內

:: 輸入參數

... - 任意值,復數用逗號分割

示例:

Print("Account free margin is ", AccountFreeMargin());

Print("Current time is ", TimeToStr(CurTime()));

double pi=3.141592653589793;

Print("PI number is ", DoubleToStr(pi,8));

// Output: PI number is 3.14159265

// Array printing

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

Print(Close[i]);

 

bool RefreshRates()

返回數據是否已經被刷新過了

示例:

int ticket;

while(true)

{

ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"expert comment",255,0,CLR_NONE);

if(ticket<=0)

{

int error=GetLastError();

if(error==134) break; // not enough money

if(error==135) RefreshRates(); // prices changed

break;

}

else { OrderPrint(); break; }

//---- 10 seconds wait

Sleep(10000);

}

 

void SendMail( string subject, string some_text)

發送郵件到指定信箱,需要到菜單 Tools -> Options -> Email 中將郵件打開.

:: 輸入參數

subject - 郵件標題

some_text - 郵件內容

示例:

double lastclose=Close[0];

if(lastclose<MY_SIGNAL)

SendMail("from your expert", "Price dropped down to "+DoubleToStr(lastclose));

 

string ServerAddress()

返回服務器地址

示例:

Print("Server address is ", ServerAddress());

 

void Sleep( int milliseconds)

設置線程暫停時間

:: 輸入參數

milliseconds - 暫停時間 1000 = 1秒

示例:

Sleep(5);

 

void SpeechText( string text, int lang_mode=SPEECH_ENGLISH)

使用Speech進行語音輸出

:: 輸入參數

text - 閱讀的文字

lang_mode - 語音模式 SPEECH_ENGLISH (默認的) 或 SPEECH_NATIVE

示例:

double lastclose=Close[0];

SpeechText("Price dropped down to "+DoubleToStr(lastclose));

 

string Symbol()

返回當前當前通貨的名稱

示例:

int total=OrdersTotal();

for(int pos=0;pos<TOTAL;POS++)

{

// check selection result becouse order may be closed or deleted at this time!

if(OrderSelect(pos, SELECT_BY_POS)==false) continue;

if(OrderType()>OP_SELL || OrderSymbol()!=Symbol()) continue;

// do some orders processing...

}

 

int UninitializeReason()

取得程序末初始化的理由

示例:

// this is example

int deinit()

{

switch(UninitializeReason())

{

case REASON_CHARTCLOSE:

case REASON_REMOVE: CleanUp(); break; // clean up and free all expert's resources.

case REASON_RECOMPILE:

case REASON_CHARTCHANGE:

case REASON_PARAMETERS:

case REASON_ACCOUNT: StoreData(); break; // prepare to restart

}

//...

}

第十一節 自定義函數

自定義指標函數 [Custom Indicator Functions]

void IndicatorBuffers(int count)

設置自定義指標緩存數

:: 輸入參數

count - 緩存數量

示例:

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Silver

//---- indicator parameters

extern int FastEMA=12;

extern int SlowEMA=26;

extern int SignalSMA=9;

//---- indicator buffers

double ind_buffer1[];

double ind_buffer2[];

double ind_buffer3[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- 2 additional buffers are used for counting.

IndicatorBuffers(3);

//---- drawing settings

SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);

SetIndexDrawBegin(0,SignalSMA);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);

//---- 3 indicator buffers mapping

SetIndexBuffer(0,ind_buffer1);

SetIndexBuffer(1,ind_buffer2);

SetIndexBuffer(2,ind_buffer3);

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");

//---- initialization done

return(0);

}

 

int IndicatorCounted()

返回緩存數量

示例:

int start()

{

int limit;

int counted_bars=IndicatorCounted();

//---- check for possible errors

if(counted_bars<0) return(-1);

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

//---- main loop

for(int i=0; i

 

{

//---- ma_shift set to 0 because SetIndexShift called abowe

ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

}

//---- done

return(0);

}

 

void IndicatorDigits( int digits)

設置指標精確度

:: 輸入參數

digits - 小數點後的小數位數

示例:

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Silver

//---- indicator parameters

extern int FastEMA=12;

extern int SlowEMA=26;

extern int SignalSMA=9;

//---- indicator buffers

double ind_buffer1[];

double ind_buffer2[];

double ind_buffer3[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- 2 additional buffers are used for counting.

IndicatorBuffers(3);

//---- drawing settings

SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);

SetIndexDrawBegin(0,SignalSMA);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);

//---- 3 indicator buffers mapping

SetIndexBuffer(0,ind_buffer1);

SetIndexBuffer(1,ind_buffer2);

SetIndexBuffer(2,ind_buffer3);

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");

//---- initialization done

return(0);

}

 

void IndicatorShortName( string name)

設置指標的簡稱

:: 輸入參數

name - 新的簡稱

示例:

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Silver

//---- indicator parameters

extern int FastEMA=12;

extern int SlowEMA=26;

extern int SignalSMA=9;

//---- indicator buffers

double ind_buffer1[];

double ind_buffer2[];

double ind_buffer3[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- 2 additional buffers are used for counting.

IndicatorBuffers(3);

//---- drawing settings

SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);

SetIndexDrawBegin(0,SignalSMA);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);

//---- 3 indicator buffers mapping

SetIndexBuffer(0,ind_buffer1);

SetIndexBuffer(1,ind_buffer2);

SetIndexBuffer(2,ind_buffer3);

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");

//---- initialization done

return(0);

}

 

void SetIndexArrow( int index, int code)

在指標上設置一個箭頭符號

:: 輸入參數

index - 第幾根指標線 0-7

code - 符號的編碼,參照 Wingdings 字體

示例:

SetIndexArrow(0, 217);

 

bool SetIndexBuffer( int index, double array[])

設置指標線的緩存數組

:: 輸入參數

index - 第幾根指標線 0-7

array[] - 緩存的數組

示例:

double ExtBufferSilver[];

int init()

{

SetIndexBuffer(0, ExtBufferSilver); // set buffer for first line

// ...

}

 

void SetIndexDrawBegin( int index, int begin)

設置劃線的開始點

:: 輸入參數

index - 第幾根指標線 0-7

begin - 劃線的開始點

示例:

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Silver

//---- indicator parameters

extern int FastEMA=12;

extern int SlowEMA=26;

extern int SignalSMA=9;

//---- indicator buffers

double ind_buffer1[];

double ind_buffer2[];

double ind_buffer3[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- 2 additional buffers are used for counting.

IndicatorBuffers(3);

//---- drawing settings

SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);

SetIndexDrawBegin(0,SignalSMA);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);

//---- 3 indicator buffers mapping

SetIndexBuffer(0,ind_buffer1);

SetIndexBuffer(1,ind_buffer2);

SetIndexBuffer(2,ind_buffer3);

//---- name for DataWindow and indicator subwindow label

IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");

//---- initialization done

return(0);

}

 

void SetIndexEmptyValue( int index, double value)

設置劃線的空值,空值不劃在和出現在數據窗口

:: 輸入參數

index - 第幾根指標線 0-7

value - 新的空值

示例:

SetIndexEmptyValue(6,0.0001);

 

void SetIndexLabel( int index, string text)

設置指標線的名稱

:: 輸入參數

index - 第幾根指標線 0-7

text - 線的名稱,Null不會顯示在數據窗口中

示例:

//+------------------------------------------------------------------+

//| Ichimoku Kinko Hyo initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Tenkan_Buffer);

SetIndexDrawBegin(0,Tenkan-1);

SetIndexLabel(0,"Tenkan Sen");

//----

SetIndexStyle(1,DRAW_LINE);

SetIndexBuffer(1,Kijun_Buffer);

SetIndexDrawBegin(1,Kijun-1);

SetIndexLabel(1,"Kijun Sen");

//----

a_begin=Kijun; if(a_begin SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);

SetIndexBuffer(2,SpanA_Buffer);

SetIndexDrawBegin(2,Kijun+a_begin-1);

SetIndexShift(2,Kijun);

//---- Up Kumo bounding line does not show in the DataWindow

SetIndexLabel(2,NULL);

SetIndexStyle(5,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(5,SpanA2_Buffer);

SetIndexDrawBegin(5,Kijun+a_begin-1);

SetIndexShift(5,Kijun);

SetIndexLabel(5,"Senkou Span A");

//----

SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);

SetIndexBuffer(3,SpanB_Buffer);

SetIndexDrawBegin(3,Kijun+Senkou-1);

SetIndexShift(3,Kijun);

//---- Down Kumo bounding line does not show in the DataWindow

SetIndexLabel(3,NULL);

//----

SetIndexStyle(6,DRAW_LINE,STYLE_DOT);

SetIndexBuffer(6,SpanB2_Buffer);

SetIndexDrawBegin(6,Kijun+Senkou-1);

SetIndexShift(6,Kijun);

SetIndexLabel(6,"Senkou Span B");

//----

SetIndexStyle(4,DRAW_LINE);

SetIndexBuffer(4,Chinkou_Buffer);

SetIndexShift(4,-Kijun);

SetIndexLabel(4,"Chinkou Span");

//----

return(0);

}

 

void SetIndexShift( int index, int shift)

設置指標線的位移數

:: 輸入參數

index - 第幾根指標線 0-7

shift - 位移多少

示例:

//+------------------------------------------------------------------+

//| Alligator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- line shifts when drawing

SetIndexShift(0,JawsShift);

SetIndexShift(1,TeethShift);

SetIndexShift(2,LipsShift);

//---- first positions skipped when drawing

SetIndexDrawBegin(0,JawsShift+JawsPeriod);

SetIndexDrawBegin(1,TeethShift+TeethPeriod);

SetIndexDrawBegin(2,LipsShift+LipsPeriod);

//---- 3 indicator buffers mapping

SetIndexBuffer(0,ExtBlueBuffer);

SetIndexBuffer(1,ExtRedBuffer);

SetIndexBuffer(2,ExtLimeBuffer);

//---- drawing settings

SetIndexStyle(0,DRAW_LINE);

SetIndexStyle(1,DRAW_LINE);

SetIndexStyle(2,DRAW_LINE);

//---- index labels

SetIndexLabel(0,"Gator Jaws");

SetIndexLabel(1,"Gator Teeth");

SetIndexLabel(2,"Gator Lips");

//---- initialization done

return(0);

}

 

void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)

設置指標線的樣式

:: 輸入參數

index - 第幾根指標線 0-7

type - 線形狀的種類,詳見線條種類

style - 劃線的樣式

width - 顯得寬度(1,2,3,4,5)

clr - 線的顏色

示例:

SetIndexStyle(3, DRAW_LINE, EMPTY, 2, Red);

第十二節 時間函數

日期時間函數 [Date & Time Functions]    

datetime CurTime( )

返回當前時間

示例:

if(CurTime()-OrderOpenTime()<360) return(0);

 

int Day()

返回當前日期

示例:

if(Day()<5) return(0);

 

int DayOfWeek( )

返回當前日期是星期幾 0-星期天,1,2,3,4,5,6

示例:

// do not work on holidays.

if(DayOfWeek()==0 || DayOfWeek()==6) return(0);

 

int DayOfYear( )

返回當前日期在年內的第幾天

示例:

if(DayOfYear()==245)

return(true);

 

int Hour()

返回當前的小時數 0-23

示例:

bool is_siesta=false;

if(Hour()>=12 || Hour()<17)

is_siesta=true;

 

datetime LocalTime()

返回當前電腦時間

示例:

if(LocalTime()-OrderOpenTime()<360) return(0);

 

int Minute()

返回當前分鐘

示例:

if(Minute()<=15)

return("first quarter");

 

int Month()

返回當前月份

示例:

if(Month()<=5)

return("first half of year");

 

int Seconds()

返回當前秒數

示例:

if(Seconds()<=15)

return(0);

 

int TimeDay( datetime date)

返回輸入日期中的日期

:: 輸入參數

date - 輸入日期

示例:

int day=TimeDay(D'2003.12.31');

// day is 31

 

int TimeDayOfWeek( datetime date)

返回輸入日期中的日期是星期幾 (0-6)

:: 輸入參數

date - 輸入日期

示例:

int weekday=TimeDayOfWeek(D'2004.11.2');

// day is 2 - tuesday

 

int TimeDayOfYear( datetime date)

返回輸入日期中的日期在當年中的第幾天

:: 輸入參數

date - 輸入日期

示例:

int day=TimeDayOfYear(CurTime());

 

int TimeHour( datetime time)

返回輸入日期中的小時

:: 輸入參數

date - 輸入日期

示例:

int h=TimeHour(CurTime());

 

int TimeMinute( datetime time)

返回輸入日期中的分鐘

:: 輸入參數

date - 輸入日期

示例:

int m=TimeMinute(CurTime());

 

int TimeMonth( datetime time)

返回輸入日期中的月份

:: 輸入參數

date - 輸入日期

示例:

int m=TimeMonth(CurTime());

 

int TimeSeconds( datetime time)

返回輸入日期中的秒鐘

:: 輸入參數

date - 輸入日期

示例:

int m=TimeSeconds(CurTime());

 

int TimeYear( datetime time)

返回輸入日期中的年份

:: 輸入參數

date - 輸入日期

示例:

int y=TimeYear(CurTime());

 

int TimeYear( datetime time)

返回當前年份

示例:

// return if date before 1 May 2002

if(Year()==2002 && Month()<5)

return(0);

第十三節 文件函數

文件處理函數 [File Functions]

void FileClose(int handle)

關閉正在已經打開的文件.

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

int handle=FileOpen("filename", FILE_CSV|FILE_READ);

if(handle>0)

{

// working with file ...

FileClose(handle);

}

 

void FileDelete(string filename)

刪除文件,如果發生錯誤可以通過GetLastError()來查詢

注:你只能操作terminal_dir\experts\files目錄下的文件

:: 輸入參數

filename - 目錄和文件名

示例:

// file my_table.csv will be deleted from terminal_dir\experts\files directory

int lastError;

FileDelete("my_table.csv");

lastError=GetLastError();

if(laseError!=ERR_NOERROR)

{

Print("An error ocurred while (",lastError,") deleting file my_table.csv");

return(0);

}

 

void FileFlush(int handle)

將緩存中的數據刷新到磁盤上去

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

int bars_count=Bars;

int handle=FileOpen("mydat.csv",FILE_CSV|FILE_WRITE);

if(handle>0)

{

FileWrite(handle, "#","OPEN","CLOSE","HIGH","LOW");

for(int i=0;i<BARS_COUNT;I++)

FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);

FileFlush(handle);

...

for(int i=0;i<BARS_COUNT;I++)

FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);

FileClose(handle);

}

 

bool FileIsEnding(int handle)

檢查是否到了文件尾.

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

if(FileIsEnding(h1))

{

FileClose(h1);

return(false);

}

 

bool FileIsLineEnding( int handle)

檢查行是否到了結束

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

if(FileIsLineEnding(h1))

{

FileClose(h1);

return(false);

}

 

int FileOpen( string filename, int mode, int delimiter=';')

打開文件,如果失敗返回值小於1,可以通過GetLastError()獲取錯誤

注:只能操作terminal_dir\experts\files目錄的文件

:: 輸入參數

filename - 目錄文件名

mode - 打開模式 FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.

delimiter - CSV型打開模式用的分割符,默認為分號(;).

示例:

int handle;

handle=FileOpen("my_data.csv",FILE_CSV|FILE_READ,';');

if(handle<1)

{

Print("File my_data.dat not found, the last error is ", GetLastError());

return(false);

}

 

int FileOpenHistory( string filename, int mode, int delimiter=';')

打開歷史數據文件,如果失敗返回值小於1,可以通過GetLastError()獲取錯誤

:: 輸入參數

filename - 目錄文件名

mode - 打開模式 FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.

delimiter - CSV型打開模式用的分割符,默認為分號(;).

示例:

int handle=FileOpenHistory("USDX240.HST",FILE_BIN|FILE_WRITE);

if(handle<1)

{

Print("Cannot create file USDX240.HST");

return(false);

}

// work with file

// ...

FileClose(handle);

 

int FileReadArray( int handle, object& array[], int start, int count)

將二進制文件讀取到數組中,返回讀取的條數,可以通過GetLastError()獲取錯誤

注:在讀取之前要調整好數組大小

:: 輸入參數

handle - FileOpen()返回的句柄

array[] - 寫入的數組

start - 在數組中存儲的開始點

count - 讀取多少個對象

示例:

int handle;

double varray[10];

handle=FileOpen("filename.dat", FILE_BIN|FILE_READ);

if(handle>0)

{

FileReadArray(handle, varray, 0, 10);

FileClose(handle);

}

 

double FileReadDouble( int handle, int size=DOUBLE_VALUE)

從文件中讀取浮點型數據,數字可以是8byte的double型或者是4byte的float型。

:: 輸入參數

handle - FileOpen()返回的句柄

size - 數字個是大小,DOUBLE_VALUE(8 bytes) 或者 FLOAT_VALUE(4 bytes).

示例:

int handle;

double value;

handle=FileOpen("mydata.dat",FILE_BIN);

if(handle>0)

{

value=FileReadDouble(handle,DOUBLE_VALUE);

FileClose(handle);

}

 

int FileReadInteger( int handle, int size=LONG_VALUE)

從文件中讀取整形型數據,數字可以是1,2,4byte的長度

:: 輸入參數

handle - FileOpen()返回的句柄

size - 數字個是大小,CHAR_VALUE(1 byte), SHORT_VALUE(2 bytes) 或者 LONG_VALUE(4 bytes).

示例:

int handle;

int value;

handle=FileOpen("mydata.dat", FILE_BIN|FILE_READ);

if(handle>0)

{

value=FileReadInteger(h1,2);

FileClose(handle);

}

 

double FileReadNumber( int handle)

從文件中讀取數字,只能在CSV裡使用

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

int handle;

int value;

handle=FileOpen("filename.csv", FILE_CSV, ';');

if(handle>0)

{

value=FileReadNumber(handle);

FileClose(handle);

}

 

string FileReadString( int handle, int length=0)

從文件中讀取字符串

:: 輸入參數

handle - FileOpen()返回的句柄

length - 讀取字符串長度

示例:

int handle;

string str;

handle=FileOpen("filename.csv", FILE_CSV|FILE_READ);

if(handle>0)

{

str=FileReadString(handle);

FileClose(handle);

}

 

bool FileSeek( int handle, int offset, int origin)

移動指針移動到某一點,如果成功返回true

:: 輸入參數

handle - FileOpen()返回的句柄

offset - 設置的原點

origin - SEEK_CUR從當前位置開始 SEEK_SET從文件頭部開始 SEEK_END 從文件尾部開始

示例:

int handle=FileOpen("filename.csv", FILE_CSV|FILE_READ, ';');

if(handle>0)

{

FileSeek(handle, 10, SEEK_SET);

FileReadInteger(handle);

FileClose(handle);

handle=0;

}

 

int FileSize( int handle)

返回文件大小

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

int handle;

int size;

handle=FileOpen("my_table.dat", FILE_BIN|FILE_READ);

if(handle>0)

{

size=FileSize(handle);

Print("my_table.dat size is ", size, " bytes");

FileClose(handle);

}

 

int FileTell( int handle)

返回文件讀寫指針當前的位置

:: 輸入參數

handle - FileOpen()返回的句柄

示例:

int handle;

int pos;

handle=FileOpen("my_table.dat", FILE_BIN|FILE_READ);

// reading some data

pos=FileTell(handle);

Print("current position is ", pos);

 

int FileWrite( int handle, ... )

向文件寫入數據

:: 輸入參數

handle - FileOpen()返回的句柄

... - 寫入的數據

示例:

int handle;

datetime orderOpen=OrderOpenTime();

handle=FileOpen("filename", FILE_CSV|FILE_WRITE, ';');

if(handle>0)

{

FileWrite(handle, Close[0], Open[0], High[0], Low[0], TimeToStr(orderOpen));

FileClose(handle);

}

 

int FileWriteArray( int handle, object array[], int start, int count)

向文件寫入數組

:: 輸入參數

handle - FileOpen()返回的句柄

array[] - 要寫入的數組

start - 寫入的開始點

count - 寫入的項目數

示例:

int handle;

double BarOpenValues[10];

// copy first ten bars to the array

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

BarOpenValues[i]=Open[i];

// writing array to the file

handle=FileOpen("mydata.dat", FILE_BIN|FILE_WRITE);

if(handle>0)

{

FileWriteArray(handle, BarOpenValues, 3, 7); // writing last 7 elements

FileClose(handle);

}

 

int FileWriteDouble( int handle, double value, int size=DOUBLE_VALUE)

向文件寫入浮點型數據

:: 輸入參數

handle - FileOpen()返回的句柄

value - 要寫入的值

size - 寫入的格式,DOUBLE_VALUE (8 bytes, default)或FLOAT_VALUE (4 bytes).

示例:

int handle;

double var1=0.345;

handle=FileOpen("mydata.dat", FILE_BIN|FILE_WRITE);

if(handle<1)

{

Print("can't open file error-",GetLastError());

return(0);

}

FileWriteDouble(h1, var1, DOUBLE_VALUE);

//...

FileClose(handle);

 

int FileWriteInteger( int handle, int value, int size=LONG_VALUE)

向文件寫入整型數據

:: 輸入參數

handle - FileOpen()返回的句柄

value - 要寫入的值

size - 寫入的格式,CHAR_VALUE (1 byte),SHORT_VALUE (2 bytes),LONG_VALUE (4 bytes, default).

示例:

int handle;

int value=10;

handle=FileOpen("filename.dat", FILE_BIN|FILE_WRITE);

if(handle<1)

{

Print("can't open file error-",GetLastError());

return(0);

}

FileWriteInteger(handle, value, SHORT_VALUE);

//...

FileClose(handle);

 

int FileWriteString( int handle, string value, int length)

向文件寫入字符串數據

:: 輸入參數

handle - FileOpen()返回的句柄

value - 要寫入的值

length - 寫入的字符長度

示例:

int handle;

string str="some string";

handle=FileOpen("filename.bin", FILE_BIN|FILE_WRITE);

if(handle<1)

{

Print("can't open file error-",GetLastError());

return(0);

}

FileWriteString(h1, str, 8);

FileClose(handle);

第十四節 全局變量函數

bool GlobalVariableCheck( string name)

檢查全局變量是否存在 

:: 輸入參數

name - 全局變量的名稱

示例:

// check variable before use

if(!GlobalVariableCheck("g1"))

GlobalVariableSet("g1",1);

 

bool GlobalVariableDel( string name)

刪除全局變量

:: 輸入參數

name - 全局變量的名稱

示例:

// deleting global variable with name "gvar_1"

GlobalVariableDel("gvar_1");

 

double GlobalVariableGet( string name)

獲取全局變量的值

:: 輸入參數

name - 全局變量的名稱

示例:

double v1=GlobalVariableGet("g1");

//---- check function call result

if(GetLastError()!=0) return(false);

//---- continue processing

 

double GlobalVariableGet( string name)

獲取全局變量的值

:: 輸入參數

name - 全局變量的名稱

示例:

double v1=GlobalVariableGet("g1");

//---- check function call result

if(GetLastError()!=0) return(false);

//---- continue processing

 

datetime GlobalVariableSet( string name, double value )

設置全局變量的值

:: 輸入參數

name - 全局變量的名稱

value - 全局變量的值

示例:

//---- try to set new value

if(GlobalVariableSet("BarsTotal",Bars)==0)

return(false);

//---- continue processing

 

bool GlobalVariableSetOnCondition( string name, double value, double check_value)

有條件的設置全局變量的值

:: 輸入參數

name - 全局變量的名稱

value - 全局變量的值

check_value - 檢查變量的值

示例:

int init()

{

//---- create global variable

GlobalVariableSet("DATAFILE_SEM",0);

//...

}

int start()

{

//---- try to lock common resource

while(!IsStopped())

{

//---- locking

if(GlobalVariableSetOnCondition("DATAFILE_SEM",1,0)==true) break;

//---- may be variable deleted?

if(GetLastError()==ERR_GLOBAL_VARIABLE_NOT_FOUND) return(0);

//---- sleeping

Sleep(500);

}

//---- resource locked

// ... do some work

//---- unlock resource

GlobalVariableSet("DATAFILE_SEM",0);

}

 

void GlobalVariablesDeleteAll( )

刪除所有全局變量

示例:

GlobalVariablesDeleteAll();

第十五節  數學運算函數

double MathAbs( double value) 

返回數字的絕對值 

:: 輸入參數

value - 要處理的數字

示例:

double dx=-3.141593, dy;

// calc MathAbs

dy=MathAbs(dx);

Print("The absolute value of ",dx," is ",dy);

// Output: The absolute value of -3.141593 is 3.141593

 

double MathArccos( double x)

計算反余弦值

:: 輸入參數

value - 要處理的數字,范圍-1到1

示例:

double x=0.32696, y;

y=asin(x);

Print("Arcsine of ",x," = ",y);

y=acos(x);

Print("Arccosine of ",x," = ",y);

//Output: Arcsine of 0.326960=0.333085

//Output: Arccosine of 0.326960=1.237711

 

double MathArcsin( double x)

計算反正弦值

:: 輸入參數

x - 要處理的值

示例:

double x=0.32696, y;

y=MathArcsin(x);

Print("Arcsine of ",x," = ",y);

y=acos(x);

Print("Arccosine of ",x," = ",y);

//Output: Arcsine of 0.326960=0.333085

//Output: Arccosine of 0.326960=1.237711

 

double MathArctan( double x)

計算反正切值

:: 輸入參數

x - 要處理的值

示例:

double x=-862.42, y;

y=MathArctan(x);

Print("Arctangent of ",x," is ",y);

//Output: Arctangent of -862.42 is -1.5696

 

double MathCeil( double x)

返回向前進位後的值

:: 輸入參數

x - 要處理的值

示例:

double y;

y=MathCeil(2.8);

Print("The ceil of 2.8 is ",y);

y=MathCeil(-2.8);

Print("The ceil of -2.8 is ",y);

 

 

double MathCos( double value)

計算余弦值

:: 輸入參數

value - 要處理的值

示例:

double pi=3.1415926535;

double x, y;

x=pi/2;

y=MathSin(x);

Print("MathSin(",x,") = ",y);

y=MathCos(x);

Print("MathCos(",x,") = ",y);

//Output: MathSin(1.5708)=1

// MathCos(1.5708)=0

 

double MathExp( double d)

Returns value the number e raised to the power d. On overflow, the function returns INF (infinite) and on underflow, MathExp returns 0.

:: 輸入參數

d - A number specifying a power.

示例:

double x=2.302585093,y;

y=MathExp(x);

Print("MathExp(",x,") = ",y);

//Output: MathExp(2.3026)=10

 

double MathFloor( double x)

返回向後進位後的值

:: 輸入參數

x - 要處理的值

示例:

double y;

y=MathFloor(2.8);

Print("The floor of 2.8 is ",y);

y=MathFloor(-2.8);

Print("The floor of -2.8 is ",y);

 

 

double MathLog( double x)

計算對數

:: 輸入參數

x - 要處理的值

示例:

double x=9000.0,y;

y=MathLog(x);

Print("MathLog(",x,") = ", y);

//Output: MathLog(9000)=9.10498

 

double MathMax( double value1, double value2)

計算兩個值中的最大值

:: 輸入參數

value1 - 第一個值 

value2 - 第二個值

示例:

double result=MathMax(1.08,Bid);

 

double MathMin( double value1, double value2)

計算兩個值中的最小值

:: 輸入參數

value1 - 第一個值 

value2 - 第二個值

示例:

double result=MathMin(1.08,Ask);

 

double MathMod( double value, double value2)

計算兩個值相除的余數

:: 輸入參數

value - 被除數 

value2 - 除數

示例:

double x=-10.0,y=3.0,z;

z=MathMod(x,y);

Print("The remainder of ",x," / ",y," is ",z);

//Output: The remainder of -10 / 3 is -1

 

double MathPow( double base, double exponent)

計算指數

:: 輸入參數

base - 基數

exponent - 指數

示例:

double x=2.0,y=3.0,z;

z=MathPow(x,y);

Printf(x," to the power of ",y," is ", z);

//Output: 2 to the power of 3 is 8

 

int MathRand( )

取隨機數

示例:

MathSrand(LocalTime());

// Display 10 numbers.

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

Print("random value ", MathRand());

 

double MathRound( double value)

取四捨五入的值

:: 輸入參數

value - 要處理的值

示例:

double y=MathRound(2.8);

Print("The round of 2.8 is ",y);

y=MathRound(2.4);

Print("The round of -2.4 is ",y);

//Output: The round of 2.8 is 3

// The round of -2.4 is -2

 

double MathSin( double value)

計算正弦數

:: 輸入參數

value - 要處理的值

示例:

double pi=3.1415926535;

double x, y;

x=pi/2;

y=MathSin(x);

Print("MathSin(",x,") = ",y);

y=MathCos(x);

Print("MathCos(",x,") = ",y);

//Output: MathSin(1.5708)=1

// MathCos(1.5708)=0

 

double MathSqrt( double x)

計算平方根

:: 輸入參數

x - 要處理的值

示例:

double question=45.35, answer;

answer=MathSqrt(question);

if(question<0)

Print("Error: MathSqrt returns ",answer," answer");

else

Print("The square root of ",question," is ", answer);

//Output: The square root of 45.35 is 6.73

 

void MathSrand( int seed)

通過Seed產生隨機數

:: 輸入參數

seed - 隨機數的種子

示例:

MathSrand(LocalTime());

// Display 10 numbers.

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

Print("random value ", MathRand());

 

double MathTan( double x)

計算正切值

:: 輸入參數

x - 要計算的角度

示例:

double pi=3.1415926535;

double x,y;

x=MathTan(pi/4);

Print("MathTan(",pi/4," = ",x);

//Output: MathTan(0.7856)=1

第十五節 物體函數 [Object Functions]

bool ObjectCreate( string name, int type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0)

創建物件 

:: 輸入參數

name - 物件名稱

type - 物件類型.

window - 物件所在窗口的索引值

time1 - 時間點1

price1 - 價格點1

time2 - 時間點2

price2 - 價格點2

time3 - 時間點3

price3 - 價格點3

示例:

// new text object

if(!ObjectCreate("text_object", OBJ_TEXT, 0, D'2004.02.20 12:30', 1.0045))

{

Print("error: can't create text_object! code #",GetLastError());

return(0);

}

// new label object

if(!ObjectCreate("label_object", OBJ_LABEL, 0, 0, 0))

{

Print("error: can't create label_object! code #",GetLastError());

return(0);

}

ObjectSet("label_object", OBJPROP_XDISTANCE, 200);

ObjectSet("label_object", OBJPROP_YDISTANCE, 100);

 

bool ObjectDelete( string name)

刪除物件

:: 輸入參數

name - 物件名稱

示例:

ObjectDelete("text_object");

 

string ObjectDescription( string name)

返回物件描述

:: 輸入參數

name - 物件名稱

示例:

// writing chart's object list to the file

int handle, total;

string obj_name,fname;

// file name

fname="objlist_"+Symbol();

handle=FileOpen(fname,FILE_CSV|FILE_WRITE);

if(handle!=false)

{

total=ObjectsTotal();

for(int i=-;i<TOTAL;I++)

{

obj_name=ObjectName(i);

FileWrite(handle,"Object "+obj_name+" description= "+ObjectDescription(obj_name));

}

FileClose(handle);

}

 

int ObjectFind( string name)

尋找物件,返回物件的索引值

:: 輸入參數

name - 物件名稱

示例:

if(ObjectFind("line_object2")!=win_idx) return(0);

 

double ObjectGet( string name, int index)

獲取物件的值

:: 輸入參數

name - 物件名稱

index - 取值屬性的索引

示例:

color oldColor=ObjectGet("hline12", OBJPROP_COLOR);

 

string ObjectGetFiboDescription( string name, int index)

取物件的斐波納契數列地描述

:: 輸入參數

name - 物件名稱

index - 斐波納契數列的等級索引

示例:

#include

...

string text;

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

{

text=ObjectGetFiboDescription(MyObjectName,i);

//---- check. may be objects's level count less than 32

if(GetLastError()!=ERR_NO_ERROR) break;

Print(MyObjectName,"level: ",i," description: ",text);

}

 

int ObjectGetShiftByValue( string name, double value)

取物件的位移值

:: 輸入參數

name - 物件名稱

value - 價格

示例:

int shift=ObjectGetShiftByValue("MyTrendLine#123", 1.34);

 

double ObjectGetValueByShift( string name, int shift)

取物件位移後的值

:: 輸入參數

name - 物件名稱

shift - 位移數

示例:

double price=ObjectGetValueByShift("MyTrendLine#123", 11);

 

bool ObjectMove( string name, int point, datetime time1, double price1)

移動物件

:: 輸入參數

name - 物件名稱

point - 調整的索引 

time1 - 新的時間 

price1 - 新的價格

示例:

ObjectMove("MyTrend", 1, D'2005.02.25 12:30', 1.2345);

 

string ObjectName( int index)

取物件名稱

:: 輸入參數

index - 物件的索引

示例:

int obj_total=ObjectsTotal();

string name;

for(int i=0;i<OBJ_TOTAL;I++)

{

name=ObjectName(i);

Print(i,"Object name is " + name);

}

 

int ObjectsDeleteAll( int window, int type=EMPTY)

刪除所有物件

:: 輸入參數

window - 物件所在的窗口索引

type - 刪除物件的類型

示例:

ObjectsDeleteAll(2, OBJ_HLINE); // removes all horizontal line objects from window 3 (index 2).

 

bool ObjectSet( string name, int index, double value)

設置物件的值

:: 輸入參數

name - 物件的名稱

index - 物件屬性的索引值 

value - 新的屬性值

示例:

// moving first coord to last bar time

ObjectSet("MyTrend", OBJPROP_TIME1, Time[0]);

// setting second fibo level

ObjectSet("MyFibo", OBJPROP_FIRSTLEVEL+1, 1.234);

// setting object visibility. object will be shown only on 15 minute and 1 hour charts

ObjectSet("MyObject", OBJPROP_TIMEFRAMES, OBJ_PERIOD_M15 | OBJ_PERIOD_H1);

 

bool ObjectSetFiboDescription( string name, int index, string text)

設置物件斐波納契數列的描述

:: 輸入參數

name - 物件的名稱

index - 物件斐波納契數列的索引值 

text - 新的描述

示例:

ObjectSetFiboDescription("MyFiboObject,2,"Second line");

 

bool ObjectSetText( string name, string text, int font_size, string font=NULL, color text_color=CLR_NONE)

設置物件的描述

:: 輸入參數

name - 物件的名稱

text - 文本

font_size - 字體大小 

font - 字體名稱 

text_color - 字體顏色

示例:

ObjectSetText("text_object", "Hello world!", 10, "Times New Roman", Green);

 

void ObjectsRedraw( )

重繪所有物件

示例:

ObjectsRedraw();

 

int ObjectsTotal( )

取物件總數

示例:

int obj_total=ObjectsTotal();

string name;

for(int i=0;i<OBJ_TOTAL;I++)

{

name=ObjectName(i);

Print(i,"Object name is for object #",i," is " + name);

}

 

int ObjectType( string name)

取物件類型

:: 輸入參數

name - 物件的名稱

示例:

if(ObjectType("line_object2")!=OBJ_HLINE) return(0);

第十五節 標准常量

標准常量 [Standard Constants] 

Applied price enumeration

價格類型枚舉

示例:

 

Constant Value Description

PRICE_CLOSE 0 收盤價

PRICE_OPEN 1 開盤價

PRICE_HIGH 2 最高價

PRICE_LOW 3 最低價

PRICE_MEDIAN 4 最高價和最低價的平均價

PRICE_TYPICAL 5 最高價、最低價和收盤價的平均價

PRICE_WEIGHTED 6 開、收盤價和最高最低價的平均價

 

 

Drawing shape style enumeration

畫圖形狀樣式枚舉,

形狀:

 

Constant Value Description

DRAW_LINE 0 Drawing line.

DRAW_SECTION 1 Drawing sections.

DRAW_HISTOGRAM 2 Drawing histogram.

DRAW_ARROW 3 Drawing arrows (symbols).

DRAW_NONE 12 No drawing.

 

樣式:

 

Constant Value Description

STYLE_SOLID 0 The pen is solid.

STYLE_DASH 1 The pen is dashed.

STYLE_DOT 2 The pen is dotted.

STYLE_DASHDOT 3 The pen has alternating dashes and dots.

STYLE_DASHDOTDOT 4 The pen has alternating dashes and double dots.

 

Ichimoku Kinko Hyo modes enumeration

Ichimoku指標模式枚舉

 

Constant Value Description

MODE_TENKANSEN 1 Tenkan-sen.

MODE_KIJUNSEN 2 Kijun-sen.

MODE_SENKOUSPANA 3 Senkou Span A.

MODE_SENKOUSPANB 4 Senkou Span B.

MODE_CHINKOUSPAN 5 Chinkou Span.

 

Indicators line identifiers

指標線標示符

指標線模式,使用在 iMACD(), iRVI() 和 iStochastic() 中:

 

Constant Value Description

MODE_MAIN 0 Base indicator line.

MODE_SIGNAL 1 Signal line.

 

指標線模式,使用在 iADX() 中:

 

Constant Value Description

MODE_MAIN 0 Base indicator line.

MODE_PLUSDI 1 +DI indicator line.

MODE_MINUSDI 2 -DI indicator line.

 

指標線模式,使用在 iBands(), iEnvelopes(), iEnvelopesOnArray(), iFractals() and iGator() 中:

 

Constant Value Description

MODE_UPPER 1 Upper line.

MODE_LOWER 2 Lower line.

 

Market information identifiers

市場信息標識

 

Constant Value Description

MODE_LOW 1 Low day price.

MODE_HIGH 2 High day price.

MODE_TIME 5 The last incoming quotation time.

MODE_BID 9 Last incoming bid price.

MODE_ASK 10 Last incoming ask price.

MODE_POINT 11 Point size.

MODE_DIGITS 12 Digits after decimal point.

MODE_SPREAD 13 Spread value in points.

MODE_STOPLEVEL 14 Stop level in points.

MODE_LOTSIZE 15 Lot size in the base currency.

MODE_TICKVALUE 16 Tick value.

MODE_TICKSIZE 17 Tick size.

MODE_SWAPLONG 18 Swap of the long position.

MODE_SWAPSHORT 19 Swap of the short position.

MODE_STARTING 20 Market starting date (usually used for future markets).

MODE_EXPIRATION 21 Market expiration date (usually used for future markets).

MODE_TRADEALLOWED 22 Trade is allowed for the symbol.

 

Moving Average method enumeration

移動平均線模式枚舉,iAlligator(), iEnvelopes(), iEnvelopesOnArray, iForce(), iGator(), iMA(), iMAOnArray(), iStdDev(), iStdDevOnArray(), iStochastic()這些會調用此枚舉

 

Constant Value Description

MODE_SMA 0 Simple moving average,

MODE_EMA 1 Exponential moving average,

MODE_SMMA 2 Smoothed moving average,

MODE_LWMA 3 Linear weighted moving average.

 

 

Object properties enumeration

物件屬性枚舉

 

Constant Value Description

OBJPROP_TIME1 0 Datetime value to set/get first coordinate time part.

OBJPROP_PRICE1 1 Double value to set/get first coordinate price part.

OBJPROP_TIME2 2 Datetime value to set/get second coordinate time part.

OBJPROP_PRICE2 3 Double value to set/get second coordinate price part.

OBJPROP_TIME3 4 Datetime value to set/get third coordinate time part.

OBJPROP_PRICE3 5 Double value to set/get third coordinate price part.

OBJPROP_COLOR 6 Color value to set/get object color.

OBJPROP_STYLE 7 Value is one of STYLE_SOLID, STYLE_DASH, STYLE_DOT, STYLE_DASHDOT, STYLE_DASHDOTDOT constants to set/get object line style.

OBJPROP_WIDTH 8 Integer value to set/get object line width. Can be from 1 to 5.

OBJPROP_BACK 9 Boolean value to set/get background drawing flag for object.

OBJPROP_RAY 10 Boolean value to set/get ray flag of object.

OBJPROP_ELLIPSE 11 Boolean value to set/get ellipse flag for fibo arcs.

OBJPROP_SCALE 12 Double value to set/get scale object property.

OBJPROP_ANGLE 13 Double value to set/get angle object property in degrees.

OBJPROP_ARROWCODE 14 Integer value or arrow enumeration to set/get arrow code object property.

OBJPROP_TIMEFRAMES 15 Value can be one or combination (bitwise addition) of object visibility constants to set/get timeframe object property.

 

OBJPROP_DEVIATION 16 Double value to set/get deviation property for Standard deviation objects.

OBJPROP_FONTSIZE 100 Integer value to set/get font size for text objects.

OBJPROP_CORNER 101 Integer value to set/get anchor corner property for label objects. Must be from 0-3.

OBJPROP_XDISTANCE 102 Integer value to set/get anchor X distance object property in pixels.

OBJPROP_YDISTANCE 103 Integer value is to set/get anchor Y distance object property in pixels.

OBJPROP_FIBOLEVELS 200 Integer value to set/get Fibonacci object level count. Can be from 0 to 32.

OBJPROP_FIRSTLEVEL+ n 210 Fibonacci object level index, where n is level index to set/get. Can be from 0 to 31.

 

 

Object type enumeration

物件類型枚舉

 

Constant Value Description

OBJ_VLINE 0 Vertical line. Uses time part of first coordinate.

OBJ_HLINE 1 Horizontal line. Uses price part of first coordinate.

OBJ_TREND 2 Trend line. Uses 2 coordinates.

OBJ_TRENDBYANGLE 3 Trend by angle. Uses 1 coordinate. To set angle of line use ObjectSet() function.

 

OBJ_REGRESSION 4 Regression. Uses time parts of first two coordinates.

OBJ_CHANNEL 5 Channel. Uses 3 coordinates.

OBJ_STDDEVCHANNEL 6 Standard deviation channel. Uses time parts of first two coordinates.

OBJ_GANNLINE 7 Gann line. Uses 2 coordinate, but price part of second coordinate ignored.

OBJ_GANNFAN 8 Gann fan. Uses 2 coordinate, but price part of second coordinate ignored.

OBJ_GANNGRID 9 Gann grid. Uses 2 coordinate, but price part of second coordinate ignored.

OBJ_FIBO 10 Fibonacci retracement. Uses 2 coordinates.

OBJ_FIBOTIMES 11 Fibonacci time zones. Uses 2 coordinates.

OBJ_FIBOFAN 12 Fibonacci fan. Uses 2 coordinates.

OBJ_FIBOARC 13 Fibonacci arcs. Uses 2 coordinates.

OBJ_EXPANSION 14 Fibonacci expansions. Uses 3 coordinates.

OBJ_FIBOCHANNEL 15 Fibonacci channel. Uses 3 coordinates.

OBJ_RECTANGLE 16 Rectangle. Uses 2 coordinates.

OBJ_TRIANGLE 17 Triangle. Uses 3 coordinates.

OBJ_ELLIPSE 18 Ellipse. Uses 2 coordinates.

OBJ_PITCHFORK 19 Andrews pitchfork. Uses 3 coordinates.

OBJ_CYCLES 20 Cycles. Uses 2 coordinates.

OBJ_TEXT 21 Text. Uses 1 coordinate.

OBJ_ARROW 22 Arrows. Uses 1 coordinate.

OBJ_LABEL 23 Text label. Uses 1 coordinate in pixels.

 

 

Object visibility enumeration

物件顯示枚舉

 

Constant Value Description

OBJ_PERIOD_M1 0x0001 Object shown is only on 1-minute charts.

OBJ_PERIOD_M5 0x0002 Object shown is only on 5-minute charts.

OBJ_PERIOD_M15 0x0004 Object shown is only on 15-minute charts.

OBJ_PERIOD_M30 0x0008 Object shown is only on 30-minute charts.

OBJ_PERIOD_H1 0x0010 Object shown is only on 1-hour charts.

OBJ_PERIOD_H4 0x0020 Object shown is only on 4-hour charts.

OBJ_PERIOD_D1 0x0040 Object shown is only on daily charts.

OBJ_PERIOD_W1 0x0080 Object shown is only on weekly charts.

OBJ_PERIOD_MN1 0x0100 Object shown is only on monthly charts.

OBJ_ALL_PERIODS 0x01FF Object shown is on all timeframes.

NULL 0 Object shown is on all timeframes.

EMPTY -1 Hidden object on all timeframes.

 

Series array identifier

系列數組標識符

 

Constant Value Description

MODE_OPEN 0 Open price.

MODE_LOW 1 Low price.

MODE_HIGH 2 High price.

MODE_CLOSE 3 Close price.

MODE_VOLUME 4 Volume, used in Lowest() and Highest() functions.

MODE_TIME 5 Bar open time, used in ArrayCopySeries() function.

 

Special constants

特殊常量

 

Constant Value Description

NULL 0 Indicates empty state of the string.

EMPTY -1 Indicates empty state of the parameter.

EMPTY_VALUE 0x7FFFFFFF Default custom indicator empty value.

CLR_NONE 0xFFFFFFFF Indicates empty state of colors.

WHOLE_ARRAY 0 Used with array functions. Indicates that all array elements will be processed.

 

Time frame enumeration

特殊常量

 

Constant Value Description

PERIOD_M1 1 1 minute.

PERIOD_M5 5 5 minutes.

PERIOD_M15 15 15 minutes.

PERIOD_M30 30 30 minutes.

PERIOD_H1 60 1 hour.

PERIOD_H4 240 4 hour.

PERIOD_D1 1440 Daily.

PERIOD_W1 10080 Weekly.

PERIOD_MN1 43200 Monthly.

0 (zero) 0 Time frame used on the chart.

 

Trade operation enumeration

交易類型

 

Constant Value Description

OP_BUY 0 Buying position.

OP_SELL 1 Selling position.

OP_BUYLIMIT 2 Buy limit pending position.

OP_SELLLIMIT 3 Sell limit pending position.

OP_BUYSTOP 4 Buy stop pending position.

OP_SELLSTOP 5 Sell stop pending position.

 

 

 

 

 

1、MT4智能交易系統編寫舉例

我們現在就創建智能交易系統,並在運行標准的平滑異同移動平均線指標,該系統具有較強的獲利能力,支持追蹤止損和最大的保障安全操作。 下面所給的例子,交易通過對單一的部位進行開倉和控制。

交易原則:

?        多頭進場– MACD指標在零點之下, 向上走,或由下行信號線穿過。

?        空頭進場– MACD指標在零點以上, 向下走,或由上行信號線穿過。

?        多頭出場-通過執行獲利限額,移動止損或當MACD指標穿過信號線(MACD指標在零點以上, 向下走,或由上行信號線穿過)

• 空頭出場-通過執行獲利限額,移動止損或當MACD指標穿過信號線(MACD指標在零點以下, 向上走,或由下行信號線穿過)

重要提示: 為了排除MACD指針於我們的分析出現的微不足道的變化(圖表上的“小山丘”),我們引入另外一種控制繪圖中的“小山丘的大小”的方法如下: 指針大小應至少為最低價格的5個單位(5*Point,表示USD/CHF = 0.0005和USD/JPY = 0.05)。

步驟 I : 編寫智能交易系統描述 

 

將鼠標指針點到導航窗口的智能交易系統區,按鼠標右鍵,在出現的菜單裡選中“創建”指令。智能交易系統的啟動向導要求你進入某些數據。在出現的窗口,我們寫入智能交易系統名稱(Name)-MACD 樣本,作者(Author)-指示你的名字,連接(Link)-連接到網站,在注解(Notes)裡寫入-以MACD為基礎的智能交易系統測試樣本。 

 

第二步: 創建程序的主結構

智能交易系統代碼只有幾頁,即便是這幾頁代碼也挺難掌握,特別是考慮這個事實:我們不是專業的程序開發商,另外,我們根本不需要專業性的描述,對嗎? 

為了對標准智能交易系統的結構有些了解,我們現在就看看下面的這個描述吧:

 

1.      原始數據檢查

•        檢查圖表、圖表上的條形數

•        核查外部變量值:單位、Lots, S/L, T/P, T/S。

2.      設定快速數據存取內部變量;

 

3.      檢查交易終端-是否可用?若是的話,那麼:

•        檢查賬戶資金的可用性,等。

•        是否可能來做多頭買賣(買單)?

•        開倉(買)並離開

•        是否能做空倉(賣出)?

•        空倉(賣)並離開

退出智能交易系統

4.      控制循環周期中前期的開倉部位

•       如果是做多頭

•        是否應出倉?

•        是否應該設置追蹤止損單?

•        如果是做多頭

•        是否應該出倉?

•        是否應該設置追蹤止損單?

結果相當簡單,只有4個主區塊。

現在,請跟隨著每個結構的步驟來創建代碼:

 

1.      原始數據的檢索

這條代碼通常從智能交易系統移到另一個稍微更改的另一個代碼-實際上為檢索的標准區塊:

若Bars<200,就離開;//圖表不足200bars-退出。

 

        若獲利<10,則退出;//錯誤獲利參數

  2. 為了加快數據存取,設置內部變量

在程序代碼中,很有必要存取指標值或處理計算值。為了簡化代碼和加速存儲,初始狀態下,數據嵌套在內部變量裡。

MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);     // MACD value on the current bar

MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);    // MACD value on the previous bar

SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); // Signal Line value on the current bar

SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);// Signal Line value on the previous bar

MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);    // moving average value on the current bar

MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);   // moving average value on the previous bar

現在,不用晦澀難懂的iMACD(12,26,9,MODE_MAIN,0) 符號,我們在程序中用簡單的寫入字符 MacdCurrent程序文本取而代之。所有的智能交易系統中的變量都依據MQL II語言進行基本的解釋。所以,我們在程序的開頭加入這段說明。

var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0);

var: MaCurrent(0), MaPrevious(0);

MQL 4語言還另外推出了另外一個用戶自定義變量概念,它可以在程序外設定,而不會對任何系統程序下的源程序文本造成干擾。這個特點使程序更具靈活性。 MATrendPeriod變量就是這種類型的一個用戶自定義變量,所以,我們在程序的開頭加入這段說明。

defines: MATrendPeriod(56);

3.      檢查交易終端-是否可用? 若是,那麼:

在智能交易系統裡,我們只能使用當前頭寸而不能操作延遲的訂單。然而,為了安全起見,我們介紹如何利用交易終端建檢查前期提交的訂單。

If TotalTrades<1 then   // no opened orders identified

{

?        檢查: 賬戶的可用資金等。在分析市場狀況之前,最好先檢查一下你的賬戶的資金情況, 以確保賬戶中有充足的開倉頭寸的資金。

如果淨保證金<1000,那麼退出;//無資金-退出。

?        可否做多頭(買入)?

多頭買入的條件:MACD指標在0軸以下,為向上趨勢且與向下趨勢的信號線相交。這和我們在MQL II語言中所描述的一樣(注意:我們可以按照原已保存在變量中的這個指標值進行操作。) 

If MacdCurrent<0 and MacdCurrent>SignalCurrent and

   MacdPrevious<SignalPrevious and              // a cross-section exists

   Abs(MacdCurrent)>(MACDOpenLevel*Point) and   // the indicator plotted a decent 'hillock'

   MaCurrent>MaPrevious then                    // 'bull' trend

{

      SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // executing

      Exit; // exiting, since after the execution of a trade

            // there is a 10-second trading timeout

};

前面我們提到了一種監控圖表中所要顯示“小丘”的大小的一種方法。MACDOpenLevel 變量是一個用戶定義變量,可以在不影響程序文本的情況下,進行更改,以確保更多的靈活性。在程序的開始部分,我們加入一段這個變量的描述(以及下面所用到的變量描述)。

defines: MACDOpenLevel(3), MACDCloseLevel(2);

?        是否可以做空頭(賣出)?空頭賣出的條件:MACD指標在0軸以上,為向下趨勢且與向上趨勢的信號線相交。符號表示如下:

If MacdCurrent>0 and MacdCurrent<SignalCurrent and

   MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and

   MaCurrent<MaPrevious then

{

      SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // executing

      Exit; // exiting

};

   Exit;   // no new positions opened - just exit

};

 

4.      控制循環周期中前期已開倉的頭寸

for cnt=1 to TotalTrades

{

   if OrderValue(cnt,VAL_TYPE)<=OP_SELL and   // is it an open position?

      OrderValue(cnt,VAL_SYMBOL)=Symbol then // position from "our" chart?

     {

CNT是周期變量,是在程序的開始部分加以描述的,具體如下:

var: Cnt(0);

?        若是多頭買入

If OrderValue(cnt,VAL_TYPE)=OP_BUY then // long position opened

{

?        是否需要平倉?存在平倉的條件:MACD指針與信號線相交,MACD指針在0軸以上,為向下趨勢且與向上趨勢的信號線相交。

If MacdCurrent>0 and MacdCurrent<SignalCurrent and

   MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then

{

    CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);

    Exit; // exit

};

?        是否應該需要重新設定移動止損點?僅在持倉並已超過移動止損點數點並獲利的情況下,而且新的移動止損點比前期的要更有理一些,我們才重新設置移動止損點。

If TrailingStop>0 then // if trailing stops are used

{

    If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(Point*TrailingStop) then

      {

        If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then

          {

             ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),

                         Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);

             Exit;

          };

       };

};

}

?        若是處在空頭部位

else // otherwise it is a short position

{

?        是否應該平倉?出現空頭的條件: MACD指針與信號線相交,MACD指針在0軸以下,為向上趨勢且與向下趨勢的信號線相交。

If MacdCurrent<0 and MacdCurrent>SignalCurrent and

   MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDCloseLevel*Point) then

{

    CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);

    Exit; // exit

};

?        是否應該重新設定移動止損點?僅在持倉並已超過移動止損點數點並獲利的情況下,而且新的移動止損點比前期的要更有理一些,我們才重新設置移動止損點。

If TrailingStop>0 then // the user has put a trailing stop in his settings

{                // so, we set out to check it

    If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then

      {

        If OrderValue(cnt,VAL_STOPLOSS)=0 or

           OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then

          {

            ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),

                        Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);

            Exit;

          };

      };

};

// end. 結束所有的花括號,但仍然有效。

    };

};

};

所以,按照步驟,循序漸進地學習,我們已經學會了編寫智能交易系統。

第三步:將所有程序代碼集合起來

 

我們將前面章節的所有的代碼集合起來:

defines: MACDOpenLevel(3),MACDCloseLevel(2);

defines: MATrendPeriod(56);

var: MacdCurrent(0),MacdPrevious(0),SignalCurrent(0),SignalPrevious(0);

var: MaCurrent(0),MaPrevious(0);

var: cnt(0);

// 原始數據檢查

//確保智能交易系統在正常圖表上運行,這很重要。

// 用戶正確設置外部變量 (單位數, 止損,

// 獲利、移動止損)

// 在我們看來,我們只需檢查獲利就行了

若Bars<200或獲利<10,那麼就退出;//圖表上少於200 bars

//簡化和加速操作程序,我們需要作必要的保存

//臨時變量中的指標數據

MacdCurrent=iMACD(12,26,9,0,MODE_MAIN);

MacdPrevious=iMACD(12,26,9,1,MODE_MAIN);

SignalCurrent=iMACD(12,26,9,0,MODE_SIGNAL);

SignalPrevious=iMACD(12,26,9,1,MODE_SIGNAL);

MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);

MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);

//現在我們必須檢查交易終端的狀況

// 我們要看一看是否還有任何前期開倉部位或訂單。

如果總交易<1, 那麼

{//沒有已開倉訂單

    // 為了安全期間,我們要確保賬戶有充足的資金。.

//比如說,取值為“1000”,通常可能就是提交1個單位

如果淨保證金<1000,那麼退出;//沒有資金-我們退出

//檢查做多頭(買入)的可能性

   If MacdCurrent<0 and MacdCurrent>SignalCurrent and

      MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDOpenLevel*Point) and

      MaCurrent>MaPrevious then

     {

      SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // 執行

      Exit; // 既然交易已經執行,退出

            // 有10秒鐘的交易暫停時間

     };

//檢查空頭(賣出)的可能性

   If MacdCurrent>0 and MacdCurrent<SignalCurrent and

      MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and

      MaCurrent<MaPrevious then

     {

      SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // executing

      Exit; // exiting

     };

//這裡我們完成了對新的開倉部位可行性檢查

//沒有新的開倉部位,我們就用退出命令退出程序

//沒有要分析的任何東西

   Exit;

};

//我們進入到智能交易系統的重要部分-控制開倉部位

// 正確進入市場很重要,但是退出市場更重要。

for cnt=1 to TotalTrades

{

   if OrderValue(cnt,VAL_TYPE)<=OP_SELL and   //這是開倉部位嗎? OP_BUY or OP_SELL      

OrderValue(cnt,VAL_SYMBOL)=Symbol then // 工具匹配嗎?

     {

      If OrderValue(cnt,VAL_TYPE)=OP_BUY then // 多頭開倉

        {

        // 我們檢查-可能,尚有時間平倉嗎?

         If MacdCurrent>0 and MacdCurrent<SignalCurrent and

            MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then

           {

             CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);

             Exit; // 退出

           };

         // 我們檢查-可能,我可能已經或該是設置移動止損的時候了嗎?

         If TrailingStop>0 then //用戶已經將移動止損進行了設置

           {                     // 所以,我們開始著手檢查

            If (Bid-OrderValue(cnt,VAL_OPENPRICE))>(Point*TrailingStop) then

              {

               If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then

                 {

                   ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),

                               Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);

                   Exit;

                 };

              };

           };

        }

      else // 否則,就是多頭。

        {

       // 我們檢查-可能,尚有時間平倉嗎?

         If MacdCurrent<0 and MacdCurrent>SignalCurrent and 

            MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDCloseLevel*Point) then

            {

             CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);

             Exit; // 退出

            };

         //我們檢查-可能,我可能已經或該是設置移動止損的時候了嗎?

         If TrailingStop>0 then // 用戶已經把移動止損進行了設置

           {                // 所以,我開始著手檢查。

            If (OrderValue(cnt,VAL_OPENPRICE)-Ask)>(Point*TrailingStop) then

             {

               If OrderValue(cnt,VAL_STOPLOSS)=0 or 

                  OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then

                 {

                   ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),

                              Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);

                   Exit;

                 };

              };

           };

        };

     };

};

// 結束 。

要完成對智能交易系統的設置,我只需要對外部變量進行設定,Lots = 1, Stop Loss (S/L) = 0 (未使用), Take Profit (T/P) = 120 (適用於一個小時的間隔),Trailing Stop (T/S) = 30。當然,你還可以設置自己的數值。

按Compile按鈕,如果沒有錯誤信息,就按SAVE按鈕保存智能交易系統(順便說,你還可以將上述程序的灰色背景打印文本保存到MetaEditor)。

現在,我們來編輯智能交易系統, 在MQL編輯器點擊頂端的Compile圖示(像一張有檢查標記的紙)。 

步驟 IV: 測試智能交易系統的歷史數據

我們已經編寫了智能交易系統,我們通過對測試歷史數據,現在急於要對其進行評估。 我們就以15分鐘間隔的EUR/USD為例,大約為4000基准值。

打開智能交易系統測試器:

在軟件下部會出現智能交易系統測試器:

在智能交易系統測試器中選擇EUR/USD,M15,設置測試歷史數據的起始日期和結束日期,開始測試

測試完成後,可查看測試記錄、淨值圖,在報告欄中可查看統計報表,並可將完整的包括淨值圖、交易記錄、分析報表完整地保存下來。

智能交易系統不僅提供建議和信號,而且允許交易賬戶上進行自動交易,用附加到圖表指令(通過在導航窗口用鼠標指針選中MACD樣本,按鼠標右鍵選中出現的菜單命令)將MACD 樣本智能交易系統附加到圖表中,然後點擊“啟用智能交易系統”按鈕。

或點擊該智能交易系統,在對話框中選擇“允許實時自動交易”並點確定。智能交易系統就會工作了

智能交易系統所有代碼在 Ready Expert Advisors頁都可找到

當你對智能交易系統做出編寫時,必須謹記:

編寫和測試交易平台的智能交易系統具有許多細節特征:

?        在開倉之前,必須檢查你賬戶上可用保證金的有效性。假如可用保證金不足時,則開倉部位交易將失敗。必須注意的是,為了達到測試的目的,可用保證金最少應在1000,因為一個單位的測試價格為1000。

If FreeMargin < 1000 Then Exit;   //如果保證金< 1000,那麼退出,無資金-退出。

?        在開倉、平倉或者修改已有部位或刪除延遲訂單(一經執行以下任何的操作:SetOrder, CloseOrder, ModifyOrder or DeleteOrder)之後,建議使用Exit語句完成智能交易系統的這部分的操作,這將有10秒鐘的限定時間間隔來執行該項操作。還應注意,10秒鐘的限定時間不適用於測試模式(你可以連續做幾次交易)。另外,假如不是用Exit語句來完成智能交易系統的上述交易操作,智能交易系統的測試結果將和真實交易不同。

SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 執行

Exit;                   //退出

為了防止在測試模式中用少於10秒的間隔來執行幾項交易,你只需確保從上一次交易到下一次的交易已經超過10秒。

//確保當前的時值離上次交易的執行大於10秒。

If CurTime > LastTradeTime + 10 Then Begin

    SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 執行

   Exit;

End;

?        歷史數據可以用已引索的預設變量OPEN、 CLOSE、 HIGH、 LOW、 VOLUME來存取。在這種情況下,指數是指必須回頭計算的期間數。

// 如果上個BAR柱狀線的收縮小於倒數第二個BAR柱狀線的收縮少

If Close[1] < Close[2] Then Exit;

?        交易平台中的智能交易系統支持4種模式:

?        OHLC 點(Open/High/Low/Close)模式。 因為系統在此的測試目的僅限於開盤價、收盤價、最高價、最低價,所以這個測試系統是最快的。 但是, 這個測試結果與智能交易系統執行的實際交易的結果可能會不同。

?        每3點一次模式:在測試智能交易系統時,每增加三點就會模擬產生一個燭台圖示。

?        每2點一次模式: 在測試智能交易系統時,每增加二點就會模擬產生一個燭台圖示。

?        每1點一次模式:在測試智能交易系統時,每增加一點就會模擬產生一個燭台圖,這種模式是最慢的但是測試結果是最接近智能交易系統的實際交易的結果的。(交易中間每間隔10秒鐘,觀察結果)

?        在編寫和檢驗智能交易系統過程中,以及在對任何其他程序測試過程中,有時, 需要輸出一些額外的調試信息。MQL II語言還提供這類信息輸出的若干可能性。

?        將ALERT函數以及包含用戶自定義的數據發送到屏幕對話框。

Alert("Free margin is ", FreeMargin);

?        COMMENT函數將由用戶定義的數據放置在圖表的左上角。“\n” 字符用於結束一行。

Comment("Free margin is ", FreeMargin, "\nEquity is ", Equity);

?        Print 函數是將由用戶定義的數據輸至系統日志。

Print("Total trades are ", TotalTrades, "; Equity is ", Equity, "; Credit is ", Credit);

?        PrintTrade函數是將指定的未平倉合約的具體細節輸出到系統日志中。 

PrintTrade(1);

?        當 智能交易系統 已測試完畢,測試結果會以擴展名為.log的文件形式儲藏在你安裝該交易平台所在的日志的子目錄中。如果你經常性地測試你的智能交易系統,別忘了定期刪除log檔,因為它們可能累計達到數兆字節。

 

智能交易系統用戶重要提示――智能交易系統並不能提供萬能保證。你應對任何你所使用智能交易系統創建的交易自行負責。現特別提醒:你使用任何系統在模擬賬戶上進行延時練習,均要確認該系統實際上滿足了你的要求。請注意,雖然模擬環境和實戰黃將相似,當在交易執行方式上還是有差別的。 外匯交易平台對任何使用智能交易系統過程中所發生的任何電子上的或技術上的錯誤均不承擔責任

2、MT4使用說明——技術指標③

資金流量指數指標

資金流量指標(MFI)是測算資金投入證券並從證券市場中收回時的。速率的技術指標。對於該指標的構築和解釋與相對強弱指標相似,區別只是在於:成交量對於資金流量指數是重要的

當我們分析資金流量指數時,必須考慮下列幾點 :

• 指標和價格移動的偏離,如果價格上升而指標下降的話(或者相反),則價格存在一個極有可能的變化;

• 資金流量指數值,如果超過80或者是低於20的話,則分別可以表明市場潛在的上升或探底趨勢。

計算方法

資金流量指標的計算方法包括幾個步驟。首先我們要定義一個需要研究時段的典型價。.

TP = (HIGH + LOW + CLOSE)/3

然後我們計算資金流量的數額:

MF = TP * VOLUME

如果當天的典型價格高於昨天的典型價格,那麼資金流量指數應該是個正數。如果今天的典型價格低於昨天的典型價格,那麼資金流量的指數應該是個負數。

正資金流量是在一定時段裡,正資金流量的一個總和。負資金流量是一定時段裡,負資金流量的一個總和。

然後我們計算資金比率(MR),把正資金流量以負資金流量:

MR = Positive Money Flow (PMF)/Negative Money Flow (NMF) 

最後我們用資金比率來計算資金流量指數:

MFI = 100 - (100 / (1 + MR))

移動平均線

移動平均線指標顯示某一個時間段平均工具性價格的數值。當我們計算移動平均線的時候,其實我們是在平均這段時間內工具性價格的數值。由於價格的變化,移動平均線指標要麼增加要麼減少。

有四種不同類型的移動平均線: 簡單(也被成為算術)移動平均線, 指數移動平均線, 通暢移動平均線和 線形權數移動平均線。。我們可以為任何一套順序排列的數據來進行移動平均線的計算,包括開市和閉市價格,最高和最低價格,交易量和任何其他的指標。同時有兩條移動平均線被使用的情況比較普遍。

只有在一種情況下,不同種類的移動平均線會產生相當大的分離,就是當權數系數不同的情況下(該系數是被安排到最近的一個數據裡的),我們在討論簡單移動平均線的時候,我們研究的時間段的所有價格都在數值上相等。指數和線形權數移動平均線的數值更趨向於最近的價格

解釋價格平均移動最普遍的方法是就是將其動量與價格運動相比較。當工具性價格上升到其移動平均線之上時,購買信號出現了;當價格下落到移動平均線下面時,我們所得到的是一個賣出信號。

這種基於移動平均線的貿易體系,並不是設計用來提供給我們一個通道的:市場處於低潮期的時候讓我們進入,在進入高峰期的時候讓我們出來。根據下列市場趨勢的變化,它可以使得我們作出相應的行動:一旦價格探底,我們就開始買進;一旦價格攀升,我們就開始賣出。

移動平均線也可被運用於各種指標。那就是移動平均指標的解釋和價格移動平均線解釋相似的地方。如果指標上升到移動平均線上面的時候,那就意味著上升的指標運動還將繼續。指標若是低於移動平均線,那就表明指標有可能繼續下滑。

這是圖表上移動平均線:

• 簡單移動平均線(SMA)

• 指數移動平均線 (EMA)

• 通暢移動平均線 (SMMA)

• 線性權數移動平均線 (LWMA)

計算方法:

簡單移動平均線(SMA)

簡單,或者說是算術移動平均線的計算:匯總某幾個單一時間段內閉合的工具性價格(比如,12個小時)然後這個匯總的數值在除以時段數

SMA = SUM(CLOSE, N) / N

 

注解:

N — 計算用的時段數目。

指數移動平均線(EMA)

指數通暢移動平均線的計算:把某一份額的當前收市價格的移動平均線與上一個這樣的數值相加有指數通暢移動平均線的當前價格的數值最大,P百分率的指數移動平均數率表示為 :

EMA = (CLOSE(i) * P) + (EMA(i - 1) * (100 - P))

 

注解: 

CLOSE(i) — 當前時段收市價格;

EMA(i-1) — 上一收市時段移動平均線;

P — 使用價格數值的百分比。

通暢移動平均線 (SMMA)

該通暢移動平均線的第一個數值的計算和簡單移動平均線一樣(SMA):

SUM1 = SUM(CLOSE, N)

SMMA1 = SUM1/N

第二個和接下來的數值的計算,可參照下列公式:

PREVSUM = SMMA(i - 1) * N

SMMA(i) = (PREVSUM - SMMA(i - 1) + CLOSE(i)) / N 

Where: 

SUM1 —N個時間段收市價格的總值; 

SMMA1 — 第一個柱形的通暢移動平均線;

SMMA(i) — 當前柱形的通暢移動平均線(除了第一個以外);

CLOSE(i) — 當前收市價格;

N — 通暢時段;

線性權數移動平均線(LWMA)

就線性權術移動平均線而言,其最新的數據值大於它早期的數值。權數移動平均線的計算:在所考慮的一系列數據裡,兩兩相乘每一個收市價格,然後在比上某一個特定的權數系數。

LWMA = SUM(Close(i)*i, N) / SUM(i, N)

 

Where: 

SUM(i, N) — 權數系數的總合。

移動振動平均震蕩器指標

震蕩移動平均指數的數值是振蕩指數和震蕩通暢指數的差額。在這種情況下,MACD的基本曲線被作為振蕩指標。信號曲線被作為通暢指標。

計算方法

OSMA = MACD-SIGNAL

能量潮指標

能量潮技術指標是關聯成交量和價格變化的一個沖量指標。JOSEPH GRANVELLE提出的這個指標相當簡單。當證券收市價格高於前一收市價格,當天所有的交易都被稱為上能量潮;當證券收市價格低於前一收市價格時,當天所有交易都被稱為下能量潮。

有關能量潮交易的一個最基本的假設是:該指標的變化先於價格的變化。該理論意思就是說,通過上升的能量潮交易量指標,我們可以看到游動資金流入證券市場。當大眾都紛紛進入證券市場的時候,證券和能量潮交易量指標都會上升。

如果證券的價格移動先於能量潮交易量的移動,“非確認“將會產生。這種情況會出現在牛力占據市場主導地位的時候(那時證券價格單獨上漲或者是先於能量潮指數上升);同樣,這種情況也會出現在熊力占市場主導地位的時候(那時證券價格單獨下降,或先於能量潮指數下降).

當能量潮技術指標每一個高峰高於上一個的時候,或者它的每一個低谷都高於上一個的時候,那麼我們就說能量潮處於一個上升趨勢。同樣,與上面情況相反的話,那麼我們就說能量潮技術指標處於一個下降的趨勢。當指數進行邊際移動或者沒有進行上下的波動時,那能量潮技術指標就處於一個懷疑趨勢。

一旦這個趨勢建立以後,只有當它被打破時,該趨勢的作用才會消失。我們有兩種打破能量潮指標趨勢的方法。第一種就是趨勢從高到低的運動,或者從低到高的運動。

第二種就是如果當指標進入懷疑趨勢或者在處於懷疑趨勢三天以上的,我們也可以打破這個指標趨勢。如果證券價格的變化遵循從上升趨勢進入懷疑趨勢,並只要能在回復到上升趨勢之前在懷疑趨勢中保持兩天的話,那我麼就認定這個能量潮指數可以一直處於上升階段。

當移動平衡指數變化到上升或是下降趨勢的時候,"爆發"就發生了。由於該指標的"爆發"先於價格的“爆發”,投資者應該在指標向下"爆發"時買進長線;同樣,投資者在該指標向上"爆發"的時候,賣出長線。應該等到趨勢變化的時候在收線。

計算方法

如果當天的收盤價高於昨天的話,那麼: OBV(i) = OBV(i-1)+VOLUME(i)

如果當天的收盤價低於昨天的話,那麼: OBV(i) = OBV(i-1)-VOLUME(i)

如果當前的收盤價等於昨天的話,那麼: OBV(i) = OBV(i-1)

注解:

OBV(i) —當前時段指標值;

OBV(i-1) —上一時段的指標值 ; 

VOLUME(i) —當前柱形的成交量。

拋物線狀止損和反轉指標

拋物線狀止損和反轉技術指標是用來分析市場的趨勢變化的。這個指標是構件於價格圖表之上的。拋物線狀止損和反轉技術指標與移動平均線技術指標相似,唯一的差別就是:拋物線技術指標是以越來越快的速度加速移動的,並且就價格而改變自己的位置的。該指標在牛力時(上升趨勢) 低於價格水平,在熊力時(下降趨勢)高於價格水平。

如果價格穿過拋物線指數時,那麼該指標開始反轉,它的進一步的價值會落在價格水平的另外一面。當該指標的反轉確實發生時,上一個時間段的最高和最低值將作為一個開始點。當該指標反轉,它就會給出一個市場趨勢結束或者是開始的信號(修正階段或無波動階段)如果價格穿過拋物線指數時,那麼該指標開始反轉,它的進一步的價值會落在價格水平的另外一面。當該指標的反轉確實發生時,上一個時間段的最高和最低值將作為一個開始點。當該指標反轉,它就會給出一個市場趨勢結束或者是開始的信號(修正階段或無波動階段)

拋物線指標在出市點方面的表現十分出色。當價格下沉到低於拋物線指標時,我們應該關閉長線的交易;當價格上升到超過該指標時,我們則應該關閉短線交易。通常情況下,該指標作為軌跡終止曲線。

如果長線位置開放的時候(價格高於拋物線指標),不管價格采取如何方向的走勢,指標總是向上運動的。指標曲線移動的長度取決於價格移動的規模。

計算方法

SAR(i) = SAR(i-1)+ACCELERATION*(EPRICE(i-1)-SAR(i-1))

注解:

SAR(i-1) — 上一柱形的指標數值; 

ACCELERATION —加速的因素 ;

EPRICE(i-1) —上一時間段的最高(最低)價格,EPRICE=HIGH是長線的價格(EPRICE=LOW是短線的價格)。

如果當前柱形的價格高於上一個牛力的價格,那麼拋物線指標數值增加;反之,則指標值下降。與此同時,加速因素(ACELERATION)會以成一倍的方式增加,這時,拋物線指標和價格趨於同一。換句話說,就是價格上升或下降的越快,指標就會更快的趨向於價格水平。

相對強弱指數指標

相對強弱指數技術指標(RSI)是追尋震蕩指標的價格,該震蕩指標的取值范圍在0-100之間。當WILDER在引進這個指數時,他建議使用一個14天的RSI指標。自他提出這個建議以後,人們使用9天和25天的RSI指標也非常的普遍了。

分析RSI指標最為普遍的方法是:我們要尋找這樣一個分離的情況,在那點上,證券的價格是創新高的,但RSI指標並未能超過它以前的那個高度。這樣的分離暗示著一個迫近的相反趨勢。當RSI指標那時開始反轉,並且下降到它最近的那個低谷,人們稱之為"失敗搖擺","失敗搖擺"被看作為是即將到來的一個相反趨勢的確認。

使用RSI指標來做圖表分析的方法:

• 頂部和底部

RSI指標通常上升到70以上或者是下降到30以下。在構成價格圖表之前,該指標一般形成這樣的頂部和底部趨勢;

• 圖表的形成

RSI指標一般會形成象頭,肩膀和三角形這樣的圖表圖案,這些圖形可能在價格圖表上是看不到了;

• 失敗搖擺 (支持或抗拒;滲透或爆發)

在這個時候,RSI指標一般會超過上一個高點(波峰)或下降到下一個低點(低谷);

• 支持或抗拒水平

RSI指標在表現支持或抗拒水平的時候比價格本身更為的清楚。

• 分離

就上述討論的一樣,當價格水平創出新高(低),但這種新高(低)的趨勢並沒有被RSI指標所確認的時候,分離的情況就發生了。價格通常會修正並且沿著RSI指標的方向進行移動。

計算方法

RSI = 100-(100/(1+U/D))

注解:

U —價格變化正值的平均數;

D — 價格變化負值的平均數。

相對活力指數指標

相對活力指數技術指標(RVI)的技術特點就是,原則上,在牛力上,收盤價格高於開盤價格;在熊力的時候,情況則相反。所以蘊涵在該RVI之後的原理就是:指數移動的活力或能量是由價格在收市時的那個數值所確立的。為了使得該指標正常於當日的交易范圍,我們根據當日價格范圍的最大值來劃分價格的變動情況。為了進行更為便利的運算,我們應該使用簡單移動平均線指標。10是最好的時間段。為了避免可能的混淆,我們必須構建一個信號曲線,這一曲線是RVI指標數值的4段對稱加權平均線。曲線之間的匯合被認為是購買或者是賣出的信號。.

計算方法

RVI = (CLOSE-OPEN)/(HIGH-LOW) 

注解:

OPEN — OPEN —開盤價格;

HIGH — 最大價格;

LOW — 最低價格 ;

CLOSE —收盤價格。

標准離差

標准離差 —是市場上的一種易變得價值尺寸。標准離差指標是對簡單移動平均線價格漲落變化的描述。所以,如果指標的價值為高,說明市場是易變的,價格柱將會隨著簡單移動平均線而漲落。如果指標的價值為低,市場的浮動則會降低,價格柱也會隨著簡單移動平均線漲落。

正常情況下,標准離差指標作為其他指標的組成部分應用。由於,當計算 保力加通道指標時,需要添加標准離差指標到它的 移動平均線。

計算方法

StdDev = SQRT (SUM (CLOSE - SMA (CLOSE, N), N)^2)/N 

注解:

SQRT — 正方體根;

SUM (..., N) — N個周期內的總和; 

SMA (..., N) — 簡單移動平均線 存在N個周期;

N —計算周期。

隨機震蕩指標

隨機震蕩技術指標比較一定時段裡,價格的范圍同證券價格收市值的相關情況。該振蕩指標以雙線來顯示。主線被稱為%K線,第二根線被稱為%D線,它的數值是主線%K的移動平均線。%K通常顯示為一個固定的曲線,而%D線則顯示為點狀曲線。

我們有很多方法來解釋這個震蕩指標,其中有三種方法比較普遍:

• 當震蕩指標(%K或是%D)下降到低於某一個具體水平的時候(比如20),然後又上升到高於那個水平的時候,我們可以進行買入。當指標上升到高於某一個具體水平時(比如80),然後又回落到低於那個水平時,我們就可以賣出了;

• 我們可以在%K曲線高於%D曲線的情況下進行買入,或者在%K曲線低於%D曲線的情況下賣出;

• 尋找分離點。比如:當價格不斷的創出新高,隨機震蕩指數未能突破它之前的新高的時候。

計算方法

隨機震蕩指標有四種變形:

• %K 時段:這是在計算震蕩指標過程中所用到的時間段的數值;

• %K減速時段:這個數值控制著%K的內部通暢度。數值一被看作是快速隨機震蕩指標,而數值三則被視為慢速隨機指標;

• %D時段:在計算%K移動平均線時,所用到的時間段的數值;

• %D方法:在計算%D時所使用的方法(包括簡單,指數,通暢和加權)。

%K的方程式: %K = (CLOSE-LOW(%K))/(HIGH(%K)-LOW(%K))*100

注解:

CLOSE —當天的收盤價格;

LOW(%K) —%K的最低最低值; 

HIGH(%K) — %K的最高最高值

根據公式,我們可以計算出%D的移動平均線: %D = SMA(%K, N) 

注解:

N — 通暢時間段;

SMA — 簡單移動平均線。

威廉指標

威廉指標是一個動態技術指標,由它來決定市場是否過度買入或買進。威廉的%R曲線和與隨機震蕩指標非常類似。唯一的區別在與%R曲線有上下運動的標尺,而隨機震蕩指標有振動指數有內部的舒張。

為了表明威廉指標的上下運動方式,我們應該在其指數前添加負號,(例如-30)不過在進行指標分析的時候,我們應忽略那個負號的存在。

在80到100%范圍內變化的指標數值表明市場處於一種過度賣出狀態。在0到20%范圍內變化的指標數值則表示市場處於過度買入狀態。

就所有過度買入或過度賣出的指標,你最好在下單之前,等待證券價格改變它的走向。如果在過度買入或是過度賣出的指標顯示出過度買入的條件,那你在賣出某個證券之前等待價格的回落是非常明智的。

威廉技術指標有趣的一個現象就是它能大膽的預測基本證券價格相反趨勢的能力。指標總是在證券在進行上下運動之前的幾天裡形成自己的波動。同樣,威廉指標通常會形成一個低谷,並且在證券價格出現之前保持幾天的時間。

計算方法

TBELOW是計算%R指標的方程式,這個公式和 隨機震蕩指標的計算方法相似: %R = (HIGH(i-n)-CLOSE)/(HIGH(i-n)-LOW(i-n))*100

注解:

CLOSE —當日收盤價

HIGH(i-n) —過去時段的最高值

外_匯_邦 WaiHuiBang.com
  • 上一个财经:
  • 下一个财经:
    • 原油期貨沒交易

      華爾街都沒料到!原油期貨黑天鵝事件推手,竟然是一家小 ...   華爾街都沒料到!. 原油期貨黑天鵝事件推手,竟然是一家

    • 趨勢判斷: 123法則和2B法則

      123法則在一段上漲的趨勢中,當價格跌至支持線下方時,我們能否判斷上漲趨勢已結束呢?答案是不一定。當價格跌破支持線的時候,往往並不代表價格已

    • 選擇基金的五個標准

        基金投資如何選擇合適的基金呢?選擇基金的評價標准是什麼?評價基金的標准有很多,下面就介紹一下比較重要的幾個方面。   1

    • 賣股票的錢當天可以買債券嗎?

      可以,當天賣出股票的資金,當天可用不可取,可以繼續進行交易(股票、基金、債券、國債逆回購等都可以),取出

    • 年底還是年初辦信用卡比較容易過?

      最佳答案: 年底申請信用卡比較容易過,因為有些銀行年底為了沖業績,可能會放寬對信用卡申請審核的條件,

      風險提示:比特財富網的各種信息資料僅供參考,不構成任何投資建議,不對任何交易提供任何擔保,亦不構成任何邀約,不作為任何法律文件,投資人據此進行投資交易而產生的後果請自行承擔,本網站不承擔任何責任,理財有風險,投資需謹慎。
    比特財富網 版權所有 © www.emoneybtc.com