程式交易教學

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

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



限時優惠代碼
在購買鈦金挑戰賽時輸入“TITANIUM30”,即獲得30%的折扣(優惠截止日期為2024年4月30日)。

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

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

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



利用EA程式交易來製作觸線警示通知工具的方法

搜尋圖表上的所有物件

在本篇章節中,將介紹當價格觸及指定線條種類(雙點劃線)的水平線時,發出警示通知的工具的製作方法。

在建立新文檔的頁面選擇「自訂指標」,檔案名稱則命名為「TouchLineAlert」。由於本次將使用「OnChartEvent」,因此在「自訂指標程式的事件處理常式」畫面中勾選「OnChartEvent」,如此便完成了雛形。

OnChartEvent

首先將搜尋圖表上所有的物件,使用ObjectsTotal函數並記載以下for文體。

for (int i = 0; i < ObjectsTotal(0, -1); i++) {

string name = ObjectName(0, i);

新增以下的if文體,便能在搜尋物件符合水平線以及雙點劃線「DASHDOTDOT」時進行處理;其後使用ObjectGetDouble以取得當時的線條價格。

if (ObjectGetInteger(0, name, OBJPROP_TYPE) == OBJ_HLINE && ObjectGetInteger(0, name, OBJPROP_STYLE) == STYLE_DASHDOTDOT){

double price = ObjectGetDouble(0, name, OBJPROP_PRICE, 0);

指定水平線的價格觸及條件

接下來,將寫入當價格在水平線的下方向上觸及、以及在水平線的上方向下觸及時,會發出警示通知的編碼。「Close[0] >= price && Close[1] < price」為由下向上觸及時的條件;「Close[0] <= price && Close[1] > price」則是由上向下觸及時的條件。警示通知的注釋則設定為「貨幣對名稱」與「價格資訊」。

if ((Close[0] >= price && Close[1] < price) || (Close[0] <= price && Close[1] > price)){

string text = _Symbol + ” Touch line. ” + DoubleToString(Bid, _Digits);

Alert(text);

其次,在for文體之前增加下列if文體,便可以設置為每根K線只通知一次。

static datetime timeAlert;

if (Time[0] > timeAlert)

更甚,在「Alert(text);」下方添加以下編碼,即可在通知時寫入目前的時間週期。

timeAlert = Time[0];

break;

若在此編譯完成,便能在價格觸及雙點劃線的水平線時發出鳴響警示;只要在圖表上進行設定,並在K線上拉出雙點劃線的水平線,即可確認警示通知。

鳴響警示

以鍵盤變更水平線的線條種類

接下來,將透過鍵盤的操作,來變更所選水平線的線條種類。

首先將宣告函數以外的全域變數;在檔案上方的一般屬性內容之下宣告「string NAME;」,並在「OnChartEvent」之下寫入以下if文體。如此一來,若點擊的物件處於已被選擇的狀態,便會記憶該物件的名稱。

if (id == CHARTEVENT_OBJECT_CLICK){

if (ObjectGetInteger(0, sparam, OBJPROP_SELECTED)) NAME = sparam;

}

透過本次的設定,將在按下鍵盤「A」鍵時變更水平線的線條種類。

鍵盤「A」鍵在處理程序中位於第30號,而「sparam」代表按下按鍵的編號;故應追加以下的if文體,以便在「sparam」為「30」時進行處理。此指示可取得目前的線條種類,並在所選物件符合雙點劃線時變更為實線、不符合時則變更為雙點劃線(※變數sparam會依照CHARTEVENT的種類來變化數值。

如欲確認各個事件的內容,可參考MQL5幫助檔>事件處理>OnChartEvent)。

if (id == CHARTEVENT_OBJECT_CLICK){

if (ObjectGetInteger(0, sparam, OBJPROP_SELECTED)) NAME = sparam;

}

if (id == CHARTEVENT_KEYDOWN){

if ((int)sparam == 30){

long style = ObjectGetInteger(0, NAME, OBJPROP_STYLE);

if (style == STYLE_DASHDOTDOT) ObjectSetInteger(0, NAME, OBJPROP_STYLE, STYLE_SOLID);

else ObjectSetInteger(0, NAME, OBJPROP_STYLE, STYLE_DASHDOTDOT);

}

}

}

如此進行編譯,即可在選擇雙點劃線的狀態下,按下鍵盤「A」鍵來替換為實線;新添加的水平線亦可進行相同的動作。觸及實線水平線時並不會發出警示通知,觸及設定為雙點劃線的水平線時才會。

警示通知

原始碼

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

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

//| aaa.mq4 |

//| Copyright 2021, MetaQuotes Software Corp. |

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

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

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

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

#property version “1.00”

#property strict

#property indicator_chart_window

string NAME;

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

//| Custom indicator initialization function |

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

int OnInit()

{

//— indicator buffers mapping

//—

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

{

//—

static datetime timeAlert;

if (Time[0] > timeAlert)

for (int i = 0; i < ObjectsTotal(0, -1); i++) {

string name = ObjectName(0, i);

if (ObjectGetInteger(0, name, OBJPROP_TYPE) == OBJ_HLINE && ObjectGetInteger(0, name, OBJPROP_STYLE) == STYLE_DASHDOTDOT){

double price = ObjectGetDouble(0, name, OBJPROP_PRICE, 0);

if ((Close[0] >= price && Close[1] < price) || (Close[0] <= price && Close[1] > price)){

string text = _Symbol + ” Touch line. ” + DoubleToString(Bid, _Digits);

Alert(text);

timeAlert = Time[0];

break;

}

}

}

//— return value of prev_calculated for next call

return(rates_total);

}

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

//| ChartEvent function |

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

void OnChartEvent(const int id,

const long &lparam,

const double &dparam,

const string &sparam)

{

if (id == CHARTEVENT_OBJECT_CLICK){

if (ObjectGetInteger(0, sparam, OBJPROP_SELECTED)) NAME = sparam;

}

if (id == CHARTEVENT_KEYDOWN){

if ((int)sparam == 30){

long style = ObjectGetInteger(0, NAME, OBJPROP_STYLE);

if (style == STYLE_DASHDOTDOT) ObjectSetInteger(0, NAME, OBJPROP_STYLE, STYLE_SOLID);

else ObjectSetInteger(0, NAME, OBJPROP_STYLE, STYLE_DASHDOTDOT);

}

}

}

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

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

EA

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

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

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



限時優惠代碼
在購買鈦金挑戰賽時輸入“TITANIUM30”,即獲得30%的折扣(優惠截止日期為2024年4月30日)。

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

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

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