我們可以毫無(wú)疑問地說,編程或編碼的重要性在我們世界的各個(gè)領(lǐng)域每天都在提升。 故此,我們可以觀察編程或編碼為我們的生活變得更輕松如何做出貢獻(xiàn),而且可以根據(jù)您想要的、和您之前確定的內(nèi)容保證準(zhǔn)確的輸出。
一旦進(jìn)入交易世界 — 這個(gè)偉大的領(lǐng)域和職業(yè) — 我們可以說,編程或編碼令我們的交易變得簡(jiǎn)單,所創(chuàng)建程序會(huì)更加系統(tǒng)化;一旦我們依據(jù)自己的期望和想要的東西完成了一個(gè)精準(zhǔn)和優(yōu)秀的程序,它就可讓我們實(shí)現(xiàn)更方便和自動(dòng)化。 因此,編碼的世界可以給我們帶來(lái)很多益處,但在我看來(lái),編碼交易最重要之處是幫助您遵守紀(jì)律,就像我們所有人都知道的那樣,作為交易員,我們的交易決策需要一直遵守紀(jì)律。 紀(jì)律是關(guān)乎我們交易和投資結(jié)果的一個(gè)重要特征,因此遵守紀(jì)律在交易中并非選項(xiàng)。 正如我常說的,紀(jì)律是您在交易和一生中能否成功的關(guān)鍵。 為了用一種簡(jiǎn)單的方式明辨紀(jì)律,這意味著無(wú)論周圍的環(huán)境如何,都要在正確的時(shí)間做您必須做的事情。 因此,當(dāng)我們找到一個(gè)工具來(lái)幫助實(shí)現(xiàn)這一點(diǎn)時(shí),我們必須要全神貫注,并了解它到底是什么。 正確的編碼工具。
眾所周知,在交易過程中,阻礙我們自律的最常見事情就是情緒,我們必須避免這些情緒,或者當(dāng)避免這些情緒對(duì)交易決策產(chǎn)生影響時(shí)采取消極方式。 我想讓大家想象一下,如果你們有一個(gè)系統(tǒng),它能在不受人為干預(yù)的情況下,以預(yù)定的參數(shù)為你們工作。 那么,在此情況下,情緒對(duì)我們交易決策的負(fù)面影響就能被避免。 好消息是,我們有一個(gè)工具可以幫助我們做到這一點(diǎn)。 此處,我將為 MetaTrader 平臺(tái)撰寫關(guān)于 MQL(MetaQuotes 語(yǔ)言)的文章。 這個(gè)偉大的編程語(yǔ)言或工具將幫助我們?cè)O(shè)計(jì)自己的交易系統(tǒng),我們指定的參數(shù)將保證具體的行動(dòng)、或具體的交易決策。
如果您想更多地了解這個(gè)概念,我們來(lái)舉一個(gè)例子。 如果我們有兩位投資者(A 和 B),他們的交易策略相同,在上升趨勢(shì)中買入并持有,在逆轉(zhuǎn)趨勢(shì)時(shí)賣出;但他們每個(gè)人的行為不同 — 投資者 A 遵守約束,但投資者 B 不會(huì)。 請(qǐng)看以下示意圖:
因此,根據(jù)之前的數(shù)據(jù),很明顯,紀(jì)律對(duì)于良好的結(jié)果至關(guān)重要,但缺乏紀(jì)律會(huì)導(dǎo)致糟糕的結(jié)果。
通過本文,我將與大家分享一款簡(jiǎn)單的移動(dòng)平均線交叉交易系統(tǒng),學(xué)習(xí)如何通過分享 MQL5 編碼的一些基礎(chǔ)知識(shí)來(lái)設(shè)計(jì)自己的交易系統(tǒng),并通過示例來(lái)練習(xí)并深入理解這些基礎(chǔ)知識(shí)。 目的是給您一個(gè)關(guān)于利用這個(gè)華麗工具能夠做哪些事情的概述。
本文的主要目的是通過學(xué)習(xí) MQL5 的一些基礎(chǔ)知識(shí),引導(dǎo)初學(xué)者學(xué)習(xí)如何在 MQL5 中設(shè)計(jì)算法交易系統(tǒng),從而獲得一個(gè)簡(jiǎn)單交易系統(tǒng)的概念,在解釋了 MQL5 的一些基礎(chǔ)知識(shí)后,在本文會(huì)中逐步實(shí)現(xiàn)編碼。 我們會(huì)通過腳本針對(duì)它們編碼,然后代碼執(zhí)行后會(huì)顯示結(jié)果。 為了增進(jìn)您的理解,我建議您自己實(shí)現(xiàn)并編寫在此閱讀的內(nèi)容,因?yàn)檫@將幫助您深入理解上述代碼的概念。 需要注意的是,本文中創(chuàng)建的全部代碼、程序和交易策略都是為教育目的而設(shè)計(jì)的,而無(wú)其它目的。 請(qǐng)注意,我們將使用 MQL5 編寫代碼。
在這一部分中,我會(huì)提及我們打算要用的工具,以及我們打算了解的工具:
演示賬戶 您可在您的經(jīng)紀(jì)商那里開一個(gè)演示賬戶,在相同的市場(chǎng)環(huán)境下,無(wú)風(fēng)險(xiǎn)的用虛擬貨幣來(lái)測(cè)試您的交易策略。 請(qǐng)務(wù)必使用演示帳戶而不是您的實(shí)盤帳戶實(shí)驗(yàn)編碼,因?yàn)槟鶆?chuàng)建和執(zhí)行的程序需要在您的帳戶上執(zhí)行交易。
MetaQuotes 語(yǔ)言編輯器,我們將在其中編寫代碼或程序。 下面的屏幕截圖將顯示安裝了 MetaTrader 后如何打開它。 有三種方法可以打開它。
或者單擊 MetaQuotes 編輯器圖標(biāo):
或者在打開終端后按鍵盤上的 F4 鍵。
下面的屏幕截圖展示了它的樣子,于此我們編寫程序和設(shè)計(jì)交易系統(tǒng)的大部分工作。
現(xiàn)在我們需要用這個(gè)編輯器來(lái)編寫我們的第一個(gè)代碼,所以按照下面的步驟來(lái)了解如何做到這一點(diǎn)。
單擊“新建”,您將找到多種類型的程序可供選擇:
在本文中,我們需要提及的是:智能交易系統(tǒng)、自定義指標(biāo)和腳本。
在這一部分中,我們將學(xué)習(xí)如何利用 MQL5 編寫第一個(gè)程序和第一段代碼。 所有編程或編碼的初學(xué)者都從編寫 “Hello World” 代碼開始他們的旅程。 因此,我們將首先編寫一個(gè)程序,在終端屏幕上打印 “Hello World”。 我們開始吧…
如上圖所示打開 MetaEditor 編輯器,然后單擊新建,然后從選項(xiàng)(腳本)中選擇,然后單擊下一步。
單擊 “下一步” 后,將出現(xiàn)以下窗口。 填寫您所需腳本的數(shù)據(jù):
然后單擊完成。
單擊“完成”后,將打開以下窗口。 在這個(gè)窗口中,會(huì)生成我們的程序代碼。正如我所提及的那樣,我們需要設(shè)計(jì)一個(gè)在終端上顯示 “Hello World!” 的程序。 因此,我們將開始在兩個(gè)花括號(hào)之間編寫代碼。
在此我們會(huì)用:
我們的代碼如下相同:
//+----------------------------------------------------------+//| Hello World!.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+----------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+----------------------------------------------------------+//| Script program start function |//+----------------------------------------------------------+void OnStart() { Alert('Hello World!'); }//+----------------------------------------------------------+
代碼編寫完畢后,單擊編譯,然后確保沒有錯(cuò)誤和警告。 編譯代碼后,“錯(cuò)誤”選項(xiàng)卡里必須沒有錯(cuò)誤,從而確保程序的運(yùn)行與我在下圖中示意的相同。 然后按 F4 鍵進(jìn)入終端,測(cè)試我們的代碼。
在此之后,在終端的導(dǎo)航窗口中的腳本之下,您能找到之前選定的程序名(Hello World!),將其拖放到圖表上或雙擊。 之后,您將看到一條警告消息出現(xiàn),其中包含您在代碼中確定的內(nèi)容。 它應(yīng)該與下面的屏幕截圖相同。
在這一部分中,我將提出一個(gè)僅出于教育意圖的交易策略思路。 它旨在幫助您學(xué)習(xí) MQL5 的基礎(chǔ)知識(shí),以及如何利用 MQL5 編程。
免責(zé)聲明
提供的任何信息均“按原樣”,目的僅作為信息,并非出于交易目的或建議。 過去的績(jī)效表現(xiàn)并不能保證未來(lái)之結(jié)果。如果您在任何交易賬戶上選用這些材料,請(qǐng)您風(fēng)險(xiǎn)自擔(dān)。
此處,策略思路是嘗試?yán)脙蓷l簡(jiǎn)單的移動(dòng)平均線指標(biāo)的信號(hào)來(lái)確認(rèn)趨勢(shì):
此處,我們需要設(shè)計(jì)一個(gè)程序來(lái)執(zhí)行這一切。
在這一部分中,我將談及一個(gè)非常重要的步驟,如果您想輕松順利地編寫系統(tǒng)代碼,就必須進(jìn)行這個(gè)步驟。 這一步是為您的策略和交易思路創(chuàng)建一幅藍(lán)圖,設(shè)計(jì)完成的系統(tǒng)會(huì)準(zhǔn)確遵照您的希望按步驟順序操作;例如,您可以通過一幅示意圖來(lái)完成,它會(huì)給您一個(gè)清晰的藍(lán)圖。 這是我們(兩條簡(jiǎn)單的移動(dòng)平均線交叉)系統(tǒng)藍(lán)圖的一個(gè)示例,它以清晰的方式令我們看到需要哪些編碼,以及我們期望從這個(gè)系統(tǒng)中得到什么。
現(xiàn)在,我們首先來(lái)了解 MQL5 的一些基礎(chǔ)知識(shí),然后是我們的設(shè)計(jì)需要用到的內(nèi)容。
在本部分中,我們將辨別并理解:
一般來(lái)說,在程序中,數(shù)據(jù)值可以是常量或變量。 如果數(shù)值是可變的,則程序和用戶可以對(duì)其進(jìn)行更改。 變量是一個(gè)內(nèi)存位置。 它有一個(gè)與該位置關(guān)聯(lián)的名稱。 因此,內(nèi)存位置用于保存數(shù)據(jù)。 MQL5 的程序可以包含數(shù)十個(gè)或數(shù)百個(gè)變量。 每個(gè)變量都有一個(gè)非常重要的特性,即能在程序中存取其數(shù)值。 這種可能性的局限性與變量的作用域有關(guān),變量作用域是變量值在程序中可用的區(qū)域。 每個(gè)變量都有其作用域。
因此,根據(jù)作用域,MQL5 中有兩種類型的變量,局部變量和全局變量。 局部變量是在函數(shù)內(nèi)部聲明的變量。 局部變量的作用域,局限在聲明變量的函數(shù)實(shí)體內(nèi)部。 局部變量可以由常量,或與其類型對(duì)應(yīng)的表達(dá)式初始化。 聲明的全局變量能夠超出所有函數(shù)。 全局變量的作用域是整個(gè)程序。 全局變量只能由與其類型(而不是表達(dá)式)對(duì)應(yīng)的常量初始化。 在指定的函數(shù)執(zhí)行之前,全局變量只會(huì)初始化一次。
無(wú)論變量的作用域如何,現(xiàn)在我們來(lái)查看以下類型的變量:
我們舉一個(gè)使用變量的例子:
//+------------------------------------------------------------------+//| Variables.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { int myInteger = 5; double myDouble = 10.56; string myString = 'My name is Mohamed'; bool myBoolean = true; Alert(myInteger); Alert(myDouble); Alert(myString); Alert(myBoolean); }//+------------------------------------------------------------------+
在編譯了前面的代碼之后,如果您在編寫時(shí)像我上面那樣,那么您不會(huì)有任何錯(cuò)誤或警告,且您肯定能看到下面屏幕截圖所示的警報(bào)窗口。
另一個(gè)使用變量的例子。
在此,我們需要存儲(chǔ)或記憶變量及其數(shù)值,A 及其值為 10,B = 10,C = 10 + 5,var1 = 2.5,var2 = 4,result = 2.5/4,message1 = Hello Mohamed,以及 message2 = A 的值,即: 10。 因此,當(dāng)我們執(zhí)行此代碼時(shí),警報(bào)消息將包含 4 個(gè)元素:
//+------------------------------------------------------------------+//| Variables 2.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { int A = 10; int B = 5; int C; double var1 = 2.5; double var2 = 4; double result = var1 / var2; string greeting = 'Hello'; string space = ' '; string name = 'Mohamed'; string message1; string message2; C = A + B; message1 = greeting + space + name; message2 = 'Value of A is: ' + string(A); Alert(message1); Alert(C); Alert(result); Alert(message2); }//+------------------------------------------------------------------+
布爾值:簡(jiǎn)單地說,進(jìn)行邏輯運(yùn)算,返回 true 或 false。
//+------------------------------------------------------------------+//| Boolean Operations.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { bool result = 4 < 5; Alert (result); //true }//+------------------------------------------------------------------+
在此,若 4<5 時(shí),它必須在警報(bào)返回消息 true。
while 操作符由一個(gè)檢驗(yàn)表達(dá)式,和一個(gè)必須滿足的操作符組成。 如果表達(dá)式為 true,則執(zhí)行該操作符,直到表達(dá)式變?yōu)?false。 在下面的示例中,我們可以了解,首先在開始時(shí)發(fā)出警報(bào),以便知曉循環(huán)的開始和結(jié)束,然后程序?qū)z查計(jì)數(shù)器的值,如果小于 3,則顯示其值。 然后,它將在之前的結(jié)果中加一,直到變?yōu)?false,在本例中 = 或 > 3,然后在循環(huán)完成時(shí)發(fā)出最后一個(gè)警報(bào)。 因此,我們將在警報(bào)消息中看到來(lái)自此代碼的以下消息:腳本開始,1,2,循環(huán)已完成。
//+------------------------------------------------------------------+//| While Loop.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { //While (Loop) Alert('Start of script'); int counter = 1; while(counter < 3) //true? { Alert(counter); counter = counter + 1; } Alert('Loop has finished'); }
for 操作符由三個(gè)表達(dá)式和一個(gè)可執(zhí)行操作符組成:
for(expression1; expression2; expression3)
operator;
Expression1 描述循環(huán)初始化。 Expression2 檢查循環(huán)終止的條件。 如果為 true,則執(zhí)行循環(huán)體。 循環(huán)重復(fù),直到 expression2 變?yōu)?false。 如果為 false,則終止循環(huán),并將控制權(quán)交給下一個(gè)操作符。 Expression3 在每次迭代后執(zhí)行計(jì)算。
如此,根據(jù)下面的循環(huán)示例,我們可以預(yù)期代碼的執(zhí)行將產(chǎn)生五條 Hello 消息(I=0,I=2,…..,I=4),然后它將 = 5,循環(huán)將因此被終止。
//+------------------------------------------------------------------+//| For Loop.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { for(int i=0; i<5 ; i++) { Alert('Hello'); } }//+------------------------------------------------------------------+
IF - ELSE 運(yùn)算符是在必須做出選擇時(shí)使用。 形式上,語(yǔ)法如下:
if (expression)
operator1
else
operator2
如果 expression 為 true,則執(zhí)行 operator1,然后將控制權(quán)交給 operator2 后面的操作符(不執(zhí)行 operator2)。 如果 expression 為 false,則執(zhí)行 operator2(不執(zhí)行 operator1)。
示例:根據(jù)下面的示例,我們會(huì)首先收到一個(gè)含有出價(jià)的警報(bào),然后我們確定如果出價(jià) > 1.146600,那么我們就會(huì)收到“價(jià)格高于 1.146600 -> 買入”的警報(bào)。 如果沒有,我們會(huì)收到“價(jià)格低于 1.146600 -> 賣出”的警告。 下面是代碼及其執(zhí)行結(jié)果。
//+------------------------------------------------------------------+//| If-else statement.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart() { double level = 1.146600; double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); Alert('Bid Price = ' + string(Bid)); if(Bid > level) { Alert ('The price is above ' + string(level) + ' -> BUY'); }// What if the condition is false and we need to take an action also here we can use else function instead of writing another if code else { Alert ('The price is below ' + string(level) + ' -> SELL'); } }//+------------------------------------------------------------------+
在這一部分中,我們將學(xué)習(xí)如何確定程序的輸入或首選參數(shù),用其替代修改代碼。
屬性(#property):每個(gè) MQL5 程序都允許指定名為 #property 的附加特定參數(shù),從而幫助客戶端正確維護(hù)程序,而無(wú)需顯式啟動(dòng)它們
script_show_inputs: 在運(yùn)行腳本之前顯示包含屬性的窗口,并禁用此確認(rèn)窗口
輸入變量: 該 input 存儲(chǔ)定義的外部變量。 而 input 前面的修飾符指明數(shù)據(jù)類型。
//+------------------------------------------------------------------+//| Trader Inputs.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'#property script_show_inputs//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+input int TakeProfit = 10;input int StopLoss = 10;void OnStart() { double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double TakeProfitLevel = Bid + TakeProfit * 0.00001; // 0.00001 (5 digits broker, so multiplied by 10) double StopLossLevel = Bid - StopLoss * 0.00001; Alert('Price now = ' + string(Bid)); Alert ('TakeProfitLevel = ', TakeProfitLevel); Alert ('StopLossLevel = ', StopLossLevel); }//+------------------------------------------------------------------+
在這一部分中,我將講解如何編寫開單的代碼:
//+------------------------------------------------------------------+//| TEST.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'#property script_show_inputs#include <Trade\Trade.mqh>CTrade trade;//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+input int TakeProfit = 150;input int StopLoss = 100;void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (' Order Ticket # ', ticket); Alert('TakeProfit = ', TakeProfitLevel); Alert('StopLoss = ', StopLossLevel); } }//+------------------------------------------------------------------+
腳本執(zhí)行后,結(jié)果如下:
當(dāng)程序運(yùn)行時(shí),任何人都可以發(fā)現(xiàn)它崩潰了,并且出現(xiàn)了問題。 因此,我們必須在代碼中加入這種技術(shù),從而檢查每個(gè)執(zhí)行的命令或代碼,并在出現(xiàn)問題時(shí)發(fā)出警告。 換句話說,這是一種保護(hù)交易員及其資金免受任何不當(dāng)情況影響的保護(hù)技術(shù)。
//+------------------------------------------------------------------+//| TEST.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'#property script_show_inputs#include <Trade\Trade.mqh>CTrade trade;//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+input int TakeProfit = 150;input int StopLoss = 100;void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); if(Equity >= Balance) trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); if (ticket <= 0) { Alert('Error!'); //in Case of error and the order did not open, appears 'Error!' } else { Alert('Your ticket # is: ' + string(ticket)); Alert('TakeProfit = ', TakeProfitLevel); Alert('StopLoss = ', StopLossLevel); } } }//+------------------------------------------------------------------+
在本部分中,我們將創(chuàng)建開單和平單的代碼,來(lái)了解如何平單。
//+------------------------------------------------------------------+//| TEST.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'#property script_show_inputs#include <Trade\Trade.mqh>CTrade trade;//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+input int TakeProfit = 150;input int StopLoss = 100;void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (' Order Ticket # ', ticket); Alert('TakeProfit = ', TakeProfitLevel); Alert('StopLoss = ', StopLossLevel); Sleep(2000); trade.PositionClose(ticket,-1); Alert('Order Closed...'); } }//+------------------------------------------------------------------+
在這一部分中,我們將學(xué)習(xí)如何創(chuàng)建有助于修改訂單的代碼。 它將修改之前的開單或掛單的特征。
//+------------------------------------------------------------------+//| TEST.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'#property script_show_inputs#include <Trade\Trade.mqh>CTrade trade;//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+input int TakeProfit = 150;input int StopLoss = 100;void OnStart() { double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double TakeProfitLevel = (Ask+TakeProfit*0.00001); double StopLossLevel = (Ask-StopLoss*0.00001); double TakeProfitLevel2 = (TakeProfitLevel+0.00100); double StopLossLevel2 = (StopLossLevel-0.00050); trade.Buy(0.01,NULL,Ask,StopLossLevel,TakeProfitLevel,NULL); for (int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); ENUM_POSITION_TYPE position = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)); Alert (' Order Ticket # ', ticket); Alert('TakeProfit = ', TakeProfitLevel); Alert('StopLoss = ', StopLossLevel); Sleep(5000); trade.PositionModify(ticket,StopLossLevel2,TakeProfitLevel2); Alert('Order Modified...'); Alert('Modified TakeProfit = ', TakeProfitLevel2); Alert('Modified StopLoss = ', StopLossLevel2); } }//+------------------------------------------------------------------+
在這一部分中,我們將把所有內(nèi)容糅合到一起,編寫兩條簡(jiǎn)單移動(dòng)平均線交叉。 按照上述所有藍(lán)圖完成所需的一切工作。
在此,我們單擊 MetaEditor中 的新建啟動(dòng)新項(xiàng)目,并選擇智能交易系統(tǒng)。
為了記住一切,以下是我們?cè)敿?xì)的交易系統(tǒng)藍(lán)圖:
我們現(xiàn)在需要做的是編碼實(shí)現(xiàn)這個(gè)策略:
下面是這個(gè)程序的代碼,以及如何執(zhí)行它。
//+------------------------------------------------------------------+//| SMA crossover.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright 'Copyright 2022, MetaQuotes Ltd.'#property link 'https://www.mql5.com'#property version '1.00'//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick() { //create an array for several prices double myMovingAverageArray1[], myMovingAverageArray2[]; //define the properties of MAs - simple MA, 1st 20 / 2nd 50 int movingAverage1 = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE); int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE); //sort the price arrays 1, 2 from current candle ArraySetAsSeries(myMovingAverageArray1,true); ArraySetAsSeries(myMovingAverageArray2,true); //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1); CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2); //Check if we have a buy entry signal if ( (myMovingAverageArray1[0]>myMovingAverageArray2[0]) && (myMovingAverageArray1[1]<myMovingAverageArray2[1]) ) { Comment('BUY'); } //check if we have a sell entry signal if ( (myMovingAverageArray1[0]<myMovingAverageArray2[0]) && (myMovingAverageArray1[1]>myMovingAverageArray2[1]) ) { Comment('SELL'); } }//+------------------------------------------------------------------+
執(zhí)行程序后,它會(huì)根據(jù)此策略在圖表上顯示帶有當(dāng)前信號(hào)(買入或賣出)的注釋。 如下圖所示:
下面的圖片將解釋我們?nèi)绾螐慕K端找到我們?cè)O(shè)計(jì)的系統(tǒng),以及如何執(zhí)行它:
拖放或雙擊程序后,將彈出以下窗口:
啟用“允許算法交易”選項(xiàng),然后單擊“確定”。 之后,智能交易系統(tǒng)將被附加到圖表上,并在成功加載時(shí)在日志選項(xiàng)卡中顯示一條消息:
如此,我們創(chuàng)建并執(zhí)行了自動(dòng)判斷兩條簡(jiǎn)單移動(dòng)平均值交叉的程序。 我想在這里提到的是,這是一個(gè)簡(jiǎn)單的例子,我們可以為我們的交易編碼。 然而,我們可以用這個(gè)強(qiáng)大的 MQL5 工具針對(duì)任何其它交易策略進(jìn)行編碼和自動(dòng)化。
同樣,本文的主要目標(biāo)不是使用這種策略,而是學(xué)習(xí) MQL5 的一些基礎(chǔ)知識(shí),了解我們?nèi)绾位谧约旱南胂筮M(jìn)行創(chuàng)造,我們可以做什么,從而令我們的交易更容易和有利可圖。 故此,如果您打算使用它,這個(gè)策略需要很多改進(jìn),這也是您唯一的責(zé)任。
聯(lián)系客服