百科解釋
MetaQuotes 4 語言是用來編寫自定義智能交易系統(tǒng)軟件,以便使交易程序管理自動化以及執(zhí)行交易商自己的交易策略。MetaQuotes 4 語言易學(xué)、易用、易創(chuàng)建。MetaQuotes 4 語言包括相當(dāng)數(shù)量的變量,用來控制當(dāng)前和前期的報價、主要的算術(shù)和邏輯運(yùn)算和特征,主要的內(nèi)置指標(biāo)和用來開啟和控制頭寸的命令。在語法上,該語言和由TradeStation 技術(shù)有限公司開發(fā)的簡易語言相似,但是它有其自身的一些具體特征。 程序代碼是用MetaEditor4編輯器編寫的,它能夠用不同的色彩集中反映MQL 4語言的不同結(jié)構(gòu),因此,有助于用戶熟悉專家系統(tǒng)的文本。 注解開始于//符號(雙斜線)。注解也可以用“斜線-星號”-“星號-斜線”組合(/*[注解]*/, 就像在 "C"編程語言一樣)。 設(shè)定和控制操作戰(zhàn)略,交易商保存一份日志文件,存儲產(chǎn)生的信號信息、變量輸出和已執(zhí)行交易的結(jié)果。智能交易系統(tǒng)日志保存在MultiBank Trader目錄下/logs/YYYYMMDD.log 文件里。當(dāng)前的日志可以從下方的“終端”窗口(日志標(biāo)簽)直接進(jìn)入。 進(jìn)入MQL 4語言的目錄系統(tǒng),要么按目錄按鈕或從工具菜單打開MetaQuotes語言詞典窗口操作。這個短小的手冊包含分類、運(yùn)算、存儲詞語等功能,使得用戶對該語言所用到的每個元素都有所了解。 1. 主要語言結(jié)構(gòu) 像其他任何語言一樣,MQL4有一套構(gòu)成基本結(jié)構(gòu)的主要組成元素。這些組成元素以一種特殊的方式組合排列的,以便代表適當(dāng)?shù)年愂龊捅磉_(dá)。 語言的主要對象就是數(shù)據(jù),包括三種類型:數(shù)字、邏輯和排列。 所有的數(shù)值均采用雙格式,邏輯數(shù)據(jù)可能包括真值和假值。排列就是用省略號標(biāo)注的一系列字符。字符串也叫做文本串。數(shù)據(jù)可以包含在適當(dāng)類型的變量之中,或直接由程序的源文本表現(xiàn)出來。 一個MetaQuotes 語言陳述指一個完整的用法說明。陳述可以包括保留字、運(yùn)算符號、數(shù)據(jù)、變量、表達(dá)式或標(biāo)點符號,而且總是以分號結(jié)尾。 保留字指具有特定或特別意義的預(yù)先設(shè)定的詞語。 運(yùn)算符號指在數(shù)據(jù)、變量和(或)表達(dá)式中特定的具體運(yùn)算符號。 變量是用來限制數(shù)字、排列或邏輯數(shù)據(jù)的。 表達(dá)式指保留字、變量、數(shù)據(jù)和運(yùn)算符號的組合,因為它們具有語言的3中類型(保留字、變量、數(shù)據(jù))中的任一價值。 標(biāo)點符號用來代表表達(dá)式,界定參數(shù),區(qū)分詞語或重新排列計算順序。 2. 標(biāo)點符號 字符 名稱 描述 ; 分號 結(jié)束MetaQuotes 4語言指令 ( ) 圓括號 對表達(dá)式的值進(jìn)行分組,改變計算順序。 標(biāo)注函數(shù)參數(shù)并啟動變量描述表達(dá)式 標(biāo)注變量的初始值并在變量描述區(qū)排列組合 , 逗號 提取函數(shù)值時,對參數(shù)進(jìn)行區(qū)分 在變量描述區(qū)對變量進(jìn)行區(qū)分 在描述排列長度時對數(shù)字進(jìn)行區(qū)分 區(qū)分進(jìn)入排列元素的指標(biāo) : 冒號 用在變量描述區(qū),啟動變量列表 " " 引號 標(biāo)注一個文本(字)串。 [ ] 方括號 標(biāo)注數(shù)字,確定排列長度 標(biāo)注進(jìn)入某個特殊排列元素的數(shù)字(指數(shù)) 標(biāo)注進(jìn)入歷史數(shù)據(jù)的期間數(shù)字 { } 波形括號 充當(dāng)運(yùn)算括號?梢杂脕泶 begin...end。將指令系列隔離成塊。 /* */ 注解括號 標(biāo)注注解 // 雙斜線 明確說明單串注解的開始 3. 運(yùn)算符號 運(yùn)算符號分成5 組:分配符號、字串符號、數(shù)學(xué)運(yùn)算符號、相關(guān)符號和邏輯符號。 3.1. 分配符號 分配符號&#39;=&#39;(等號)是用來將具體數(shù)值(數(shù)字、排列或邏輯,視變量類型而定)分配到變量中。分配值可以是表達(dá)式的結(jié)果。比如: 變量: Counter(0); ... Counter = Counter + 1;結(jié)果,反向變量取值為1。變量值也可以分配來對元素進(jìn)行排列。 3.2. 字串符號 操作文本串,只有一個運(yùn)算符可以用上: &#39;+&#39; (加號)。 它是用來連接兩個字串的。比如: 變量: 字串(" "); ... 字串 = "some_" + "text"; 結(jié)果,字串變量包含“some_text”這樣的文本串,允許將字串與數(shù)字和邏輯值結(jié)合起來。在后面的這個例子里,數(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é)符號 4種主要的數(shù)學(xué)運(yùn)算:加法- &#39;+&#39; (加號)、減法-&#39;-&#39; (減號)、乘法-&#39;*&#39; (星號)、除法-&#39;/&#39; (斜線),都用在計算數(shù)值的數(shù)學(xué)表達(dá)式里。 數(shù)學(xué)表達(dá)式的例子:( Ask + Bid ) / 2 , High[1] + 20 * Point 3.4. 相關(guān)符號 相關(guān)符號用來對同種類型的兩個數(shù)值進(jìn)行比較。 第一個數(shù)值和第二個數(shù)值進(jìn)行比較,產(chǎn)生邏輯值“真值”或“假值”, “小于”-&#39;<&#39; (左小于號), “大于”-&#39;>&#39; (右小于號);“等于”-&#39;=&#39; (等號);“不等于”-&#39;<>&#39;; “小于或等于”-&#39;<=&#39;; “大于或等于”-&#39;>=&#39;。由相關(guān)表達(dá)式而取得的邏輯值用在MetaQuotes II語言的控制結(jié)構(gòu)里。比如: if FreeMargin < 1000 then exit; 這個字串按詞典順序進(jìn)行比較,即,"aaa" 字串被認(rèn)為小于字串 "zzz"。當(dāng)邏輯值進(jìn)行比較時,我們應(yīng)該牢記:“True”的邏輯值的數(shù)值為1,而“False”的邏輯值的數(shù)值為“0”。 3.5. 邏輯符號 邏輯符號使用戶能夠?qū)⑦壿嬛到Y(jié)合起來。邏輯OR - &#39;|&#39; (垂直線或豎杠);邏輯AND-&#39;&&#39; (“和”符號)。邏輯符號有相應(yīng)的保留字OR, AND, NOT。 比如: If FreeMargin > 100 and FreeMargin < 1000 then print( "Free margin is ", FreeMargin );注意:當(dāng)OR 和 AND運(yùn)算符號是雙值時,即它們有兩個值進(jìn)行運(yùn)算,NOT運(yùn)算符號是單值,即它之適用于單值。比如: Variable: Condition1( True ); ... Condition1 = FreeMargin >= 1000; If not Condition1 then exit; 下面是邏輯運(yùn)算符號的結(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. 邏輯符號。 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ù)值取而代之。宏記錄器的引入簡化了編寫用戶功能要求的程序:更加方便、無關(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. 所有的固定字均是非敏感字號,即它們可以小寫也可以大寫。 4.1. 智能交易系統(tǒng)向?qū)?BR> 智能交易系統(tǒng)向?qū)崾綧QL 4允許編寫智能交易系統(tǒng)、自編指標(biāo)、自編腳本和從模板中進(jìn)行編輯 預(yù)先設(shè)定參數(shù)或變量的名稱,將會自動在文本編輯欄中出現(xiàn)參數(shù)框架: 4.2. MetaQuotes 4 語言的指令結(jié)構(gòu) 4.2.1. 變量宣告和語句 在計算過程中保存臨時數(shù)據(jù)要求使用變量。變量在本程序的開頭部分就用保留字、變量、排列和定義進(jìn)行了敘述。他允許使用這些詞語的負(fù)數(shù)形式,即 “ Variables, Arrays and Defines”。 這些詞中間總有一個開始變量的宣告敘述。這些詞語的差別如下: "variable" 語句簡單變量,"array"語句排列, "define" 語句附加用戶定義的變量,類似于預(yù)先界定的用戶變量,均可以通過設(shè)置對話框進(jìn)行修改,即從外部修改。然而,又不像預(yù)先界定的變量,用戶變量可以在程序內(nèi)部的計算過程中進(jìn)行更改。 變量宣告語法: 變量:名稱(初期值);這里名稱就是變量的名字;“初期值”就是變量的起初值。初期值對變量的類型-數(shù)字、字串或邏輯值進(jìn)行界定。 一個數(shù)字變量宣告的例子: Variable : Counter( 0 ); 一個字串變量宣告的例子: Variable : String1( "任意字串" ); 一個邏輯變量宣告的例子: Variable : MyCondition( false ); 數(shù)組聲明語法: Array : ArrayName[Array length]( 初始值 );其中,數(shù)組長度有一個或若干(多達(dá)4)個數(shù)字-數(shù)字 - number[, number [, number [, number]]]. 在MetaQuotes 4語言里, 數(shù)組可能是1-,2-,3-,4-個元素長度,一般情況下,數(shù)組就是一組可以用同一個名稱查找到的、并按照相繼成行定位數(shù)組且給定了數(shù)組元素的序列號(數(shù))的變量。數(shù)組方便于對同樣類型的數(shù)據(jù)排序。數(shù)組的一個典型例子就是交易終端的歷史數(shù)據(jù),比如,收盤、開盤、高點位、低點位、交易量。這些數(shù)據(jù)作為單一元素數(shù)組的。比如, Close[ 5 ] 指后退5個交易期間的收盤值。兩個元素的數(shù)組可能是一個簡單表格,其中第一個分量為行而第二個分量則為列。 Array: MyTable[ 10, 5 ]( 0 ); // 一個10行5列的表格。 ... print( MyTable[ 2, 4 ] ); // 打印第二行的第4個元素 數(shù)組可能包括任何類型的數(shù)值-數(shù)字、字串或邏輯值,但是應(yīng)該為同一類型,其中的初期值在數(shù)組被宣告時為特定的。 附加用戶定義變量宣告語法: 定義:名稱(初期數(shù));其中名稱為變量名稱;初期數(shù)為變量起初的數(shù)字值。 應(yīng)該注意,附加用戶定義變量可能只為數(shù)字類型。如上所述,用戶定義變量可以在程序的計算過程中進(jìn)行修改。這些修改只能運(yùn)用到智能交易系統(tǒng)的當(dāng)前時段,直到特殊的智能交易系統(tǒng)從圖表中刪除或客戶終端的操作結(jié)束。當(dāng)新的智能交易系統(tǒng)時段啟動時,用戶定義變量值將重新初始化。 4.2.2. 退出語句 退出報告中斷智能系統(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;其中,條件為一個邏輯表達(dá)式,取值為True 或 False; "Statement" 指MetaQuotes II語言中的任何指令。符號括號Begin – End可能被波形括號{ }所替代。 條件語句可能被用在對程序進(jìn)行分支。為達(dá)到此目的,另一個關(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)格來說, 變量宣告并不是一個可執(zhí)行語句。 4.2.4. WHILE循環(huán) WHILE循環(huán)確保在循環(huán)條件有效時,包含在循環(huán)主體中的語句的多次執(zhí)行。一個循環(huán)可以用Break 語句提前終止。迭代可以通過使用Continue語句停止。這個語句造成循環(huán)的下一個迭代開始,即Continue后面的語句直到循環(huán)主體結(jié)束在本迭代中不得執(zhí)行。在條件語句中用Break 和 Continue是合理的。語法: while Condition begin Statement; [break;][continue;] ... end;其中,條件是循環(huán)執(zhí)行條件-在每個循環(huán)迭代之前計算出的一個邏輯表達(dá)式,取值為True 或 False; 語句是MetaQuotes 4語言的任何指令。 符號括號Begin – End表示循環(huán)主體,可以被波形括號{ }替代。 “Break and Continue”描述也不是強(qiáng)制性的。 Example: Counter = 1; while Counter <= Bars begin print( Close[ Counter - 1 ] ); Counter = Counter + 1; end;這個例子說明一個將要執(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)主體,可以被波形括號{}取而代之。 Break 和Continue語句并非是強(qiáng)制性的。 Example: 比如: for Counter = 1 to 10 begin if Counter > Bars then break; print( Close[ Counter ] ); end; 這個例子說明一個可能被執(zhí)行10次的環(huán)。但是,若基準(zhǔn)值小于10, 循環(huán)就會提前終止,也就是說循環(huán)執(zhí)行BARS次。 4.2.6. BREAK中斷語句 中斷語句確保一個For 循環(huán)或一個While循環(huá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)主體開始下一個迭代。換句話說,在Continue之后語句被忽略。比如: for Counter = 1 to 10 begin ... if Counter > Bars then continue; print( Close[ Counter ] ); ... end;這個例子說明一個將被執(zhí)行了差不多10次的循環(huán)。但收盤值(counter)被打印不會比基準(zhǔn)次數(shù)多。"..."代表MetaQuotes 4 語言的其他語句。 4.3.交易中斷的預(yù)選界定變量 為了最大的方便用戶,交易中斷的一些變量可以從智能系統(tǒng)輸入。 AccountNumber-賬號(同義詞:AccNum) Ask –賣價(買方出價) Balance – 交易賬戶的余額值 Bars – 圖表上條形的數(shù)目-說明用數(shù)據(jù)填充圖表程度的非常重要的一個變量。 Bid -買入價(賣方要價) Close –收盤價格 Credit –信用優(yōu)先 Equity –賬戶狀況,包括未實現(xiàn)利潤 FreeMargin –交易賬戶的自由保證金值-也用來核查賬戶資金的可用性; High –期間最高價位 Low -期間最低價位 Margin –用來支撐開倉部位的資金(保證金) Open –開盤價 Point – 當(dāng)前金融工具單點上的價值(此點此時智能交易系統(tǒng)系統(tǒng)運(yùn)行),比如, USD/JPY - 0.01, USD/CHF - 0.0001 等。 PriceAsk –在市場觀測窗口上顯示的當(dāng)前賣價。 PriceBid -在市場觀測窗口上顯示的當(dāng)前買價。 PriceHigh – 當(dāng)前24小時期間的最高買價。 PriceLow -當(dāng)前24小時期間的最高賣價。 PriceTime -在市場觀測窗口上顯示的當(dāng)前時間。 Time – 價格圖表上的條形時間的基準(zhǔn)時間; TotalProfit – 所有開倉部位的總未實現(xiàn)利潤; TotalTrades –開倉部位的總數(shù)和交易中斷上的延遲訂單; Volume – 交易量(期間交易的數(shù)目) 應(yīng)注意到,Close, Open, High, Low, Volume, Time為歷史數(shù)據(jù)數(shù)組(seriesarrays),在上個交易期間允許進(jìn)入這些數(shù)據(jù)。 4.4. 內(nèi)置函數(shù) MetaQuotes 4語言提供許多功能,可用于多種多樣的場合。這些包括技術(shù)指標(biāo)、交易功能、時間功能、數(shù)學(xué)和三角函數(shù)功能、數(shù)據(jù)轉(zhuǎn)換和輸出函數(shù),等。 Abs –返回這個數(shù)值的絕對值(模塊) 語法:Abs函數(shù) (n個表達(dá)式) 參數(shù): 數(shù)值 AccountName – 返回包含用戶名的文本串 (同義詞:AccName ) Alert –產(chǎn)生包含用戶定義數(shù)據(jù)的對話屏 語法: Alert(...) 參數(shù)的任何非零數(shù)都可能。 Ceil – 返回代表最小接近整數(shù)的一個數(shù)字,它等于或大于特定的數(shù)值。 語法:Ceil( n個表達(dá)式 ) 參數(shù):數(shù)值 CloseOrder –收盤頭寸(部位) 語法:收盤頭寸(訂單、單位、價格、滑動量、色彩) Parameters: 參數(shù): order -開倉部位的訂單數(shù) lots – 單位數(shù) price –優(yōu)先收盤價 slippage –最大價格滑動值 color – 圖表上交叉點的色彩 Comment –在圖表的左上角產(chǎn)生的用戶定義數(shù)據(jù) 語法: Comment(...) 參數(shù)的任何非零數(shù)都可能。 Cos –計算和返回數(shù)值的余弦值,代表用弧度表示的角度。 語法: Cos( n分表達(dá)式 ) 參數(shù):數(shù)值 CurTime –返回從1970年元月1日起所經(jīng)過的秒數(shù)。 Day – 返回當(dāng)月當(dāng)前日序列號 DayOfWeek –返回當(dāng)周當(dāng)前日序列號。1 – 星期日, 2 – 星期一, ... , 7 – 星期六 DeleteOrder –刪除前期提交的延遲訂單 語法:DeleteOrder( 訂單 ) 參數(shù): 訂單-延遲部位的訂單數(shù) Exp – 返回代表特定數(shù)值指數(shù)的一個數(shù)目 語法: Exp( n個表達(dá)式) 參數(shù):數(shù)值 Floor –返回代表最大接近整數(shù)的一個數(shù)字,它等于或小于特定的數(shù)值。 語法: Floor( n個表達(dá)式) 參數(shù):數(shù)值 Highest – 返回期間特定數(shù)間的 Open, Low, High, Close or Volume (取決于“類型”參數(shù))的最大值。 語法: Highest( 類型、beginbar、期間 ) Parameters: 參數(shù): Type 類型 – 一個返回變量,可能去下列數(shù)值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUMEbeginbar –表示條形的轉(zhuǎn)換,與當(dāng)前條形有關(guān),并從中取值。 periods期間 – 計算執(zhí)行依據(jù)的期間數(shù) Hour –返回在24小時期間內(nèi)當(dāng)前小時的序列數(shù)。 iADX -平均指導(dǎo)動作目錄 語法:iADX( 期間、模式、轉(zhuǎn)換) 參數(shù): period – 計算的期間數(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 – 計算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 平均移動收斂/發(fā)散指標(biāo)(iBANDS –– 布林帶指數(shù) 語法: iBANDS(期間,誤差,模式,轉(zhuǎn)換) 參數(shù): period – 計算的期間數(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 – 計算的期間數(shù) shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iMA – 移動平均指標(biāo) 語法: iMA( 期間、模式、轉(zhuǎn)換) 參數(shù): period – 計算的期間數(shù) mode – 計算模式,可以取下列值: MODE_SMA, MODE_EMA, MODE_WMA. shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iMACD -平均移動收斂/發(fā)散指標(biāo) 語法: iMACD( fast_ema_period, slow_ema_period, signal_period, mode, shift ) 參數(shù): fast_ema_period -計算&#39;快&#39; 平均移動期間(通常12); slow_ema_period - number of periods for calculation of the &#39;slow&#39; moving average (usually 26); signal_period計算&#39;慢&#39; 平均移動期間(通常12); mode 數(shù)據(jù)源,可以取下列值:MODE_MAIN (主要指標(biāo))、MODE_SIGNAL (信號列); shift -與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iMFI – 現(xiàn)金流量指標(biāo) 語法: iMFI( 期間、轉(zhuǎn)換) 參數(shù): period – 計算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iMOM – 動量指標(biāo) 語法:iMOM( 期間、轉(zhuǎn)換) 參數(shù): period – 計算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iRSI – 相對強(qiáng)弱指標(biāo) 語法:iRSI(期間、轉(zhuǎn)換) 參數(shù): 期間 – 計算期間數(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 – 計算方法,取下列值: MODE_SMA (簡單平均)、MODE_EMA (指數(shù)值)、 MODE_WMA (權(quán)重值); mode – 數(shù)據(jù)源,可以取下列值: MODE_MAIN (主指標(biāo)線), MODE_SIGNAL (信號指標(biāo)線); shift -與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 iWPR -威廉氏百分?jǐn)?shù)范圍指標(biāo) 語法:iWPR( 期間、轉(zhuǎn)換) 參數(shù): 期間 – 計算期間數(shù); shift – 與當(dāng)前條形(后退期間數(shù))相關(guān)的轉(zhuǎn)換,為數(shù)據(jù)待取值的依據(jù)。 IsDemo – 如果智能交易系統(tǒng)系統(tǒng)在試用帳戶運(yùn)行,返回邏輯值,否則會返回錯誤值. IsIndirect –如果使用反向方式對特定工具進(jìn)行計算,會返回正確的邏輯值,否則會返回錯誤值。 LastTradeTime –返回代表最近交易執(zhí)行時間的一個數(shù)字(SetOrder, DelOrder, CloseOrder, ModifyOrder),計算從1970年元月1日0點經(jīng)過的秒鐘數(shù)。 Log (-特定正數(shù)值的對數(shù) 語法:日志( n個表達(dá)式) 參數(shù): 正數(shù)值 Lowest - 特定期間返回開倉,低,高,收盤或交易量最小值(依據(jù)"類型"參數(shù)而定) ...returns 語法:最低點(類型、beginbar、 期間) 參數(shù): type – 可以取下列值: MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUME beginbar –表示條形的轉(zhuǎn)換,與當(dāng)前條形有關(guān),并從中取值。 periods期間 – 計算執(zhí)行依據(jù)的期間數(shù) Minute –返回當(dāng)前小時的分鐘序列數(shù)。 Mod -返回代表著一個接著一個的數(shù)值的整數(shù) 語法:Mod( n個表達(dá)式1, n個表達(dá)式2) 參數(shù): 數(shù)值1、數(shù)值2 ModifyOrder –前期開倉部位或延遲訂單修改的特征 語法:ModifyOrder( 訂單、價格、止損、獲利、色彩) 參數(shù): order – 開倉或延遲部位的數(shù)目或訂單; price – 新的價格 (僅適用于延遲部位!); stoploss – 新的止損水平線; takeprofit – 新的獲利水平線; color – 圖表上象形圖 的色彩 Month –返回當(dāng)前月的續(xù)列號 MoveObject –移動或建立命名對象 語法:MoveObject( 名稱、類型、時間、價格、 時間2、時間2) 參數(shù): name – 文本串形式的名稱; type – 對象類型,可以取下列值:OBJ_HLINE (水平線)、 OBJ_VLINE (垂直線), OBJ_TRENDLINE (趨勢線)、 OBJ_SYMBOL (設(shè)定象形圖)、 OBJ_TEXT (文本串); time – 參照圖表第一時間; price -參照圖表第一價格; time2 -參照圖表第二時間; price2 -參照圖表第二時間 NumberToStr – 返回特定數(shù)值轉(zhuǎn)換成特定準(zhǔn)確格式的文本串。通過在十進(jìn)位點數(shù)之后的其他4個數(shù)產(chǎn)生的數(shù)值的函數(shù)。 語法: NumberToStr(數(shù)字、準(zhǔn)確性) 參數(shù): number – 特定數(shù)值; precision – 準(zhǔn)確格式、十進(jìn)位點數(shù)的數(shù)字 OrderValue – 返回訂單特定價值的之一 語法:OrderValue(部位、模式) 參數(shù): position – 交易終端列表的訂單頭寸部位,從1開始; mode – 返回數(shù)據(jù)類型,可以取下列值:VAL_TICKET (訂單數(shù)), VAL_OPENTIME (定定開倉時間), VAL_TYPE (訂單類型), VAL_LOTS (要求單位數(shù)目), VAL_SYMBOL (工具名稱,以文本串的形式), VAL_OPENPRICE (開盤價), VAL_STOPLOSS (止損水平線), VAL_TAKEPROFIT (獲利水平線), VAL_CLOSEPRICE (收盤價), VAL_COMISSION (委托交易量), VAL_SWAP (部位展期的展期費(fèi)用數(shù)額), VAL_PROFIT (交易利潤數(shù)), VAL_COMMENT (以文本串形式對特殊部位的注解), VAL_CLOSETIME (訂單收盤時間)。 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 – 存儲日志中特殊部位的細(xì)節(jié) 語法: PrintTrade( 部位 ) 參數(shù):部位 – 在交易終端里已開倉部位數(shù)字 Rand –返回一個產(chǎn)生的偽隨機(jī)數(shù)字。在使用此函數(shù)之前,偽隨機(jī)數(shù)字發(fā)生器應(yīng)用Srand函數(shù)調(diào)整到初始狀態(tài)。 如果偽隨機(jī)數(shù)字發(fā)生器不用,就在啟動程序時一次調(diào)整到初始狀態(tài)。 Round – 返回代表最接近整數(shù)的特定數(shù)值 語法: Round( n個表達(dá)式) 參數(shù): 一個數(shù)值 ServerAddress –以文本串的形式返回服務(wù)器IP地址 SetArrow –設(shè)定圖表繪圖標(biāo)志 語法: SetArrow( 時間、價格、標(biāo)志和色彩) 參數(shù): time -參照圖表第一時間; price -參照圖表第一價格; symbol -從Wingdings字體設(shè)定標(biāo)志 的數(shù)值; color -圖表顏色 SetObjectText -指定文本串到特定的對象 語法: SetObjectText(稱,文本,字體, 尺寸,顏色) 參數(shù): name – 對象名稱; text – 特定文本; font – 字體命; size – 字體大小; color – 文本色彩. SetOrder –用于開倉或設(shè)定延遲訂單的主函數(shù)。 語法:SetOrder( 操作、單位、價格、滑動、止損、獲利、色彩) 參數(shù): operation – 操作類型,可以取下列值:OP_BUY (開始購買部位), OP_SELL (開始出售部位), OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP (提交延遲訂單); lots – 單位數(shù); price – 交易優(yōu)先收盤價; slippage - OP_BUY 和OP_SELL操作的最大價格滑動; stoploss – 止損水平線; takeprofit – 獲利水平線; color – 當(dāng)提取函數(shù)時,圖表上箭頭的色彩 SetText –把圖表種的文本創(chuàng)放到特定的位置 語法:SetText( 時間、價格、字符串、色彩 ) 參數(shù): time -參照圖表第一時間; price -參照圖表第一價格; string – 文本串; color – 文本色彩 Sin -計算并返回代表弧度角度的數(shù)值 語法:Sin( n個表達(dá)式) 參數(shù): 數(shù)值 Sqrt -計算和返回特定正數(shù)值的平方根 語法: Sqrt( n個表達(dá)式 ) 參數(shù): 正數(shù)值 Srand – 設(shè)定偽隨機(jī)數(shù)字發(fā)生器到初始狀態(tài)。如果使用發(fā)生器,將其在啟動程序時一次性設(shè)置到初始狀態(tài)。 初始設(shè)置所用的最佳值就是時間函數(shù)回歸的數(shù)字-在此情況下,產(chǎn)生順序的隨機(jī)性就增大。 語法:Srand( 時間) 參數(shù): 正數(shù)值 Symbol –返回智能交易系統(tǒng)運(yùn)行的金融工具名稱的文本串。 Tan -計算并返回代表角度弧度的正切數(shù)值。 語法: Tan( n個表達(dá)式) 參數(shù): 數(shù)值 TimeToStr – 返回帶有"yyyy.mm.dd hh:mi" 類型的文本串,由代表經(jīng)過1970元月1日起的秒鐘數(shù)的特定數(shù)值。 語法: TimeToStr( 時間) 參數(shù): 正數(shù)值 Year – 返回當(dāng)年數(shù)。 逐步創(chuàng)建簡單顧問軟件 我們現(xiàn)在就創(chuàng)建智能交易系統(tǒng),并在運(yùn)行標(biāo)準(zhǔn)的平滑異同移動平均線指標(biāo),該系統(tǒng)具有較強(qiáng)的獲利能力,支持追蹤止損和最大的保障安全操作。 下面所給的例子,交易通過對單一的部位進(jìn)行開倉和控制。 交易原則: 多頭進(jìn)場– MACD指標(biāo)在零點之下, 向上走,或由下行信號線穿過。 空頭進(jìn)場– MACD指標(biāo)在零點以上, 向下走,或由上行信號線穿過。 多頭出場-通過執(zhí)行獲利限額,移動止損或當(dāng)MACD指標(biāo)穿過信號線(MACD指標(biāo)在零點以上, 向下走,或由上行信號線穿過) &#8226; 空頭出場-通過執(zhí)行獲利限額,移動止損或當(dāng)MACD指標(biāo)穿過信號線(MACD指標(biāo)在零點以下, 向上走,或由下行信號線穿過) 重要提示: 為了排除MACD指針于我們的分析出現(xiàn)的微不足道的變化(圖表上的“小山丘”),我們引入另外一種控制繪圖中的“小山丘的大小”的方法如下: 指針大小應(yīng)至少為最低價格的5個單位(5*Point,表示USD/CHF = 0.0005和USD/JPY = 0.05)。 步驟 I : 編寫智能交易系統(tǒng)描述 將鼠標(biāo)指針點到導(dǎo)航窗口的智能交易系統(tǒng)區(qū),按鼠標(biāo)右鍵,在出現(xiàn)的菜單里選中“創(chuàng)建”指令。智能交易系統(tǒ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)代碼只有幾頁,即便是這幾頁代碼也挺難掌握,特別是考慮這個事實:我們不是專業(yè)的程序開發(fā)商,另外,我們根本不需要專業(yè)性的描述,對嗎? 為了對標(biāo)準(zhǔn)智能交易系統(tǒng)的結(jié)構(gòu)有些了解,我們現(xiàn)在就看看下面的這個描述吧: 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個主區(qū)塊。 現(xiàn)在,請跟隨著每個結(jié)構(gòu)的步驟來創(chuàng)建代碼: 1. 原始數(shù)據(jù)的檢索 這條代碼通常從智能交易系統(tǒng)移到另一個稍微更改的另一個代碼-實際上為檢索的標(biāo)準(zhǔn)區(qū)塊: 若Bars<200,就離開;//圖表不足200bars-退出。 若獲利<10,則退出;//錯誤獲利參數(shù) 2. 為了加快數(shù)據(jù)存取,設(shè)置內(nèi)部變量 在程序代碼中,很有必要存取指標(biāo)值或處理計算值。為了簡化代碼和加速存儲,初始狀態(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) 符號,我們在程序中用簡單的寫入字符 MacdCurrent程序文本取而代之。所有的智能交易系統(tǒng)中的變量都依據(jù)MQL II語言進(jìn)行基本的解釋。所以,我們在程序的開頭加入這段說明。 var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0); var: MaCurrent(0), MaPrevious(0); MQL 4語言還另外推出了另外一個用戶自定義變量概念,它可以在程序外設(shè)定,而不會對任何系統(tǒng)程序下的源程序文本造成干擾。這個特點使程序更具靈活性。 MATrendPeriod變量就是這種類型的一個用戶自定義變量,所以,我們在程序的開頭加入這段說明。 defines: MATrendPeriod(56); 3. 檢查交易終端-是否可用? 若是,那么: 在智能交易系統(tǒng)里,我們只能使用當(dāng)前頭寸而不能操作延遲的訂單。然而,為了安全起見,我們介紹如何利用交易終端建檢查前期提交的訂單。 If TotalTrades<1 then // no opened orders identified { 檢查: 賬戶的可用資金等。在分析市場狀況之前,最好先檢查一下你的賬戶的資金情況, 以確保賬戶中有充足的開倉頭寸的資金。 如果凈保證金<1000,那么退出;//無資金-退出。 可否做多頭(買入)? 多頭買入的條件:MACD指標(biāo)在0軸以下,為向上趨勢且與向下趨勢的信號線相交。這和我們在MQL II語言中所描述的一樣(注意:我們可以按照原已保存在變量中的這個指標(biāo)值進(jìn)行操作。) If MacdCurrent<0 and MacdCurrent>SignalCurrent and MacdPrevious<SIGNALPREVIOUS and a cross-section exists Abs(MacdCurrent)>(MACDOpenLevel*Point) and // the indicator plotted a decent &#39;hillock&#39; 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 變量是一個用戶定義變量,可以在不影響程序文本的情況下,進(jìn)行更改,以確保更多的靈活性。在程序的開始部分,我們加入一段這個變量的描述(以及下面所用到的變量描述)。 defines: MACDOpenLevel(3), MACDCloseLevel(2); 是否可以做空頭(賣出)?空頭賣出的條件:MACD指標(biāo)在0軸以上,為向下趨勢且與向上趨勢的信號線相交。符號表示如下: If MacdCurrent>0 and MacdCurrent<SIGNALCURRENT and MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and MaCurrent<MAPREVIOUS { SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // executing 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指針與信號線相交,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 }; 是否應(yīng)該需要重新設(shè)定移動止損點?僅在持倉并已超過移動止損點數(shù)點并獲利的情況下,而且新的移動止損點比前期的要更有理一些,我們才重新設(shè)置移動止損點。 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指針與信號線相交,MACD指針在0軸以下,為向上趨勢且與向下趨勢的信號線相交。 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è)定移動止損點?僅在持倉并已超過移動止損點數(shù)點并獲利的情況下,而且新的移動止損點比前期的要更有理一些,我們才重新設(shè)置移動止損點。 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é)束所有的花括號,但仍然有效。 }; }; }; 所以,按照步驟,循序漸進(jìn)地學(xué)習(xí),我們已經(jīng)學(xué)會了編寫智能交易系統(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ù), 止損, // 獲利、移動止損) // 在我們看來,我們只需檢查獲利就行了 若Bars<200或獲利<10,那么就退出;//圖表上少于200 bars //簡化和加速操作程序,我們需要作必要的保存 //臨時變量中的指標(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個單位 如果凈保證金<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秒鐘的交易暫停時間 }; //檢查空頭(賣出)的可能性 If MacdCurrent>0 and MacdCurrent<SIGNALCURRENT and MacdPrevious>SignalPrevious and MacdCurrent>(MACDOpenLevel*Point) and MaCurrent<MAPREVIOUS P then { SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // executing Exit; // exiting }; //這里我們完成了對新的開倉部位可行性檢查 //沒有新的開倉部位,我們就用退出命令退出程序 //沒有要分析的任何東西 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 // 多頭開倉 { // 我們檢查-可能,尚有時間平倉嗎? 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; // 退出 }; // 我們檢查-可能,我可能已經(jīng)或該是設(shè)置移動止損的時候了嗎? If TrailingStop>0 then //用戶已經(jī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 // 否則,就是多頭。 { // 我們檢查-可能,尚有時間平倉嗎? 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è)置移動止損的時候了嗎? If TrailingStop>0 then // 用戶已經(jī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é)束 。 要完成對智能交易系統(tǒng)的設(shè)置,我只需要對外部變量進(jìn)行設(shè)定,Lots = 1, Stop Loss (S/L) = 0 (未使用), Take Profit (T/P) = 120 (適用于一個小時的間隔),Trailing Stop (T/S) = 30。當(dāng)然,你還可以設(shè)置自己的數(shù)值。 按Compile按鈕,如果沒有錯誤信息,就按SAVE按鈕保存智能交易系統(tǒng)(順便說,你還可以將上述程序的灰色背景打印文本保存到MetaEditor)。 現(xiàn)在,我們來編輯智能交易系統(tǒng), 在MQL編輯器點擊頂端的Compile圖示(像一張有檢查標(biāo)記的紙)。 步驟 IV: 測試智能交易系統(tǒng)的歷史數(shù)據(jù) 我們已經(jīng)編寫了智能交易系統(tǒng),我們通過對測試歷史數(shù)據(jù),現(xiàn)在急于要對其進(jìn)行評估。 我們就以15分鐘間隔的EUR/USD為例,大約為4000基準(zhǔn)值。 打開智能交易系統(tǒng)測試器: 在軟件下部會出現(xiàn)智能交易系統(tǒng)測試器: 在智能交易系統(tǒng)測試器中選擇EUR/USD,M15,設(shè)置測試歷史數(shù)據(jù)的起始日期和結(jié)束日期,開始測試 測試完成后,可查看測試記錄、凈值圖,在報告欄中可查看統(tǒng)計報表,并可將完整的包括凈值圖、交易記錄、分析報表完整地保存下來。 智能交易系統(tǒng)不僅提供建議和信號,而且允許交易賬戶上進(jìn)行自動交易,用附加到圖表指令(通過在導(dǎo)航窗口用鼠標(biāo)指針選中MACD樣本,按鼠標(biāo)右鍵選中出現(xiàn)的菜單命令)將MACD 樣本智能交易系統(tǒng)附加到圖表中,然后點擊“啟用智能交易系統(tǒng)”按鈕。 或點擊該智能交易系統(tǒng),在對話框中選擇“允許實時自動交易”并點確定。智能交易系統(tǒng)就會工作了 智能交易系統(tǒng)所有代碼在 Ready Expert Advisors頁都可找到 當(dāng)你對智能交易系統(tǒng)做出編寫時,必須謹(jǐn)記: 編寫和測試交易平臺的智能交易系統(tǒng)具有許多細(xì)節(jié)特征: 在開倉之前,必須檢查你賬戶上可用保證金的有效性。假如可用保證金不足時,則開倉部位交易將失敗。必須注意的是,為了達(dá)到測試的目的,可用保證金最少應(yīng)在1000,因為一個單位的測試價格為1000。 If FreeMargin < 1000 Then Exit; //如果保證金< 1000,那么退出,無資金-退出。 在開倉、平倉或者修改已有部位或刪除延遲訂單(一經(jīng)執(zhí)行以下任何的操作:SetOrder, CloseOrder, ModifyOrder or DeleteOrder)之后,建議使用Exit語句完成智能交易系統(tǒng)的這部分的操作,這將有10秒鐘的限定時間間隔來執(zhí)行該項操作。還應(yīng)注意,10秒鐘的限定時間不適用于測試模式(你可以連續(xù)做幾次交易)。另外,假如不是用Exit語句來完成智能交易系統(tǒng)的上述交易操作,智能交易系統(tǒng)的測試結(jié)果將和真實交易不同。 SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // 執(zhí)行 Exit; //退出 為了防止在測試模式中用少于10秒的間隔來執(zhí)行幾項交易,你只需確保從上一次交易到下一次的交易已經(jīng)超過10秒。 //確保當(dāng)前的時值離上次交易的執(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ù)是指必須回頭計算的期間數(shù)。 // 如果上個BAR柱狀線的收縮小于倒數(shù)第二個BAR柱狀線的收縮少 If Close[1] < Close[2] Then Exit; 交易平臺中的智能交易系統(tǒng)支持4種模式: OHLC 點(Open/High/Low/Close)模式。 因為系統(tǒng)在此的測試目的僅限于開盤價、收盤價、最高價、最低價,所以這個測試系統(tǒng)是最快的。 但是, 這個測試結(jié)果與智能交易系統(tǒng)執(zhí)行的實際交易的結(jié)果可能會不同。 每3點一次模式:在測試智能交易系統(tǒng)時,每增加三點就會模擬產(chǎn)生一個燭臺圖示。 每2點一次模式: 在測試智能交易系統(tǒng)時,每增加二點就會模擬產(chǎn)生一個燭臺圖示。 每1點一次模式:在測試智能交易系統(tǒng)時,每增加一點就會模擬產(chǎn)生一個燭臺圖,這種模式是最慢的但是測試結(jié)果是最接近智能交易系統(tǒng)的實際交易的結(jié)果的。(交易中間每間隔10秒鐘,觀察結(jié)果) 在編寫和檢驗智能交易系統(tǒng)過程中,以及在對任何其他程序測試過程中,有時, 需要輸出一些額外的調(diào)試信息。MQL II語言還提供這類信息輸出的若干可能性。 將ALERT函數(shù)以及包含用戶自定義的數(shù)據(jù)發(fā)送到屏幕對話框。 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é)果會以擴(kuò)展名為.log的文件形式儲藏在你安裝該交易平臺所在的日志的子目錄中。如果你經(jīng)常性地測試你的智能交易系統(tǒng),別忘了定期刪除log檔,因為它們可能累計達(dá)到數(shù)兆字節(jié)。
移動通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團(tuán)隊博客 | 免責(zé)聲明 | 關(guān)于詞典 | 幫助