返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解8 g6 W) d  s* F% p' o8 ~% J" ~
6 O  D' b' l3 j+ E# n
//+------------------------------------------------------------------+$ Z9 G: [: R- W
//| MACD Sample.mq4 |
# t0 n8 T: D$ r//| ... [/quote]4 n" H5 D! o  |
extern double TakeProfit = 50; 盈利目标点数. o5 z0 ]7 X! \8 P) u
extern double Lots = 0.1; 每单入场的手数* l2 \* e" Y+ V/ J" n& @! u. }) t* ?
extern double TrailingStop = 30; 追踪止损的点数
( C. Z! N. H) h8 ^' q: a4 Zextern double MACDOpenLevel=3; MACD开仓的参考位置
0 T" @4 n+ d" ^/ Lextern double MACDCloseLevel=2; MACD出场的参考位置
. K" `# m/ C! Z- A6 }/ ~extern double MATrendPeriod=26; 条件中使用的MA均线的周期数. D0 C( a, i$ v8 _  ^1 L
程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。
, s# _+ H% x! c这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。
8 C3 d- Z" q' a: t' I& {# x先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。& @3 ]) V! n9 U. O7 T* y
多头入场条件:: h+ c: z6 Q/ _# A
MACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势- e- B# i% ?& l# M, p0 ?/ _
多头出场条件:
& s7 d, O# K& `# F3 G# oMACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)7 L5 \  K, ^8 ?
空头入场条件:- ]- o6 H& C) U3 g- j5 T
MACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势
" Q2 S; ^* T7 q空头出场条件:8 w9 p8 _( R4 ^: l4 `8 W0 W
MACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)
. B+ P, O" ^0 L' d+ \=============================================================" `4 s  _2 H+ ~
有了以上的初步了解,下面开始进行EA程序基本结构的分析:: F/ R- F  k; p, }- p, [! f
1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里
8 C( L7 {# U. t. D2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。
4 s( o% W, F) R2 c先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。; D% b4 g* }/ ^9 y- I( L: a' X
程序开始的以下两个部分不重要 简单说一下:3 V! e6 }0 a9 h
if(Bars<100)
; x9 b; a  P5 h6 d, T9 K# Y{" R, Z) [, Q2 o* Z; d# w7 V
Print("bars less than 100");
8 V0 v+ I' y: }/ ^0 z/ }, Wreturn(0);- ]4 G- F, o- O+ x
}/ [. j3 C: Y* G2 U; \& e
以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。  u% l1 D3 a. O
if(TakeProfit<10)
$ U/ O/ [9 Z: W% v: J$ }* l: d- c{
/ }$ {& I( G1 q% w% O* {" k) aPrint("TakeProfit less than 10");9 H. [2 s' [( g0 h# R( C
return(0); // check TakeProfit8 d$ I7 v9 k. B+ v0 n* N
}+ T# W3 g5 L0 u0 P
以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。
# k, v$ s8 c# U" b8 W下面这段:/ B8 t6 V4 e0 t; A# w8 w5 [) |2 _
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
& _/ e1 _: S7 u5 A* iMacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
/ P4 w: I& v' p& G) }8 ISignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
3 U" u$ ^  I3 c1 y4 iSignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);: }& }( T) l6 R9 q  g9 S
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);* S1 \  q: A" Z5 K
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
% B  @$ v- Y* ~- q: W, P这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。2 D) Y. a2 I/ ^
再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。
( h) b3 t5 d! G3 U6 t$ k2 Gtotal=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:
3 d" D- q" R  Yif(total<1)9 Z! _( P- l# {5 A# o) s9 R: d) u
{
) s) X' F3 T) s/ @6 C// no opened orders identified  W9 w" s4 _$ o2 R. b: ]* T. d
if(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断% `/ i: }. G1 B- Q" H5 v* ]) w0 o
{" ?; x" Q$ g5 y# a- w9 z
Print("We have no money. Free Margin = ", AccountFreeMargin());$ v3 A+ Q' O5 \9 h$ v  {6 O
return(0);  L8 V" [2 F. B& T3 V2 }# y% I2 f
}& f$ I+ u0 Z1 ]* p$ M
// check for long position (BUY) possibility8 n% t- K+ ?" P* d, P# a
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious% y& _4 \8 |+ f" r
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值
0 x- s$ O9 F, s( k1 d& }# T: B& Q* b{' e0 k* d9 D$ [; x$ V2 N/ U
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。
- h. W8 w; M5 K* V4 ]4 [if(ticket>0) 大于0说明入场成功
$ y! `5 \7 ?4 d: u{
; {/ {) K& e$ b! r. Xif(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());$ `) b5 f! o3 F
}
4 a4 n6 E6 d4 S: Q1 I1 X. nelse Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。
4 `, r# ~( I0 `/ kreturn(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。0 f1 y8 O8 \3 g# l0 ]; y2 U& I$ q
}5 o9 x8 r1 r& y9 e0 J) F
下面就是空单入场的判断了,大家自己对照观看即可
" E$ E' J6 M( z" F8 i( F// check for short position (SELL) possibility0 `0 K* q' f& s% a6 ~. E4 `, r
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&3 K2 K. M' y3 o0 _6 a
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
7 J: Q$ }1 [2 A4 Q{
. E/ K, ^# D. r, g, I, j% Lticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);) ?5 |& N* e+ s7 H
if(ticket>0)
$ Y7 C" b& h. Q! R& ?4 J# r{* X+ W1 }" K  L8 `  D1 \
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());/ l. V: ?8 n, [! Y
}
* N5 V  U( `  w4 S. ?else Print("Error opening SELL order : ",GetLastError());  q3 K, n: x) F& m
return(0);& e/ U9 C. Q' h0 V
}
9 V1 p: w. M! v/ zreturn(0);
- F- M/ R1 V- \7 q4 V}
# F& u/ N! I9 @. E
- q  ~+ R8 g) G5 V( d  G0 }  p6 d$ |1 w
汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。
; d: ]& q, i" Q0 y) r' n" I# n: k7 I* D: H1 W4 W8 {+ N, ]
  愿你% z+ W; q# W- ~+ s( L) o

3 l& ?1 O  H4 w. a' C! `3 H  真诚地愿你拥有一种淡淡的情致。
( @8 k- b- B6 g) h& Q/ ^% K) k) ]( ~0 K

3 A% `, K- q% i1 ~. F+ ^8 I, S8 Q7 q7 l
0 S1 R$ Z' P8 d+ O
color=dimgray

TOP

返回列表

站长推荐 关闭


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

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


查看