詞語解釋
MetaQuotes 4 語言是用來編寫自定義智能交易系統(tǒng)軟件,以便使交易程序管理自動(dòng)化以及執(zhí)行交易商自己的交易策略。MetaQuotes 4 語言易學(xué)、易用、易創(chuàng)建。MetaQuotes 4 語言包括相當(dāng)數(shù)量的變量,用來控制當(dāng)前和前期的報(bào)價(jià)、主要的算術(shù)和邏輯運(yùn)算和特征,主要的內(nèi)置指標(biāo)和用來開啟和控制頭寸的命令。在語法上,該語言和由TradeStation 技術(shù)有限公司開發(fā)的簡易語言相似,但是它有其自身的一些具體特征。
程序代碼是用MetaEditor4編輯器編寫的,它能夠用不同的色彩集中反映MQL 4語言的不同結(jié)構(gòu),因此,有助于用戶熟悉專家系統(tǒng)的文本。 注解開始于//符號(hào)(雙斜線)。注解也可以用“斜線-星號(hào)”-“星號(hào)-斜線”組合(/*[注解]*/, 就像在 "C"編程語言一樣)。
設(shè)定和控制操作戰(zhàn)略,交易商保存一份日志文件,存儲(chǔ)產(chǎn)生的信號(hào)信息、變量輸出和已執(zhí)行交易的結(jié)果。智能交易系統(tǒng)日志保存在MultiBank Trader目錄下/logs/YYYYMMDD.log 文件里。當(dāng)前的日志可以從下方的“終端”窗口(日志標(biāo)簽)直接進(jìn)入。
進(jìn)入MQL 4語言的目錄系統(tǒng),要么按目錄按鈕或從工具菜單打開MetaQuotes語言詞典窗口操作。這個(gè)短小的手冊(cè)包含分類、運(yùn)算、存儲(chǔ)詞語等功能,使得用戶對(duì)該語言所用到的每個(gè)元素都有所了解。
1. 主要語言結(jié)構(gòu)
像其他任何語言一樣,MQL4有一套構(gòu)成基本結(jié)構(gòu)的主要組成元素。這些組成元素以一種特殊的方式組合排列的,以便代表適當(dāng)?shù)年愂龊捅磉_(dá)。
語言的主要對(duì)象就是數(shù)據(jù),包括三種類型:數(shù)字、邏輯和排列。 所有的數(shù)值均采用雙格式,邏輯數(shù)據(jù)可能包括真值和假值。排列就是用省略號(hào)標(biāo)注的一系列字符。字符串也叫做文本串。數(shù)據(jù)可以包含在適當(dāng)類型的變量之中,或直接由程序的源文本表現(xiàn)出來。
一個(gè)MetaQuotes 語言陳述指一個(gè)完整的用法說明。陳述可以包括保留字、運(yùn)算符號(hào)、數(shù)據(jù)、變量、表達(dá)式或標(biāo)點(diǎn)符號(hào),而且總是以分號(hào)結(jié)尾。
保留字指具有特定或特別意義的預(yù)先設(shè)定的詞語。
運(yùn)算符號(hào)指在數(shù)據(jù)、變量和(或)表達(dá)式中特定的具體運(yùn)算符號(hào)。
變量是用來限制數(shù)字、排列或邏輯數(shù)據(jù)的。
表達(dá)式指保留字、變量、數(shù)據(jù)和運(yùn)算符號(hào)的組合,因?yàn)樗鼈兙哂姓Z言的3中類型(保留字、變量、數(shù)據(jù))中的任一價(jià)值。
標(biāo)點(diǎn)符號(hào)用來代表表達(dá)式,界定參數(shù),區(qū)分詞語或重新排列計(jì)算順序。
2. 標(biāo)點(diǎn)符號(hào)
字符
名稱
描述
;
分號(hào)
結(jié)束MetaQuotes 4語言指令
( )
圓括號(hào)
對(duì)表達(dá)式的值進(jìn)行分組,改變計(jì)算順序。 標(biāo)注函數(shù)參數(shù)并啟動(dòng)變量描述表達(dá)式 標(biāo)注變量的初始值并在變量描述區(qū)排列組合
,
逗號(hào)
提取函數(shù)值時(shí),對(duì)參數(shù)進(jìn)行區(qū)分 在變量描述區(qū)對(duì)變量進(jìn)行區(qū)分 在描述排列長度時(shí)對(duì)數(shù)字進(jìn)行區(qū)分 區(qū)分進(jìn)入排列元素的指標(biāo)
:
冒號(hào)
用在變量描述區(qū),啟動(dòng)變量列表
" "
引號(hào)
標(biāo)注一個(gè)文本(字)串。
[ ]
方括號(hào)
標(biāo)注數(shù)字,確定排列長度 標(biāo)注進(jìn)入某個(gè)特殊排列元素的數(shù)字(指數(shù)) 標(biāo)注進(jìn)入歷史數(shù)據(jù)的期間數(shù)字
{ }
波形括號(hào)
充當(dāng)運(yùn)算括號(hào)?梢杂脕泶 begin...end。將指令系列隔離成塊。
/* */
注解括號(hào)
標(biāo)注注解
//
雙斜線
明確說明單串注解的開始
3. 運(yùn)算符號(hào)
運(yùn)算符號(hào)分成5 組:分配符號(hào)、字串符號(hào)、數(shù)學(xué)運(yùn)算符號(hào)、相關(guān)符號(hào)和邏輯符號(hào)。
3.1. 分配符號(hào)
分配符號(hào)'='(等號(hào))是用來將具體數(shù)值(數(shù)字、排列或邏輯,視變量類型而定)分配到變量中。分配值可以是表達(dá)式的結(jié)果。比如: 變量: Counter(0); ... Counter = Counter + 1;結(jié)果,反向變量取值為1。變量值也可以分配來對(duì)元素進(jìn)行排列。
3.2. 字串符號(hào)
操作文本串,只有一個(gè)運(yùn)算符可以用上: '+' (加號(hào))。 它是用來連接兩個(gè)字串的。比如:
變量: 字串(" "); ... 字串 = "some_" + "text"; 結(jié)果,字串變量包含“some_text”這樣的文本串,允許將字串與數(shù)字和邏輯值結(jié)合起來。在后面的這個(gè)例子里,數(shù)字及或邏輯值在結(jié)合前,應(yīng)轉(zhuǎn)化為字串類型。比如: String = "string" + 1; 因此,字串變量將包含"string1"的文本串。 操作數(shù)不僅可以是數(shù)值,也可以是相應(yīng)的含有這樣數(shù)值類型的變量,以及表達(dá)式,經(jīng)執(zhí)行后,便產(chǎn)生這樣的數(shù)值。
3.3. 數(shù)學(xué)符號(hào)
4種主要的數(shù)學(xué)運(yùn)算:加法- '+' (加號(hào))、減法-'-' (減號(hào))、乘法-'*' (星號(hào))、除法-'/' (斜線),都用在計(jì)算數(shù)值的數(shù)學(xué)表達(dá)式里。
數(shù)學(xué)表達(dá)式的例子:( Ask + Bid ) / 2 , High[1] + 20 * Point
3.4. 相關(guān)符號(hào)
相關(guān)符號(hào)用來對(duì)同種類型的兩個(gè)數(shù)值進(jìn)行比較。 第一個(gè)數(shù)值和第二個(gè)數(shù)值進(jìn)行比較,產(chǎn)生邏輯值“真值”或“假值”, “小于”-&#39;<&#39; (左小于號(hào)), “大于”-&#39;>&#39; (右小于號(hào));“等于”-&#39;=&#39; (等號(hào));“不等于”-&#39;<>&#39;; “小于或等于”-&#39;<=&#39;; “大于或等于”-&#39;>=&#39;。由相關(guān)表達(dá)式而取得的邏輯值用在MetaQuotes II語言的控制結(jié)構(gòu)里。比如:
if FreeMargin < 1000 then exit; 這個(gè)字串按詞典順序進(jìn)行比較,即,"aaa" 字串被認(rèn)為小于字串 "zzz"。當(dāng)邏輯值進(jìn)行比較時(shí),我們應(yīng)該牢記:“True”的邏輯值的數(shù)值為1,而“False”的邏輯值的數(shù)值為“0”。
3.5. 邏輯符號(hào)
邏輯符號(hào)使用戶能夠?qū)⑦壿嬛到Y(jié)合起來。邏輯OR - &#39;|&#39; (垂直線或豎杠);邏輯AND-&#39;&&#39; (“和”符號(hào))。邏輯符號(hào)有相應(yīng)的保留字OR, AND, NOT。 比如: If FreeMargin > 100 and FreeMargin < 1000 then print( "Free margin is ", FreeMargin );注意:當(dāng)OR 和 AND運(yùn)算符號(hào)是雙值時(shí),即它們有兩個(gè)值進(jìn)行運(yùn)算,NOT運(yùn)算符號(hào)是單值,即它之適用于單值。比如: Variable: Condition1( True ); ... Condition1 = FreeMargin >= 1000; If not Condition1 then exit; 下面是邏輯運(yùn)算符號(hào)的結(jié)果表:
Value1 Value2 Value1 OR Value2
True True True
True False True
False True True
False False False
Value1 Value2 Value1 AND Value2
True True True
True False False
False True False
False False False
Value1 NOT Value1
True False
False True
4.固定字
MetaQuotes 4 語言使用下面的幾組固定字。
1. 邏輯符號(hào)。
AND, NOT, OR.
2. MQL 4語言指令。
Array, Begin, Break, Continue, Define, Downto, Else, End, Exit, For, If, Input, Then, To, Variable, While。
界定語言指令結(jié)構(gòu)的固定字也叫做關(guān)鍵字。
3. 內(nèi)置函數(shù)。
Abs, AccName, AccountName, Alert, Ceil, CloseOrder, Comment, Cos, CurTime, Day, DayOfWeek, DeleteOrder, Exp, Floor, Highest, Hour, iADX, iATR, iBANDS, iCCI, iMA, iMACD, iMFI, iMOM, iRSI, iSAR, iSTO, iWPR, IsDemo, IsIndirect, LastTradeTime, Log, Lowest, Minute, Mod, ModifyOrder, Month, MoveObject, NumberToStr, Ord, OrderValue, Period, Pow, Print, PrintTrade, Rand, Round, ServerAddress, SetArrow, SetObjectText, SetOrder, SetText, Sin, Sqrt, Srand, Symbol, Tan, TimeToStr, Year.
4. 預(yù)先設(shè)定用戶變量(用戶定義變量)。
Lots, StopLoss, TakeProfit, TrailingStop.
5. 預(yù)先設(shè)定交易終端變量。
AccNum, AccountNumber, Ask, Balance, Bars, Bid, Close, Credit, Equity, FreeMargin, High, Low, Margin, Open, Point, PriceAsk, PriceBid, PriceHigh, PriceLow, PriceTime, Time, TotalProfit, TotalTrades, Volume.
6. 預(yù)先設(shè)定內(nèi)置函數(shù)參數(shù)(宏命令)。
MODE_CLOSE, MODE_EMA, MODE_HIGH, MODE_LOW, MODE_MAIN, MODE_MINUSDI, MODE_OPEN, MODE_PLUSDI, MODE_SIGNAL, MODE_SMA, MODE_STOPLOSS, MODE_TAKEPROFIT, MODE_VOLUME, MODE_WMA, OBJ_HLINE, OBJ_SYMBOL, OBJ_TEXT, OBJ_TRENDLINE, OBJ_VLINE, OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP, SYMBOL_ARROWDOWN, SYMBOL_ARROWUP, SYMBOL_CHECKSIGN, SYMBOL_STOPSIGN, SYMBOL_THUMBSDOWN, SYMBOL_THUMBSUP, VAL_CLOSEPRICE, VAL_CLOSETIME, VAL_COMISSION, VAL_COMMENT, VAL_LOTS, VAL_OPENPRICE, VAL_OPENTIME, VAL_PROFIT, VAL_STOPLOSS, VAL_SWAP, VAL_SYMBOL, VAL_TAKEPROFIT, VAL_TICKET, VAL_TYPE.
實(shí)際上,上述固定字為宏記錄器,即語法分析程序用數(shù)值取而代之。宏記錄器的引入簡化了編寫用戶功能要求的程序:更加方便、無關(guān)聯(lián)的重要詞語可以用來替代一些函數(shù)參數(shù)值。同樣可以用于色彩名稱。
7. 色彩。
AliceBlue, AntiqueWhite, Aqua, Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chartreuse, Chocolate, Coral, CornflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue, DarkCyan, DarkGoldenrod, DarkGray, DarkGreen, DarkKhaki, DarkMagenta, DarkOliveGreen, DarkOrange, DarkOrchid, DarkRed, DarkSalmon, DarkSeaGreen, DarkSlateBlue, DarkSlateGray, DarkTurquoise, DarkViolet, DeepPink, DeepSkyBlue, DimGray, DodgerBlue, FireBrick, FloralWhite, ForestGreen, Fuchsia, Gainsboro, GhostWhite, Gold, Goldenrod, Gray, Green, GreenYellow, Honeydew, HotPink, IndianRed, Indigo, Ivory, Khaki, Lavender, LavenderBlush, LawnGreen, LemonChiffon, LightBlue, LightCoral, LightCyan, LightGoldenrod, LightGreen, LightGrey, LightPink, LightSalmon, LightSeaGreen, LightSkyBlue, LightSlateGray, LightSteelBlue, LightYellow, Lime, LimeGreen, Linen, Magenta, Maroon, MediumAquamarine, MediumBlue, MediumOrchid, MediumPurple, MediumSeaGreen, MediumSlateBlue, MediumSpringGreen, MediumTurquoise, MediumVioletRed, MidnightBlue, MintCream, MistyRose, Moccasin, NavajoWhite, Navy, OldLace, Olive, OliveDrab, Orange, OrangeRed, Orchid, PaleGoldenrod, PaleGreen, PaleTurquoise, PaleVioletRed, PapayaWhip, PeachPuff, Peru, Pink, Plum, PowderBlue, Purple, Red, RosyBrown, RoyalBlue, SaddleBrown, Salmon, SandyBrown, SeaGreen, Seashell, Sienna, Silver, SkyBlue, SlateBlue, SlateGray, Snow, SpringGreen, SteelBlue, Tan, Teal, Thistle, Tomato, Turquoise, Violet, Wheat, White, WhiteSmoke, Yellow, YellowGreen.
所有的固定字均是非敏感字號(hào),即它們可以小寫也可以大寫。
4.1. 智能交易系統(tǒng)向?qū)?BR> 智能交易系統(tǒng)向?qū)崾綧QL 4允許編寫智能交易系統(tǒng)、自編指標(biāo)、自編腳本和從模板中進(jìn)行編輯
預(yù)先設(shè)定參數(shù)或變量的名稱,將會(huì)自動(dòng)在文本編輯欄中出現(xiàn)參數(shù)框架:
4.2. MetaQuotes 4 語言的指令結(jié)構(gòu)
4.2.1. 變量宣告和語句
在計(jì)算過程中保存臨時(shí)數(shù)據(jù)要求使用變量。變量在本程序的開頭部分就用保留字、變量、排列和定義進(jìn)行了敘述。他允許使用這些詞語的負(fù)數(shù)形式,即 “ Variables, Arrays and Defines”。 這些詞中間總有一個(gè)開始變量的宣告敘述。這些詞語的差別如下: "variable" 語句簡單變量,"array"語句排列, "define" 語句附加用戶定義的變量,類似于預(yù)先界定的用戶變量,均可以通過設(shè)置對(duì)話框進(jìn)行修改,即從外部修改。然而,又不像預(yù)先界定的變量,用戶變量可以在程序內(nèi)部的計(jì)算過程中進(jìn)行更改。 變量宣告語法: 變量:名稱(初期值);這里名稱就是變量的名字;“初期值”就是變量的起初值。初期值對(duì)變量的類型-數(shù)字、字串或邏輯值進(jìn)行界定。 一個(gè)數(shù)字變量宣告的例子: Variable : Counter( 0 ); 一個(gè)字串變量宣告的例子: Variable : String1( "任意字串" ); 一個(gè)邏輯變量宣告的例子: Variable : MyCondition( false ); 數(shù)組聲明語法: Array : ArrayName[Array length]( 初始值 );其中,數(shù)組長度有一個(gè)或若干(多達(dá)4)個(gè)數(shù)字-數(shù)字 - number[, number [, number [, number]]]. 在MetaQuotes 4語言里, 數(shù)組可能是1-,2-,3-,4-個(gè)元素長度,一般情況下,數(shù)組就是一組可以用同一個(gè)名稱查找到的、并按照相繼成行定位數(shù)組且給定了數(shù)組元素的序列號(hào)(數(shù))的變量。數(shù)組方便于對(duì)同樣類型的數(shù)據(jù)排序。數(shù)組的一個(gè)典型例子就是交易終端的歷史數(shù)據(jù),比如,收盤、開盤、高點(diǎn)位、低點(diǎn)位、交易量。這些數(shù)據(jù)作為單一元素?cái)?shù)組的。比如, Close[ 5 ] 指后退5個(gè)交易期間的收盤值。兩個(gè)元素的數(shù)組可能是一個(gè)簡單表格,其中第一個(gè)分量為行而第二個(gè)分量則為列。 Array: MyTable[ 10, 5 ]( 0 ); // 一個(gè)10行5列的表格。 ... print( MyTable[ 2, 4 ] ); // 打印第二行的第4個(gè)元素 數(shù)組可能包括任何類型的數(shù)值-數(shù)字、字串或邏輯值,但是應(yīng)該為同一類型,其中的初期值在數(shù)組被宣告時(shí)為特定的。 附加用戶定義變量宣告語法: 定義:名稱(初期數(shù));其中名稱為變量名稱;初期數(shù)為變量起初的數(shù)字值。 應(yīng)該注意,附加用戶定義變量可能只為數(shù)字類型。如上所述,用戶定義變量可以在程序的計(jì)算過程中進(jìn)行修改。這些修改只能運(yùn)用到智能交易系統(tǒng)的當(dāng)前時(shí)段,直到特殊的智能交易系統(tǒng)從圖表中刪除或客戶終端的操作結(jié)束。當(dāng)新的智能交易系統(tǒng)時(shí)段啟動(dòng)時(shí),用戶定義變量值將重新初始化。
4.2.2. 退出語句
退出報(bào)告中斷智能系統(tǒng)軟件的操作。也就是所謂的預(yù)先設(shè)定的程序終止。
4.2.3. IF-THEN條件語句
If-Then條件語句使得控制智能交易系統(tǒng)指令的執(zhí)行順序得以可能。該語句可能有不同的方式編寫: if Condition then Statement;or if Condition then begin Statement; Statement; ... end;其中,條件為一個(gè)邏輯表達(dá)式,取值為True 或 False; "Statement" 指MetaQuotes II語言中的任何指令。符號(hào)括號(hào)Begin – End可能被波形括號(hào){ }所替代。 條件語句可能被用在對(duì)程序進(jìn)行分支。為達(dá)到此目的,另一個(gè)關(guān)鍵字Else要用上。語法: if Condition then Statement1 else Statement2;or if Condition then begin Statement; Statement; ... end else Statement; Statement; ... end;or if Condition then begin Statement; Statement; ... end else Statement2;or if Condition then Statement1 else Statement; Statement; ... end;可以使用嵌套式的條件語句。一般說來,語句可能由MetaQuotes II語言的任何合法指令表示,除非變量宣告,因?yàn)閲?yán)格來說, 變量宣告并不是一個(gè)可執(zhí)行語句。
4.2.4. WHILE循環(huán)
WHILE循環(huán)確保在循環(huán)條件有效時(shí),包含在循環(huán)主體中的語句的多次執(zhí)行。一個(gè)循環(huán)可以用Break 語句提前終止。迭代可以通過使用Continue語句停止。這個(gè)語句造成循環(huán)的下一個(gè)迭代開始,即Continue后面的語句直到循環(huán)主體結(jié)束在本迭代中不得執(zhí)行。在條件語句中用Break 和 Continue是合理的。語法: while Condition begin Statement; [break;][continue;] ... end;其中,條件是循環(huán)執(zhí)行條件-在每個(gè)循環(huán)迭代之前計(jì)算出的一個(gè)邏輯表達(dá)式,取值為True 或 False; 語句是MetaQuotes 4語言的任何指令。 符號(hào)括號(hào)Begin – End表示循環(huán)主體,可以被波形括號(hào){ }替代。 “Break and Continue”描述也不是強(qiáng)制性的。 Example: Counter = 1; while Counter <= Bars begin print( Close[ Counter - 1 ] ); Counter = Counter + 1; end;這個(gè)例子說明一個(gè)將要執(zhí)行的循環(huán),基準(zhǔn)次數(shù),或者,如果基準(zhǔn)=0,而且循環(huán)就不止一次。
4.2.5. For 循環(huán)
For循環(huán)確保在循環(huán)主體中所包含的具體次數(shù)的語句執(zhí)行。語法: for NumberVariable = InitialValue to|downto LimitValue begin Statement; [break;][continue;] ... end; 其中數(shù)字變量就是在每次迭代之后循環(huán)要么增加或者減少到1的循環(huán)變量 (視使用關(guān)鍵字To 或 Down to而定); 初期值指循環(huán)變量的起初數(shù)值。 語句指MetaQuotes 4 語言的任何指令。 To or Downto 確定循環(huán)變量增加到1(To)或者減少到1(Downto); 限值是循環(huán)變量的邊際數(shù)值。 操作符brackets Begin – End表示循環(huán)主體,可以被波形括號(hào){}取而代之。 Break 和Continue語句并非是強(qiáng)制性的。 Example: 比如: for Counter = 1 to 10 begin if Counter > Bars then break; print( Close[ Counter ] ); end; 這個(gè)例子說明一個(gè)可能被執(zhí)行10次的環(huán)。但是,若基準(zhǔn)值小于10, 循環(huán)就會(huì)提前終止,也就是說循環(huán)執(zhí)行BARS次。
4.2.6. BREAK中斷語句
中斷語句確保一個(gè)For 循環(huán)或一個(gè)While循環(huán)早點(diǎn)終止。前例不僅說明循環(huán)執(zhí)行,也說明了中斷語句的使用!癇reak”語句不僅用于循環(huán)主體之外。循環(huán)是嵌套式的,中斷語句中離其最近的循環(huán)。換言之,中斷內(nèi)部循環(huán)的語句并沒中斷外部循環(huán)。
4.2.7. CONTINUE繼續(xù)語句
CONTINUE繼續(xù)語句提前終止循環(huán)的迭代,并從循環(huán)主體開始下一個(gè)迭代。換句話說,在Continue之后語句被忽略。比如: for Counter = 1 to 10 begin ... if Counter > Bars then continue; print( Close[ Counter ] ); ... end;這個(gè)例子說明一個(gè)將被執(zhí)行了差不多10次的循環(huán)。但收盤值(counter)被打印不會(huì)比基準(zhǔn)次數(shù)多。"..."代表MetaQuotes 4 語言的其他語句。
4.3.交易中斷的預(yù)選界定變量
為了最大的方便用戶,交易中斷的一些變量可以從智能系統(tǒng)輸入。
AccountNumber-賬號(hào)(同義詞:AccNum) Ask –賣價(jià)(買方出價(jià)) Balance – 交易賬戶的余額值 Bars – 圖表上條形的數(shù)目-說明用數(shù)據(jù)填充圖表程度的非常重要的一個(gè)變量。 Bid -買入價(jià)(賣方要價(jià)) Close –收盤價(jià)格 Credit –信用優(yōu)先 Equity –賬戶狀況,包括未實(shí)現(xiàn)利潤 FreeMargin –交易賬戶的自由保證金值-也用來核查賬戶資金的可用性; High –期間最高價(jià)位 Low -期間最低價(jià)位 Margin –用來支撐開倉部位的資金(保證金) Open –開盤價(jià) Point – 當(dāng)前金融工具單點(diǎn)上的價(jià)值(此點(diǎn)此時(shí)智能交易系統(tǒng)系統(tǒng)運(yùn)行),比如, USD/JPY - 0.01, USD/CHF - 0.0001 等。 PriceAsk –在市場觀測窗口上顯示的當(dāng)前賣價(jià)。 PriceBid -在市場觀測窗口上顯示的當(dāng)前買價(jià)。 PriceHigh – 當(dāng)前24小時(shí)期間的最高買價(jià)。 PriceLow -當(dāng)前24小時(shí)期間的最高賣價(jià)。 PriceTime -在市場觀測窗口上顯示的當(dāng)前時(shí)間。 Time – 價(jià)格圖表上的條形時(shí)間的基準(zhǔn)時(shí)間; TotalProfit – 所有開倉部位的總未實(shí)現(xiàn)利潤; TotalTrades –開倉部位的總數(shù)和交易中斷上的延遲訂單; Volume – 交易量(期間交易的數(shù)目) 應(yīng)注意到,Close, Open, High, Low, Volume, Time為歷史數(shù)據(jù)數(shù)組(seriesarrays),在上個(gè)交易期間允許進(jìn)入這些數(shù)據(jù)。
4.4. 內(nèi)置函數(shù)
MetaQuotes 4語言提供許多功能,可用于多種多樣的場合。這些包括技術(shù)指標(biāo)、交易功能、時(shí)間功能、數(shù)學(xué)和三角函數(shù)功能、數(shù)據(jù)轉(zhuǎn)換和輸出函數(shù),等。 Abs –返回這個(gè)數(shù)值的絕對(duì)值(模塊) 語法:Abs函數(shù) (n個(gè)表達(dá)式) 參數(shù): 數(shù)值 AccountName – 返回包含用戶名的文本串 (同義詞:AccName ) Alert –產(chǎn)生包含用戶定義數(shù)據(jù)的對(duì)話屏 語法: Alert(...) 參數(shù)的任何非零數(shù)都可能。 Ceil – 返回代表最小接近整數(shù)的一個(gè)數(shù)字,它等于或大于特定的數(shù)值。 語法:Ceil( n個(gè)表達(dá)式 )
參數(shù):數(shù)值 CloseOrder –收盤頭寸(部位) 語法:收盤頭寸(訂單、單位、價(jià)格、滑動(dòng)量、色彩) Parameters: 參數(shù): order -開倉部位的訂單數(shù) lots – 單位數(shù) price –優(yōu)先收盤價(jià) slippage –最大價(jià)格滑動(dòng)值 color – 圖表上交叉點(diǎn)的色彩 Comment –在圖表的左上角產(chǎn)生的用戶定義數(shù)據(jù) 語法: Comment(...)
參數(shù)的任何非零數(shù)都可能。 Cos –計(jì)算和返回?cái)?shù)值的余弦值,代表用弧度表示的角度。 語法: Cos( n分表達(dá)式 ) 參數(shù):數(shù)值 CurTime –返回從1970年元月1日起所經(jīng)過的秒數(shù)。 Day – 返回當(dāng)月當(dāng)前日序列號(hào) DayOfWeek –返回當(dāng)周當(dāng)前日序列號(hào)。1 – 星期日, 2 – 星期一, ... , 7 – 星期六 DeleteOrder –刪除前期提交的延遲訂單 語法:DeleteOrder( 訂單 ) 參數(shù): 訂單-延遲部位的訂單數(shù) Exp – 返回代表特定數(shù)值指數(shù)的一個(gè)數(shù)目 語法: Exp( n個(gè)表達(dá)式) 參數(shù):數(shù)值 Floor –返回代表最大接近整數(shù)的一個(gè)數(shù)字,它等于或小于特定的數(shù)值。 語法: Floor( n個(gè)表達(dá)式) 參數(shù):數(shù)值
Highest – 返回期間特定數(shù)間的 Open, Low, High, Close or Volume (取決于“類型”參數(shù))的最大值。 語法: Highest( 類型、beginbar、期間 ) Parameters: 參數(shù): Type 類型 – 一個(gè)返回變量,可能去下列數(shù)值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUMEbeginbar –表示條形的轉(zhuǎn)換,與當(dāng)前條形有關(guān),并從中取值。 periods期間 – 計(jì)算執(zhí)行依據(jù)的期間數(shù)
Hour –返回在24小時(shí)期間內(nèi)當(dāng)前小時(shí)的序列數(shù)。 iADX -平均指導(dǎo)動(dòng)作目錄
語法:iADX( 期間、模式、轉(zhuǎn)換) 參數(shù): period – 計(jì)算的期間數(shù); mode – 數(shù)據(jù)類型,可以取下列數(shù)值:MODE_MAIN(主要指標(biāo))、MODE_PLUSDI(line +DI), MODE_MINUSDI(line -DI). shift – 與當(dāng)前條形有關(guān)的轉(zhuǎn)換 (后退期間數(shù)),為數(shù)據(jù)待取值的依據(jù)。 iATR - 平均間距的指標(biāo) 語法:iATR( 期間、轉(zhuǎn)換) 參數(shù): period – 計(jì)算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
平均移動(dòng)收斂/發(fā)散指標(biāo)(iBANDS –– 布林帶指數(shù) 語法: iBANDS(期間,誤差,模式,轉(zhuǎn)換) 參數(shù): period – 計(jì)算的期間數(shù); deviation -誤差; mode – 可以取下列值: MODE_MAIN(主線、滑移)、 MODE_LOW(下邊線), MODE_HIGH(上邊線). shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
iCCI – 交易通道指標(biāo) 語法: iCCI(期間、轉(zhuǎn)換) 參數(shù): period – 計(jì)算的期間數(shù)
shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
iMA – 移動(dòng)平均指標(biāo) 語法: iMA( 期間、模式、轉(zhuǎn)換) 參數(shù): period – 計(jì)算的期間數(shù)
mode – 計(jì)算模式,可以取下列值: MODE_SMA, MODE_EMA, MODE_WMA. shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iMACD -平均移動(dòng)收斂/發(fā)散指標(biāo)
語法: iMACD( fast_ema_period, slow_ema_period, signal_period, mode, shift ) 參數(shù): fast_ema_period -計(jì)算&#39;快&#39; 平均移動(dòng)期間(通常12); slow_ema_period - number of periods for calculation of the &#39;slow&#39; moving average (usually 26); signal_period計(jì)算&#39;慢&#39; 平均移動(dòng)期間(通常12); mode 數(shù)據(jù)源,可以取下列值:MODE_MAIN (主要指標(biāo))、MODE_SIGNAL (信號(hào)列); shift -與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iMFI – 現(xiàn)金流量指標(biāo) 語法: iMFI( 期間、轉(zhuǎn)換) 參數(shù): period – 計(jì)算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
iMOM – 動(dòng)量指標(biāo) 語法:iMOM( 期間、轉(zhuǎn)換) 參數(shù): period – 計(jì)算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
iRSI – 相對(duì)強(qiáng)弱指標(biāo) 語法:iRSI(期間、轉(zhuǎn)換) 參數(shù): 期間 – 計(jì)算期間數(shù);
iSAR -拋物線
語法: iSAR(步驟,最大值,轉(zhuǎn)換)
參數(shù):
步驟-增量,通常是0.02;
最大值 – 最大值, 通常是0.02; iSTO - "隨機(jī)振蕩"指標(biāo)
語法: iSTO( %K期間、 %D期間、 慢、方法、模式、轉(zhuǎn)換) 參數(shù): %Kperiod - %K線期間; %Dperiod - %D線期間; slowing – 慢值; method – 計(jì)算方法,取下列值: MODE_SMA (簡單平均)、MODE_EMA (指數(shù)值)、 MODE_WMA (權(quán)重值); mode – 數(shù)據(jù)源,可以取下列值: MODE_MAIN (主指標(biāo)線), MODE_SIGNAL (信號(hào)指標(biāo)線); shift -與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
iWPR -威廉氏百分?jǐn)?shù)范圍指標(biāo) 語法:iWPR( 期間、轉(zhuǎn)換) 參數(shù): 期間 – 計(jì)算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。
IsDemo – 如果智能交易系統(tǒng)系統(tǒng)在試用帳戶運(yùn)行,返回邏輯值,否則會(huì)返回錯(cuò)誤值. IsIndirect –如果使用反向方式對(duì)特定工具進(jìn)行計(jì)算,會(huì)返回正確的邏輯值,否則會(huì)返回錯(cuò)誤值。
LastTradeTime –返回代表最近交易執(zhí)行時(shí)間的一個(gè)數(shù)字(SetOrder, DelOrder, CloseOrder, ModifyOrder),計(jì)算從1970年元月1日0點(diǎn)經(jīng)過的秒鐘數(shù)。
Log (-特定正數(shù)值的對(duì)數(shù)
語法:日志( n個(gè)表達(dá)式)
參數(shù): 正數(shù)值 Lowest - 特定期間返回開倉,低,高,收盤或交易量最小值(依據(jù)"類型"參數(shù)而定) ...returns 語法:最低點(diǎn)(類型、beginbar、 期間) 參數(shù): type – 可以取下列值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUME
beginbar –表示條形的轉(zhuǎn)換,與當(dāng)前條形有關(guān),并從中取值。 periods期間 – 計(jì)算執(zhí)行依據(jù)的期間數(shù)
Minute –返回當(dāng)前小時(shí)的分鐘序列數(shù)。 Mod -返回代表著一個(gè)接著一個(gè)的數(shù)值的整數(shù) 語法:Mod( n個(gè)表達(dá)式1, n個(gè)表達(dá)式2)
參數(shù): 數(shù)值1、數(shù)值2 ModifyOrder –前期開倉部位或延遲訂單修改的特征 語法:ModifyOrder( 訂單、價(jià)格、止損、獲利、色彩) 參數(shù): order – 開倉或延遲部位的數(shù)目或訂單; price – 新的價(jià)格 (僅適用于延遲部位!); stoploss – 新的止損水平線; takeprofit – 新的獲利水平線; color – 圖表上象形圖 的色彩
Month –返回當(dāng)前月的續(xù)列號(hào) MoveObject –移動(dòng)或建立命名對(duì)象 語法:MoveObject( 名稱、類型、時(shí)間、價(jià)格、 時(shí)間2、時(shí)間2) 參數(shù): name – 文本串形式的名稱; type – 對(duì)象類型,可以取下列值:OBJ_HLINE (水平線)、 OBJ_VLINE (垂直線), OBJ_TRENDLINE (趨勢線)、 OBJ_SYMBOL (設(shè)定象形圖)、 OBJ_TEXT (文本串); time – 參照?qǐng)D表第一時(shí)間; price -參照?qǐng)D表第一價(jià)格; time2 -參照?qǐng)D表第二時(shí)間; price2 -參照?qǐng)D表第二時(shí)間 NumberToStr – 返回特定數(shù)值轉(zhuǎn)換成特定準(zhǔn)確格式的文本串。通過在十進(jìn)位點(diǎn)數(shù)之后的其他4個(gè)數(shù)產(chǎn)生的數(shù)值的函數(shù)。 語法: NumberToStr(數(shù)字、準(zhǔn)確性) 參數(shù): number – 特定數(shù)值; precision – 準(zhǔn)確格式、十進(jìn)位點(diǎn)數(shù)的數(shù)字
OrderValue – 返回訂單特定價(jià)值的之一 語法:OrderValue(部位、模式) 參數(shù): position – 交易終端列表的訂單頭寸部位,從1開始; mode – 返回?cái)?shù)據(jù)類型,可以取下列值:VAL_TICKET (訂單數(shù)), VAL_OPENTIME (定定開倉時(shí)間), VAL_TYPE (訂單類型), VAL_LOTS (要求單位數(shù)目), VAL_SYMBOL (工具名稱,以文本串的形式), VAL_OPENPRICE (開盤價(jià)), VAL_STOPLOSS (止損水平線), VAL_TAKEPROFIT (獲利水平線), VAL_CLOSEPRICE (收盤價(jià)), VAL_COMISSION (委托交易量), VAL_SWAP (部位展期的展期費(fèi)用數(shù)額), VAL_PROFIT (交易利潤數(shù)), VAL_COMMENT (以文本串形式對(duì)特殊部位的注解), VAL_CLOSETIME (訂單收盤時(shí)間)。
Ord –和OrderValue完全相同。 Period –返回界定的已用期間分鐘數(shù) Pow – 返回由nBaseExpression數(shù)值提高到nExponentExpression 倍數(shù)而產(chǎn)生的數(shù)值,參見參數(shù)。 語法:Pow( nBaseExpression, nExponentExpression ) 參數(shù):數(shù)值1、數(shù)值2。 Print – 打印由用戶在系統(tǒng)日志里界定的數(shù)據(jù)。
語法: Print(...)
參數(shù)的任何非零數(shù)均可能。 PrintTrade – 存儲(chǔ)日志中特殊部位的細(xì)節(jié) 語法: PrintTrade( 部位 ) 參數(shù):部位 – 在交易終端里已開倉部位數(shù)字 Rand –返回一個(gè)產(chǎn)生的偽隨機(jī)數(shù)字。在使用此函數(shù)之前,偽隨機(jī)數(shù)字發(fā)生器應(yīng)用Srand函數(shù)調(diào)整到初始狀態(tài)。 如果偽隨機(jī)數(shù)字發(fā)生器不用,就在啟動(dòng)程序時(shí)一次調(diào)整到初始狀態(tài)。 Round – 返回代表最接近整數(shù)的特定數(shù)值 語法: Round( n個(gè)表達(dá)式) 參數(shù): 一個(gè)數(shù)值 ServerAddress –以文本串的形式返回服務(wù)器IP地址 SetArrow –設(shè)定圖表繪圖標(biāo)志 語法: SetArrow( 時(shí)間、價(jià)格、標(biāo)志和色彩) 參數(shù): time -參照?qǐng)D表第一時(shí)間; price -參照?qǐng)D表第一價(jià)格; symbol -從Wingdings字體設(shè)定標(biāo)志 的數(shù)值; color -圖表顏色
SetObjectText -指定文本串到特定的對(duì)象 語法: SetObjectText(稱,文本,字體, 尺寸,顏色) 參數(shù): name – 對(duì)象名稱; text – 特定文本; font – 字體命; size – 字體大小; color – 文本色彩. SetOrder –用于開倉或設(shè)定延遲訂單的主函數(shù)。 語法:SetOrder( 操作、單位、價(jià)格、滑動(dòng)、止損、獲利、色彩) 參數(shù): operation – 操作類型,可以取下列值:OP_BUY (開始購買部位), OP_SELL (開始出售部位), OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP (提交延遲訂單); lots – 單位數(shù); price – 交易優(yōu)先收盤價(jià); slippage - OP_BUY 和OP_SELL操作的最大價(jià)格滑動(dòng); stoploss – 止損水平線; takeprofit – 獲利水平線; color – 當(dāng)提取函數(shù)時(shí),圖表上箭頭的色彩 SetText –把圖表種的文本創(chuàng)放到特定的位置 語法:SetText( 時(shí)間、價(jià)格、字符串、色彩 ) 參數(shù): time -參照?qǐng)D表第一時(shí)間; price -參照?qǐng)D表第一價(jià)格; string – 文本串; color – 文本色彩
Sin -計(jì)算并返回代表弧度角度的數(shù)值 語法:Sin( n個(gè)表達(dá)式) 參數(shù): 數(shù)值 Sqrt -計(jì)算和返回特定正數(shù)值的平方根 語法: Sqrt( n個(gè)表達(dá)式 ) 參數(shù): 正數(shù)值 Srand – 設(shè)定偽隨機(jī)數(shù)字發(fā)生器到初始狀態(tài)。如果使用發(fā)生器,將其在啟動(dòng)程序時(shí)一次性設(shè)置到初始狀態(tài)。 初始設(shè)置所用的最佳值就是時(shí)間函數(shù)回歸的數(shù)字-在此情況下,產(chǎn)生順序的隨機(jī)性就增大。 語法:Srand( 時(shí)間) 參數(shù): 正數(shù)值 Symbol –返回智能交易系統(tǒng)運(yùn)行的金融工具名稱的文本串。
Tan -計(jì)算并返回代表角度弧度的正切數(shù)值。
語法: Tan( n個(gè)表達(dá)式) 參數(shù): 數(shù)值
TimeToStr – 返回帶有"yyyy.mm.dd hh:mi" 類型的文本串,由代表經(jīng)過1970元月1日起的秒鐘數(shù)的特定數(shù)值。
語法: TimeToStr( 時(shí)間) 參數(shù): 正數(shù)值 Year – 返回當(dāng)年數(shù)。
逐步創(chuàng)建簡單顧問軟件
我們現(xiàn)在就創(chuàng)建智能交易系統(tǒng),并在運(yùn)行標(biāo)準(zhǔn)的平滑異同移動(dòng)平均線指標(biāo),該系統(tǒng)具有較強(qiáng)的獲利能力,支持追蹤止損和最大的保障安全操作。 下面所給的例子,交易通過對(duì)單一的部位進(jìn)行開倉和控制。
交易原則:
多頭進(jìn)場– MACD指標(biāo)在零點(diǎn)之下, 向上走,或由下行信號(hào)線穿過。
空頭進(jìn)場– MACD指標(biāo)在零點(diǎn)以上, 向下走,或由上行信號(hào)線穿過。
多頭出場-通過執(zhí)行獲利限額,移動(dòng)止損或當(dāng)MACD指標(biāo)穿過信號(hào)線(MACD指標(biāo)在零點(diǎn)以上, 向下走,或由上行信號(hào)線穿過)
&#8226; 空頭出場-通過執(zhí)行獲利限額,移動(dòng)止損或當(dāng)MACD指標(biāo)穿過信號(hào)線(MACD指標(biāo)在零點(diǎn)以下, 向上走,或由下行信號(hào)線穿過)
重要提示: 為了排除MACD指針于我們的分析出現(xiàn)的微不足道的變化(圖表上的“小山丘”),我們引入另外一種控制繪圖中的“小山丘的大小”的方法如下: 指針大小應(yīng)至少為最低價(jià)格的5個(gè)單位(5*Point,表示USD/CHF = 0.0005和USD/JPY = 0.05)。
步驟 I : 編寫智能交易系統(tǒng)描述
將鼠標(biāo)指針點(diǎn)到導(dǎo)航窗口的智能交易系統(tǒng)區(qū),按鼠標(biāo)右鍵,在出現(xiàn)的菜單里選中“創(chuàng)建”指令。智能交易系統(tǒng)的啟動(dòng)向?qū)б竽氵M(jìn)入某些數(shù)據(jù)。在出現(xiàn)的窗口,我們寫入智能交易系統(tǒng)名稱(Name)-MACD 樣本,作者(Author)-指示你的名字,連接(Link)-連接到網(wǎng)站,在注解(Notes)里寫入-以MACD為基礎(chǔ)的智能交易系統(tǒng)測試樣本。
第二步: 創(chuàng)建程序的主結(jié)構(gòu)
智能交易系統(tǒng)代碼只有幾頁,即便是這幾頁代碼也挺難掌握,特別是考慮這個(gè)事實(shí):我們不是專業(yè)的程序開發(fā)商,另外,我們根本不需要專業(yè)性的描述,對(duì)嗎? 為了對(duì)標(biāo)準(zhǔn)智能交易系統(tǒng)的結(jié)構(gòu)有些了解,我們現(xiàn)在就看看下面的這個(gè)描述吧:
1. 原始數(shù)據(jù)檢查
&#8226; 檢查圖表、圖表上的條形數(shù)
&#8226; 核查外部變量值:單位、Lots, S/L, T/P, T/S。
2. 設(shè)定快速數(shù)據(jù)存取內(nèi)部變量;
3. 檢查交易終端-是否可用?若是的話,那么:
&#8226; 檢查賬戶資金的可用性,等。
&#8226; 是否可能來做多頭買賣(買單)?
&#8226; 開倉(買)并離開
&#8226; 是否能做空倉(賣出)?
&#8226; 空倉(賣)并離開
退出智能交易系統(tǒng)
4. 控制循環(huán)周期中前期的開倉部位
&#8226; 如果是做多頭
&#8226; 是否應(yīng)出倉?
&#8226; 是否應(yīng)該設(shè)置追蹤止損單?
&#8226; 如果是做多頭
&#8226; 是否應(yīng)該出倉?
&#8226; 是否應(yīng)該設(shè)置追蹤止損單?
結(jié)果相當(dāng)簡單,只有4個(gè)主區(qū)塊。 現(xiàn)在,請(qǐng)跟隨著每個(gè)結(jié)構(gòu)的步驟來創(chuàng)建代碼:
1. 原始數(shù)據(jù)的檢索 這條代碼通常從智能交易系統(tǒng)移到另一個(gè)稍微更改的另一個(gè)代碼-實(shí)際上為檢索的標(biāo)準(zhǔn)區(qū)塊:
若Bars<200,就離開;//圖表不足200bars-退出。
若獲利<10,則退出;//錯(cuò)誤獲利參數(shù)
2. 為了加快數(shù)據(jù)存取,設(shè)置內(nèi)部變量 在程序代碼中,很有必要存取指標(biāo)值或處理計(jì)算值。為了簡化代碼和加速存儲(chǔ),初始狀態(tài)下,數(shù)據(jù)嵌套在內(nèi)部變量里。
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
現(xiàn)在,不用晦澀難懂的iMACD(12,26,9,MODE_MAIN,0) 符號(hào),我們?cè)诔绦蛑杏煤唵蔚膶懭胱址?MacdCurrent程序文本取而代之。所有的智能交易系統(tǒng)中的變量都依據(jù)MQL II語言進(jìn)行基本的解釋。所以,我們?cè)诔绦虻拈_頭加入這段說明。
var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0);
var: MaCurrent(0), MaPrevious(0);
MQL 4語言還另外推出了另外一個(gè)用戶自定義變量概念,它可以在程序外設(shè)定,而不會(huì)對(duì)任何系統(tǒng)程序下的源程序文本造成干擾。這個(gè)特點(diǎn)使程序更具靈活性。 MATrendPeriod變量就是這種類型的一個(gè)用戶自定義變量,所以,我們?cè)诔绦虻拈_頭加入這段說明。
defines: MATrendPeriod(56);
3. 檢查交易終端-是否可用? 若是,那么:
在智能交易系統(tǒng)里,我們只能使用當(dāng)前頭寸而不能操作延遲的訂單。然而,為了安全起見,我們介紹如何利用交易終端建檢查前期提交的訂單。
If TotalTrades<1 then // no opened orders identified
{
檢查: 賬戶的可用資金等。在分析市場狀況之前,最好先檢查一下你的賬戶的資金情況, 以確保賬戶中有充足的開倉頭寸的資金。
如果凈保證金<1000,那么退出;//無資金-退出。
可否做多頭(買入)? 多頭買入的條件:MACD指標(biāo)在0軸以下,為向上趨勢且與向下趨勢的信號(hào)線相交。這和我們?cè)贛QL II語言中所描述的一樣(注意:我們可以按照原已保存在變量中的這個(gè)指標(biāo)值進(jìn)行操作。)
If MacdCurrent<0 and MacdCurrent>SignalCurrent and
MacdPrevious
MaCurrent>MaPrevious then // &#39;bull&#39; 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
};
前面我們提到了一種監(jiān)控圖表中所要顯示“小丘”的大小的一種方法。MACDOpenLevel 變量是一個(gè)用戶定義變量,可以在不影響程序文本的情況下,進(jìn)行更改,以確保更多的靈活性。在程序的開始部分,我們加入一段這個(gè)變量的描述(以及下面所用到的變量描述)。
defines: MACDOpenLevel(3), MACDCloseLevel(2);
是否可以做空頭(賣出)?空頭賣出的條件:MACD指標(biāo)在0軸以上,為向下趨勢且與向上趨勢的信號(hào)線相交。符號(hào)表示如下:
If MacdCurrent>0 and MacdCurrent
MaCurrent
Exit; // exiting
};
Exit; // no new positions opened - just exit
};
4. 控制循環(huán)周期中前期已開倉的頭寸
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指針與信號(hào)線相交,MACD指針在0軸以上,為向下趨勢且與向上趨勢的信號(hào)線相交。
If MacdCurrent>0 and MacdCurrent
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit; // exit
};
是否應(yīng)該需要重新設(shè)定移動(dòng)止損點(diǎn)?僅在持倉并已超過移動(dòng)止損點(diǎn)數(shù)點(diǎn)并獲利的情況下,而且新的移動(dòng)止損點(diǎn)比前期的要更有理一些,我們才重新設(shè)置移動(dòng)止損點(diǎn)。
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
{
是否應(yīng)該平倉?出現(xiàn)空頭的條件: MACD指針與信號(hào)線相交,MACD指針在0軸以下,為向上趨勢且與向下趨勢的信號(hào)線相交。
If MacdCurrent<0 and MacdCurrent>SignalCurrent and
MacdPrevious(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
Exit; // exit
};
是否應(yīng)該重新設(shè)定移動(dòng)止損點(diǎn)?僅在持倉并已超過移動(dòng)止損點(diǎn)數(shù)點(diǎn)并獲利的情況下,而且新的移動(dòng)止損點(diǎn)比前期的要更有理一些,我們才重新設(shè)置移動(dòng)止損點(diǎn)。
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. 結(jié)束所有的花括號(hào),但仍然有效。
};
};
};
所以,按照步驟,循序漸進(jìn)地學(xué)習(xí),我們已經(jīng)學(xué)會(huì)了編寫智能交易系統(tǒng)。
第三步:將所有程序代碼集合起來
我們將前面章節(jié)的所有的代碼集合起來:
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);
// 原始數(shù)據(jù)檢查
//確保智能交易系統(tǒng)在正常圖表上運(yùn)行,這很重要。
// 用戶正確設(shè)置外部變量 (單位數(shù), 止損,
// 獲利、移動(dòng)止損)
// 在我們看來,我們只需檢查獲利就行了
若Bars<200或獲利<10,那么就退出;//圖表上少于200 bars
//簡化和加速操作程序,我們需要作必要的保存
//臨時(shí)變量中的指標(biāo)數(shù)據(jù)
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);
//現(xiàn)在我們必須檢查交易終端的狀況
// 我們要看一看是否還有任何前期開倉部位或訂單。
如果總交易<1, 那么
{//沒有已開倉訂單
// 為了安全期間,我們要確保賬戶有充足的資金。.
//比如說,取值為“1000”,通?赡芫褪翘峤1個(gè)單位
如果凈保證金<1000,那么退出;//沒有資金-我們退出
//檢查做多頭(買入)的可能性
If MacdCurrent<0 and MacdCurrent>SignalCurrent and
MacdPrevious(MACDOpenLevel*Point) and
MaCurrent>MaPrevious then
{
SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // 執(zhí)行
Exit; // 既然交易已經(jīng)執(zhí)行,退出
// 有10秒鐘的交易暫停時(shí)間
};
//檢查空頭(賣出)的可能性
If MacdCurrent>0 and MacdCurrent
MaCurrent
Exit; // exiting
};
//這里我們完成了對(duì)新的開倉部位可行性檢查
//沒有新的開倉部位,我們就用退出命令退出程序
//沒有要分析的任何東西
Exit;
};
//我們進(jìn)入到智能交易系統(tǒng)的重要部分-控制開倉部位
// 正確進(jìn)入市場很重要,但是退出市場更重要。
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 // 多頭開倉
{
// 我們檢查-可能,尚有時(shí)間平倉嗎?
If MacdCurrent>0 and MacdCurrent
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
Exit; // 退出
};
// 我們檢查-可能,我可能已經(jīng)或該是設(shè)置移動(dòng)止損的時(shí)候了嗎?
If TrailingStop>0 then //用戶已經(jīng)將移動(dòng)止損進(jìn)行了設(shè)置
{ // 所以,我們開始著手檢查
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 // 否則,就是多頭。
{
// 我們檢查-可能,尚有時(shí)間平倉嗎?
If MacdCurrent<0 and MacdCurrent>SignalCurrent and
MacdPrevious(MACDCloseLevel*Point) then
{
CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
Exit; // 退出
};
//我們檢查-可能,我可能已經(jīng)或該是設(shè)置移動(dòng)止損的時(shí)候了嗎?
If TrailingStop>0 then // 用戶已經(jīng)把移動(dòng)止損進(jìn)行了設(shè)置
{ // 所以,我開始著手檢查。
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;
};
};
};
};
};
};
// 結(jié)束 。
要完成對(duì)智能交易系統(tǒng)的設(shè)置,我只需要對(duì)外部變量進(jìn)行設(shè)定,Lots = 1, Stop Loss (S/L) = 0 (未使用), Take Profit (T/P) = 120 (適用于一個(gè)小時(shí)的間隔),Trailing Stop (T/S) = 30。當(dāng)然,你還可以設(shè)置自己的數(shù)值。 按Compile按鈕,如果沒有錯(cuò)誤信息,就按SAVE按鈕保存智能交易系統(tǒng)(順便說,你還可以將上述程序的灰色背景打印文本保存到MetaEditor)。
現(xiàn)在,我們來編輯智能交易系統(tǒng), 在MQL編輯器點(diǎn)擊頂端的Compile圖示(像一張有檢查標(biāo)記的紙)。
步驟 IV: 測試智能交易系統(tǒng)的歷史數(shù)據(jù)
我們已經(jīng)編寫了智能交易系統(tǒng),我們通過對(duì)測試歷史數(shù)據(jù),現(xiàn)在急于要對(duì)其進(jìn)行評(píng)估。 我們就以15分鐘間隔的EUR/USD為例,大約為4000基準(zhǔn)值。
打開智能交易系統(tǒng)測試器:
在軟件下部會(huì)出現(xiàn)智能交易系統(tǒng)測試器:
在智能交易系統(tǒng)測試器中選擇EUR/USD,M15,設(shè)置測試歷史數(shù)據(jù)的起始日期和結(jié)束日期,開始測試
測試完成后,可查看測試記錄、凈值圖,在報(bào)告欄中可查看統(tǒng)計(jì)報(bào)表,并可將完整的包括凈值圖、交易記錄、分析報(bào)表完整地保存下來。
智能交易系統(tǒng)不僅提供建議和信號(hào),而且允許交易賬戶上進(jìn)行自動(dòng)交易,用附加到圖表指令(通過在導(dǎo)航窗口用鼠標(biāo)指針選中MACD樣本,按鼠標(biāo)右鍵選中出現(xiàn)的菜單命令)將MACD 樣本智能交易系統(tǒng)附加到圖表中,然后點(diǎn)擊“啟用智能交易系統(tǒng)”按鈕。
或點(diǎn)擊該智能交易系統(tǒng),在對(duì)話框中選擇“允許實(shí)時(shí)自動(dòng)交易”并點(diǎn)確定。智能交易系統(tǒng)就會(huì)工作了
智能交易系統(tǒng)所有代碼在 Ready Expert Advisors頁都可找到
當(dāng)你對(duì)智能交易系統(tǒng)做出編寫時(shí),必須謹(jǐn)記:
編寫和測試交易平臺(tái)的智能交易系統(tǒng)具有許多細(xì)節(jié)特征:
在開倉之前,必須檢查你賬戶上可用保證金的有效性。假如可用保證金不足時(shí),則開倉部位交易將失敗。必須注意的是,為了達(dá)到測試的目的,可用保證金最少應(yīng)在1000,因?yàn)橐粋(gè)單位的測試價(jià)格為1000。
If FreeMargin < 1000 Then Exit; //如果保證金< 1000,那么退出,無資金-退出。
在開倉、平倉或者修改已有部位或刪除延遲訂單(一經(jīng)執(zhí)行以下任何的操作:SetOrder, CloseOrder, ModifyOrder or DeleteOrder)之后,建議使用Exit語句完成智能交易系統(tǒng)的這部分的操作,這將有10秒鐘的限定時(shí)間間隔來執(zhí)行該項(xiàng)操作。還應(yīng)注意,10秒鐘的限定時(shí)間不適用于測試模式(你可以連續(xù)做幾次交易)。另外,假如不是用Exit語句來完成智能交易系統(tǒng)的上述交易操作,智能交易系統(tǒng)的測試結(jié)果將和真實(shí)交易不同。
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 執(zhí)行
Exit; //退出
為了防止在測試模式中用少于10秒的間隔來執(zhí)行幾項(xiàng)交易,你只需確保從上一次交易到下一次的交易已經(jīng)超過10秒。
//確保當(dāng)前的時(shí)值離上次交易的執(zhí)行大于10秒。
If CurTime > LastTradeTime + 10 Then Begin
SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 執(zhí)行
Exit;
End;
歷史數(shù)據(jù)可以用已引索的預(yù)設(shè)變量OPEN、 CLOSE、 HIGH、 LOW、 VOLUME來存取。在這種情況下,指數(shù)是指必須回頭計(jì)算的期間數(shù)。
// 如果上個(gè)BAR柱狀線的收縮小于倒數(shù)第二個(gè)BAR柱狀線的收縮少
If Close[1] < Close[2] Then Exit;
交易平臺(tái)中的智能交易系統(tǒng)支持4種模式:
OHLC 點(diǎn)(Open/High/Low/Close)模式。 因?yàn)橄到y(tǒng)在此的測試目的僅限于開盤價(jià)、收盤價(jià)、最高價(jià)、最低價(jià),所以這個(gè)測試系統(tǒng)是最快的。 但是, 這個(gè)測試結(jié)果與智能交易系統(tǒng)執(zhí)行的實(shí)際交易的結(jié)果可能會(huì)不同。
每3點(diǎn)一次模式:在測試智能交易系統(tǒng)時(shí),每增加三點(diǎn)就會(huì)模擬產(chǎn)生一個(gè)燭臺(tái)圖示。
每2點(diǎn)一次模式: 在測試智能交易系統(tǒng)時(shí),每增加二點(diǎn)就會(huì)模擬產(chǎn)生一個(gè)燭臺(tái)圖示。
每1點(diǎn)一次模式:在測試智能交易系統(tǒng)時(shí),每增加一點(diǎn)就會(huì)模擬產(chǎn)生一個(gè)燭臺(tái)圖,這種模式是最慢的但是測試結(jié)果是最接近智能交易系統(tǒng)的實(shí)際交易的結(jié)果的。(交易中間每間隔10秒鐘,觀察結(jié)果)
在編寫和檢驗(yàn)智能交易系統(tǒng)過程中,以及在對(duì)任何其他程序測試過程中,有時(shí), 需要輸出一些額外的調(diào)試信息。MQL II語言還提供這類信息輸出的若干可能性。
將ALERT函數(shù)以及包含用戶自定義的數(shù)據(jù)發(fā)送到屏幕對(duì)話框。 Alert("Free margin is ", FreeMargin);
COMMENT函數(shù)將由用戶定義的數(shù)據(jù)放置在圖表的左上角。“
” 字符用于結(jié)束一行。 Comment("Free margin is ", FreeMargin, "
Equity is ", Equity);
Print 函數(shù)是將由用戶定義的數(shù)據(jù)輸至系統(tǒng)日志。 Print("Total trades are ", TotalTrades, "; Equity is ", Equity, "; Credit is ", Credit);
PrintTrade函數(shù)是將指定的未平倉合約的具體細(xì)節(jié)輸出到系統(tǒng)日志中。 PrintTrade(1);
當(dāng) 智能交易系統(tǒng) 已測試完畢,測試結(jié)果會(huì)以擴(kuò)展名為.log的文件形式儲(chǔ)藏在你安裝該交易平臺(tái)所在的日志的子目錄中。如果你經(jīng)常性地測試你的智能交易系統(tǒng),別忘了定期刪除log檔,因?yàn)樗鼈兛赡芾塾?jì)達(dá)到數(shù)兆字節(jié)。
掃碼付費(fèi)即可復(fù)制
X