您现在的位置: 比特财富网 >> 财经 >  >> 外匯
MT4新編:簡單三線交叉EA
外_匯_邦 WaiHuiBang.com

MT4編程入門教程目錄

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

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

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

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

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

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

MT4編程入門7:判斷語句

MT4編程入門8:循環

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

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

MT4編程入門11:MT4的報警

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

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

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

 1.jpg

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

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

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

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

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

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

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

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

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

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

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

 2.jpg

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

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

1、打開MQ語言編輯器

 3.jpg

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

 4.jpg

 5.jpg

 6.jpg

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

 7.jpg

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

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

 8.jpg

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

 9.jpg

 10.jpg

 

保存後,再點一下編寫。

到此,源碼保存完成。

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

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

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

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

這非常簡單

 11.jpg

 

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

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

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

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

二、分號“;”

表示一個語句結束

三、逗號“,”

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

四、等於號“=”

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

五、加號“+”

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

六、加加“++”

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

七、加等於“+=”

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

八、雙等號“==”

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

九、歎號等號“!=”

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

十、“&&”

邏輯符“並且”

十一、“||”

邏輯符“或者”

十二、大括號“{}”

表示函數體。

{}內部為函數體語句。

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

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

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

例:

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

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

二、類型和類型定義詞

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

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

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

3、字符串型(string)。

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

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

三、附加變量

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

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

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

例:

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

 

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

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

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

int ft(int x,int y)

    {

     int temp;

     temp=3*x+2*y;

     return(temp);

    }

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

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

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

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

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

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

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

函數體部分有三句:

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

第二句,計算temp的值

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

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

二、函數類型與類型符

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

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

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

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

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

四、函數的調用

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

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

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

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

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

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

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

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

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

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

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

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

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

例:

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

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

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

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

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

三、數組使用時的賦值

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

例如:dd[2]=1;

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

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

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

四、數組的引用

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

以此類推。。。。。。

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

二、預定義變量

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

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

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

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

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

三、指標函數

1、價格、成交量、時間

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

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

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

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

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

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

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

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

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

例:

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

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

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

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

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

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

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

均線周期:10天平均線的均線周期為10,20天均線的均線周期為20

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

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

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

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

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

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

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

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

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

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

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

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

4、求自定義指標的值

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

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

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

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

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

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

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

 

MT4編程入門7:判斷語句

一、if語句

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

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

例如:

if(a==1)

    {

     b=c+1;

    }

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

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

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

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

例:

int mark=0;

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

    {

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

     mark=1;

    }

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

    {

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

     mark=2;

    }

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

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

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

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

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

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

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

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

二、if ... else語句

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

if(條件)

  {

  語句1;

  }

else

  {

  語句2;

  }

三、注意事項

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

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

              if(條件)    語句1;

 

MT4編程入門8:循環

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

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

一、while循環

while(條件)

   {

   語句1

   語句2

   。。。

   }

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

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

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

例:

   extern int 快線=12;

   extern int 慢線=26;

   double buffer[];

   int i=0;

   while(i<1000)

     {

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

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

      i++;

     }

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

二、for循環

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

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

   extern int 快線=12;

   extern int 慢線=26;

   double buffer[];

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

     {

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

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

     }

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

(1)文件頭部

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

(3)初始化函數init()

(4)主函數start()

 12.jpg

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

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

常用的預處理程序有:

1、#property  indicator_chart_window

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

2、#property indicator_separate_window

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

3、#property indicator_buffers 3

顯示3根指標線

4、#property indicator_color1 Red

第1根指標線的顏色為Red

5、#property  indicator_width1  1

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

6、#property indicator_level1   0.00

在0.00值位置橫劃1條虛線

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

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

三、初始化函數init()

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

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

四、主函數start()

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

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

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

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

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

 

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

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

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

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

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

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

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

第六、給數組賦值

其中:

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

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

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

下面以MACD為例說明

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

其中:

白線是二根均線的差;

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

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

 13.jpg

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

下面是全部語句:

#property indicator_separate_window

#property indicator_color1  White

#property indicator_level1  0

extern int FMA=12;

extern int SMA=26;

double     buf[];

int init()

  {

   SetIndexBuffer(0,buf);

   SetIndexStyle(0,DRAW_LINE);

   return(0);

  }

int start()

  {

   int limit=Bars-IndicatorCounted();

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

    {

    buf=

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

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

    }

   return(0);

  }

說明如下:

 14.jpg

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

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

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

#property indicator_separate_window

指標放在副圖

#property indicator_color1  White

第一條指標線為白色

#property indicator_level1  0

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

extern int FMA=12;

extern int SMA=26;

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

double     buf[];

設立一個數組

int init()

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

  {

   SetIndexBuffer(0,buf);

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

   SetIndexStyle(0,DRAW_LINE);

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

   return(0);

   函數結束語句

  }

int start()

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

  {

   int limit=Bars-IndicatorCounted();

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

   Bars是圖表中的柱數

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

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

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

   循環語句。

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

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

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

    {

    buf=

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

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

    }

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

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

   return(0);

   start函數結束

  }

 

MT4編程入門11:MT4的報警

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

 15.jpg

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

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

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

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

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時,說明已經對下穿報過警了,就不能再次對下穿報警。

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

外_匯_邦 WaiHuiBang.com
  • 大盤反彈也能抓住強勢股

    一般來說,大盤在下跌過程中的反彈,會引發一些個股的短期上漲行情,但這種上漲極其短暫,而個股也漲跌不一。如果選股不當,一旦大盤結束反彈,投資者

  • “授漁亭”之外匯交易員未來前途光明

    外_匯_邦 WaiHuiBang.com   一、可以獨擋一面的外匯交易員,這樣的交易員可以自己分析外匯市場行情,做出獨立的判斷,不需要借助

  • 金融匯率

    金融匯率(financial rate)  金融匯率又稱非貿易匯率,是指用於國際資金流動、國際旅游業及其他國際間非貿易性收支的計算和結匯時所

  • 錢有路顯示一直申請中請問怎樣查詢申請進度?

    最佳答案: 錢有路申請的結果一般會通過短信發放,你也可以登陸APP查詢申請結果,要是一直沒有收到回復

  • 2018雙十一買家電劃算嗎?

    最佳答案: 雙十一買家電的話,還是可以買的,因為降價幅度大,所以在網上買價格一般都比實體店要低一些。

  風險提示:比特財富網的各種信息資料僅供參考,不構成任何投資建議,不對任何交易提供任何擔保,亦不構成任何邀約,不作為任何法律文件,投資人據此進行投資交易而產生的後果請自行承擔,本網站不承擔任何責任,理財有風險,投資需謹慎。
比特財富網 版權所有 © www.emoneybtc.com