返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解, \7 e- i$ P8 j

: @# L7 O3 d+ [# q+ x, f! ~+ q//+------------------------------------------------------------------+6 h& j0 A( a% p# ~' o6 b( j
//| MACD Sample.mq4 |
2 [5 U$ U8 k8 c' l/ z% K//| ... [/quote]
$ P. g1 _9 Q7 [' `1 textern double TakeProfit = 50; 盈利目标点数+ t! f% _" X, E4 @. _; U; ]2 ?3 _! @
extern double Lots = 0.1; 每单入场的手数- s+ c: V  o# S& _( L4 Q
extern double TrailingStop = 30; 追踪止损的点数
2 G" e+ }: x# j( T4 A; _extern double MACDOpenLevel=3; MACD开仓的参考位置- b+ L9 ?. C* s6 E
extern double MACDCloseLevel=2; MACD出场的参考位置! O+ Q, M! C! e* M! `
extern double MATrendPeriod=26; 条件中使用的MA均线的周期数, N. f* I. L& [4 n9 V( w
程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。
, W' m' j  R0 b+ \; l$ e- X& r这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。
8 y8 K2 I' R' m+ V# q5 d先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。# J! K3 W) o2 ]
多头入场条件:: n* |, c+ X- g  C: _  G8 n
MACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势6 U4 _7 U: W" Q6 V" r
多头出场条件:
, \6 @- J2 r+ z+ i$ m" u# \6 l7 A/ [MACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)
, t# d, ]6 O  B3 r5 [: @+ s; T! n7 y空头入场条件:5 c. F3 m' m' O" M
MACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势
; ?: w2 J- c2 H" h% T空头出场条件:4 U, P$ f# N( ], j1 l
MACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)
% N* z) q& B: w# @=============================================================1 y. Z7 S. k+ z6 {, S- u
有了以上的初步了解,下面开始进行EA程序基本结构的分析:& X" c+ P; G: J2 x) W' h8 S
1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里4 E. i  a2 m! ]9 `0 k! Q
2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。8 G0 G2 q0 U/ ?' c9 M+ g% ]
先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。0 G. F: ]/ p" B  i7 N
程序开始的以下两个部分不重要 简单说一下:% W; o( \/ i& Q$ L) @. _/ N8 ]6 V0 [! J
if(Bars<100)
1 \# [! j" i* T; c{4 O0 Z- u  K) e" s# F. }* d
Print("bars less than 100");
$ z+ Z( E! A9 g4 ?return(0);0 U. w4 M4 @: p2 n  x" j" Q% s
}
: o1 k+ @2 a9 V# o以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。& t9 x$ y) ]2 z* ^$ {& T
if(TakeProfit<10)& ?/ y& y+ p$ p* ?/ w; V+ T
{8 @1 \$ ^3 ?& w
Print("TakeProfit less than 10");
5 {  X+ ]1 n% h' M# Creturn(0); // check TakeProfit
' d) J9 ^! W( y. B; @0 S}
  H* R, Y. v  U2 l& s以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。
& h1 p) G; |6 `- x  j! b7 q下面这段:
. J$ h  ^* B2 L' ~MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);" Q6 S! f& z/ k. m' o4 g
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);$ s: \+ |. H. D. S* f
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
0 U" t: c3 y6 b  R0 ^SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
: F, V5 x3 v" z- L1 xMaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);  f6 ^  m- a- E( w
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
3 h' x! E1 L9 l$ p) S这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。$ B2 y$ o6 B3 X$ ]
再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。7 n% C% k6 k  b1 s* l/ z; J
total=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:
/ ]9 I7 N7 \/ s0 W9 ]3 _if(total<1)/ M: C7 B0 }- K: t3 C
{0 G$ R+ W4 Y- t
// no opened orders identified
5 [! Z" \& @: \if(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断
, x& R4 _! V+ ]- _5 y{$ @$ `8 y! E  O. v
Print("We have no money. Free Margin = ", AccountFreeMargin());
% W1 P5 d4 }# Breturn(0);7 B; p0 l: A- G6 C$ d* _9 X  {
}
: o7 v& }8 p0 q3 u2 a// check for long position (BUY) possibility
$ q" X5 y7 ]( X- k) m+ Hif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious5 y* A' M/ I& W! s
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值6 U$ l# ^$ m2 g' \8 D
{
  b9 {$ r2 D; t* {% F& N6 J4 nticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。+ Y! A% F1 N3 N- R! l
if(ticket>0) 大于0说明入场成功& J9 ~7 d% ?9 r% h
{8 Z2 e$ P* h+ D7 @$ S
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
& c! s" K* x' }4 h}
. K, i% u* k- J+ b" h6 O" |else Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。" d3 l/ D5 v) m! \
return(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。8 b% o9 I* f% V3 z& H' P/ v
}  y4 [% D, }# L; Z1 i  D' q
下面就是空单入场的判断了,大家自己对照观看即可
0 e2 Q9 E3 e6 ^! G, G// check for short position (SELL) possibility
5 m% a4 _* |# o3 L2 O+ K9 ]. lif(MacdCurrent>0 && MacdCurrentSignalPrevious &&1 h0 ?4 ]' _5 \# M
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
: e" U# E& @5 `3 G' w8 j, {$ {5 y{
. o1 J  y5 x  S  y4 z4 S/ {+ ^ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);( T8 M- {8 _0 j' F+ U. z/ `! e
if(ticket>0)
) ^+ z$ w# F: G8 s) _9 h; _{
& b' r4 Q4 Q! y6 Pif(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());' {, D  P6 O9 l
}
! j. K! n8 q0 D: F& H- _$ helse Print("Error opening SELL order : ",GetLastError());
) V% l/ E4 j3 T2 S- breturn(0);
/ V: P, e7 |" p& b$ [}: m) g/ e% a% V1 [
return(0);
/ s/ [2 B' A8 q. l}
# n# W: ]1 Q. d! ^0 v* \% S
0 S. p9 _& Y7 j: `, d2 {6 B0 S/ j) Q- d4 y- J$ D1 V2 m$ H
汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。
6 l" N  D4 Q+ D+ k8 H/ {! c
% y6 a: g) _3 w. U  愿你: c- ?6 t3 j) a/ q9 H

  y6 b1 O( [9 q" u0 ?6 m/ N  K  真诚地愿你拥有一种淡淡的情致。$ {! y- j1 b  f: E

7 F9 I4 @: l7 g2 A+ F
6 B1 G7 T) m. G4 W
0 P4 I. A0 ?1 t- S) t, _5 r* _! c# c3 U
color=dimgray

TOP

返回列表

站长推荐 关闭


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

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


查看