點擊:... 回復:45 主題:MT4:強大的編程功能 默認

發表於: [2010-02-03 11:57:50] 樓主:安騰 [查看資料] [發送紙條] [博客] [微博]

等級:...  積分:...

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,保存類型選擇“所以文件”
用戶IP: 來自: 置頂 精華 推薦 標記 轉移 轉帖 鎖定 刪除 調整A值:

1樓:安騰 發表於:[2010-02-03 11:58:38]

[查看資料] [發送紙條] [博客] [微博]

指標源碼中的常用符號說明
一、註釋符:單行註釋“//”、多行註釋“/* */”
程序不執行註釋,註釋內容僅供閱讀或保留不用的語句
在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: 來自:

2樓:安騰 發表於:[2010-02-03 11:59:26]

[查看資料] [發送紙條] [博客] [微博]

一、自定義變量在使用前,必須先創建(定義),設定變量的類型和名稱。
創建時可同時賦值,也可以不賦值。名稱可以使用中文字符。
例:
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: 來自:

3樓:豆霸封神 發表於:[2010-02-03 11:59:36]

[查看資料] [發送紙條] [博客] [微博]

吃飽了撐的
用戶IP: 來自:

4樓:上海外匯股票期貨地產 發表於:[2010-02-03 11:59:58]

[查看資料] [發送紙條] [博客] [微博]

我用的外匯MT4平臺的FXDD,有8年了,還好
用戶IP: 來自:

5樓:安騰 發表於:[2010-02-03 12:00:01]

[查看資料] [發送紙條] [博客] [微博]

自定義函數
自定義函數與數學函數在本質上是一致的
例如:數學函數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: 來自:

6樓:安騰 發表於:[2010-02-03 12:00:56]

[查看資料] [發送紙條] [博客] [微博]

自定義數組
一、數組是一系列同類型變量的集合,可以同時存儲多個數值。
例: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: 來自:

7樓:安騰 發表於:[2010-02-03 12:01:40]

[查看資料] [發送紙條] [博客] [微博]

