返回列表 发帖

MT4自带的EA:Moving Average 详解

MT4自带的EA:Moving Average 详解
$ m/ x* v( l$ z5 F( {( R9 w" Z, b8 J2 G2 p  P& I
//+------------------------------------------------------------------+
- x/ m+ z! i' m7 o//| Moving Average.mq4 |
* {/ }- d8 c! [* N//| Copyright ?2005, MetaQuotes Software Corp. |% [( F& C3 m& |8 C1 U
//+------------------------------------------------------------------+$ [" F7 P% @& B
#define MAGICMA 20050610 //定义本EA操作的订单的唯一标识号码
& D+ m+ _* |7 [) m  y. k& h* b; h0 f1 Y6 o( Q" M  D
extern double Lots = 0.1;//每单的交易量0 F6 {9 g2 k8 M, k+ r4 v# o8 t
extern double MaximumRisk = 0.02;//作者定义的最大风险参数
( u9 O3 C: I; H- [extern double DecreaseFactor = 3;//作者定义的参数,作用要看程序中的用法
( F9 l* _7 |' \, c$ ^/ Qextern double MovingPeriod = 10;//EA中使用的均线的周期5 w. h  S4 b" h# S4 y* E
extern double MovingShift =3;//EA中使用的均线向左的K线偏移量
; J: y2 U$ I- D, j5 u7 X+ w' P/ v//+------------------------------------------------------------------+
& x, F) o9 S1 D//| Calculate open positions |4 E2 D: U" {$ n) a- u2 Q/ B
//+------------------------------------------------------------------+- C1 d) t+ z% z$ x: g; @
int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓订单的数量
# k8 B: h% ~5 c* p{- a  \. D* {" J! l# L; z8 t
int buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
9 _5 m" s* N6 S//----$ p* t' I! {6 P& q6 b1 w
for(int i=0;i
- z! p" a: S- D{) O! x4 h4 D' J' E
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持仓单的每一个订单位置
" [4 |. D/ m, @- u2 P3 j' {if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根据订单位置,比较是否是当前K线商品以及订单唯一标识号是否和本程序设置的一致(用于避免EA误操作其他程序控制的持仓单)
: G% |3 v; u5 L7 C' i{
; G& J' P# o0 O9 U; bif(OrderType()==OP_BUY) buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加1# x" f7 X4 e1 ?9 u" ]0 V+ I
if(OrderType()==OP_SELL) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1- g: E9 h+ c) v) i) i  U
}
1 u) S; U! B4 `}8 ?/ S& a4 N: ~* P
//---- return orders volume9 @; a" z/ |" J2 j' F
if(buys>0) return(buys);
  _( U: d$ i7 Xelse return(-sells);//本函数返回查询计算结束时的持仓单的个数。
, L8 Z4 D* R: u* [}. [! |! q5 w$ Z
//+------------------------------------------------------------------+. I) Q4 e$ U, S$ N1 @; Q" N/ O( {
//| Calculate optimal lot size |' ^( n: ^& q, {4 a" I( Q) a
//+------------------------------------------------------------------+
/ c- p' I( }- o: d) j- J4 Cdouble LotsOptimized()//函数目的,根据要求 计算出订单交易量7 A) w7 {2 h% ~# V5 N3 E# C
{
* o% ~/ N9 M( T1 w3 B8 {4 L/ ydouble lot=Lots;5 w+ B* O) t+ E% N
int orders=HistoryTotal(); // history orders total 历史出场订单的个数: C( ?% T: e* q; u
int losses=0; // number of losses orders without a break# {  E' l* C$ |6 a7 v) c- k2 ~
//---- select lot size, n6 x* `# S" u& P9 F: @
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量
, b2 z! R% G( u1 v4 ~' e2 U2 y//---- calcuulate number of losses orders without a break
; ]5 B* ]: Q0 S) Hif(DecreaseFactor>0)8 ^# t3 L3 ]! r, \! r2 M
{
* J% S0 R( L. o  mfor(int i=orders-1;i>=0;i--)% G. Q% D/ b8 @( K, Q
{4 S( {; H' s" M2 z1 Q0 X( {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循环查询出场单队列
6 y6 b% L# y5 b$ Y, ~if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//6 E  W- b4 m3 \- n9 r# g  U
//----$ T( V7 v9 ^3 H2 Z! D4 V7 K
if(OrderProfit()>0) break;
% S9 I) `' ?( l: S9 g  G8 qif(OrderProfit()<0) losses++;//循环计算所有出场亏损单的亏损总和) R* z7 O0 q: `
}, }% q! r( i3 O' B* b
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。9 |& Y& {0 [6 ]
}
) p  h. ?: q, i5 F5 K6 M' A//---- return lot size5 z7 Y8 k4 G# S1 G4 m4 V* M
if(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量
8 T# @$ D& o  S" W  g7 Freturn(lot);1 n) k  G$ ]( ?, J) ?4 m
}
1 i2 R* j3 o. [, H3 {$ u//+------------------------------------------------------------------+
- ]2 O7 E  w0 U/ s//| Check for open order conditions |5 Q; T+ `& A3 L* U( ^9 Y$ E% W' R
//+------------------------------------------------------------------+" F! g8 k1 E& z' V. q9 U; A
void CheckForOpen()//检查入场条件的情况并作处理
$ w0 P: |& _2 U) m6 Y/ c( m+ T{. Q/ ?+ F# q) i/ F
double ma;
1 g& o7 g2 e. Uint res;" N1 q7 f( c/ t
//---- go trading only for first tiks of new bar
; [+ `+ k/ m  E0 h' Gif(Volume[0]>1) return;//如果当前K线持仓量大于1,说明不是K线的开盘时间点,则直接返回 否则是K线第一个价格,则继续下面的过程
) O) ]  f! X6 r: P//---- get Moving Average
2 P' Z  g3 ~+ c* F6 r* h! _ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//获得当前的均线数值
8 c7 ?4 e- e4 b. s/ _: e  O" h4 T//---- sell conditions$ v8 r7 W+ h+ ~& W8 j
if(Open[1]>ma && Close[1]% ]9 Z$ y0 m) A2 u: p. H6 i
{
, J4 x; O* w, |* u- d* t2 yres=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
# p7 N, C" d! F8 a7 Xreturn;
! w& v3 Z* C6 ]0 ^) O4 b! s}
' I6 p( \; Y& W; g//---- buy conditions
' f6 T: E, V" S/ N, m' {/ yif(Open[1]ma) //如当前K开盘价小于均线,而前一K收盘价大于均线,则发出入场空单
6 F3 z0 q5 `5 d! ~1 i( O, D0 T{, i$ w$ x5 [# L! ]9 L" e
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);: v: S: C* B8 d: r7 z* Z. b
return;
( s# G# X4 M4 a# k6 X4 J5 E}% d2 i) Y+ m$ C0 ]/ C
//----
  W6 E* z6 m" Q$ s: J6 B' |5 Q}( {: N$ L: K  T7 d$ C$ @* P
//+------------------------------------------------------------------+0 p) z' @# z) L, y& s
//| Check for close order conditions |( j  Y1 F& c# i; N
//+------------------------------------------------------------------++ v4 [! p$ P$ b0 h
void CheckForClose()//检查出场条件的情况并作处理  T1 Z6 t4 B, p  O2 \5 p9 N
{
& @! k# A6 ?. b/ |! sdouble ma;
0 e+ r" b; M% s6 Y* U. E( p" l//---- go trading only for first tiks of new bar
) w  a7 l1 f, z& N" j; \" {if(Volume[0]>1) return;
) k# r/ R) j8 Q  u, D//---- get Moving Average
8 j, j  I; J2 C. y: j' rma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
$ v. o9 s, {) f( @; s+ F* i//----
: j& w9 @8 i: U* afor(int i=0;i" n- s) g$ {- |+ L2 q
{
& T2 |  A; T- y. |/ W  [4 Fif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;$ q5 `" U$ B4 `/ d0 k( d$ v& W
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;, Y8 B& \; [6 Y  D- ]
//---- check order type
( A; W0 A; d# y; E2 Tif(OrderType()==OP_BUY)3 g$ E: N" Y& f3 a  l
{
9 T" T; V4 `3 N5 ~5 eif(Open[1]>ma && Close[1]6 p& M1 a) D* ?+ p6 n+ Y1 o' \
break;
2 n. z; u9 S% X, L/ r$ c* l/ E}
2 j3 H- \) H7 Z. S/ K7 U$ Zif(OrderType()==OP_SELL)
5 l  k& [" s" I{
* |8 u* ~. a( q( nif(Open[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持仓是空单,则当当前K开盘价大于均线,而前一K收盘价小于均线,则发出平仓指令
+ \& c  Y1 _: p: f0 G4 z) k  t$ ], @, s, L. j
break;
/ |& A- ]1 T; H/ y+ \: f4 @}/ m7 D  p( {* b2 ^7 ]
}3 D5 @# @4 i: \/ G
//----2 [- D7 H9 P. V, U8 @, J$ r  p; o
}
  a% R- q0 g6 v% ~! \//+------------------------------------------------------------------+
9 D3 g4 I6 Y, k5 {: d3 ?//| Start function |
* F0 Z' [9 y  H; X//+------------------------------------------------------------------+- Z1 U9 ^" k. |4 @
void start()//主循环过程
( @% z0 Z: \3 W1 q! i4 Z5 l# Y( X{- }3 ]. U4 G. H6 D
//---- check for history and trading
8 K6 a# o# G. O$ t, H: p! F# mif(Bars<100 || IsTradeAllowed()==false) return;
3 D" J. }2 b3 p9 H  u  W1 X! C//---- calculate open orders by current symbol
; G# o/ `2 j5 n, C$ z, c0 y4 H5 A$ b7 uif(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
* r7 P+ q4 x& Velse CheckForClose();
  N% _0 d/ K/ G. P, U) e% S//----2 \$ g* V% X+ v2 r5 }
}! m  \4 z8 r$ P2 J
//+------------------------------------------------------------------+$ f% u% \0 q/ c$ I
. Q0 q0 W4 m; k) y

% S1 s6 |$ F' p( f/ X6 S+ k( G! B2 Q汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

返回列表

站长推荐 关闭


EXNESS外汇平台开户流程

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


查看