返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解( D+ N4 C$ @5 s3 o$ w! Q1 b/ m

4 G* E8 ^( p" j* ^3 Y//+------------------------------------------------------------------+
! U5 @  T8 n! t& R) G# P/ n0 Q( H//| MACD Sample.mq4 |
# _- `6 _* o' j# s//| ... [/quote]
, R6 c* V( ?1 B) B2 }/ Dextern double TakeProfit = 50; 盈利目标点数7 q* d: S' h/ N' f* F) g
extern double Lots = 0.1; 每单入场的手数6 K: z% b) _- i( T% \  z5 X
extern double TrailingStop = 30; 追踪止损的点数( T, D% c3 u* V$ D
extern double MACDOpenLevel=3; MACD开仓的参考位置1 \3 k# w: O; `+ i! z8 O
extern double MACDCloseLevel=2; MACD出场的参考位置$ V! r% g3 d: U0 k# h/ @
extern double MATrendPeriod=26; 条件中使用的MA均线的周期数
0 H8 d% [" C- Z5 }0 Z程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。
6 R. D, S5 [! O$ u2 Z* e这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。
. T9 j* }: [# _# |) W0 W5 y先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。
9 A- o& {, B6 e多头入场条件:
& ^7 ]+ X7 w! k% v5 pMACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势: j: q# k, W/ y
多头出场条件:2 \- o- ^; J0 E( Q$ i
MACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)
( x% k& @1 e( a空头入场条件:) Q* L0 `5 R: K! i  z1 y
MACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势
% n3 F7 }9 l, w空头出场条件:( l; H7 e+ ], E( u
MACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)- e8 z- C4 I: q
=============================================================
! r4 @0 j# m8 k# \- b有了以上的初步了解,下面开始进行EA程序基本结构的分析:6 d. `  Y7 s7 B; _
1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里
  R1 H/ ?4 ^$ w  k. @2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。
* l$ Y; w& d9 M9 Z: D先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。- r3 N& B! R+ }9 m5 H# ~/ ]
程序开始的以下两个部分不重要 简单说一下:
. D8 `" t: G/ b- N8 T+ n' zif(Bars<100)
( d9 R! Q6 V* [9 [' N7 w; f  V{
0 F1 B1 @+ n/ yPrint("bars less than 100");; ~: m) s# H1 U2 Q% x, ^4 p
return(0);
6 a  g9 K) y9 A0 E}0 z1 N( G9 `' B" B# I
以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。
1 r. W! `. k* H" c" B- q: Vif(TakeProfit<10)
/ f) Q) q% @/ r  U( o* j7 o{" C* m- i+ {  I/ C
Print("TakeProfit less than 10");
- y( ~& A) p! l3 X8 [) vreturn(0); // check TakeProfit& O7 I8 ?/ b, W/ q: T* L2 A
}# J2 W* S+ S1 S- Y
以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。0 j$ ^. g3 H8 s# \# F0 Z: }9 O. d0 J
下面这段:" n# W) [. a1 ]' M4 b4 L# ^( v
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);. e1 A* T1 R6 m, Z2 }8 U
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
( c/ G6 i# @* ^) t$ _SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);1 Z: x% ]- V6 j0 J7 m0 s1 ]
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);% H8 \5 U" u1 t5 ]% M
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
* K; `* J. \: W# ^+ h& XMaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
# {; A  Q. K, o, q) E这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。
- h. M2 l+ P8 E& f* B再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。
2 Q% M1 j6 h3 S: }total=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:) q% r2 p2 J+ x/ U
if(total<1)
) t4 ^! N" c$ A{
  w8 R, T7 u' Y5 O// no opened orders identified$ b% Q, P1 v& D4 }5 y
if(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断
; C. r# R7 v( y/ Y- ]3 {{
" y2 v: g1 c0 {* o6 CPrint("We have no money. Free Margin = ", AccountFreeMargin());
; g, _) [+ a" m: K0 kreturn(0);6 w& e4 j0 O( I1 q1 S/ ]
}& E$ z" z+ t% w; V" ?; _
// check for long position (BUY) possibility
, Z. N/ i( ~/ l# Aif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious4 e9 c6 m* M  V1 J* S
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值/ g* g: P& c, W
{
$ r$ z( l' v1 Uticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。8 Y" y' Q! g9 Q. u
if(ticket>0) 大于0说明入场成功
& D4 {7 Q3 |" Z5 @! e) b{
' d2 l5 n" l4 c! z- H4 uif(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
+ `, A, H8 \: ^  U& s}
# [4 k, ?& U: h+ o# G9 ~else Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。* s) _1 w5 l. r- T1 r& h
return(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。
; ?% M# E! X, M}
/ e7 i/ P5 ]6 o8 v下面就是空单入场的判断了,大家自己对照观看即可
# T2 a1 L6 @3 K# n9 W. n// check for short position (SELL) possibility; a9 I" P* [- o* f4 a# }
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&# V2 e7 }; O3 j; Y9 {( _( c
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
( }' H6 v! M6 I) R" x; x8 m2 R* w{. K4 b6 y; C  o# U1 a2 ]8 U9 D
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);  U, l) P# U5 n# s( ?
if(ticket>0)
2 \2 J, n4 ~, I' O{( `  `! A% y5 n7 |. H- |
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
5 g0 K% G7 e  C- P}! }% X5 p' U' \: a% @
else Print("Error opening SELL order : ",GetLastError());* \, i) R$ C! N* F
return(0);
. i2 M- i& A4 }}
( X3 ]3 c7 c5 @9 A2 O0 [return(0);- p( Y9 C: B) s+ g
}
0 l7 f) {1 T/ D3 t  o) v* B6 Q2 M' D, I+ [1 S

9 _' d( ^5 N7 `1 g3 ?  j$ @汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。
2 S0 @. D+ n; S, [
7 F" P7 ?9 B, H& i% B6 k  愿你
5 C. V" u% v4 y1 a' U% \. B$ k
: c. ^0 j" H* W. p) e  真诚地愿你拥有一种淡淡的情致。+ J  R/ H0 ]! F* M* S6 }
4 I7 Z/ {9 R0 B9 O: n- R2 K# k

* J7 E' p$ q* u7 {8 o( j4 E
& Q) j' J+ H% z; F* X  c; J
# Q+ `5 Z. G9 G6 {color=dimgray

TOP

返回列表

站长推荐 关闭


NordFX外汇平台真实帐户开户流程

主要货币2点差起,MT4交易平台,多种账户类型,支持银联卡,信用卡,ALERTPAY,WebMoney,LR等存取款


查看