市場數據取值
一、預定義數組(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: 來自:

8樓:安騰 發表於:[2010-02-03 12:02:17]

[查看資料] [發送紙條] [博客] [微博]

判斷語句
一、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: 來自:

9樓:安騰 發表於:[2010-02-03 12:04:01]

[查看資料] [發送紙條] [博客] [微博]

循環
一幅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: 來自:

10樓:安騰 發表於:[2010-02-03 12:05:08]

[查看資料] [發送紙條] [博客] [微博]

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: 來自:

11樓:安騰 發表於:[2010-02-03 12:08:07]

[查看資料] [發送紙條] [博客] [微博]

畫一條指標線
要畫指標線,只要在程序中寫明以下幾點就可以了:
第一、明確指標線所在窗口,是主圖還是副圖
第二、要建立數組,用以保存指標線在各個位置的值。
第三、要建立指標線與數組的對應關系,哪個數組對應哪條指標線
第四、要明確指標線的線型,是曲線還是柱線或者是箭頭
第五、如果指標線是箭頭,還要說明是哪種箭頭
第六、給數組賦值
其中:
第一、二條寫在文件頭部中,
第三、四、五條寫在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: 來自:

12樓:火蜂 發表於:[2010-02-03 12:09:43]

[查看資料] [發送紙條] [博客] [微博]

安騰開始做外匯了?

用戶IP: 來自:

13樓:安騰 發表於:[2010-02-03 12:10:03]

[查看資料] [發送紙條] [博客] [微博]

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: 來自:

14樓:安騰 發表於:[2010-02-03 12:52:25]

[查看資料] [發送紙條] [博客] [微博]

功能顯然比文化強大,文華什麽時候改進?
用戶IP: 來自:

15樓:傳號 發表於:[2010-02-03 12:54:51]

[查看資料] [發送紙條] [博客] [微博]

安騰,精力真是足啊,
用戶IP: 來自:

16樓:隔岸觀火1 發表於:[2010-02-03 12:55:47]

[查看資料] [發送紙條] [博客] [微博]

安騰 大嬸現在人氣大不如前啊,幫你頂一下吧。
用戶IP: 來自:

17樓:傳號 發表於:[2010-02-03 12:56:37]

[查看資料] [發送紙條] [博客] [微博]

安騰,在尋找夢幻一般的指標信號。
用戶IP: 來自:

18樓:zhx163 發表於:[2010-02-03 12:57:05]

[查看資料] [發送紙條] [博客] [微博]

開課了??文華的編程就是垃圾
用戶IP: 來自:

19樓:zhx163 發表於:[2010-02-03 13:02:47]

[查看資料] [發送紙條] [博客] [微博]

去學學交易開拓者吧,至少國內期貨可以用!功能媲美mt4
用戶IP: 來自:

20樓:期貨一小兵 發表於:[2010-02-03 13:15:13]

[查看資料] [發送紙條] [博客] [微博]

安騰,研究下操作方法吧,費那麽大的精力編它幹麽
用戶IP: 來自:

21樓:安騰 發表於:[2010-02-03 15:32:26]

[查看資料] [發送紙條] [博客] [微博]

剛看了下開拓者,感覺不錯。

Vars
NumericSeries MyVal1(0); //定義數值型序列變量MyVal1,默認值為0;
Numeric MyVal2(0); //定義數值型變量MyVal2,默認值為0;
Bool MyVal3(False); //定義布爾型變量MyVal3,默認值為False;
String MyVal4("Test"); //定義字符串變量MyVal4,默認值為Test。
剛看到這裏,第一和二個類型的區別沒搞清楚。。。
用戶IP: 來自:

22樓:風之自由 發表於:[2010-02-03 16:30:31]

[查看資料] [發送紙條] [博客] [微博]

交易開拓者有免費帳戶嗎?請教了。
用戶IP: 來自:

23樓:blue_whale 發表於:[2010-02-03 17:14:29]

[查看資料] [發送紙條] [博客] [微博]

美女的貼,看到就頂
用戶IP: 來自:

24樓:安騰 發表於:[2010-02-03 17:17:05]

[查看資料] [發送紙條] [博客] [微博]

不知道我也沒用過交易開拓者。
用戶IP: 來自:

25樓:劉堅 發表於:[2010-02-03 17:21:46]

[查看資料] [發送紙條] [博客] [微博]

MT4能看國內行情嗎?能免費使用嗎?
用戶IP: 來自:

26樓:安騰 發表於:[2010-02-03 17:30:15]

[查看資料] [發送紙條] [博客] [微博]

不知道mt4能否看國內期貨的,好像交易開拓者可以?
用戶IP: 來自:

27樓:劉堅 發表於:[2010-02-03 17:32:04]

[查看資料] [發送紙條] [博客] [微博]

交易開拓者是否具有MT4的編程功能?交易開拓者行情速度跟文華、博易相比如何?
用戶IP: 來自:

28樓:安騰 發表於:[2010-02-03 17:40:36]

[查看資料] [發送紙條] [博客] [微博]

mt4好像不行,交易開拓者也許可以。
用戶IP: 來自:

29樓:安騰 發表於:[2010-02-03 18:51:47]

[查看資料] [發送紙條] [博客] [微博]

交易開拓者當然也有編程功能,可能比mt4稍簡單些。
用戶IP: 來自:

30樓:劉堅 發表於:[2010-02-03 18:55:45]

[查看資料] [發送紙條] [博客] [微博]

關鍵還是行情的速度和穩定性。飛狐軟件編程功能就已經很強了,但行情數據有點問題,就連試用都免了。
用戶IP: 來自:

31樓:安騰 發表於:[2010-02-03 19:01:57]

[查看資料] [發送紙條] [博客] [微博]

mt4的均線定義就很強大,本身就具有跨周期功能,顯然不僅可引用大周期也可引用小周期,也可引用其它商品的,不像文華那樣一個程序裏只可引一次也不能反復引用。
用戶IP: 來自:

32樓:安騰 發表於:[2010-02-03 19:06:59]

[查看資料] [發送紙條] [博客] [微博]

引用劉堅的大作:
關鍵還是行情的速度和穩定性。飛狐軟件編程功能就已經很強了,但行情數據有點問題,就連試用都免了。
可能用戶少,就沒資金投入。主要是服務器,用的人多了自然會投入了就好了。
用戶IP: 來自:

33樓:babaishang 發表於:[2010-02-03 19:09:06]

[查看資料] [發送紙條] [博客] [微博]

安騰,不要沈浸在那些指標裏。那是歧途。
用戶IP: 來自:

34樓:劉堅 發表於:[2010-02-03 19:11:07]

[查看資料] [發送紙條] [博客] [微博]

股票數據那麽多,股民也那麽多,沒聽說哪家的服務器慢的。

期貨數據少,期民也少,卻找不到一家象樣的服務器。
用戶IP: 來自:

35樓:大墨無痕 發表於:[2010-02-03 20:08:17]

[查看資料] [發送紙條] [博客] [微博]

哈哈 終於開編程課了。樓主學過營銷吧,
用戶IP: 來自:

36樓:omg21 發表於:[2010-02-03 20:25:14]

[查看資料] [發送紙條] [博客] [微博]

好象MT4的服務器現在都不能用了。提示“舊版本”
用戶IP: 來自:

37樓:安騰 發表於:[2010-02-03 23:22:32]

[查看資料] [發送紙條] [博客] [微博]

不是吧?每個外匯平臺都有mt4,不可能都打不開的,要不升級到mt5了,都可以下載免費註冊賬號的。
用戶IP: 來自:

38樓:安騰 發表於:[2010-02-03 23:31:35]

[查看資料] [發送紙條] [博客] [微博]

引用劉堅的大作:
股票數據那麽多,股民也那麽多,沒聽說哪家的服務器慢的。
期貨數據少,期民也少,卻找不到一家象樣的服務器。
用戶IP: 來自:

39樓:橘子洲尾 發表於:[2010-02-04 00:03:49]

[查看資料] [發送紙條] [博客] [微博]

開始向外匯進軍了啊?外匯基本都是MT4平臺,對很多人來說,界面不夠友好
用開拓者(TB)的話,理論上基本可以把你的思路表達出來,不過用於實盤的話還是有不少問題,主要是網絡不夠穩定,滑點,還有就是TB比較消耗電腦資源,cpu占用率很高,等等,而且對編程有較高的要求,否則即使編出程序,也會因為執行效率低下導致電腦反應遲鈍
用戶IP: 來自:

40樓:安騰 發表於:[2010-02-04 07:53:48]

[查看資料] [發送紙條] [博客] [微博]

引用橘子洲尾的大作:
開始向外匯進軍了啊?外匯基本都是MT4平臺,對很多人來說,界面不夠友好
用開拓者(TB)的話,理論上基本可以把你的思路表達出來,不過用於實盤的話還是有不少問題,主要是網絡不夠穩定,滑點,還有就是TB比較消耗電腦資源,cpu占用率很高,等等,而且對編程有較高的要求,否則即使編出程序,也會因為執行效率低下導致電腦反應遲鈍

MT4界面很好上手的!上手後你就會覺得比文華啊博易啊友好多了!開拓者我不知道,可能算法不理想吧所以占資源。
用戶IP: 來自:

41樓:安騰 發表於:[2010-02-04 07:59:04]

[查看資料] [發送紙條] [博客] [微博]

MT4現在已經發展到MT5了,據說功能更強大了,尤其是歷史數據儲存方式更科學了,除了外匯還有期貨和期權了,不知什麽時候會有國內期貨。很快期貨行情數據就會像股票行情一樣無需賬號也可任意登陸。
用戶IP: 來自:

42樓:安騰 發表於:[2010-02-04 08:05:11]

[查看資料] [發送紙條] [博客] [微博]

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: 來自:

43樓:安騰 發表於:[2010-02-04 08:07:48]

[查看資料] [發送紙條] [博客] [微博]

1、直接支持鍵盤消息的處理。這意味著mt5的ea和指標可以實現更多更復雜

的功能了,
2、直接Timer機制,這說明不用像mt4那樣等待tick到來start才能執行一次

了,可以精確的在某個時間執行某些動作。
用戶IP: 來自:

44樓:安騰 發表於:[2010-02-04 08:10:04]

[查看資料] [發送紙條] [博客] [微博]

http://www.mt5.net.cn/
第一MT5編程站
用戶IP: 來自:

45樓:安騰 發表於:[2010-02-04 08:12:04]

[查看資料] [發送紙條] [博客] [微博]

國外有消息稱Alpari俄羅斯將是首個引入MetaTrader5平臺的經紀商。
用戶IP: 來自:

快速回復

未登錄用戶請在此登錄:   新用戶註冊

 
表情:新版 | 老版