程式交易教學

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

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



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

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

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

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



在早盤頭皮EA中加入馬丁格爾策略功能【複製源碼就可以使用】


上篇文章中介紹了在簡單的時間限制以及逆勢交易邏輯中,加入追蹤停損的話會有什麼影響。

本篇文章將介紹「追蹤停損」以外,如果加入「馬丁格爾策略」的話會有什麼樣的結果。

馬丁格爾策略主要是作為賭場策略而開發的

策略非常簡單,就是把賭金一直加倍到盈利為止。

外匯交易中的馬丁格爾策略一般都是加2倍手數。

馬丁格爾策略的優點和缺點

以下為馬丁格爾策略的優點和缺點。

優點

優點是一次就可以賺回之前的全部虧損

一般來說,一次虧損需要2次盈利才可以獲利,而馬丁格爾策略且只需要一次盈利就可以。

缺點

缺點就是,如果連續虧損的話資金馬上就會用完

在外匯交易中,每筆交易都是獨立的,因此也有可能會出現連續虧損。

所以,在交易時需要充分的資金。

例如,初次下單是0.01手,連續虧損10次時,在第11次的手數就會變成10.24手。

馬丁格爾策略就是如果資金不夠就會馬上爆倉。

在外匯交易中需要對馬丁格爾的注意事項

馬丁格爾雖然有介紹說「一次就可以賺回全部虧損」,但這只限於與停損幅度與停利幅度相同時,如果停損幅度高於停利幅度的話一次不能賺回全部虧損。

在外匯交易中,根據點差以及下單時機等因素,並不只是按照加碼2倍來計算這麼簡單

說明

首先介紹上次製作的EA。

・下單

時間在台灣時間清晨,並且RSI低於超賣線時下多單

時間在台灣時間清晨,並且RSI高於超買線時下空單

・平倉

根據停利價格和停損價格平倉

・其他

Copyright設置為「OANDA」

透過滑點和點差限制下單數量

設置為只能持有1個部位

可以修改Magic Number和手數

以上內容是上次製作的EA。

這次在以上內容中加入可以設置馬丁格爾次數的參數。

如果這個參數是「3」時,代表可以加碼3次,每次2倍手數。

如果連續虧損4次時,就不在加碼2倍,只按當時的價格下單。

製作EA

本程式是以上次的「製作早盤頭皮EA」為基礎製作,所以跳過上次內容,本篇文章至介紹加入的功能。

領域

input int MAGICMA = 23198721; // Magic Number
input double Lots =0.01; // 1手為10萬貨幣
input int Slippage = 4; // 限制下單滑點
input double MaxSpread = 5; // 限制下單點差
input double TakeProfit = 10.0; // 停利點數(pips)
input double LossCut = 20.0; // 停損點數(pips)
input int RSIPeriod=6; // 週期
input ENUM_APPLIED_PRICE RSIAppliedPrice = PRICE_CLOSE; // 價格來源
input int UpLine = 85; // 上線
input int DownLine = 25; // 下線
input int TradeTime = 0; // 交易時間

//設置馬丁格爾
input int NumMartin = 5; // 在馬丁格爾中加倍加碼的最大次數

在上次的參數中最後添加了NumMartin參數。

OnTick函數

void OnTick()
{
dSpread = (Ask - Bid) / (Point * 10);
int loseCount = 0; //虧損次數
for( int i= OrdersHistoryTotal()-1; i>=0; i-- ){ //①
if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == true && OrderMagicNumber() == MAGICMA && OrderSymbol() == Symbol() ){
if( OrderProfit() <= 0 ){ //②
if(loseCount >= NumMartin)break; //③
loseCount++; //②
}
else{
break;
}
}
}
double lot = Lots * MathPow(2, loseCount); //④
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen(lot); //⑤
}
以上為OnTick函數。
    ①執行馬丁格爾時會根據最近交易的虧損次數來決定手數。
    因此,OnTick函數開始會先查看以往交易的虧損次數。

    ②根據 「OrderProfit() < =0」這個條件,如果盈虧小於0時,「loseCount」變量將會遞增加1。

    ③ loseCount的數值不能超過NumMartin參數的數值。

    ④ 根據loseCount的次數計算手數。
    MathPow只返回第1個參數的數值乘以第2個參數的數值。

    ⑤ 作為參數傳給CheckForOpen函數。

