欧美人与禽2O2O性论交,秋霞免费视频,国产美女视频免费观看网址,国产成人亚洲综合网色欲网

MT4 EA編程入門,自帶移動(dòng)平均線策略,代碼解析與回測(cè)(手機(jī)mt4有ema移動(dòng)平均線)

MT4 EA編程入門,自帶移動(dòng)平均線策略,代碼解析與回測(cè)(手機(jī)mt4有ema移動(dòng)平均線)

mt4軟件自帶兩個(gè)ea交易策略,macd和moving average(ma),這里解析的是ma。

一、策略思路

K線上穿均線時(shí),如果無倉,則開多倉,如果有空倉,則平倉;

K線下穿均線時(shí),如果無倉,則開空倉,如果有多倉,則平倉。

二、代碼解析

//雙斜線后為注釋內(nèi)容,對(duì)程序執(zhí)行沒影響。注:綠色字體為我的注釋,黑色注釋為原程序自帶。

#define MAGICMA 20210201//全局標(biāo)識(shí),用于區(qū)分該策略與別的策略,在對(duì)單子進(jìn)行篩選時(shí)會(huì)用到,確保該策略不會(huì)操作其它策略的單子

//— Inputs(輸入變量,這些變量允許用戶輸入,也可以加載、保存,如下圖所示)

MT4 EA編程入門,自帶移動(dòng)平均線策略,代碼解析與回測(cè)(手機(jī)mt4有ema移動(dòng)平均線)

input double Lots =0.1;//下單手?jǐn)?shù)

input double MaximumRisk =0.02;//可用的最大資金比例2%

input double DecreaseFactor=3;//作者自己定義的數(shù)據(jù),通過下文可以看到,影響下單量

input int MovingPeriod =12;//移動(dòng)平均線周期

input int MovingShift =6;//均線向左的偏移量

//| Calculate Open positions |

//計(jì)算當(dāng)前開單的數(shù)量,包括買單和賣單,不考慮鎖單的情況,只有買單、賣單、空倉三種情況

int CalculateCurrentOrders(string Symbol)

{

int buys=0,sells=0;(初始化買單數(shù)和賣單數(shù)為0)

for(int i=0;i<OrdersTotal();i )

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)

(單子的貨幣對(duì)是當(dāng)前的貨幣對(duì),并且策略標(biāo)識(shí)符是該策略的)

{

if(OrderType()==OP_BUY) buys ;

if(OrderType()==OP_SELL) sells ;

//訂單類型為整數(shù)型,0-BUY,1-SELL,2-BUYLIMT,3-BUYSTOP,4-SELLLIMT,5-SELLSTOP,下文中還會(huì)用到“>OP_SELL”代表掛單

}

}

if(buys>0) return(buys);

else return(-sells);

(如果買單數(shù)大于0,返回買單數(shù),否則返回賣單數(shù)的負(fù)數(shù),如果空倉就會(huì)返回0。)

}

//| Calculate optimal lot size |//計(jì)算下單的數(shù)量

double LotsOptimized()

{

double lot=Lots;

int orders=HistoryTotal(); // history orders total

int losses=0; // number of losses orders without a break虧損的單量

//— select lot size

lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//— calcuulate number of losses orders without a break

if(DecreaseFactor>0)

{

for(int i=orders-1;i>=0;i–)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)

{

Print("Error in history!");

break;

}

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)

continue;

//—當(dāng)不是買單和賣單時(shí)(比如掛單),繼續(xù)

if(OrderProfit()>0) break;

if(OrderProfit()<0) losses ;//利潤小于0的,虧單數(shù) 1

}

if(losses>1)

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

//修正下單量, 如果 虧損單數(shù)>1時(shí),則重新計(jì)算下單量,并保留小數(shù)點(diǎn)后1位,其計(jì)算公式為:下單量=(lot-lot*losses/DecreaseFactor(=3))。

}

//— return lot size

if(lot<0.1) lot=0.1;

return(lot);

}

//| Check for open order conditions |(建倉函數(shù))

void CheckForOpen()

{

double ma;

int res;

//— go trading only for first tiks of new bar

if(Volume[0]>1) return;

//只有在新K線的首次報(bào)價(jià)時(shí)執(zhí)行,如果當(dāng)前K線的成交價(jià)次數(shù)大于1時(shí),返回。
(不是K線的開盤時(shí)間點(diǎn),即當(dāng)前k線還沒收盤確定,則直接返回;否則,如果是K線第一個(gè)成交價(jià),則向下繼續(xù)運(yùn)行)

//— get Moving Average計(jì)算ma值

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_Close,0);

