返回列表 发帖

MT4自带的EA:Moving Average 详解

MT4自带的EA:Moving Average 详解
' K2 W0 T4 G" S% ]' b/ L( a2 t/ p" Z- a* f$ x. o5 H& f/ c
//+------------------------------------------------------------------+: F- j7 s$ d" A- X2 g" l
//| Moving Average.mq4 |- J- F4 n" _% s* ]+ r3 Q$ M5 g
//| Copyright ?2005, MetaQuotes Software Corp. |9 e, O5 w" P: K8 m
//+------------------------------------------------------------------+: R& q* }+ h: \, L/ w8 Y2 ~- k
#define MAGICMA 20050610 //定义本EA操作的订单的唯一标识号码
6 H( K2 a) ^8 {! k) x. f' x5 ]7 ]4 e+ x+ x4 N$ I5 S/ H
extern double Lots = 0.1;//每单的交易量
: n2 j+ f" H: r% y. Z4 R# a% g4 {extern double MaximumRisk = 0.02;//作者定义的最大风险参数
: G* n! ]6 Z# O1 Wextern double DecreaseFactor = 3;//作者定义的参数,作用要看程序中的用法% u6 i. o. C, R  c$ n7 T) c- ^( \
extern double MovingPeriod = 10;//EA中使用的均线的周期7 r) w) e0 g) k
extern double MovingShift =3;//EA中使用的均线向左的K线偏移量
! p3 l7 _4 w+ D, W4 t7 Q1 p//+------------------------------------------------------------------+
$ G# K% B& e) u//| Calculate open positions |
. |/ n+ ]. z( E; M/ x//+------------------------------------------------------------------+- W( K4 j: }& }
int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓订单的数量
9 x: N; B+ e, z) b7 X{
7 o' U) z% x( \0 F$ zint buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
( d3 p* X+ x0 X//----" G# S8 m8 F' y) q
for(int i=0;i$ J4 b  |& s  |- C0 ~. E' K! t
{  ?1 n' V0 H' Q+ P$ D
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持仓单的每一个订单位置  i2 p! ^  n9 r+ o; y
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根据订单位置,比较是否是当前K线商品以及订单唯一标识号是否和本程序设置的一致(用于避免EA误操作其他程序控制的持仓单)
# ^1 Y& @$ u7 c' h{
4 E2 ~$ Q. @; M7 m/ h6 F0 H# u; pif(OrderType()==OP_BUY) buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加1
. ?; ]2 B; s: v  _  vif(OrderType()==OP_SELL) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1
" u  |/ w4 D& l) A6 v3 M}; e/ K+ w8 g' u4 c% u/ p& y
}  {8 R/ u/ C8 r- X# s' s- p
//---- return orders volume
3 c( I, ^3 F9 d8 cif(buys>0) return(buys);7 O. H7 U. `3 y( A  }% s3 w
else return(-sells);//本函数返回查询计算结束时的持仓单的个数。. O) X/ |3 h  u# w& n
}$ |& k# ^4 T- D2 N
//+------------------------------------------------------------------+& Y" W; ?) d' c6 d
//| Calculate optimal lot size |
& Z& g. Z) V6 @: R' W+ U//+------------------------------------------------------------------+
% F2 i8 o4 R& A& r9 x1 t  e$ udouble LotsOptimized()//函数目的,根据要求 计算出订单交易量
* R8 K, e9 ]3 U) G{
+ u/ b6 p" o* `+ w7 Wdouble lot=Lots;$ N" ^- ?% J" P( {
int orders=HistoryTotal(); // history orders total 历史出场订单的个数
8 [* Y4 x1 W( g" ]int losses=0; // number of losses orders without a break$ @! a" a( _9 W0 Z" r& k; C2 c
//---- select lot size
& L9 T( c! @( G. m$ {6 P3 Tlot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量5 b/ M: r5 v1 t! @$ o( ^
//---- calcuulate number of losses orders without a break
& I8 @& i9 m/ S) k. lif(DecreaseFactor>0), {6 Z3 d+ h4 y, u0 ~: E, X
{. j, V/ `- @: i7 T2 K0 o6 N3 K! n7 c
for(int i=orders-1;i>=0;i--)1 u# J+ u. ~  l/ I
{
- i& v# Y9 b" u9 _& Uif(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循环查询出场单队列
5 C: ~8 O4 h0 p0 ?. S" Aif(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
8 V) i$ u: @  z! m# Q7 G+ n& h: d$ O//----
! W8 p; b# W+ S5 `if(OrderProfit()>0) break;
. K3 Y8 z4 I8 T% V. w# I* yif(OrderProfit()<0) losses++;//循环计算所有出场亏损单的亏损总和
) y/ x( ]4 c+ V7 `* z) H& p2 {' s9 Y}
( N0 a( c7 Z! iif(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。! f' Y+ J; j$ L) G) F: A+ J$ ]
}4 }2 \/ t+ L' B5 B
//---- return lot size" [, O  J2 Q* M( U  O& ~) |
if(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量; f; V/ h2 Q1 U# o: E  \  Q
return(lot);: T# P7 z  A& n3 ~3 g
}' R$ z1 O( }; u& _( s4 s$ J
//+------------------------------------------------------------------+
* R4 @3 E' X" p- I; h& j9 n! E//| Check for open order conditions |  F: J" T/ p6 H3 W/ B
//+------------------------------------------------------------------+
2 G* v" t. U4 E8 l% U, mvoid CheckForOpen()//检查入场条件的情况并作处理
/ Y7 S5 c# J/ M2 p- ?- X{! I  _1 z: F2 a; ~! ~
double ma;
: Y+ S' Y" ?* H: Xint res;) u% d& Q" B- M& V9 ~7 W5 b2 V
//---- go trading only for first tiks of new bar
# M: W8 K% `" l5 X5 ?7 Gif(Volume[0]>1) return;//如果当前K线持仓量大于1,说明不是K线的开盘时间点,则直接返回 否则是K线第一个价格,则继续下面的过程0 c4 s# \# r9 R& }. C8 `4 U
//---- get Moving Average1 Y& P$ q$ V: Q' P/ @
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//获得当前的均线数值
1 i" K+ K8 \, b. E//---- sell conditions/ v# z1 x0 R  e- K1 c
if(Open[1]>ma && Close[1]4 H' L1 G! q6 l2 H, i
{/ Q- R! e4 u7 |( n( F
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);9 o% P! f( _, J
return;1 H% d. t& |8 D* @  w& f) i) I
}  t) O! H1 N) q9 F- J% q
//---- buy conditions  K$ {6 q) e9 a# D
if(Open[1]ma) //如当前K开盘价小于均线,而前一K收盘价大于均线,则发出入场空单
7 T2 x, r( U; g, x{" o0 {, z2 N* ?
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
+ C- d6 ?7 ^8 i) ^$ {' B1 M0 dreturn;% R- D! k( d2 d3 ~0 v! r6 P" G
}
+ N' k  U2 Q; i: c" a% z5 b: W//----; K- w" u9 _. S9 V) u% }4 X
}
  c7 f  J$ a) y//+------------------------------------------------------------------+2 J# c4 |; z' W
//| Check for close order conditions |
5 I2 v. U2 p, `//+------------------------------------------------------------------+
% |# u3 A. \  q: P2 A6 |void CheckForClose()//检查出场条件的情况并作处理
5 r: Q2 K6 q$ h. E$ E{+ a8 Y# M' o) X4 D" P- H: n( i; K
double ma;5 R: P% [2 U; h, f
//---- go trading only for first tiks of new bar) U- M0 p4 y% l  {. G/ h& l& V
if(Volume[0]>1) return;
1 L+ B/ |* W" f: ]9 L% J$ W" d//---- get Moving Average1 Y2 d3 z% L0 q" m9 Z& W8 F) m
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);1 |9 _6 c8 |: `5 P# Q" e' R
//----+ H( Y) j, I6 H& }) n
for(int i=0;i
- _  ?5 j8 z6 v8 j8 h{
3 W: G$ _9 i# Gif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
/ y, l* E+ C! ^* h, B  X" h* vif(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;, N6 _7 J# m+ L# q& U0 m
//---- check order type
$ ^" H7 h, P+ B$ b) y! a* U+ mif(OrderType()==OP_BUY)/ T5 ^8 b8 Q* c- e( F, B
{
9 d$ S6 F8 @4 E9 w* Gif(Open[1]>ma && Close[1]1 F3 U; [2 D; u. ~6 j9 @
break;
% t' E- I9 b  [, G}
. ~5 V+ z( _3 u0 p: `( Nif(OrderType()==OP_SELL)( k. B1 d4 G7 f$ U( X9 D
{
+ {3 ^& F6 Q6 O, ~! S& m5 bif(Open[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持仓是空单,则当当前K开盘价大于均线,而前一K收盘价小于均线,则发出平仓指令& N0 \% C: L- r( h, P& _
- u& t4 l8 \+ I7 g. ?3 @5 Z! F4 x
break;
! b# O1 M& ]1 @* a7 ?7 @}5 Z/ v; @' H4 C, S$ ?0 T$ \
}, i  }+ `, ~, g, h* f- d
//----
5 D2 A$ W4 Q+ {7 O6 J" g. q}
% ]/ y8 \* R- B& j3 b//+------------------------------------------------------------------+
0 i2 h5 [* }( W- a0 `- W//| Start function |
# z1 ?) _) M% R6 S/ ^//+------------------------------------------------------------------+; t) |8 u- z- y/ S7 m
void start()//主循环过程* h! R1 ?* D, E$ v- I: O8 i" R# Z
{
; X: w. t8 i7 w4 k$ n7 D//---- check for history and trading
( E5 [- Q9 o1 g6 W9 Zif(Bars<100 || IsTradeAllowed()==false) return;
8 b6 L1 Z% l. b! U( H//---- calculate open orders by current symbol) W/ @% C" b+ g  g
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
1 n' _+ T# }0 D  }: K" f* U; _else CheckForClose();; `9 [# ^, v% a% e  I
//----
$ _, k1 q! }6 G. V}6 G4 `; J; ~. ~2 l
//+------------------------------------------------------------------+6 i0 b6 X4 ]( @5 I% n8 G
& k( Z% F( W4 ?4 _7 D" h' |

# N# p4 U3 a" w' X: w6 O8 \汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

返回列表

站长推荐 关闭


EXNESS外汇平台开户流程

EXNESS外汇平台开户流程 EXNESS(杠杆高达1:1000,可交易外汇、期货、股票等,点差0.4点起,没有任何交易限制)。取款瞬间到帐。 ...


查看