程式交易教學

誠邀您參加全球知名外匯經紀商OANDA的自營交易(Prop Trader)

報名OANDA自營交易(Prop Trader),並通過我們的考核,您就可以使用OANDA提供的資金進行交易,獲得高達90%的交易利潤分成。



優化了挑戰塞交易規則
無最低交易天數限制等優化了挑戰賽的交易規則。

500,000美元交易資金
您可以使用最高500,000美元的資金進行交易。

豐富的交易商品
您可以交易包括外匯、黃金、原油、股票指數等多種商品。



運用MQL程式語言顯示多週期的方式解析

顯示其他時間週期的移動平均線

本節文章將說明多週期。多週期能顯示目前圖表時間週期與其他時間週期的計算結果。

此處用以修改的檔案是在「運用MQL程式語言在圖表中顯示移動平均線的方法」中製作、並在「運用MQL程式語言製作移動平均線的方法」添加功能的「MA_demo_step2-1」;其原本只能單純顯示移動平均線,而此處將對此進行變更。

參考文章:運用MQL程式語言製作移動平均線的方法

首先將檔案名稱變更為「MTF_MA_demo」進行儲存,並添加設定時間週期的參數;本次將使用列舉型的「ENUM_TIMEFRAMES」,並預設為1小時週期。

input ENUM_TIMEFRAMES TIMEFRAME = PERIOD_H1; // 時間週期

接下來,將製作的參數貼上於OnCalculate函數下方的指定時間週期位置。

MABuffer[i] = iMA(NULL, TIMEFRAME, PERIOD, SHIFT, METHOD, PRICE, i );

如此進行編譯之後,先安裝在15分鐘圖表上。將此圖表與安裝在1小時圖表上的修改前的「MA_demo_step2-1」進行對照,便會如同下方的畫面所示,上方為1小時圖表、修改前的MA;下方則為15分鐘圖表、修改後的MA。時間週期雖然有所不同,移動平均線的形狀卻相同,由此可知是使用1小時週期的資訊。

時間週期不同

修正時間等資訊

在上述的步驟中,完成了更換顯示移動平均線的時間週期。但若如此延續下去,時間資訊將會產生誤差,因此需要進行修正。為了修正K線的位置,此處使用的函數為「iBarShift」。將其匯入於OnCalculate函數旗下的for文法下方,並將iMA函數括弧內的「i」替換成由iBarShift計算的「bar」。

for (int i = limit; i >= 0; i–) {

int bar = iBarShift(NULL, TIMEFRAME, Time[i]);

MABuffer[i] = iMA(NULL, TIMEFRAME, PERIOD, SHIFT, METHOD, PRICE, bar );

}

iBarShift函數的設定項目
symbol 設定貨幣對名稱
timeframe 設定時間週期
time 設定搜尋的時間值
exact 設定在沒有搜尋到指定K線時的回覆敘述

由於將顯示貨幣對,因此iBarShift函數的參數設定將使用「NULL」、時間週期則是「TIMEFRAME」。時間的部分,因使用目前圖表中的K線時間,因此設定為Time序列的「i」。

另外一點,當沒有K線存在的狀況下,雖然存在著回覆敘述的相關參數,但此處可維持預設的「false」;在使用預設值的狀況下亦可加以省略。

將此參數設定為「false」之後,在指定的時間K線不存在的狀況下,就會返回最靠近的K線。另一方面,若設定為「true」在指定的時間K線不存在的狀況下,則會返回「-1」。

依照以上的設定進行編譯,就會在15分鐘的圖表上,顯示1小時的移動平均線。

1小時的移動平均線

修正最小限度的計算K線數量

顯示移動平均線的多週期外觀已經完成,但由於每次計算都會使用到圖表中所有的K線,因此應使其只計算最小限度的K線數量;如此若使用上一級別時間週期K線的資訊,將可能不足以進行計算。舉例來說,在15分鐘週期的部分,若使用1小時週期的資訊,將可能有4根K線難以確認;為了避免這樣的狀況,必須進行修改以再度計算。