//— sell conditions

if(Open[1]>ma && Close[1]<ma)

// 如果前1根K線下穿均線(即K線的開盤價(jià)大于均線值、收盤價(jià)小于均線值)

{

res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);

// 發(fā)送倉單(當(dāng)前貨幣對(duì),賣出方向,開倉量計(jì)算(),買價(jià),滑點(diǎn)=3,無止損,無止贏,訂單編號(hào),標(biāo)上紅色箭頭)

return;

}

//— buy conditions

if(Open[1]<ma && Close[1]>ma)

// 如果前1根K線上穿均線(即K線的開盤價(jià)小于均線值、收盤價(jià)大于均線值)

{

res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);

// 發(fā)送倉單(當(dāng)前貨幣對(duì),買入方向,開倉量計(jì)算(),賣價(jià),滑點(diǎn)=3,無止損,無止贏,訂單編號(hào),標(biāo)上藍(lán)色箭頭)

return;

}

}

//| Check for close order conditions |(平倉函數(shù))

void CheckForClose()

{

double ma;

//— go trading only for first tiks of new bar

if(Volume[0]>1) return;

//— get Moving Average

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//—

for(int i=0;i<OrdersTotal();i )

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

// 如果 沒有本系統(tǒng)所交易的倉單時(shí),跳出循環(huán)

if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

// 如果 倉單編號(hào)不是本系統(tǒng)編號(hào),或者 倉單貨幣對(duì)不是當(dāng)前貨幣對(duì)時(shí),繼續(xù)選擇

//— check order type

if(OrderType()==OP_BUY)

{

if(Open[1]>ma && Close[1]<ma)

{

if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))

// 如果第1根K線開盤價(jià)下穿均線(即開盤價(jià)高于均價(jià)而收盤價(jià)低于均價(jià)),則進(jìn)行多頭平倉(倉單編號(hào),持倉數(shù)量,買價(jià),滑點(diǎn)=3,用白色箭頭顯示)

Print("OrderClose error ",GetLastError());

}

break;

}

if(OrderType()==OP_SELL)

{

if(Open[1]<ma && Close[1]>ma)

{

if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))

// 如果第1根K線開盤價(jià)上穿均線(即開盤價(jià)低于均價(jià)而收盤價(jià)高于均價(jià)),則進(jìn)行空頭平倉(倉單編號(hào),持倉數(shù)量,賣價(jià),滑點(diǎn)=3,用白色箭頭顯示)

Print("OrderClose error ",GetLastError());

}

break;

}

}

}

//| OnTick function |(循環(huán)函數(shù),每更新一次數(shù)據(jù)執(zhí)行一次函數(shù))

void OnTick()

{

//— check for history and trading

if(Bars<100 || IsTradeAllowed()==false)

//K線數(shù)小于100或不允許智能交易時(shí),返回

return;

//— calculate open orders by current symbol

if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();

else CheckForClose();

//如果當(dāng)前無單,進(jìn)入建倉函數(shù),否則進(jìn)入平倉函數(shù)

}

三、策略回測(cè)

回測(cè)時(shí),需要先下載歷史數(shù)據(jù),工具—歷史數(shù)據(jù)中心—選擇標(biāo)的對(duì)象,下載。

這里選擇了歐美貨幣對(duì),打開策略測(cè)試窗口,按鈕在新訂單左邊,或是按快捷鍵ctrl r,進(jìn)行如下設(shè)置:

選擇交易策略、交易品種、ma時(shí)間周期、測(cè)試時(shí)間區(qū)間。

MT4 EA編程入門,自帶移動(dòng)平均線策略,代碼解析與回測(cè)(手機(jī)mt4有ema移動(dòng)平均線)

點(diǎn)擊開始,進(jìn)行測(cè)試,結(jié)果如下:

MT4 EA編程入門,自帶移動(dòng)平均線策略,代碼解析與回測(cè)(手機(jī)mt4有ema移動(dòng)平均線)MT4 EA編程入門,自帶移動(dòng)平均線策略,代碼解析與回測(cè)(手機(jī)mt4有ema移動(dòng)平均線)

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢
分享本頁
返回頂部