返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解
$ {6 b+ U: |) @! K  `: q" \
* A8 `! K& u3 \  g  s7 F//+------------------------------------------------------------------+
  J: j1 N6 |' l/ t+ H//| MACD Sample.mq4 |  s: y4 i6 ?4 ?+ \8 d
//| ... [/quote]
& E$ J' R0 n! `2 @1 K* d6 O7 dextern double TakeProfit = 50; 盈利目标点数
( H  }( ]# W6 C1 J$ |+ xextern double Lots = 0.1; 每单入场的手数' R0 [/ {- Z" y: G% u7 Y. R
extern double TrailingStop = 30; 追踪止损的点数
* ~" J1 L5 l! P% g* I4 L& Cextern double MACDOpenLevel=3; MACD开仓的参考位置0 @3 }! z" @* t  }1 j+ P: Z& H
extern double MACDCloseLevel=2; MACD出场的参考位置. W+ F5 j* u# X! I6 z, i: t. F7 B
extern double MATrendPeriod=26; 条件中使用的MA均线的周期数3 T1 k6 `, v# F1 v* N
程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。
9 n9 m( N' X; Q3 w% v这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。
; L4 [' N2 {' k% e7 l# p' I2 v! Q先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。
5 Q) M9 }  G6 _, D4 ~; g7 x多头入场条件:7 J0 Z) n1 X5 m) b; |
MACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势6 U! [4 C. J- S' E0 }1 d% v
多头出场条件:4 _0 Y5 i- q. i+ F% g# ?$ O
MACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)
/ k$ ~' ]. y# _0 {" U空头入场条件:
% X2 u/ \6 e. q5 s2 u6 |2 \MACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势
+ ]$ j: n: B$ ]5 F* X8 M" z8 d+ i空头出场条件:
( i+ P4 U  W; Y  p1 t$ zMACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)
5 i) V2 j2 N& z& X' ]=============================================================
3 }# E% C, l* ^6 H有了以上的初步了解,下面开始进行EA程序基本结构的分析:
: A) {0 R9 ^! D# N) s7 e1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里
8 ]7 t! G" d* @* M# {& D& I2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。
( N4 ~  w) L) V. L3 b8 ]" H( {先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。
) `: ?9 ]  F+ q( D; A. {程序开始的以下两个部分不重要 简单说一下:. Z1 v7 O: }& ^
if(Bars<100): Z2 {6 f+ O4 @4 ?  O/ N  O
{8 r1 c6 b0 q. u8 v- p. g' R4 Z; Y( v8 _
Print("bars less than 100");
* V1 w6 Z4 z- }# l6 t: y8 N8 Treturn(0);
0 h" V7 h# I  |6 h/ x( V}8 k9 y1 H, J6 M
以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。
; a8 n$ Z9 |' Lif(TakeProfit<10)
4 T+ D- V7 J9 x: d* G{
& x4 x! V; s" G3 x  f1 O1 uPrint("TakeProfit less than 10");, N( q/ R. c# z* Q
return(0); // check TakeProfit; _7 v  l1 H: T4 I: [; G
}
& s  i& H- U* B* J以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。: }8 y- }, `2 h, Y( ?  j. ^
下面这段:
2 {5 D( s- b* x# F1 T' BMacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
. I" `  Z0 e3 `. C4 KMacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);: C* b( ]  d, o. e& X, `3 G
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);% b, g( V& h9 G8 G
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
: u6 @4 d  K7 ~! ]& x0 RMaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);1 p  a( c! J5 K; A5 }
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);$ F2 ^- o8 W  M! U3 n
这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。
# e+ V1 K9 y, K: l再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。8 @0 n/ J3 t0 s# g
total=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:
( `+ ?- f6 g2 o. @9 V, C7 Iif(total<1)% O6 K5 [4 g, Z2 G. U3 Y* }: t
{
0 j2 }1 S9 b) n; m& N// no opened orders identified
  G% P$ _" W- \if(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断% N' ]% _6 [! c8 w4 I8 ?+ V% n  n  |6 R
{' X' Q! r+ L: h% k* m) ^# }% y' P
Print("We have no money. Free Margin = ", AccountFreeMargin());: w. [, |. d  r/ s% p+ f& V
return(0);* N  Z2 a( i+ [( d- Q
}! y3 R4 n; d8 ]2 s
// check for long position (BUY) possibility  S% t. [6 T2 m3 S4 O! c" q3 k
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious
( j* B* m! c+ q3 b; @MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值
# ?# @# {9 S5 |/ w) \7 O{4 Q7 d* }6 g' Z/ N
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。
) G0 O. G6 u2 K6 L8 R# |1 Xif(ticket>0) 大于0说明入场成功0 y8 i" i4 I$ ~+ P
{% f) n! O+ r5 X
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
; b/ C$ ~, a# d/ ~/ L& W}
. n1 F) H: Z9 U; _' ^else Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。
# A# I& Z0 Z4 O' z" [$ _return(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。( h% @! i  M- b1 A) t7 e
}
5 ?& ~+ y  E4 `下面就是空单入场的判断了,大家自己对照观看即可. c+ k' x! G) y, m
// check for short position (SELL) possibility0 ^: r  U) ?7 E3 @
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
1 o: c; E+ @4 H7 WMacdCurrent>(MACDOpenLevel*Point) && MaCurrent3 v3 o% f; `! [
{/ d" Q( ^; B0 H; X
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);/ N2 r4 U. |* l# T8 a& e; a6 a
if(ticket>0)
0 H9 T) b2 X2 H) a0 y% h6 G% t/ ]{5 P. D2 k( V0 q, \  f
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());' c) P0 ]5 Z4 a  V" s+ w! I/ d" ^
}
0 [. O& c" ?7 M4 velse Print("Error opening SELL order : ",GetLastError());
/ j& V1 k3 @( J( p8 `, ]return(0);6 U$ C' {4 \4 U. i' K  `6 \. r' o) C1 U$ v
}
1 y. I* x% K5 F, Xreturn(0);
5 i: z  B# `9 r  z- ?9 `4 q}
$ t" O% n- m" J9 q* @1 [& n
5 g" r2 I/ |: E1 S3 S$ ]$ ]
" z) B$ k4 V  k  _; X9 V" e# a" `汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。
' {1 ^2 J" E4 k
+ k' Y' N9 t3 H) j$ o. ~. w  愿你1 t6 d' H$ m5 q3 Q- d( x% |# r
9 K! f- Y5 Q- |- ?8 g
  真诚地愿你拥有一种淡淡的情致。
" a( a! @7 {9 J" F6 J  e
* D1 {. S7 _; {( ?5 D0 U' ~0 W& c
! x: R5 C5 E7 I3 V7 k4 ]) h2 D1 F, b. T0 P. H

2 o& a+ O' f2 A( x9 ]color=dimgray

TOP

返回列表

站长推荐 关闭


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

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


查看