返回列表 发帖

MT4自带的EA:Moving Average 详解

MT4自带的EA:Moving Average 详解! V, c* h% ]# C! }! x/ m  I) r

8 j# Y* u8 H" K/ U//+------------------------------------------------------------------+7 S9 g' ]) I8 L2 [: S- x8 y6 u
//| Moving Average.mq4 |5 w4 ~+ A, _* a3 d/ b7 [+ ~
//| Copyright ?2005, MetaQuotes Software Corp. |
: W2 k$ V" j% J+ @' W- l//+------------------------------------------------------------------+
* b# h3 `* t; U2 {' [  Y: l#define MAGICMA 20050610 //定义本EA操作的订单的唯一标识号码  I2 I7 g6 C( Z  O, h" I

  Q4 P! c; A' i& G( }' W7 ~0 @extern double Lots = 0.1;//每单的交易量
% l- g* a! u( M4 {, |* t1 Y% ~extern double MaximumRisk = 0.02;//作者定义的最大风险参数
& k( q' |0 A  J0 Y# @, r- `6 l# }  s" hextern double DecreaseFactor = 3;//作者定义的参数,作用要看程序中的用法- K% Q6 F, R+ h9 `) Y7 H' G' Y
extern double MovingPeriod = 10;//EA中使用的均线的周期
. _8 O& P5 |  I) M1 @- W2 c& Iextern double MovingShift =3;//EA中使用的均线向左的K线偏移量
) x' E8 P1 z- E- F/ ?$ J5 C/ H( Y- H//+------------------------------------------------------------------+
4 ], g; t+ m) K; _3 O//| Calculate open positions |6 w# i# T1 A- d, L3 @) z3 D9 L6 u3 ]8 J
//+------------------------------------------------------------------+: T) j6 F5 T) F5 L8 B7 C, R
int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓订单的数量
9 p0 S: s) K9 p- F* o  k9 d8 g) V{4 ?2 F+ f5 e2 P5 p7 k$ ~( b3 C
int buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
( K# e* \( ?5 k% G7 b//----
! H& m- x) N2 d* U  tfor(int i=0;i
4 }) T7 O: h* d; O# r- Q8 y{
* j* Z, D1 F! K% qif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持仓单的每一个订单位置
( |  `* d) @7 e9 j  R9 U+ {! Aif(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根据订单位置,比较是否是当前K线商品以及订单唯一标识号是否和本程序设置的一致(用于避免EA误操作其他程序控制的持仓单)
) A) ^7 F3 N0 P{$ V" P8 V! B) a9 @( g! F
if(OrderType()==OP_BUY) buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加1
. u4 X3 J1 v# S& e* @2 `# hif(OrderType()==OP_SELL) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1- }& [9 [. q/ @  R- j! ]8 Z) Y
}" W* T, m* J8 e3 r0 K, P9 Q8 {
}# W3 h/ W& J1 y4 H. F" S
//---- return orders volume
+ q+ {6 c, L" I! S* C; H1 Cif(buys>0) return(buys);
# `, F5 M% ?1 c% B0 U3 _) f! Jelse return(-sells);//本函数返回查询计算结束时的持仓单的个数。
5 F7 H) X( s7 a0 A3 Z}8 n1 o9 n# K, J) o# J- Y
//+------------------------------------------------------------------+. ^5 P6 b/ M2 t& g& Q
//| Calculate optimal lot size |/ _, Z, F9 x3 C' R
//+------------------------------------------------------------------+
* \2 j& r' Q; S  R- o8 H! Jdouble LotsOptimized()//函数目的,根据要求 计算出订单交易量9 j+ m+ \* C# C
{* Y4 \4 |: a! ^  ]4 }; Q
double lot=Lots;
0 |# c2 {) a, G5 L" }int orders=HistoryTotal(); // history orders total 历史出场订单的个数
5 X- {* U' E2 _int losses=0; // number of losses orders without a break2 H; E) o' J' q  E
//---- select lot size! g6 b) ?3 H( Z5 p
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量2 L7 V. F; Y/ b- y% [" r& ?" P
//---- calcuulate number of losses orders without a break, W9 s- L1 _" A$ g9 g
if(DecreaseFactor>0)
9 j! H- {) i# w+ k' n  O{/ Q% e5 i) R1 f8 m7 U/ h
for(int i=orders-1;i>=0;i--)
" w; F* W4 y0 K{- u1 O& w0 x* @0 @4 s4 g
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循环查询出场单队列6 _4 ^1 t2 j; U7 \. C4 y$ f
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//3 U# U. C1 |2 E
//----
% c+ A  v" M  A( H2 a# |: B5 W" Eif(OrderProfit()>0) break;
; ]4 J9 x, A! S1 y9 `7 q& vif(OrderProfit()<0) losses++;//循环计算所有出场亏损单的亏损总和# o( B3 C. U) l5 M$ A8 O. J
}
) n0 n) q9 D- F$ N" R5 qif(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。
3 ^, h/ W7 ~# \4 X}9 h5 i! E3 H7 L1 O6 ?
//---- return lot size
8 x6 }/ r# o9 m  B! G7 D/ R3 Yif(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量7 \% q! d7 a/ `7 @! C6 y% D7 y
return(lot);+ u: _0 c8 e: G) h
}
, K* f5 i" x7 t4 {  _6 c! B//+------------------------------------------------------------------+
' s4 _, A, P' i+ H8 Q//| Check for open order conditions |, l5 a$ _3 G0 a4 q
//+------------------------------------------------------------------+
4 q7 t6 ~, O2 `8 J4 wvoid CheckForOpen()//检查入场条件的情况并作处理* P' h9 H% E) m4 ~5 v7 g: M
{4 z0 _* h/ m" w. {' R
double ma;2 C1 _6 Q$ \4 u* }
int res;9 K- w; E3 b4 k4 R4 |% P( i- Q
//---- go trading only for first tiks of new bar& ?! R; B& r: P; x/ P/ t# r
if(Volume[0]>1) return;//如果当前K线持仓量大于1,说明不是K线的开盘时间点,则直接返回 否则是K线第一个价格,则继续下面的过程
9 O2 D, \2 T) r  ^. {5 m) l4 H//---- get Moving Average# ?3 B1 `. ~: q9 `3 ^& u
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//获得当前的均线数值- q) o& O1 ]: c: O
//---- sell conditions
2 ^0 t* u- N2 T: ~8 j+ O0 Hif(Open[1]>ma && Close[1], |! U* `2 }" p' C5 g
{+ F: ]. Q" L6 o% a$ L- ~/ R
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);: s  O: B; }; v( I) ]
return;* E1 f' o+ a6 h1 }' o" |2 }7 j' O
}- q( x9 C7 P& p
//---- buy conditions2 m6 N+ O8 q0 R  o+ @; }9 |
if(Open[1]ma) //如当前K开盘价小于均线,而前一K收盘价大于均线,则发出入场空单
. s% I9 k5 _, f, h5 d2 H, m, X4 o{8 h3 S0 ~# H. f& v9 r* E! w
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
3 {" |& \9 c4 d8 f5 r+ ~return;7 ~3 c& L6 b8 K9 S7 d
}3 R& S9 I0 o2 M% ]0 v  d+ p. g- j! y
//----
$ H0 T* y4 o/ X' H3 [0 v8 n}( n* b* N: p. s" ~7 d
//+------------------------------------------------------------------+
) ]  k5 E! ]; }; Z& t$ _1 g& ~2 k" {2 I//| Check for close order conditions |% Q8 G) @- Q( C6 Q, A
//+------------------------------------------------------------------+
! ?5 e+ |. p9 ~1 y3 Zvoid CheckForClose()//检查出场条件的情况并作处理
$ w: }+ _) X/ Y: V5 C$ n{1 ^; G: B# ~8 c& s
double ma;
* B4 v( R4 p  z//---- go trading only for first tiks of new bar- _7 V3 Z0 q: l8 a7 d& M# j  M; B
if(Volume[0]>1) return;
7 f" ]: Y! u4 w' P* B# k//---- get Moving Average
* N2 D- l- x- }: Z+ v: Hma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);/ P% N* ?% h( v9 p7 x0 y# l
//----
9 ]# Y$ F/ f1 b/ hfor(int i=0;i; Z0 r* U3 k8 L8 x' G' L
{: ~) F# g( G' s' Z" M+ f6 u+ S
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;6 `- i0 _4 U3 Z: J$ Q
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
2 B  I% f- H: Z* T  Z, r! A//---- check order type
, e# n4 i" N+ Uif(OrderType()==OP_BUY)+ n( P3 V. O& ]7 P# H+ E
{
- A) J$ N' k5 w2 hif(Open[1]>ma && Close[1]
" U- u: V/ b; M) X  k6 r* I; vbreak;
2 D$ M$ k7 |  |}3 L0 ]2 Z( m6 A2 G  j7 M
if(OrderType()==OP_SELL)! J: S5 B7 W; g% |1 u( o4 T
{2 D9 Z5 T; Z& ?  C4 Z
if(Open[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持仓是空单,则当当前K开盘价大于均线,而前一K收盘价小于均线,则发出平仓指令; B8 ?6 v& ]4 p% E' v& ~  ?

. O( k% s# D' y( y0 m( `break;
7 ~  N4 Z; t; h' e}- M, X* I. h* t7 b
}+ F' n" a) U3 j8 R' P. \
//----0 {: u% D9 c" w
}( ~- B, \* @- H% N. t% y
//+------------------------------------------------------------------+: T9 y' c/ c! X7 {0 c0 {3 V
//| Start function |9 N/ [4 W4 z! p* o- l: T
//+------------------------------------------------------------------+
' {- l, M6 i' ~* pvoid start()//主循环过程
: L4 [" t. Z! m+ M, a% K0 X{
( U6 ?+ ?5 k8 D& G! E" ~//---- check for history and trading
8 U# N& j9 E0 Bif(Bars<100 || IsTradeAllowed()==false) return;
# m& S; ]% ~; r0 j//---- calculate open orders by current symbol
; Y5 V  H- X4 L  J- r5 }if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
. m' x) `1 ?; v# N9 Q/ Q/ N+ Selse CheckForClose();
0 z7 b9 e2 o- F, ?% m0 f) u# `2 ]# f//----
( @, ^$ Y8 D) \3 L  X) P" F; G( u! A}
3 A, J+ f6 n$ S8 W- _9 ^2 b//+------------------------------------------------------------------+4 w# U0 S5 a9 i9 z
* C4 a2 T* h% @
% C' k/ o3 K$ s6 Q8 U, r- l8 N+ d
汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

返回列表

站长推荐 关闭


EXNESS外汇平台开户流程

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


查看