国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
[純技術(shù)] 學(xué)習(xí)為什么、以及如何設(shè)計(jì)算法交易系統(tǒng)
userphoto

2023.01.19 浙江

關(guān)注

我們可以毫無(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 編寫代碼。

我們?cè)谠O(shè)計(jì)我們的算法交易時(shí)需要什么

在這一部分中,我會(huì)提及我們打算要用的工具,以及我們打算了解的工具:

  • MetaTrader 5平臺(tái),又名 MetaTrader 5 終端。 通過終端執(zhí)行命令和測(cè)試我們的代碼。 MetaTrader 是最受歡迎的交易平臺(tái)。

演示賬戶 您可在您的經(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 后如何打開它。 有三種方法可以打開它。

  • 單擊工具菜單,然后單擊 MMetaQuotes 語(yǔ)言編輯器:

或者單擊 MetaQuotes 編輯器圖標(biāo):

或者在打開終端后按鍵盤上的 F4 鍵。

下面的屏幕截圖展示了它的樣子,于此我們編寫程序和設(shè)計(jì)交易系統(tǒng)的大部分工作。

現(xiàn)在我們需要用這個(gè)編輯器來(lái)編寫我們的第一個(gè)代碼,所以按照下面的步驟來(lái)了解如何做到這一點(diǎn)。

單擊“新建”,您將找到多種類型的程序可供選擇:

在本文中,我們需要提及的是:智能交易系統(tǒng)、自定義指標(biāo)和腳本。

  • 智能交易系統(tǒng):EA 是終端中的一個(gè)程序,根據(jù)您設(shè)置的參數(shù)開發(fā),并用于自動(dòng)化分析和交易過程。
  • 自定義指標(biāo):是一段已編碼的程序;它主要用于附屬初步計(jì)算的圖形顯示。
  • 腳本:是一個(gè)用于執(zhí)行任何單一操作的程序,它可以實(shí)現(xiàn)分析和交易功能,并且與智能交易系統(tǒng)不同,它是根據(jù)請(qǐng)求執(zhí)行的,而非基于即時(shí)報(bào)價(jià)執(zhí)行。

啟程的 Hello World! 程序

在這一部分中,我們將學(xué)習(xí)如何利用 MQL5 編寫第一個(gè)程序和第一段代碼。 所有編程或編碼的初學(xué)者都從編寫 “Hello World” 代碼開始他們的旅程。 因此,我們將首先編寫一個(gè)程序,在終端屏幕上打印 “Hello World”。 我們開始吧…

如上圖所示打開 MetaEditor 編輯器,然后單擊新建,然后從選項(xiàng)(腳本)中選擇,然后單擊下一步。

單擊 “下一步” 后,將出現(xiàn)以下窗口。 填寫您所需腳本的數(shù)據(jù):

  • Name 是腳本的名稱
  • Author 是腳本的創(chuàng)作者嗎
  • Link 是您的鏈接
  • Parameter 是您需要為腳本設(shè)置的參數(shù),但此處我們不會(huì)為該腳本設(shè)置任何參數(shù),因此跳過它。

然后單擊完成。

單擊“完成”后,將打開以下窗口。 在這個(gè)窗口中,會(huì)生成我們的程序代碼。正如我所提及的那樣,我們需要設(shè)計(jì)一個(gè)在終端上顯示 “Hello World!” 的程序。 因此,我們將開始在兩個(gè)花括號(hào)之間編寫代碼。

在此我們會(huì)用:

  • Alert: 它打印我確定的內(nèi)容,或者在程序中顯示一條預(yù)先確定的消息,而在我們的示例中是 “Hello World!”
  • ( “ ”): 在引號(hào)里寫入我想要的東西和預(yù)先確定的信息 “Hello World!” 或任何內(nèi)容。
  • ; - 分隔句子。

我們的代碼如下相同:

//+----------------------------------------------------------+//| 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)該與下面的屏幕截圖相同。

交易策略理念(兩條簡(jiǎn)單的移動(dò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ì):

  • 簡(jiǎn)單移動(dòng)平均線是一個(gè)滯后的技術(shù)指標(biāo),它計(jì)算指定時(shí)期的平均收盤價(jià),它是滯后的,因?yàn)樗男盘?hào)于價(jià)格行動(dòng)信號(hào)之后才生成。
  • 策略如下:
    • 如果較短周期的簡(jiǎn)單移動(dòng)平均線(其周期為 20)向上穿越較長(zhǎng)周期的簡(jiǎn)單移動(dòng)平均線(其周期為 50),則信號(hào)為買入。
    • 如果較短周期的簡(jiǎn)單移動(dòng)平均線(其周期為 20)向下穿越較長(zhǎng)周期的簡(jiǎn)單移動(dòng)平均線(其周期為 50),則信號(hào)為賣出。

