程式交易教學

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

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



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

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."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
在創建新的EA時,默認會提高一個模板方案。

這次製作的EA將使用默認的預處理器。

關於「copyright」和「link」,主要是把製作的EA送給其他人時所顯示部分,如果只是個人使用的話刪除也沒有問題。

欄位

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;
當在欄位中聲明一個變量時,在語句前面加入「input」的話,用戶就可以在MT4中修改參數。

EMA輸入參數

對於這次EA的基本要素「Magic Number」、「手數」、「滑點限制」、「點差限制」、以及決定下單時所使用的移動平均線的「短期週期」、「長期週期」、「種類」、「應用價格」,都可以進行修改。

變量「dSpread」是一個計算和存儲點差值的變量。

OnTick函數

int OnInit()
{
return(INIT_SUCCEEDED);
}
OnInit函數是製作新EA時默認提供的函數。

將EA設置在MT4的圖表上的那一刻,在這個函數中所描述的代碼將會被執行。

因此,在這個OnInit函數內需要描述「設置EA的那一刻就進行處理」。

不過,這次製作的EA不需要在設置的那一刻就進行處理,所以也不需要編寫。

OnInit函數

void OnTick()
{
dSpread = (Ask - Bid) / (Point * 10);
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();
}
OnTick函數與OnInit函數一樣,也是在製作新EA時默認提供的函數。

這個函數是當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()
{
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;
}
CalculateCurrentOrders函數是讀取當前持有的部位數量。

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);
}
}
CheckForOpen函數是判斷移動平均線是否黃金交叉或死亡交叉。

如果是黃金交叉的話就買入,如果是死亡交叉的話就賣出。

判斷黃金交叉的條件為「前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

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

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

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



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

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

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