|
點擊:... 回復:45
主題:MT4:強大的編程功能
MT4自定義指標的保存目錄、指標編緝器與指標調用
一、MT4自定義指標保存在C:\Program Files\MetaTrader 4\experts\indicators這個目錄中,該目錄中主要有二種類型的文件,一種是mq4文件,這是MT4自定義指標的源碼文件,是一種高級語言文件,可以人工編寫修改,機器不能直接執行,但能在MT4啟動時自動編譯為ex4可執行文件。 另一種就是ex4文件,這是MT4自定義指標的可執行文件,由mq4文件編譯得到。 mq4文件必須編譯為ex4文件才能被MT4執行。 但ex4文件是機器碼文件,人工不可修改,另外還有一個文件是mqlcache.dat,它用來保存目錄中的文件信息,如果MT4無法自動編譯,只要刪除此文件即可解決問題 mq4文件編譯為ex4可執行文件有兩種方法: 1、MT4啟動時,會自動把此目錄中的mq4文件編譯為ex4文件。 2、用MQ語言編輯器打開mq4文件,點一下“編寫”按鈕,即可生成ex4文件 二、下載保存mq4文件、ex4文件 在論壇上我們經常看到有mq4文件、ex4文件可供下載,我們只要把它們保存到C:\Program Files\MetaTrader 4\experts\indicators這個目錄,也就是下面這個目錄中,就可以了。如果下載的是ex4文件,那可以直接調用;如果是mq4文件,則需要重啟動MT4,讓系統自動編譯生成ex4可執行文件。如果下載的是rar、zip等類型的壓縮文件,還必須下載後解壓到此目錄才能使用。 三、將源碼保存為源碼文件 在論壇上,我們也經常能看到指標源碼貼在網頁上,但沒有mq4、ex4等文件可以下載,只能復制源碼。此時需要我們自己動手將源碼保存為源碼文件,那也沒關系,非常地簡單,多點幾下鼠標就搞定。 1、打開MQ語言編輯器 2、在MQ語言編輯器中新建一個文件,文件名一定要輸,別的隨便操作都沒關系。 3、刪除新文件裏面的所有內容,成為一個空文件, 4、接著我們就可以將網頁上源碼復制粘貼進來 試著點一下“編寫”,如果左下角出現“0錯誤,0警告”,那說明源碼沒問題,編譯通過了,成功生成了ex4可執行文件 5、還有很重要的一點,就是要把源碼文件保存到正確的目錄中 保存後,再點一下編寫。 到此,源碼保存完成。 當然,我們也還有另的辦法: 可以打開一個原已存在的mq4文件,然後另存為你需要的文件名,再刪除文件中的所有內容成為空文件,把網頁上的源貼到文件中保存即可 也可以在記事本中新建一個文件,把網頁上的源碼貼進記事本,然後取個文件名保存到上面提到的目錄,不過文件後綴必須輸入mq4,保存類型選擇“所以文件” 指標源碼中的常用符號說明
一、註釋符:單行註釋“//”、多行註釋“/* */” 程序不執行註釋,註釋內容僅供閱讀或保留不用的語句 在MQ語言編輯器中,註釋內容以灰色顯示 二、分號“;” 表示一個語句結束 三、逗號“,” 表示一個語句內部間隔,不結束語句。 四、等於號“=” 賦值語句,把等號後面的值賦給等號前的變量中 五、加號“+” 整數或小數,則表示值相加;字符串,則表示前後連接。 六、加加“++” 表示把符號前的變量值加1,例如:“i++;” 這實際上就是:“i=i+1;”的簡寫,表示i的值加1 七、加等於“+=” 表示把符號後的值加到符號前的變量中。例如“i+=2;”,實際上就是“i=i+2;”的簡寫,表示i的值加2 八、雙等號“==” 等於號。用於邏輯判斷,雙等號前後值相等,則返回邏輯值“真true”;雙等號前後值不相等,則返回邏輯值“假false” 九、嘆號等號“!=” 不等於號。用於邏輯判斷,不等號前後值不相等,則返回邏輯值“真true”;不等號前後值相等,則返回邏輯值“假false” 十、“&&” 邏輯符“並且” 十一、“||” 邏輯符“或者” 十二、大括號“{}” 表示函數體。 {}內部為函數體語句。 UID1 帖子2213 精華74 積分7306 威望1235 金錢6037 閱讀權限200 在線時間1438 小時 註冊時間2008-11-14 最後登錄2010-2-3 查看詳細資料 TOP
用戶IP: 來自:
一、自定義變量在使用前,必須先創建(定義),設定變量的類型和名稱。
創建時可同時賦值,也可以不賦值。名稱可以使用中文字符。 例: 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,允許用戶在程序外部修改參數值
用戶IP: 來自:
自定義函數
自定義函數與數學函數在本質上是一致的 例如:數學函數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後繼續執行主程序。
用戶IP: 來自:
自定義數組
一、數組是一系列同類型變量的集合,可以同時存儲多個數值。 例: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 這樣,我們在處理數列的時候,使用數組就能帶來極大的方便
用戶IP: 來自:
市場數據取值
一、預定義數組(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條指標線在最新位置的值
用戶IP: 來自:
判斷語句
一、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;
用戶IP: 來自:
循環
一幅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) 然後回到第二步繼續執行循環。 再補充一點:如果循環體中(大括號中)只有一行語句,大括號可以省略
用戶IP: 來自:
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()所做的初始化操作。
用戶IP: 來自:
畫一條指標線
要畫指標線,只要在程序中寫明以下幾點就可以了: 第一、明確指標線所在窗口,是主圖還是副圖 第二、要建立數組,用以保存指標線在各個位置的值。 第三、要建立指標線與數組的對應關系,哪個數組對應哪條指標線 第四、要明確指標線的線型,是曲線還是柱線或者是箭頭 第五、如果指標線是箭頭,還要說明是哪種箭頭 第六、給數組賦值 其中: 第一、二條寫在文件頭部中, 第三、四、五條寫在init()函數中(init函數僅在指標加載時運行一次) 第六條寫在start()函數中(start函數在數據發動變動時運行,變動一次運行一次) 下面以MACD為例說明 我們知道,MACD指標由二條曲線和一組紅綠柱線組成。(下圖一) 其中: 白線是二根均線的差; 紫線是白線的移動平均線; 紅綠柱線則是白線和紫線的差,白線上穿紫線,出現紅柱,下穿則出現綠柱。 我們從簡單入手,先去除紫線和紅綠柱線,僅保留其中的那根白線,來看白線是怎樣畫出來的。 下面是全部語句: #property indicator_separate_window #property indicator_color1 White #property indicator_level1 0 extern int FMA=12; extern int SMA=26; double buf[]; int init() { SetIndexBuffer(0,buf); SetIndexStyle(0,DRAW_LINE); return(0); } int start() { int limit=Bars-IndicatorCounted(); for(int i=0; i<limit; i++) { buf= iMA(NULL,0,FMA,0,1,0,i) -iMA(NULL,0,SMA,0,1,0,i); } return(0); } 說明如下: ============================================== ============================================== 以下為上述語句的簡要說明 #property indicator_separate_window 指標放在副圖 #property indicator_color1 White 第一條指標線為白色 #property indicator_level1 0 在副圖中零值位置上畫一條水平橫線, extern int FMA=12; extern int SMA=26; 設立二個整數型變量,默認值為12和26,允許外部修改值 double buf[]; 設立一個數組 int init() 初始化函數。該函數在指標加載時只運行一次。init是系統默認的函數名,但使用時仍需要進行創設,所以要加定義符int { SetIndexBuffer(0,buf); 設置數組buf為第一條指標線 SetIndexStyle(0,DRAW_LINE); 設置第一條指標線線型為連續曲線 return(0); 函數結束語句 } int start() 指標觸發函數。與init函數不同,該函數在有數據變化時被觸發,如果數據被不斷更新,則該函數將不斷執行。start也是系統默認的函數名,但使用時也仍然需要進行創設,所以也要加定義符int { int limit=Bars-IndicatorCounted(); 自定義一個變量limit,並賦值 Bars是圖表中的柱數 IndicatorCounted()緩存中的柱數,就是已經計算過的有值的柱數 這樣limit的值就是未經計算的柱數,這樣就可以起到優化程序的作用。 for(int i=0; i<limit; i++) 循環語句。 循環從i=0開始,每循環一次i值增加1,一直循環到i<limit不滿足時結束循環 由於循環變量i為一個新變量,所以要先定義,加上整型變量定義符int 下面大括中為循環體,此例中只一條語句 { buf= iMA(NULL,0,FMA,0,1,0,i) -iMA(NULL,0,SMA,0,1,0,i); } 給數組buf賦值,其值分別為相應位置上兩條均線的差 i是水平位置序號值,即燭柱從右到左的序號,右邊第一個燭柱序號為0 return(0); start函數結束 }
用戶IP: 來自:
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時,說明已經對下穿報過警了,就不能再次對下穿報警。 這樣就起到了消除重復報警的作用。
用戶IP: 來自:
MetaTrader 5相比MetaTrader 4功能更強大。
首先,MetaTrader 5終端可以使用的金融產品增多了,現在除了外匯、期貨 以外,它還可以應用於股票、期權等金融產品。 其次,MetaTrader 5在功能方面 也越來越強大了,新增的功能有: ■可以有21種時間段來分析行情 ■ 內置38種分析指標 ■ 內置39種圖像對象 ■ 4種縮放模式 ■ 17種顯示指標樣式 此外,歷史數據不會像mt4那麽大容量了,10年的m1數據才占10MB(我記得 mt4中要100多MB了。。。); 和MT5編程語言同步的MQL5編程語言,也比和MT4同步的MQL4編程語言有很大 不同,具體有: 這些是官方網站上列出的,不一定就是最終版的規格: 1、MQL5和C++的不同之處: 沒有類繼承; 沒有指針; 沒有運算符重載; 沒有’goto’運算符; 沒有三重表達式; 2、歷史測試可能是多線程的,可以同時測試多時間周期及多貨幣對同時交易 ; 另外提醒一點:MT5並不與MT4相兼容,換句話說就是: MQL4語言編寫的MT4 指標或者MT4 EA 都不能在MT5環境中運行。
用戶IP: 來自:
|




























