程式交易教學

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

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



全面升級——更多功能、更大靈活性!
優化了“固定最大虧損”,“每日虧損限制”等。查看詳情全新「Boost」計劃

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

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



運用ATR製作波動判別工具的方法|數值的顯示方式與變更顯示顏色的方法

1.以參數設定ATR的週期與容許值

本篇章節中,將說明如何以ATR製作波動判別工具。工具的功能包含於圖表上顯示ATR數值、在該數值未達容許值的狀態下變更顯示顏色、以及使用趨勢線在圖表上顯示大型×標記等等。

首先,在製作新檔案時選擇「自訂指標」,並將檔案命名為「ATR_Judge」。接著將ATR的週期與容許值設定為參數。期間的名稱為「PERIOD」、類型為「int」、預設值為「14」,容許值名稱則是「LEVEL」、類型為「double」、預設值為「1.5」。在「自訂指標程式的事件處理常式」中勾選「OnChartEvent」,並在下一個畫面中點擊「完成」即是雛形。

自訂指標

2.定義前綴允許可刪除物件

由於本次會使用物件,因此為了往後能將其統一刪除,必須在檔案上方的屬性「property indicator_chart_window」之下,將「PREFIX」定義為前綴。「MQLInfoString(MQL_PROGRAM_NAME)」將會顯示指標的檔案名稱。

#define PREFIX MQLInfoString(MQL_PROGRAM_NAME) + “_”
其次應在「Custom indicator initialization function」之下設置「Custom indicator deinitialization function」,並寫入使用OnDeinit的下列編碼。如此一來,只要從圖表上刪除指標,相關的物件便會一併消失。

void OnDeinit(const int reason)

{

ObjectsDeleteAll(0, PREFIX);

}
另外,也使用列舉型的「ENUM_TIMEFRAMES」來指定時間條列。此處將5分鐘單位設定為預設值。在「input int PERIOD=14;」上方寫入下列編碼即可。

input ENUM_TIMEFRAMES TF = PERIOD_M5; // 時間足

3.製作處理物件繪圖的函數

接著將定義處理繪圖物件的函數。在「ChartEvent function」之下設置「Draw function」,並製作新的「DrawX()」函數。

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

//| Draw function |

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

void DrawX()

{


在DrawX()當中,先使用iATR函數來定義ATR。由於欲使用目前顯示的物件,因此貨幣對選擇「NULL」,時間框架與週期則是由參數所定義的物件,因為想要從價格以確定的K線上取得ATR數值,故指定為「1」,並將ATR的數值轉換為pips單位。

double atr = iATR(NULL, TF, PERIOD, 1) / _Point / 10;
此ATR數值若未達LEVEL(容許值),便會將波動性判定為「小」。關於物件的顏色,則會在使用三項運算子的ATR數值較小時顯示「紅色」、偏大時顯示「白色」。

bool small = atr < LEVEL;

color clrATR = small ? clrRed : clrWhite;

4.沿用LABEL物件的範例編碼

在上述文章中,設定了前綴以製作處理物件繪圖的函數「DrawX()」,並說明了當中的ATR定義方式。接下來,將使用LABEL物件,將ATR數值顯示於圖表上。

可從MQL4幫助檔中,複製使用LABEL物件的範例編碼。於MQL4幫助檔目錄中點選「Constants, Enumerations and Structures」→「Objects Constants」→「Object Types」,便會顯示物件一覽表。從中選擇「OBJ_LABEL」,並將預先準備的「Create a text label」編碼複製貼上於檔案的下方。

「Print(__FUNCTION__,」「”: failed to create text label! Error code = “,GetLastError());」的兩行不需使用,因此可加上「/*」「*/」作為註解,並加上「ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);」以便在其下反應ATR的數字變化、以及「ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);」以反映顏色變化。

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

//| Create a text label |

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

bool LabelCreate(const long chart_ID = 0, // chart’s ID

const string name = “Label”, // label name

const int sub_window = 0, // subwindow index

const int x = 0, // X coordinate

const int y = 0, // Y coordinate

const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring

const string text = “Label”, // text

const string font = “Arial”, // font

const int font_size = 10, // font size

const color clr = clrRed, // color

const double angle = 0.0, // text slope

const ENUM_ANCHOR_POINT anchor = ANCHOR_LEFT_UPPER, // anchor type

const bool back = false, // in the background

const bool selection = false, // highlight to move

const bool hidden = true, // hidden in the object list

const long z_order = 0) // priority for mouse click