此處,我們需要設(shè)計(jì)一個(gè)程序來(lái)執(zhí)行這一切。

算法交易系統(tǒng)藍(lán)圖

在這一部分中,我將談及一個(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)容。

它們是變量和類型,以及我們?nèi)绾问褂?/h1>

在本部分中,我們將辨別并理解:

  • 什么是變量?
  • 變量的類型。
  • 我們?nèi)绾问褂盟鼈儯?/li>

一般來(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)查看以下類型的變量:

  • int 是數(shù)字類型;有不同類型的整數(shù)型來(lái)存儲(chǔ)不同長(zhǎng)度的數(shù)值。
  • double. 構(gòu)建一個(gè)能夠處理交易中所用數(shù)字的程序需要一種能夠管理浮點(diǎn)數(shù)的數(shù)據(jù)類型。所以 MetaTrader 提供了以下數(shù)據(jù)類型來(lái)處理這些數(shù)據(jù):float 和 double。 它們之間的差異是內(nèi)存中分配的字節(jié)數(shù),float 有 4 字節(jié),double 有 8 字節(jié),從而產(chǎn)生以下最小值和最大值:
    • float - 最小 1.175494351e-38, 最大 3.402823466e+38
    • double - 最小 2.2250738585072014e-308, 最大 1.7976931348623158e+308
      為了聲明這些類型的數(shù)據(jù),需用 float 和 double 關(guān)鍵字。
  • string 是一種非常重要的數(shù)據(jù)類型,在 MQL5 編碼中也廣泛使用。 字符串允許存儲(chǔ)和操作任何字母數(shù)字字符序列。
  • bool - 布爾型是一種邏輯類型,可以假定為 truefalse。

我們舉一個(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è)元素:

  • message1 的等效值
  • C 的等效值
  • result 的等效值
  • message2 的等效值
//+------------------------------------------------------------------+//| 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); }//+------------------------------------------------------------------+


布爾運(yùn)算

布爾值:簡(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 循環(huán)

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 循環(huán)

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ǔ)句

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é)果如下:

錯(cuò)誤處理技術(shù)

當(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...'); } }//+------------------------------------------------------------------+

通過 OrderModify 調(diào)整訂單

在這一部分中,我們將學(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);   }  }//+------------------------------------------------------------------+

兩條簡(jiǎn)單移動(dòng)平均線交叉系統(tǒng)

在這一部分中,我們將把所有內(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è)策略:

  • 如果較短周期的簡(jiǎn)單移動(dòng)平均線(其周期為 20)上穿較長(zhǎng)周期的簡(jiǎn)單移動(dòng)平均線 (其周期為 50),則信號(hào)為買入。
  • 如果較短周期的簡(jiǎn)單移動(dòng)平均線(其周期為 20)下穿較長(zhǎng)周期的簡(jiǎn)單移動(dòng)平均線(其周期為 50),則信號(hào)為賣出。

下面是這個(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é)任。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MT5入門到精通之五:MQL5初級(jí)語(yǔ)法
MQL語(yǔ)言介紹 ? 7號(hào)交易員
MQL4 語(yǔ)言入門。簡(jiǎn)介
學(xué)習(xí)如何基于 MACD 設(shè)計(jì)交易系統(tǒng)
午讀 | “安迪式做空”帶火MT4平臺(tái) 火爆背后還有這樣的故事
MQL4基礎(chǔ)知識(shí)學(xué)習(xí)(系統(tǒng)保留字區(qū)分大小寫字母,否則EA編輯器不認(rèn))
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服