返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解
6 a" R* A$ v, a& ~# q
9 l$ |, T& [7 I( K5 ]) {//+------------------------------------------------------------------+
1 V3 [! G' m) y/ }//| MACD Sample.mq4 |
& T+ I. X1 j' h; i2 ?- u4 D//| ... [/quote]
) W9 w2 O, t" ?5 O# A, G" A% ]extern double TakeProfit = 50; 盈利目标点数; N) f" z& C9 O# r# S
extern double Lots = 0.1; 每单入场的手数
1 F! Y6 B! o$ p, U7 T) \- qextern double TrailingStop = 30; 追踪止损的点数
/ i* |8 s2 D1 O7 iextern double MACDOpenLevel=3; MACD开仓的参考位置
. u! a+ E3 @2 d8 {4 {extern double MACDCloseLevel=2; MACD出场的参考位置% }  d' ]! d  H$ o: e5 N  x. j
extern double MATrendPeriod=26; 条件中使用的MA均线的周期数% `( Y3 O6 T; v: H
程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。
  X  l, A4 H6 d' H7 E+ {/ Z这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。
! Q, \3 c1 \$ g! P先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。' }" i' q5 }  b# L
多头入场条件:
0 x& Y9 [2 O3 U2 A$ lMACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势3 u; D) [1 ]5 }$ X
多头出场条件:
1 p# j. _) l% O+ l' N8 ^. lMACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)  y' [" M0 W5 W( g
空头入场条件:0 C3 v/ b4 K+ P# U% N8 O* R
MACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势+ s+ o- \  j+ S( d" c
空头出场条件:
" m( j/ J# x! GMACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)' h- Q, W# G7 P0 c( R9 J4 z) W
=============================================================# F: J5 R0 ~$ G) W7 z
有了以上的初步了解,下面开始进行EA程序基本结构的分析:5 u6 j- K% c9 j9 f+ g
1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里! A* |+ Q5 Z# A! D
2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。
. U# A1 i% J. z+ ~$ g3 \先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。# e7 u/ g7 g  P3 M4 l
程序开始的以下两个部分不重要 简单说一下:  @( ?; a# t; G4 b( {2 S9 s
if(Bars<100)
4 u2 n3 ]( h- H, R{
* R! t3 A6 y; h1 r$ s* O2 a1 g$ P5 {9 ePrint("bars less than 100");
/ f! Q; I; `( i; N& f3 Creturn(0);
5 B: m9 P. H( S5 R& Z! ^3 ?2 s" I' M}5 ~1 h* Y" Y. d0 p: I6 r- h8 P3 O
以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。
! Q6 E: B* _% a; \3 Aif(TakeProfit<10). A, X6 b" A0 s; v3 d1 T1 [
{) ?1 K: I7 B# V( [. P' ~- g) I
Print("TakeProfit less than 10");( \( L/ p! i: [( D6 a* r
return(0); // check TakeProfit  v+ q& |+ f8 X- k* Z7 T9 ?
}
, @+ U2 E  m/ r以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。
4 ?: a7 v# B0 I; f' n* \* O下面这段:
6 J: ]" I! O8 J6 wMacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);4 `7 ?5 m3 |1 c' `0 [
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
+ q) @( n* o+ v6 {# g* s: G# c3 ESignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
: F, Y; d& k+ Q- _; U8 C2 sSignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);+ @5 r+ b+ a+ v* t2 b
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);) }0 ^1 W, H. D$ h, r/ C3 ?0 L# W
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
  X( Z  e% o1 E' c6 }( _* Y3 L这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。
8 X& x2 o8 k8 E9 P再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。7 z& E# ^% V  _; i! g4 t* d# ?
total=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:' s1 a4 \1 f( i9 ]! K6 u
if(total<1)
6 d+ C6 A& ^1 O5 ?+ s' G9 d) P* P{
/ \6 I) x; k" \: \// no opened orders identified
! b% j+ a% T: E: {# ~if(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断: N0 J5 F& _) ?0 r, P% M) y% a: F
{/ Q' |& h2 O" U& _4 L1 v* o
Print("We have no money. Free Margin = ", AccountFreeMargin());( E9 p9 ~& p* y
return(0);6 h$ c0 e1 c+ l2 F; V
}
& {$ J' T2 M. b1 [/ N// check for long position (BUY) possibility+ e1 q+ a" X5 B# m! v
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious$ D  w1 F; |4 f9 R5 C8 _: F+ x/ b
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值
8 r9 h; n7 I! K1 c. Q8 G{
3 Y2 u  ?; ]( M; |* aticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。  t, m+ S# F  _+ V5 F
if(ticket>0) 大于0说明入场成功
5 ~  q8 p2 c  g+ ^4 U{
  ^+ L% h4 S: ^3 ?if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());) x! L' G( V/ g* e: v: H2 ^5 s
}
) \# K5 J$ }/ I, L( l$ I  k* helse Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。
: H$ F& J: I. A5 ]& Z$ Z8 d+ sreturn(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。6 N9 I' ?3 @9 C3 r$ I: c7 ~
}
# ?" z9 i4 |, n: x4 A2 {9 m; N下面就是空单入场的判断了,大家自己对照观看即可- g0 m" u4 A' Y1 @! S( Q4 c0 x7 J' D" P  L
// check for short position (SELL) possibility
0 K' T' T" j: K( Y/ N8 F5 |, {) Aif(MacdCurrent>0 && MacdCurrentSignalPrevious &&$ }, y' D% s* U) j9 ]
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
7 d3 t* w0 R+ G+ {- Z/ X+ }{' R$ Q% Y6 }: V# v" Z% S+ ]
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);5 [1 a# T6 C! m7 Y1 d8 F; w" z
if(ticket>0)
' b% j2 _+ p. x4 H- v3 Z{
, }" N  a# h8 z- S* ]6 @4 @if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());+ P  q" ?8 R! c
}
/ D0 [/ t/ H* V7 r& s* s8 Welse Print("Error opening SELL order : ",GetLastError());/ o- O. |( C% A- W5 q2 _
return(0);
' h. V  v( a$ [1 U: G; o  v* j' J' z0 j}
: s  S0 e0 J8 n& m* _return(0);
$ A, N1 P/ C) @" M  x: l. |; C}
6 _3 k: |7 y& O  b. t% A5 U: h% U5 @! R" |
! w' A, r6 \$ b; N9 o: [
汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。
3 x3 O* m) x1 j  B" R" ~% d
. E9 z$ o: n4 c+ {: `' ^( G  愿你9 }( W* W6 d' u

9 r& U$ n: l0 k% i+ E( s" [  真诚地愿你拥有一种淡淡的情致。
8 t7 W, a; [  f
- I( [$ r% o( i6 }  N* @( C$ f( Q2 n  w9 [6 c5 _) v) m2 h

* g% r7 L' c& z  D6 E  h
- `" _0 n4 a# E5 fcolor=dimgray

TOP

返回列表

站长推荐 关闭


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

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


查看