首先,在 OnCalculate函數旗下的if文法上方,必須以整數型定義一項「min」,並在顯示1根K線秒數的「PeriodSeconds」括弧中設定時間週期。接下來,將該時間的秒數除以目前顯示的K線時間,得出的數值將作為if文法內的最小限度計算K線數量。將最小限度計算K線數量為1號至0號的「1」變更為「min」即可完成。

int min = PeriodSeconds(TIMEFRAME) / PeriodSeconds();

if (limit < min) limit = min;

接下來還有一處需要修改;如果設定的時間週期時下一級別的話,便將沒有計算的意義,因此可設定if文法使其不進行計算。

if (_Period > TIMEFRAME && TIMEFRAME != PERIOD_CURRENT) return -1;

int limit = Bars – IndicatorCounted() – 1;

int min = PeriodSeconds(TIMEFRAME) / PeriodSeconds();

if (limit < min) limit = min;

「_Period」將顯示目前的時間週期;若其大於TIMEFRAME,便代表計算就此結束。另外,「PERIOD_CURRENT」意指目前顯示中的K線,該數值則為0;若此狀況的條件成立,將會停止進行運作,因此可以予以去除。如此即為完成。

原始碼

本次製作的原始碼如以下所示。

//+——————————————————————+

//| MTF_MA_demo.mq4 |

//| Copyright 2020, MetaQuotes Software Corp. |

//| https://www.mql5.com |

//+——————————————————————+

#property copyright “Copyright 2020, MetaQuotes Software Corp.”

#property link “https://www.mql5.com”

#property version “1.00”

#property strict

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_plots 1

//— parameters

input ENUM_TIMEFRAMES TIMEFRAME = PERIOD_H1; // 時間週期

input int PERIOD = 20; // 週期

input int SHIFT = 0; // 移動

input ENUM_MA_METHOD METHOD = MODE_SMA; // MA類別

input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE; // 適用價格

input color CLR = clrWhite; // 顏色

input ENUM_LINE_STYLE STYLE = STYLE_SOLID; // 線條種類

input int WIDTH = 1; // 寬度

//— indicator buffers

double MABuffer[];

//+——————————————————————+

//| Custom indicator initialization function |

//+——————————————————————+

int OnInit()

{

//— indicator buffers mapping

SetIndexBuffer(0, MABuffer);

SetIndexStyle (0, DRAW_LINE, STYLE, WIDTH, CLR);

SetIndexLabel(0, “MA”);

//—

return INIT_SUCCEEDED;

}

//+——————————————————————+

//| Custom indicator iteration function |

//+——————————————————————+

int OnCalculate(const int rates_total,

const int prev_calculated,

const datetime &time[],

const double &open[],

const double &high[],

const double &low[],

const double &close[],

const long &tick_volume[],

const long &volume[],

const int &spread[])

{

//—

if (_Period > TIMEFRAME && TIMEFRAME != PERIOD_CURRENT) return -1;

int limit = Bars – IndicatorCounted() – 1;

int min = PeriodSeconds(TIMEFRAME) / PeriodSeconds();

if (limit < min) limit = min;

for (int i = limit; i >= 0; i–) {

int bar = iBarShift(NULL, TIMEFRAME, Time[i]);

MABuffer[i] = iMA(NULL, TIMEFRAME, PERIOD, SHIFT, METHOD, PRICE, bar );

}

//— return value of prev_calculated for next call

return rates_total;

}

//+——————————————————————+,

將EA自動程式交易應用於外匯與差價合約交易中

EA

我們以圖文形式詳細介紹有關EA自動程式交易的基本知識,以及在MT4/MT5平台上的安裝、參數設定方法、編碼等等內容。另外,對持有OANDA帳戶的客戶,還可以免費使用我們的獨有EA與指標工具。

誠邀您參加全球知名外匯經紀商OANDA的自營交易(Prop Trader)

報名OANDA自營交易(Prop Trader),並通過我們的考核,您就可以使用OANDA提供的資金進行交易,獲得高達90%的交易利潤分成。



優化了挑戰塞交易規則
無最低交易天數限制等優化了挑戰賽的交易規則。

500,000美元交易資金
您可以使用最高500,000美元的資金進行交易。

豐富的交易商品
您可以交易包括外匯、黃金、原油、股票指數等多種商品。