誠邀您參加全球知名外匯經紀商OANDA的自營交易(Prop Trader)
報名OANDA自營交易(Prop Trader),並通過我們的考核,您就可以使用OANDA提供的資金進行交易,獲得高達90%的交易利潤分成。
全面升級——更多功能、更大靈活性!
優化了“固定最大虧損”,“每日虧損限制”等。查看詳情全新「Boost」計劃
500,000美元交易資金
您可以使用最高500,000美元的資金進行交易。
豐富的交易商品
您可以交易包括外匯、黃金、原油、股票指數等多種商品。
利用EA程式交易來製作觸線警示通知工具的方法
搜尋圖表上的所有物件
在本篇章節中,將介紹當價格觸及指定線條種類(雙點劃線)的水平線時,發出警示通知的工具的製作方法。在建立新文檔的頁面選擇「自訂指標」,檔案名稱則命名為「TouchLineAlert」。由於本次將使用「OnChartEvent」,因此在「自訂指標程式的事件處理常式」畫面中勾選「OnChartEvent」,如此便完成了雛形。
首先將搜尋圖表上所有的物件,使用ObjectsTotal函數並記載以下for文體。
for (int i = 0; i < ObjectsTotal(0, -1); i++) {新增以下的if文體,便能在搜尋物件符合水平線以及雙點劃線「DASHDOTDOT」時進行處理;其後使用ObjectGetDouble以取得當時的線條價格。
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);
指定水平線的價格觸及條件
接下來,將寫入當價格在水平線的下方向上觸及、以及在水平線的上方向下觸及時,會發出警示通知的編碼。「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)){其次,在for文體之前增加下列if文體,便可以設置為每根K線只通知一次。
string text = _Symbol + ” Touch line. ” + DoubleToString(Bid, _Digits);
Alert(text);
static datetime timeAlert;更甚,在「Alert(text);」下方添加以下編碼,即可在通知時寫入目前的時間週期。
if (Time[0] > timeAlert)
timeAlert = Time[0];若在此編譯完成,便能在價格觸及雙點劃線的水平線時發出鳴響警示;只要在圖表上進行設定,並在K線上拉出雙點劃線的水平線,即可確認警示通知。
break;
以鍵盤變更水平線的線條種類
接下來,將透過鍵盤的操作,來變更所選水平線的線條種類。首先將宣告函數以外的全域變數;在檔案上方的一般屬性內容之下宣告「string NAME;」,並在「OnChartEvent」之下寫入以下if文體。如此一來,若點擊的物件處於已被選擇的狀態,便會記憶該物件的名稱。
if (id == CHARTEVENT_OBJECT_CLICK){透過本次的設定,將在按下鍵盤「A」鍵時變更水平線的線條種類。
if (ObjectGetInteger(0, sparam, OBJPROP_SELECTED)) NAME = sparam;
}
鍵盤「A」鍵在處理程序中位於第30號,而「sparam」代表按下按鍵的編號;故應追加以下的if文體,以便在「sparam」為「30」時進行處理。此指示可取得目前的線條種類,並在所選物件符合雙點劃線時變更為實線、不符合時則變更為雙點劃線(※變數sparam會依照CHARTEVENT的種類來變化數值。
如欲確認各個事件的內容,可參考MQL5幫助檔>事件處理>OnChartEvent)。
if (id == CHARTEVENT_OBJECT_CLICK){如此進行編譯,即可在選擇雙點劃線的狀態下,按下鍵盤「A」鍵來替換為實線;新添加的水平線亦可進行相同的動作。觸及實線水平線時並不會發出警示通知,觸及設定為雙點劃線的水平線時才會。
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);
}
}
}
原始碼
本次製作的原始碼如以下所示。//+——————————————————————+
//| 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自動程式交易的基本知識,以及在MT4/MT5平台上的安裝、參數設定方法、編碼等等內容。另外,對持有OANDA帳戶的客戶,還可以免費使用我們的獨有EA與指標工具。
誠邀您參加全球知名外匯經紀商OANDA的自營交易(Prop Trader)
報名OANDA自營交易(Prop Trader),並通過我們的考核,您就可以使用OANDA提供的資金進行交易,獲得高達90%的交易利潤分成。
全面升級——更多功能、更大靈活性!
優化了“固定最大虧損”,“每日虧損限制”等。查看詳情全新「Boost」計劃
500,000美元交易資金
您可以使用最高500,000美元的資金進行交易。
豐富的交易商品
您可以交易包括外匯、黃金、原油、股票指數等多種商品。