返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解
% ^2 P- e$ {2 s& |$ q7 M8 {3 c! m  y9 @( s
//+------------------------------------------------------------------+, t3 r% m9 n1 u. m6 l
//| MACD Sample.mq4 |+ x5 G  v, y) j0 G! r" p6 w' w# C
//| ... [/quote]1 J; J, z% Z# X2 ^: E
extern double TakeProfit = 50; 盈利目标点数, O- s; ~* f5 a$ ~% @! V
extern double Lots = 0.1; 每单入场的手数# D/ X2 N: Z4 o+ Y+ e$ x2 d
extern double TrailingStop = 30; 追踪止损的点数; q/ ]. d) |% X: E% ]0 {* E2 B8 R
extern double MACDOpenLevel=3; MACD开仓的参考位置
0 u8 v6 M: ?) u1 Hextern double MACDCloseLevel=2; MACD出场的参考位置
; K9 C( ?% `6 J2 v# S" g( W4 iextern double MATrendPeriod=26; 条件中使用的MA均线的周期数) l3 U1 C- T' s6 x
程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。- |6 J/ {5 R; n8 y1 V% a: r/ B5 X
这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。# N7 w$ V# L, f; u  ~" w
先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。
! `8 K% B4 u& F) n+ w* u* J* Q多头入场条件:7 U! n7 [3 d3 A) C( r2 E
MACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势( l/ X, r  f& T# y
多头出场条件:& R2 |, W+ J  t9 J# P0 u" c0 r" N# c
MACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)
2 j. D$ H7 _! U3 n空头入场条件:
2 U( F$ ^* O; g$ v! Q7 q" kMACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势
' |/ a1 K3 X, {( B% l空头出场条件:5 B$ p/ l2 L6 Y' H8 M
MACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)
# A9 n# `$ D$ E- S4 w$ S. X+ r' }=============================================================
# X0 A) X) \7 n) e有了以上的初步了解,下面开始进行EA程序基本结构的分析:7 W1 b" n& `" ?" g% k
1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里! f/ P, Q& C$ i
2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。4 a5 U: [  {. \, I6 ]. l
先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。, Z1 Z. S0 B7 S+ m3 e' g2 D) J6 l& f
程序开始的以下两个部分不重要 简单说一下:
2 y8 I. V5 a1 ^. N: z8 `. z- |) Eif(Bars<100)
3 I$ [: N$ w) _{
" v$ a- W# p" x; h+ ~( TPrint("bars less than 100");
1 L8 ]( ~( Z: t/ Rreturn(0);4 Q5 o+ `7 P/ \8 D
}3 x7 I  w+ X1 I1 V+ Q
以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。
" w2 @2 M* u+ f0 t3 Dif(TakeProfit<10)
7 S; F2 z1 f) G1 J: F3 U$ V& d{
( [- A  d$ _& k1 }9 Z* uPrint("TakeProfit less than 10");2 a' j8 i- y1 S+ Y
return(0); // check TakeProfit! S" z  _- _4 C& z# g3 b$ ?
}+ \8 v) i4 }( h: Q& C' t" {
以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。# B, }1 h; u$ O. B0 B) Z; Q# z3 N
下面这段:
2 y# I6 f$ W8 [) m' V5 FMacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
) ?  u* H6 M& n' P7 H: }, JMacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
3 w& j. R- B1 r" ]) o- mSignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
! y0 r; D# W- i% b8 ]. [SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
- l6 a, E& R3 Z4 RMaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
9 C: h$ k9 C8 h8 `( qMaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);, j! u; U  r% {& }% C5 ?  M! \3 b
这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。/ B, ^8 O# _1 z
再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。' L: H8 p2 L8 K+ q/ Z+ A
total=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:
+ K% I1 d$ W  l& ^if(total<1)
/ p7 _' n7 P1 R  r0 @6 ?{7 H" s; z/ n- H& G! I+ Z* ?
// no opened orders identified/ l  x9 [' ?$ f9 `: Y; X& e7 u
if(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断( h) @8 U$ H5 J2 G( x
{
2 Q$ _2 H2 Z' L3 Q8 \; Y+ ~* e& RPrint("We have no money. Free Margin = ", AccountFreeMargin());& D, r. |' g4 a
return(0);
+ @/ Z% K* R* |/ G1 V}
: V4 A6 l5 D9 E, f4 ^$ A- g% r// check for long position (BUY) possibility
! ?& a5 d! v7 [+ Q9 W! h0 d( Aif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious
0 M# N$ J: T  Q$ w1 lMathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值2 @( y# R  k/ e' ^/ C
{
  h, [' B6 o: K7 Xticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。
/ Y: o1 h' P$ }: H" W5 gif(ticket>0) 大于0说明入场成功
7 A$ l; H7 C/ U1 A8 b{
% }" d, Q. ^% {- Qif(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
5 c/ s, L4 V: Y}' i& ]0 y, U. Y
else Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。
" h  N. K+ }$ y1 q8 t9 Greturn(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。
# F0 c# N( c4 l1 e6 n3 n' b7 m}
) q2 z6 S8 u& w4 B: |下面就是空单入场的判断了,大家自己对照观看即可" L0 B6 N1 A. A; ]
// check for short position (SELL) possibility" {$ Q4 Z# v3 K2 X
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&  G0 U4 ~; u3 |, F5 Y4 C2 c
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
  R. h0 ?# a8 g4 ^{
& ?* t: m" ~4 c# n1 Fticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
1 W4 r2 U6 z' J9 D* h4 x6 n! K3 @if(ticket>0)& N, \' X* S' T! I7 k7 [
{0 m# a8 a) B2 m2 Y
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());( a* \! i! J# A6 `. }! q- E* A
}+ b. T4 Q& i2 y  \; g+ ^6 r
else Print("Error opening SELL order : ",GetLastError());2 P% w% A, q3 }0 U; W
return(0);
: V, K5 D, B; G) N! e- [}
( ]2 Y& u, r' s# H. ?2 Vreturn(0);, T6 y. w2 H! m6 D& t- g- g
}6 |, G; {8 I- ?% C: p7 r) j$ j/ r9 A

8 F7 [% l! l" I4 `3 D; i1 c. @9 r
# H' Z  C1 ^# y  Q汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。1 X2 g4 G  i2 ^8 T8 F
& P" ]# @( R" `! x
  愿你/ y+ e4 U: K* Y1 q$ m7 d- ~
7 w2 P' X7 ?, F: d
  真诚地愿你拥有一种淡淡的情致。7 X% C# X- W, P0 n' }, {
# h. q& q- c+ j8 f$ O3 @

: Y, X) o0 W! I7 r- ]. a0 q1 k# G& r

/ m0 Z6 o. }9 h$ Q- ~5 [# {color=dimgray

TOP

返回列表

站长推荐 关闭


EXNESS外汇平台开户流程

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


查看