誠邀您參加全球知名外匯經紀商OANDA的自營交易(Prop Trader)
報名OANDA自營交易(Prop Trader),並通過我們的考核,您就可以使用OANDA提供的資金進行交易,獲得高達90%的交易利潤分成。
全面升級——更多功能、更大靈活性!
優化了“固定最大虧損”,“每日虧損限制”等。查看詳情全新「Boost」計劃
500,000美元交易資金
您可以使用最高500,000美元的資金進行交易。
豐富的交易商品
您可以交易包括外匯、黃金、原油、股票指數等多種商品。
什麼是EA(自動交易)?說明使用移動平均線(MA)製作一個簡單的EA
什麼是EA?
EA是Expert Adviser的簡稱,是一種可以代替交易者進行自動交易的程式。EA有多種類型,有從下單到平倉全部程序都自動交易型,還有只在平倉時手動的半自動型。
本篇文章將介紹如何製作一個簡單的EA。
所有的自動交易都是EA嗎?
雖然把自動交易程式稱為EA,實際上主要是對於MT4或MT5中所製作的程式。
在外匯交易中除了EA之外,還有外匯經紀商獨自的自動交易程式。
另外,在加密貨幣的行業中,把自動交易程式稱為「bot」,或是直接稱為「自動交易工具」。
規格
首先整理要製作的EA規格。雖然也可以馬上編寫程式,但是,整理好規格的話可以提高編寫效率。
下單條件
當短期MA和長期MA黃金交叉時下買單。當短期MA和長期MA死亡交叉時下賣單。
平倉條件
這次,平倉是用手動進行,所以不設置平倉邏輯。其他條件
透過滑點和點擊來限制下單。同時只能持有一個部位。
可以修改Magic Number和手數。
製作EA
程式按照「預處理器」、「欄位」、「函數(OnInit)」「函數(OnInit以外)」的順序進行編寫。預處理器 | 在mql4程式被編寫之前執行的預處理。 指定程式版權和版本。 |
---|---|
欄位 | 儲存在程式中所使用的的各種數據。 |
函數 | 把特定動作同一歸納在一起的部分。 |
預處理器
#property copyright "Copyright 2018, MetaQuotes Software Corp."在創建新的EA時,默認會提高一個模板方案。
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
這次製作的EA將使用默認的預處理器。
關於「copyright」和「link」,主要是把製作的EA送給其他人時所顯示部分,如果只是個人使用的話刪除也沒有問題。
欄位
input int MAGICMA = 23498721; // Magic Number當在欄位中聲明一個變量時,在語句前面加入「input」的話,用戶就可以在MT4中修改參數。
input double Lots =0.01; // 1手為10萬貨幣
input int Slippage = 4; // 限制下單的滑點
input double MaxSpread = 5; // 限制下單的點差
input int MAPeriod1 = 12; // 短期均線週期
input int MAPeriod2 = 96; // 長期均線週期
input ENUM_MA_METHOD MAMethod = MODE_SMA; // 種類
input ENUM_APPLIED_PRICE MAAppliedPrice = PRICE_CLOSE; // 應用價格
double dSpread;
對於這次EA的基本要素「Magic Number」、「手數」、「滑點限制」、「點差限制」、以及決定下單時所使用的移動平均線的「短期週期」、「長期週期」、「種類」、「應用價格」,都可以進行修改。
變量「dSpread」是一個計算和存儲點差值的變量。
OnTick函數
int OnInit()OnInit函數是製作新EA時默認提供的函數。
{
return(INIT_SUCCEEDED);
}
將EA設置在MT4的圖表上的那一刻,在這個函數中所描述的代碼將會被執行。
因此,在這個OnInit函數內需要描述「設置EA的那一刻就進行處理」。
不過,這次製作的EA不需要在設置的那一刻就進行處理,所以也不需要編寫。
OnInit函數
void OnTick()OnTick函數與OnInit函數一樣,也是在製作新EA時默認提供的函數。
{
dSpread = (Ask - Bid) / (Point * 10);
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();
}
這個函數是當MT4圖表的Tick每次更新時都會執行。
主要是描述「EA的下單和平倉」等重要處理。
在「dSpread」中將會存儲根據Ask(買値)與Bid(売値)之間的差值所計算的點差值。
點差值根據每個Tick出現變化時,都會在OnTIck函數中進行計算。
「if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();」的語句代表「現在持有的部位為0,並且當點差低於在參數中的點差限制時進行下單」。
CalculateCurrentOrders函數是讀取現在持有的部位數量的函數。
CheckForOpen函數是實際進行下單的函數。
OnInit函數與OnTick函數是不是一定需要?
OnInit函數與OnTick函數雖然有默認提供,但是,並不是說一定要描述。例如,即使刪除OnInit函數也可以編寫。
但是,如果把OnInit函數和OnTick函數都刪除的話,在編寫時就會出現錯誤。
CalculateCurrentOrders函數
int CalculateCurrentOrders()CalculateCurrentOrders函數是讀取當前持有的部位數量。
{
int positions = 0;
for(int i=0;i{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
positions++;
}
}
return positions;
}
CheckForOpen函數
void CheckForOpen()CheckForOpen函數是判斷移動平均線是否黃金交叉或死亡交叉。
{
int res;
double ma1 = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma2 = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma1_before = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,2);
double ma2_before = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,2);
if(ma1 > ma2 && ma1_before <= ma2_before)
{
res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,"", MAGICMA, 0, Red);
}
if(ma1 < ma2 && ma1_before >= ma2_before)
{
res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", MAGICMA, 0, Blue);
}
}
如果是黃金交叉的話就買入,如果是死亡交叉的話就賣出。
判斷黃金交叉的條件為「前1根K線的短期移動平均線小於長期移動平均線,而當前K線的短期移動平均線大於長期移動平均線」。
一旦滿足了交叉的條件,就會使用OrderSend函數進行下單。
把第5個參數指定為限制滑點的參數的話,就會自動執行滑點限制。
源碼
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int MAGICMA = 23498721; // Magic Number
input double Lots =0.01; // 1手為10萬貨幣
input int Slippage = 4; // 限制下單的滑點
input double MaxSpread = 5; // 限制下單的點差
input int MAPeriod1 = 12; // 短期均線週期
input int MAPeriod2 = 96; // 長期均線週期
input ENUM_MA_METHOD MAMethod = MODE_SMA; // 種類
input ENUM_APPLIED_PRICE MAAppliedPrice = PRICE_CLOSE; // 應用價格
double dSpread;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnTick()
{
dSpread = (Ask - Bid) / (Point * 10);
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();//如果沒有部位的話可以持有部位
}
void CheckForOpen()
{
int res;
double ma1 = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma2 = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,1);
double ma1_before = iMA(Symbol(), Period(), MAPeriod1, NULL ,MAMethod ,MAAppliedPrice ,2);
double ma2_before = iMA(Symbol(), Period(), MAPeriod2, NULL ,MAMethod ,MAAppliedPrice ,2);
if(ma1 > ma2 && ma1_before <= ma2_before)
{
res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,"", MAGICMA, 0, Red);
}
if(ma1 < ma2 && ma1_before >= ma2_before)
{
res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", MAGICMA, 0, Blue);
}
}
int CalculateCurrentOrders()
{
int positions = 0;
for(int i=0;i{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
positions++;
}
}
return positions;
}
將EA自動程式交易應用於外匯與差價合約交易中
我們以圖文形式詳細介紹有關EA自動程式交易的基本知識,以及在MT4/MT5平台上的安裝、參數設定方法、編碼等等內容。另外,對持有OANDA帳戶的客戶,還可以免費使用我們的獨有EA與指標工具。
誠邀您參加全球知名外匯經紀商OANDA的自營交易(Prop Trader)
報名OANDA自營交易(Prop Trader),並通過我們的考核,您就可以使用OANDA提供的資金進行交易,獲得高達90%的交易利潤分成。
全面升級——更多功能、更大靈活性!
優化了“固定最大虧損”,“每日虧損限制”等。查看詳情全新「Boost」計劃
500,000美元交易資金
您可以使用最高500,000美元的資金進行交易。
豐富的交易商品
您可以交易包括外匯、黃金、原油、股票指數等多種商品。