{

//— reset the error value

ResetLastError();

//— create a text label

if(!ObjectCreate(chart_ID, name, OBJ_LABEL, sub_window, 0, 0)) {

/* Print(__FUNCTION__,

“: failed to create text label! Error code = “,GetLastError());*/

ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);

ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);

return(false);

}

//— set label coordinates

ObjectSetInteger(chart_ID, name, OBJPROP_XDISTANCE, x);

ObjectSetInteger(chart_ID, name, OBJPROP_YDISTANCE, y);

//— set the chart’s corner, relative to which point coordinates are defined

ObjectSetInteger(chart_ID, name, OBJPROP_CORNER, corner);

//— set the text

ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);

//— set text font

ObjectSetString(chart_ID, name, OBJPROP_FONT, font);

//— set font size

ObjectSetInteger(chart_ID, name, OBJPROP_FONTSIZE, font_size);

//— set the slope angle of the text

ObjectSetDouble(chart_ID, name, OBJPROP_ANGLE, angle);

//— set anchor type

ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, anchor);

//— set color

ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);

//— display in the foreground (false) or background (true)

ObjectSetInteger(chart_ID, name, OBJPROP_BACK, back);

//— enable (true) or disable (false) the mode of moving the label by mouse

ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection);

ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection);

//— hide (true) or display (false) graphical object name in the object list

ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden);

//— set the priority for receiving the event of a mouse click in the chart

ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order);

//— successful execution

return(true);

}

5.以LabelCreate顯示ATR數值

在DrawX()當中執行設定的LabelCreate。針對LabelCreate的參數,圖表ID為「0」、名稱為「PREFIX + “ATR”」,視窗為主視窗的「0」、X與Y位置皆為「0」、標準位置則指定為左下方的「CORNER_LEFT_LOWER」。ATR數值顯示至小數點1位以下,字體為「Arial Bold」、尺寸為「20」、顏色是先前定義的「clrATR」、角度為「0」、錨定則設定為左下方的「ANCHOR_LEFT_LOWER」。

LabelCreate(0, PREFIX + “ATR”, 0, 0, 0, CORNER_LEFT_LOWER, DoubleToString(atr, 1), “Arial Bold”, 20, clrATR, 0, ANCHOR_LEFT_LOWER);
接著將製作的DrawX()於OnCalculate函數之下進行宣告。在「//— return value of prev_calculated for next call」上方設置「DrawX();」。

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[])

{

//—

DrawX();

//— return value of prev_calculated for next call

return(rates_total);

}
如此進行編譯並設定圖表,就能在圖表左下方顯示ATR數值。由於容許值的預設值小於「1.5」,因此數值會呈現紅色。

ATR數值

6.定義圖表四角的時間與價格資訊

接下來,在ATR數值小於容許值時,為了能在圖表上以趨勢線繪製×標記,故需定義圖表四角的時間與價格資訊。首先以「ChartGetDouble」取得圖表的最大值與最小值。

double max = ChartGetDouble(0, CHART_PRICE_MAX);

double min = ChartGetDouble(0, CHART_PRICE_MIN);
其次取得K線位置藉以指定時間。以「CHART_FIRST_VISIBLE_BAR」取得圖表左邊的K線,自該處拖曳圖表整體的K線數量「CHART_WIDTH_IN_BARS」,進而取得右邊的K線。

int barL = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR);

int barR = barL – (int)ChartGetInteger(0, CHART_WIDTH_IN_BARS);
為了以此換算時間,左邊的K線雖可就此直接定義,但至於右邊的K線,則需要在小於零時設定為「Time[0] – barR * PeriodSeconds()」。此原因在於序列 (Time[])的必要編號無法指定為負數。

datetime timeL = Time[barL];

datetime timeR = barR >= 0 ? Time[barR] : Time[0] – barR * PeriodSeconds();
在ATR數值小於容許值時,趨勢線的顏色會呈現橘色,反之則因不會顯示而呈現無色。

color clrX = small ? clrOrange : clrNONE;
關於在圖表上以趨勢線繪製×標記的方式,請參考以下文章。

參考文章:以ATR製作波動判別工具的方法|在圖表上繪製×標記的方法

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

EA

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

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

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



全面升級——更多功能、更大靈活性!
優化了“固定最大虧損”,“每日虧損限制”等。查看詳情全新「Boost」計劃

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

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