CheckForOpen函數

void CheckForOpen(double int lot)
{
int res;
double RSI = iRSI(Symbol(), 0, RSIPeriod, RSIAppliedPrice, 1);
if(TradeTime == TimeHour(Time[1]))
{
if(RSI < DownLine)
{
res=OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, Bid - TrailWidth * Point * 10, Ask + TakeProfit * Point * 10,"", MAGICMA, 0, Red);
}
if(RSI > UpLine)
{
res=OrderSend(Symbol(), OP_SELL, lot, Bid, Slippage, Ask + TrailWidth * Point * 10, Bid - TakeProfit * Point * 10, "", MAGICMA, 0, Blue);
}
}
}
這次手數會在OnTick函數中計算,因此可以將手數指定為函數。

不要忘記在OrderSend函數的第3個參數中指定接受的手數。

回測結果

這次製作的馬丁格爾EA與上次製作的只開一部位EA的回測結果進行比較。

回測條件如下。
    貨幣對:GBPUSD
    時間週期:5分鐘
    時間:從2018年1月1日至2023年1月1日的5年時間
    點差:固定為15

一部位EA

一部位EA

馬丁格爾EA

馬丁格爾EA

可以看到,在曲線圖的下方有顯示綠色柱狀圖

這是下單時的手數。

也就是說,綠色柱狀長的地方也就是連續虧損的地方。

從成績上來說,在交易次數、盈利因子、勝率等項目中高於一部位EA。

但是,由於手數會增加,所以最大回撤也高於一部位EA。

主要事項

這次回測是在固定點差中進行。

台灣時間早盤的特徵是,市場波動相對較小,點差容易擴大。

在實際操作中需要充分注意點差,對點差設置限制等措施。

馬丁格爾策略有可能會在一瞬間就會失去全部資金,在使用時還請多加注意

完整源碼

#property copyright "Copyright(C) 2023, OANDA"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

input int MAGICMA = 23198721; // Magic Number
input double Lots =0.01; // 1手為10萬貨幣
input int Slippage = 4; // 限制下單滑點
input double MaxSpread = 5; // 限制下單點差
input double TakeProfit = 10.0; // 停利點數(pips)
input double LossCut = 20.0; // 停損點數(pips)
input int RSIPeriod=6; // 週期
input ENUM_APPLIED_PRICE RSIAppliedPrice = PRICE_CLOSE; // 價格來源
input int UpLine = 85; // 上線
input int DownLine = 25; // 下線
input int TradeTime = 0; // 交易時間

//設置馬丁格爾
input int NumMartin = 5; // 在馬丁格爾中加倍加碼的最大次數

double dSpread;

int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnTick()
{
dSpread = (Ask - Bid) / (Point * 10);

int loseCount = 0; //虧損次數
for( int i= OrdersHistoryTotal()-1; i>=0; i-- ){
if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == true && OrderMagicNumber() == MAGICMA && OrderSymbol() == Symbol() ){
if( OrderProfit() <= 0 ){
if(loseCount >= NumMartin)break;
loseCount++;
}
else{
break;
}
}
}
double lot = Lots * MathPow(2, loseCount);
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen(lot);

}
void CheckForOpen(double lot)
{
int res;
double RSI = iRSI(Symbol(), 0, RSIPeriod, RSIAppliedPrice, 1);
if(TradeTime == TimeHour(Time[1]))
{
if(RSI < DownLine)
{
res=OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, Bid - LossCut * Point * 10, Ask + TakeProfit * Point * 10,"", MAGICMA, 0, Red);
}
if(RSI > UpLine)
{
res=OrderSend(Symbol(), OP_SELL, lot, Bid, Slippage, Ask + LossCut * Point * 10, Bid - TakeProfit * Point * 10, "", 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提供的資金進行交易,獲得高達80%的交易利潤分成。



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

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

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

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