返回列表 发帖

MT4自带的EA:Moving Average 详解

MT4自带的EA:Moving Average 详解
( O2 {2 Q  q  _9 _1 A& @9 x
. ^! q* M' v% n! X0 i6 y9 z) k//+------------------------------------------------------------------+& H4 b8 o8 x  P6 F0 ]
//| Moving Average.mq4 |, h7 O7 f' N1 p2 t4 `3 y
//| Copyright ?2005, MetaQuotes Software Corp. |
4 h7 \# r  ?! X//+------------------------------------------------------------------++ W' n0 h4 L; L. i
#define MAGICMA 20050610 //定义本EA操作的订单的唯一标识号码
3 a+ W- @' b- u2 f6 i0 A
4 ], |, N" u6 l2 e4 u  {& pextern double Lots = 0.1;//每单的交易量
% n  W8 y) l) r. Sextern double MaximumRisk = 0.02;//作者定义的最大风险参数- s: ~' G- [9 t! w' i/ n$ W! t
extern double DecreaseFactor = 3;//作者定义的参数,作用要看程序中的用法
8 K' Z' m4 r, b  w( @# I, {extern double MovingPeriod = 10;//EA中使用的均线的周期* v: [4 D6 X- k2 _, k* @
extern double MovingShift =3;//EA中使用的均线向左的K线偏移量! U5 c+ V% I" o1 `- w" o
//+------------------------------------------------------------------+
, e! z! s+ N# V& F' _6 ^//| Calculate open positions |
+ u/ p5 O+ l4 `, x! C//+------------------------------------------------------------------+8 H% ^2 I8 z$ X2 V2 D) ~& f
int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓订单的数量' {% \+ T6 t1 D+ ]- j1 @/ ^4 Z
{
0 v8 u. l0 e8 q9 R1 j  a: V/ K$ \2 S9 Sint buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
$ u' x& E5 V1 g0 X$ v4 o" ~//----
. z) S7 n% V% I8 f# _for(int i=0;i
- \% G" l7 ?! ^9 ~) z/ _{
- {  u! s7 K* @& P! Gif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持仓单的每一个订单位置' Q& ]4 @) @$ G
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根据订单位置,比较是否是当前K线商品以及订单唯一标识号是否和本程序设置的一致(用于避免EA误操作其他程序控制的持仓单)
0 Q/ B' s6 W1 H9 c{
: J3 M3 h( I8 S# ~9 C8 bif(OrderType()==OP_BUY) buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加10 o# Z  D: U: Y5 e- g- `
if(OrderType()==OP_SELL) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1
" @, \# r0 p9 P; R% w}
0 k0 z/ n1 z9 a: |}) I" T4 l0 r7 B3 m  r1 p" \
//---- return orders volume
5 n' U: I7 Q! E0 _% S/ r6 U# Q  I* ]if(buys>0) return(buys);
, T" Y+ I( s+ s+ i5 Eelse return(-sells);//本函数返回查询计算结束时的持仓单的个数。4 m* c5 m$ g5 [7 M9 c
}2 ~0 M2 m1 t" y* ^3 H7 h
//+------------------------------------------------------------------+* V4 _: H0 n6 F  G" i$ Y
//| Calculate optimal lot size |
3 @( R$ b) a! d) y" `3 n//+------------------------------------------------------------------+0 I$ G! ?- J1 }- R1 N; _
double LotsOptimized()//函数目的,根据要求 计算出订单交易量
3 e6 Q: Y" G5 T6 K{; n* Y) |8 U1 _/ r
double lot=Lots;
' x3 Q$ l2 j! H3 P5 B0 X6 I5 {int orders=HistoryTotal(); // history orders total 历史出场订单的个数1 J+ A, H0 _) F& K$ c! ^- N- e4 ^
int losses=0; // number of losses orders without a break
0 @; D2 A  ]2 @6 h) z; r. z- R//---- select lot size
4 p  L# ], J9 \* M4 Q2 olot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量. |, z) w' P- }# ]# c3 ~% A8 u
//---- calcuulate number of losses orders without a break! Z8 ?. O) V4 I3 \( L1 ?! V
if(DecreaseFactor>0)4 {2 H! s" r5 s* {
{: u8 d1 Q  U/ q, F/ l
for(int i=orders-1;i>=0;i--)
2 c7 }! r( Y  Z: P% I{
1 |$ c  A5 h& b! S& N4 w# Lif(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循环查询出场单队列
/ n- B3 l! a$ Q! b4 Y7 _if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
4 I1 w' f, N! v' U/ {) T; L# S//----9 [, S2 I5 c2 h
if(OrderProfit()>0) break;
+ y* E+ D( j0 u' dif(OrderProfit()<0) losses++;//循环计算所有出场亏损单的亏损总和6 ^$ q% e- m. h. ]$ ~1 U, z# ^
}
8 w  R: u$ z0 p- X, n+ eif(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。) c2 R4 Z' }7 h: H
}  c8 \4 p' s" o# I% L
//---- return lot size
& ?3 y' j  m' r6 r$ rif(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量# z4 o1 a$ Q6 }$ _( a  d
return(lot);& C( W3 J* j9 P" u( \1 p4 ?$ {
}, y- v- j/ V1 a4 w  B3 E/ M+ J4 K
//+------------------------------------------------------------------+
9 W5 z! N; q6 Y//| Check for open order conditions |" J% b( ?( p) Z  p6 g; @
//+------------------------------------------------------------------+
+ \. V' O" ]+ jvoid CheckForOpen()//检查入场条件的情况并作处理
! \! n8 j; i' b5 S' X; G{
* ]  H; P" V! E9 P# Z2 Ydouble ma;
: u: ]2 q0 Y( e4 Pint res;" f# m' {! X7 }* B8 |, l0 Q
//---- go trading only for first tiks of new bar8 P. R4 E) E7 w* {5 ]/ X
if(Volume[0]>1) return;//如果当前K线持仓量大于1,说明不是K线的开盘时间点,则直接返回 否则是K线第一个价格,则继续下面的过程
/ d1 f; M% U) M8 r4 q- Z1 _- A//---- get Moving Average4 s+ a  ^/ ^+ y8 h  l# i
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//获得当前的均线数值. L( v- e# {3 G
//---- sell conditions
& j! d1 j! x3 Qif(Open[1]>ma && Close[1]: I" N6 @2 y( o$ z/ f6 S
{5 q. T) D+ C# a) U! i8 b
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);- y% h: c% X; p% B- ^" M+ K
return;0 a3 a  W, [( I9 Y6 B
}! b/ ^0 l5 ~; K- ~8 g
//---- buy conditions
0 w! C' n  E! P6 B& [* tif(Open[1]ma) //如当前K开盘价小于均线,而前一K收盘价大于均线,则发出入场空单3 e% w( r& X! u2 L- y
{
4 ~9 j, }$ M" I9 Pres=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);: U' s9 g# E9 R- R
return;& b, ?6 O) P9 B3 x- Q5 W7 g
}4 C- I8 u9 Z. K& O% t
//----0 W/ w# F7 u7 ]+ d: G: ]
}6 _7 ^7 X- e& L" C7 T+ e2 @3 I% B
//+------------------------------------------------------------------+
& M! a& ?% l, \1 z; c1 ^" q+ i//| Check for close order conditions |9 Y5 R, G' D9 o
//+------------------------------------------------------------------+, ^% g7 T! N7 [* H
void CheckForClose()//检查出场条件的情况并作处理. z7 B8 A+ k; }* {) D
{
1 ^: E: q- c( J1 s/ l3 hdouble ma;
5 L0 N5 ?/ @. |4 q9 V- g" U& N2 B//---- go trading only for first tiks of new bar
+ P7 K* F) k) N) _if(Volume[0]>1) return;
$ c% H2 L& G* m  O* f) V$ U5 _( y//---- get Moving Average, e7 \' v# W. ?" x0 }. T2 B
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
4 S9 B- z, ?+ _6 E//----7 n; k7 F8 E5 g; P# `* S* G
for(int i=0;i9 A/ j9 Y9 x% q0 G4 v6 B  R
{
: q5 K, H' f( M6 D2 jif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  N# O9 R! v4 |. B) B# C2 L8 Nif(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;( F3 Q9 g. R' D. v6 ]; f# p
//---- check order type
0 X! U3 [- e5 q, Dif(OrderType()==OP_BUY)
! w2 i& w8 E: i, _  H4 p{
- N* U- C8 \1 O! O5 tif(Open[1]>ma && Close[1]# i" y) E! i! Y. z8 U5 X
break;
$ E: E$ I; @) x8 Q& p, ]" a}8 u3 T8 D0 J: P
if(OrderType()==OP_SELL)8 J3 N' C! @- [+ `5 z$ o
{8 I9 w2 c8 b9 n5 l( ^5 v
if(Open[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持仓是空单,则当当前K开盘价大于均线,而前一K收盘价小于均线,则发出平仓指令
; P8 C( I1 g; }  j2 k1 P! R$ n9 s4 m+ P8 s
break;
" q1 P/ `2 f+ ?$ l4 `/ J}0 X- J1 o% y$ N8 d0 b
}
% x, S0 \' u( A. A5 g//----1 u" X! `# T* K" c
}
% z) |; q$ D' p) ?7 R//+------------------------------------------------------------------+9 a/ p( Q) K! _. q8 @
//| Start function |
3 b: u8 q; j0 P//+------------------------------------------------------------------+) I$ v3 E5 V9 H7 k
void start()//主循环过程
+ o' \  p4 H5 j. a4 A- z{% k. N; v7 L7 {- C% _
//---- check for history and trading
# d/ J4 `& w% A5 J: R' x- Xif(Bars<100 || IsTradeAllowed()==false) return;
8 S) a( j- j2 u# Z* j# h//---- calculate open orders by current symbol. m0 k' [7 c2 X
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
' d4 B  m0 K( K7 qelse CheckForClose();
0 ]: Y. Q2 `5 w% _# e//----' Q, j+ v2 G/ {  ], P, w1 Y
}
& d( T/ E2 l9 ~: m//+------------------------------------------------------------------+
, d! Z# P* \4 d: l  S; I& F1 W9 a3 J2 q4 ]0 D

0 ~+ D8 ~  Z3 ?汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

返回列表

站长推荐 关闭


EXNESS外汇平台开户流程

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


查看