返回列表 发帖

MT4自带EA:MACD Sample详解

MT4自带EA:MACD Sample详解0 \0 G! ?9 ~6 w/ W+ T& u
3 u- ^5 L% \. K
//+------------------------------------------------------------------+
/ j) d- e( x8 S( c9 z//| MACD Sample.mq4 |2 V- m. _+ v' \. s! p
//| ... [/quote]  X. u/ e- b% l" m0 }5 ^
extern double TakeProfit = 50; 盈利目标点数
5 _# [. C0 i5 jextern double Lots = 0.1; 每单入场的手数
6 A2 h" m; S6 ~: Y0 D5 Mextern double TrailingStop = 30; 追踪止损的点数3 l. P9 s* F# I% t$ c
extern double MACDOpenLevel=3; MACD开仓的参考位置
8 {5 [3 \- _( [* z% Q6 cextern double MACDCloseLevel=2; MACD出场的参考位置2 I( N& k+ ^/ O* H+ e
extern double MATrendPeriod=26; 条件中使用的MA均线的周期数4 t# H  y2 F0 x0 m! B/ q$ @
程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。
& v, q+ Y' w8 B; v这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。: G  K, u: t( @( w
先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。" s& X9 ?: x/ @* {
多头入场条件:( ]6 w3 o" k( ~4 [; F
MACD小于0 并且 小于指定的参数MACDOpenLevel 并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势
: F' [9 t/ Y, C' F0 d* n( W多头出场条件:/ y6 U0 ~3 G7 F0 Z/ [
MACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)
2 _$ h2 y' o; |. X" Y空头入场条件:. h$ m, ^, u9 A6 n
MACD大于0 并且 大于指定的参数MACDOpenLevel 并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势" }" {2 o+ y- ]
空头出场条件:
) Y: }  ]+ J% h8 k* `7 PMACD小于0 并且 小于制定的参数MACDCloseLevel 并且 MACD讯号线下穿基准线(死叉)) u+ l$ E3 Z: F' A0 m
=============================================================* X* ^$ N' w3 L
有了以上的初步了解,下面开始进行EA程序基本结构的分析:# q% O# m% k1 ~& F
1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里) U9 E8 _  b& f# w3 _& a9 V, w
2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。2 [/ l/ X; w  p
先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。  Q* `& D& [0 d* @' S1 z. [
程序开始的以下两个部分不重要 简单说一下:5 h6 l8 o; Z& B
if(Bars<100)
# e& g7 K+ J- S{
/ Y5 V2 `6 \" tPrint("bars less than 100");' T9 _0 o8 @/ q/ {) J% d( G: Q* U/ ]
return(0);
$ ?  a2 r! [3 T2 u. A, y, l: x8 F* K9 s}6 X5 D, V& [+ q1 d1 v5 \% @, {
以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。4 I' |6 j* `2 l7 T
if(TakeProfit<10)
' q( G  |% i, L" A- n- F{
) M# a, c1 W- \1 z0 B" r) v) jPrint("TakeProfit less than 10");
& a& U, D9 R8 ^" o9 Nreturn(0); // check TakeProfit, ]  Q5 A! ^: X* c
}
  L0 ?2 ]$ H; R  V0 F, y. \. u$ H以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。
9 [4 \, @3 [! p$ G下面这段:* y: U5 Y. u5 {* X' e% R5 }
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);# e/ p, g  l5 {1 U8 g
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
& k" }- E5 D6 i1 Z" ]$ g0 F1 {" s! ?SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);1 h! p: P0 Q' ]& P! I% G
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);2 G" ?/ x, v3 B2 H# F& H
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);5 R5 l4 A, W& X& B: U8 \$ Z6 K
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
% X8 o  Q( |* M. V这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。# _4 k& p, p; L3 b1 G1 f4 o: ^
再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。
- a- [9 E8 @- Qtotal=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:
; |. G1 d) q, gif(total<1)- f# J2 y0 s3 L8 [3 U5 @# N7 }/ ^  |
{6 n+ |8 z+ k6 D5 l) G" a) T
// no opened orders identified
" l  r$ b- O3 N- v$ Bif(AccountFreeMargin()<(1000*Lots)) 这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断
/ ?0 R0 I" X) |2 A5 D{
3 i8 ~/ r1 K) H4 mPrint("We have no money. Free Margin = ", AccountFreeMargin());! b# N$ l  B" t
return(0);
0 C+ |# j. d4 g+ j6 [) U}$ b" P4 t  d; H( {+ d: _  J+ n. t
// check for long position (BUY) possibility
8 O) g- Q) ?, Z% m. [2 Tif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious3 b3 C# L4 s7 b5 _4 Q& Q3 T0 c
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值1 }% G# y  O# G3 L
{( y1 \: F0 `+ r+ i0 @6 y2 R) r
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 这是入场语句记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。7 t" b: D+ `1 h( I2 Y5 k& u/ s/ h
if(ticket>0) 大于0说明入场成功+ C9 z& L! m7 m& h0 K% u' u
{
! f9 A% r) u: K# ~+ Eif(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());8 }  |! q8 x0 D% C0 X7 B
}! e2 v# F# Q2 T9 b' q8 v6 W4 @
else Print("Error opening BUY order : ",GetLastError()); 入场不成功,输出不成功的系统原因。
  ]1 |$ r: Q1 ureturn(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。
: Y/ }2 w# H* R0 p) v; _}
8 i7 t- W2 Z5 z$ ^% D# z" @3 P下面就是空单入场的判断了,大家自己对照观看即可
/ K1 E/ J& L  T! o: L1 E) ^// check for short position (SELL) possibility9 S2 I  V1 x& \' H
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&+ h( {& Z9 u4 ~
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent
/ v1 C/ t* p5 T0 \* z5 W{  F* j# ^, G6 z' ?$ M
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);, s+ g) H: Q% ~' O6 Q& S! s& Y' _
if(ticket>0)# `8 H* D8 Q4 C$ V
{
$ x! o4 `  q& S+ w4 A3 Z+ x8 Kif(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());# _% C2 k: F. w: C6 c4 c
}7 J0 ?) ~* @0 X
else Print("Error opening SELL order : ",GetLastError());
- @* k! r$ j5 |% Xreturn(0);
; w7 L+ C1 T+ E+ a+ E}
. Z+ Q7 k2 _3 N% _, C& p. lreturn(0);
- L0 ?# e3 f( w+ d( B: @0 O9 C}
! {1 ~8 {3 z  e/ Y% x! S) ^" U
. c# L- n$ E* ]$ T3 n2 \: a2 S2 |0 ~# `2 k3 P! N* \9 y; o2 @& U+ R" {
汇茶外汇论坛
客服QQ:708853620;  
服务客户,诚信双赢;  汇茶外汇论坛

有意思,确实不错,!!不论怎样,人生路上每一处坎坷,每一道风景,你都要以一种淡淡的心情去面对。5 k2 z5 H. I3 r
. a) _* Z5 E5 u$ C  @) v
  愿你7 p$ R* ^; I# {( W: }! \! S& i
3 d! Z5 ^- f$ H
  真诚地愿你拥有一种淡淡的情致。, V3 }$ ?  {/ H$ E& P5 D! A
" O  g7 V) ]$ q& t

" x- r6 A. l; T  k+ ~# z1 E# o7 S' Y1 a- \# ^7 S

1 E# D4 o, H* W! }8 w/ Y0 Zcolor=dimgray

TOP

返回列表

站长推荐 关闭


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

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


查看