MT4 EA制作速成班——基础篇

# 什么是MT4?

我就当你了解什么是MT4了

MT4就是META. TRADER 4

# 什么是EA?

我也当你了解什么是EA了

EA 就是 Expert Adviser

EA 就是智能交易系统

智能教育系统就是:

-软件自己判断下订单

-软件自己判断提成利润

-软件自己判断砍仓止输

# 什么是速成班?

就是你在很短很快的时间内就可以学会如何编写EA

是的,快则8个学习小时

慢则24个学习小时

# 什么叫“易学难精”?

就是你很快的就上手,难在成为厉害的高手。

这需要时间慢慢的去研究编写。

久而久之你就可以是EA编写高手了。

05-25-2009 08:56 AM

yes810

第一课::了解EA的形式

* 以下就是EA的编写形式//

+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright ?2007, MetaQuotes Software Corp. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright ?2007, MetaQuotes Software Corp."

#property link. "http://www.FXunion.com"

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

* //+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright ?2007, MetaQuotes Software Corp. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

这个是在上面的垃圾

写与不写都无所谓

我们就不用理他

* #property copyright "Copyright ?2007, MetaQuotes Software Corp."

#property link. "http://www.FXunion.com"

这个也是在上面的垃圾

写与不写都无所谓

我们也不用理他

* //+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//以后可能有用到

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//以后可能有用到

//----

return(0);

}

这两个很少用到。高高手才会用

速成班的话,这个可以不用理他。

放在一边先,以后才学怎样用它。

* //+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

//主程式

//----

return(0);

}

//+------------------------------------------------------------------+

这个就是EA开始操作的重要部分

以上的EA的编写形式我们改成如下:

* //+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

/以后可能有用到

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

/以后可能有用到

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

//主程式

//----

return(0);

}

//+------------------------------------------------------------------+

* 什么是“.mq4”?

EA制作好了就save成.mq4的文件

这文件是可以修改的

* 什么是“.ex4”?

EA制作好了

按“编写”就会自动save成.ex4的文件

这文件是不可以被修改的

这文件是加密的

可以出售的文件。

* 有什么问题要问吗?

但是我告诉你

不要问太深的问题,我是不会的。

05-25-2009 08:59 AM

yes810

第二课:EA重要部分

* 回到EA重要部分

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

//主程式

//----

return(0);

}

//+------------------------------------------------------------------+

* 我们要知道EA是由上面往下读的

所以我们在编写方面要有逻辑思考

以下是速成班编写的形式

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

MoneyManagement();

macd();

ma();

zhangchang();

buyme();

sellme();

xianshi();

//----

return(0);

}

//+------------------------------------------------------------------+

void MoneyManagement() {

}

//+------------------------------------------------------------------+

void macd() {

}

//+------------------------------------------------------------------+

void ma() {

}

//+------------------------------------------------------------------+

void zhangchang() {

}

//+------------------------------------------------------------------+

void buyme() {

}

//+------------------------------------------------------------------+

void sellme() {

}

//+------------------------------------------------------------------+

void buyme() {

}

//+------------------------------------------------------------------+

void xianshi() {

}

//+------------------------------------------------------------------+

/////end

* // 这两划代表右边的不要读

也可以说是注解

注意:EA不会读中文符号。比如这个“”

这个就可以 ""

* 我们可以完整他

//+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//以后可能有用到

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//以后可能有用到

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

//主程式

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

buyme();//买上

sellme();//买下

xianshi();//显示管理

//----

return(0);

}

//+------------------------------------------------------------------+

void MoneyManagement() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void macd() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void ma() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void zhangchang() {

///子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void buyme() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void sellme() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void buyme() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

void xianshi() {

//子程式

//这边要写一些东西

}

//+------------------------------------------------------------------+

/////end

* 如果你在上面加这个xianshi2();

下面就加这个

//////////////////////////

void xianshi2() {

//这边要写一些东西

}

////////////////////////////

可以任意无限的加。。。

* 有什么问题要问吗?

但是我老实告诉你

不要问太深的问题,我是不会回答的。

05-25-2009 09:03 AM

yes810

第三课::加入指标

* //////////////////////////////

void ma()

{

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

ma1now2 = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,1);

ma2now = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,0);

ma2now2 = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,1);

ma1bnow = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_OPEN,0);

ma2bnow = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_OPEN,0);

}

////////////////////////

ma1now是代表的字

你可以写成什么都可以

PRICE_CLOSE是ma最新的参数

PRICE_OPEN是ma开始的参数

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

这个整句是死的。

你只要copy&press就可以用了

ma1是ma的参数号码或bar

如果这样写法,他人不能更改参数

double ma1=1,ma2=2;

double ma1now,ma1now2,ma2now,ma2now2,ma1bnow,ma2bnow;

这样写法,他人可以更改参数

extern double ma1=1,ma2=2;

这个是要放在#property上面那边的

* 其它指标的写法

macd1now=iMACD(NULL,0,macd1,macd1*2,1,PRICE_CLOSE, MODE_MAIN,0);

zigzag1now=iCustom(NULL,0,"ZigZag",2,deviation,bac kstep,0,0);

Highest1now=High[iHighest(NULL,0,MODE_HIGH,Highest1,0)];

Lowest1now=Low[iLowest(NULL,0,MODE_LOW,Lowest1,0)];

iTrend1now=iCustom(NULL,0,"iTrend",2,0,0,iTrend1,0 ,iTrend1,0,0,1);

wpr1now = iWPR(Symbol(),0,wpr1,0);

指标写法是不用记住的

网上可以找到很多指标的写法

* 有了指标

我们可以更改我们的EA了

更改如下:

注意看看

刚刚的指标加在什么地方

什么位置

//+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

extern double ma1=1,ma2=2;

double ma1now,ma1now2,ma2now,ma2now2,ma1bnow,ma2bnow;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

buyme();//买上

sellme();//买下

xianshi();//显示管理

//----

return(0);

}

//+------------------------------------------------------------------

+void MoneyManagement() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void macd() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void ma()

{

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

ma1now2 = iMA(NULL,0,ma10,0,MODE_EMA,PRICE_CLOSE,1);

ma2now = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,0);

ma2now2 = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,1);

ma1bnow = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_OPEN,0);

ma2bnow = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_OPEN,0);

}

//+------------------------------------------------------------------+

void zhangchang() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void buyme() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void sellme() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void buyme() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void xianshi() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

/////end

* 注意这个{},不要糊涂的删除了也不知道

会出错的

注意这个可以写成这样

效果一样

double ma1=1;

double ma2=2;

double ma1now;

double ma1now2;

double ma2now;

double ma2now2;

double ma1bnow;

double ma2bnow;

* extern double ma1=1;

extern double ma2=2;

这样写可以显示在EA开始的修改处

* 有什么问题要问吗?

但是我老实告诉你

不要问太深的问题

可能我也不会回答的。

05-25-2009 09:07 AM

yes810

第四课-资金管理

* 这个将放在#property上面那边

////////////////////////

extern string _资金管理_ ="任选一个";

extern bool zijiguanli1 = true;//false true、、

extern bool zijiguanli2= false;//false true、、

extern bool zijiguanli3= false;//false true、、

///////////////////////////////////

true=要

false =不要用

我提供了三个资金管理作为参考

你可以自己增加自己喜欢的资金管理方案

* /////////////////////////////////////

void MoneyManagement() {

lotstart=(AccountBalance()*lotab/10000);

lots=lotstart;

if(cheng==0){cheng=1;}

CurrentBasket=AccountEquity()-AccountBalance();

/////////////////////////////////////////////////////////////////

if(zijiguanli1){ LotMM = lots;}

/////////////////////////////////////////////////////////////////

if(zijiguanli2){

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lots*(OrdersTotal()*cheng)+ lotstart,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(zijiguanli3){

if(s+b==0){aa=1;}

if(s+b==1){aa=3;}

if(s+b==2){aa=7;}

if(s+b==3){aa=11;}

if(s+b==4){aa=20;}

if(s+b==5){aa=31;}

if(s+b==6){aa=42;}

if(s+b==7){aa=54;}

if(s+b==8){aa=66;}

if(s+b==9){aa=76;}

if(s+b=10){aa=66;}

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lotstart*aa,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(LotMM

if(LotMMLotsMax){LotMM=LotsMax;}

}//end zijiguanli

//////////////////////////////////////////

注意:这个资金管理加了很多新的词句

所以我们要加上去#property上面那边

不然会出错

* 新的词句:

extern double cheng=1;

double aa=0;

int s=0,b=0;

intdouble CurrentBasket=0;

double LotMM=0;

double lotstart=0;

double LotsMax=100;

extern double lotab=0.1;

double lots=0;

* 注意:

double 是有小数点的

int 是没有小数点的

* 注意:

if(){}

很容易用,比如:

if(LotMM

意思就是:

如果LotMM小过lots,LotMM就等于0.01。

if(LotMMLotsMax){LotMM=LotsMax;}

意思就是:

如果LotMM大过LotsMax,LotMM就等于LotsMax。

不会的话,不要紧

copy&press就可以用了

把void MoneyManagement() { }

copy&press到我们EA模板去

结果如下://

* +------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

extern double ma1=1,ma2=2;

double ma1now,ma1now2,ma2now,ma2now2,ma1bnow,ma2bnow;

////////////////////////

extern string _资金管理_ ="任选一个";

extern bool zijiguanli1= true;//false true、、

extern bool zijiguanli2= false;//false true、、

extern bool zijiguanli3= false;//false true、、

///////////////////////////////////

extern double cheng=1;

double aa=0;

int s=0,b=0;

int double CurrentBasket=0;

double LotMM=0;

double lotstart=0;

double LotsMax=100;

extern double lotab=0.1;

double lots=0;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

buyme();//买上

sellme();//买下

xianshi();//显示管理

//----

return(0);

}

//+------------------------------------------------------------------+

void MoneyManagement() {

lotstart=(AccountBalance()*lotab/10000);

lots=lotstart;

if(cheng==0){cheng=1;}

CurrentBasket=AccountEquity()-AccountBalance();

/////////////////////////////////////////////////////////////////

if(zijiguanli1){ LotMM = lots;}

/////////////////////////////////////////////////////////////////

if(zijiguanli2){

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lots*(OrdersTotal()*cheng)+ lotstart,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(zijiguanli3){

if(s+b==0){aa=1;}

if(s+b==1){aa=3;}

if(s+b==2){aa=7;}

if(s+b==3){aa=11;}

if(s+b==4){aa=20;}

if(s+b==5){aa=31;}

if(s+b==6){aa=42;}

if(s+b==7){aa=54;}

if(s+b==8){aa=66;}

if(s+b==9){aa=76;}

if(s+b=10){aa=66;}

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lotstart*aa,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(LotMM

if(LotMMLotsMax){LotMM=LotsMax;}

}//end zijiguanli

//+------------------------------------------------------------------+

void macd() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void ma()

{

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

ma1now2 = iMA(NULL,0,ma10,0,MODE_EMA,PRICE_CLOSE,1);

ma2now = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,0);

ma2now2 = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,1);

ma1bnow = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_OPEN,0);

ma2bnow = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_OPEN,0);

}

//+------------------------------------------------------------------+

void zhangchang() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void buyme() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void sellme() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void buyme() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void xianshi() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

/////end

* 资金管理有三个方案:

资金管理1=平注

资金管理2=1,2,3,4,5...

可以乘,如果你把cheng改成2或3或0.2

资金管理3是固定式,1,3,7,11.。。

* 不明白?别急,用了就明白。

有什么问题要问吗?

但是我老实告诉你

我是自学成功的,没有上过什么EA课程

不要问太深的问题

可能我也不会回答的。

05-25-2009 09:14 AM

yes810

第五课:策略:战场

* 这里是整个EA最重要的地方

这里策略变化无穷

高深莫测就是这里作怪

* 在这里你要想:。。。

你的EA要怎样下注

什么时候买上?

什么时候买下?

怎样买上?

怎样买下?

有买上又买下?

什么时候离场?

条件满足是很重要的

* 在这里我给个简单的策略

-ma1黄金交叉ma2,EA买上

-ma1死亡交叉ma2,EA买下

-有赚25点就出场

-如果亏的时候亏50点就出场

* 是这样编写的:

ma1nowma2now

这样一句是不够条件的

ma1nowma2now

&& ma1now2

这个就是黄金交叉的编写法

* 反过来

ma1now

&& ma1now2ma2now2

这个就是死亡交叉的编写法

* 但是条件还是不够的

再加

ma1nowma2now

&& ma1now2

&& s+b==0

s+b==0 意思就是 买上+买下等于没有

没有下注,如果遇到条件符合就可以下注的意思

&& 的意思就是“再加”什么什么的条件

那么整句是这样编写

if(什么什么){就什么什么}

就是用这个

if(ma1nowma2now

&& ma1now2

&& s+b==0

){buyme();}

if(ma1now

&& ma1now2ma2now2

&& s+b==0

){sellme();}

* 现在我们就把这两句copy&press到战场去

注意:

现在又多了两个新的东西

buyme()和sellme()

你就copy&press buyme()和sellme()的编写法就可以了。

* 结果如下:

//+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

extern double ma1=1,ma2=2;

double ma1now,ma1now2,ma2now,ma2now2,ma1bnow,ma2bnow;

////////////////////////

extern string _资金管理_ ="任选一个";

extern bool zijiguanli1= true;//false true、、

extern bool zijiguanli2= false;//false true、、

extern bool zijiguanli3= false;//false true、、

///////////////////////////////////

extern double cheng=1;

double aa=0;

int s=0,b=0;

intdouble CurrentBasket=0;

double LotMM=0;

double lotstart=0;

double LotsMax=100;

extern double lotab=0.1;

double lots=0;

double TP=0,TPP=0,SL=0,SLL=0;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

buyme();//买上

sellme();//买下

xianshi();//显示管理

//----

return(0);

}

//+------------------------------------------------------------------+

void MoneyManagement() {

lotstart=(AccountBalance()*lotab/10000);

lots=lotstart;

if(cheng==0){cheng=1;}

CurrentBasket=AccountEquity()-AccountBalance();

/////////////////////////////////////////////////////////////////

if(zijiguanli1){ LotMM = lots;}

/////////////////////////////////////////////////////////////////

if(zijiguanli2){

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lots*(OrdersTotal()*cheng)+ lotstart,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(zijiguanli3){

if(s+b==0){aa=1;}

if(s+b==1){aa=3;}

if(s+b==2){aa=7;}

if(s+b==3){aa=11;}

if(s+b==4){aa=20;}

if(s+b==5){aa=31;}

if(s+b==6){aa=42;}

if(s+b==7){aa=54;}

if(s+b==8){aa=66;}

if(s+b==9){aa=76;}

if(s+b=10){aa=66;}

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lotstart*aa,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(LotMM

if(LotMMLotsMax){LotMM=LotsMax;}

}//end zijiguanli

//+------------------------------------------------------------------+

void macd() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void ma()

{

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

ma1now2 = iMA(NULL,0,ma10,0,MODE_EMA,PRICE_CLOSE,1);

ma2now = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,0);

ma2now2 = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,1);

ma1bnow = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_OPEN,0);

ma2bnow = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_OPEN,0);

}

//+------------------------------------------------------------------+

void zhangchang() {

//这边要写一些东西

if(ma1nowma2now

&& ma1now2

&& s+b==0

){buyme();}

if(ma1now

&& ma1now2ma2now2

&& s+b==0

){sellme();}

}

//+------------------------------------------------------------------+

void buyme(){

if (TP==0) { TPP=0; } if(TP0) { TPP=Ask+TP*Point; }

if (SL==0) { SLL=0; } if(SL0) { SLL=Ask-SL*Point; }

OrderSend(Symbol(),OP_BUY,LotMM,Ask,slip,SLL,TPP," M"+Period()+"",0,0,Violet);

return(0); }

//+------------------------------------------------------------------+

void sellme(){

if (TP==0) { TPP=0; } if(TP0) { TPP=Bid-(TP*Point); }

if (SL==0) { SLL=0; } if(SL0) { SLL=Bid+(SL*Point); }

ticket=OrderSend(Symbol(),OP_SELL,LotMM,Bid,2,SLL, TPP,"M"+Period()+"",0,0,GreenYellow);

return(0); }

//+------------------------------------------------------------------+

void buyme() {

//这边要写一些东西

}

//+------------------------------------------------------------------

+void xianshi() {

//这边要写一些东西

}

//+------------------------------------------------------------------+/////end

* 在buyme()和sellme()

我们又发现新的词句

TP,TPP,SL,SLL

我们必须在#property上面加上他们

不然会出错

我已经加上去了上面的结果了

你注意到了吗?

* ok,这个EA可以用了

现在你copy&press 去你的METAEDITOR

save as 一个新的名字就可以了

* 试一试,用一用

告诉你,它肯定是“垃圾”EA

因为是亏钱的EA

哈哈和。。。

* 有什么问题要问吗?

但是我老实告诉你

我是自学成功的,没有上过什么EA课程

不要问太深奥或无聊的问题

我可能不知道怎样答你的问题。

哈哈和。。。

* 你会发现问题??。。。

然后告诉我上面问题。。。

这就是你今天的功课

再见

哈哈和。。。

05-25-2009 09:18 AM

yes810

第六课-解决出错问题

* 如果你有做功课

你会知道以上的EA还是不能用

因为出错了

出错是常事

没有什么了不起

没有什么大事

* 当你按在METAEDITOR按“编写”时

最下方会告诉你出错了

按一按下方的出错

他会告诉你在那里出错了

第一:intdouble CurrentBasket=0;

多了 int

删掉 int 就可以了

//int 是表示要“整数”比如:1,2,3,4...

//double 表示要有小数点,比如:1.1,7.987.56.897.....

* 之后你在按一下“编写”

他告诉你

第二:ma1now2 = iMA(NULL,0,ma10,0,MODE_EMA,PRICE_CLOSE,1);

ma10,意思就是没有ma10这个新词句

其实我们没有用到ma10

是编写错误

不是ma10,是多了个0

应该是ma1

删掉 0 就可以了

* 之后你在按一下“编写”

他告诉你

第三:OrderSend(Symbol(),OP_BUY,LotMM,Ask,slip,SLL,TP P,"M"+Period()+"",0,0,Violet);

问题是slip

应该是新的词句

slip 是什么?

听他们讲是滑点?管他

因为我们不可以删掉slip

所以在上方加上新的词句吧!

比如:

int slip=6;

就可以了

* 再来。。。

ticket=OrderSend(Symbol(),OP_SELL,LotMM,Bid,2,SLL, TPP,"M"+Period()+"",0,0,GreenYellow);

ticket?

我们没有用到ticket

所以可以删掉 ticket= 就可以了

* 再来。。。他告诉你多了这个

void buyme() {

//这边要写一些东西

}

因为已经有了的,哈哈和。。。

是糊涂多了一个

删掉 整句多余的buyme 就可以了

* 再来。。。

0错误 0警告

哈哈和。。。

成功了

恭喜你已经学会编写EA了

* 试一试用一用?

效果怎样?

是不是有一点怪怪?

又出错了?

又是功课的时间

告诉我又发生什么事情。。。

* 编写EA就是解决问题

当你是解决问题高手

你就是编写EA高手

哈哈和。。。

05-25-2009 09:22 AM

yes810

第七课-填写盈亏

上一回我们讲到

-有赚25点就出场

-如果亏的时候亏50点就出场

这个还没有加上去

编写方法就是

Take Profit=25

Stop Loss=50

我把他们简写成

TP=25;

SL=50;

你想到了什么吗?

对,这字眼很熟吧!

记得吗?

double TP=0,TPP=0,SL=0,SLL=0;

我们改成

double TP=25,TPP=0,SL=50,SLL=0;

你发现吗?

不过下注方面还是有问题!

其实是这EA没有判断

什么是B

什么是S

B是buy

S是sell

速成班不必学会怎样写

你只要copy&prss下面的子程式

放进去就可以了

我把它称为检查

//////////////////////////////////////////

void jiancha()

{

b=0;s=0;

for (int cnt=0; cnt<=OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol()==Symbol() )

{

mode=OrderType();LastOrderType=OrderType();

if (OrderType() == OP_SELL){ s++; LastPricesell=OrderOpenPrice();}

if (OrderType() == OP_BUY ){ b++; LastPricebuy=OrderOpenPrice();}

LastPrice=OrderOpenPrice();

if (OrderType()==OP_SELL) {OpenSells++;}

if (OrderType()==OP_SELLSTOP) {OpenSellStops++;}

if (OrderType()==OP_BUY) {OpenBuys++;}

if (OrderType()==OP_BUYSTOP) {OpenBuyStops++;}

}

}

}//end jiancha

//////////////////////////////////////////////////

要记得:在start那边也加入

jiancha;

这样就可以了。

当我们按“编写”

会出错

因为有了新的词句

我们没有加在#property上面那边

新的词句:

mode

LastOrderType

LastPricesell

LastPricebuy

LastPrice

OpenSells

OpenSellStops

OpenBuys

OpenBuyStops

我们更正如下:

double mode=0;

double LastOrderType;

double LastPricesell;

double LastPricebuy;

double LastPrice;

double OpenSells;

double OpenSellStops;

double OpenBuys;

double OpenBuyStops;

按“编写”。。。

0错误 0警告

ok了

按“终端”试一试效果怎样

还是不行

还是buy sell buy sell buy sell

你知道什么事情发生了吗?

跟你讲一个逻辑

什么是主程式

就是主要的程式

什么是子程式

就是不是主要的程式

了解了这些

现在一个问题,这些子程式

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

buyme();//买上

sellme();//买下

xianshi();//显示管理

那些是不需要一直用的就不可以在主程式这里

对啦!

buyme();//买上

sellme();//买下

是有时用到,有时没有用

所以我们删掉它

现在这个EA可以正常的操作了

其编写程式如下:

注意颜色部分的位置

//+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

extern double ma1=1,ma2=2;

double ma1now,ma1now2,ma2now,ma2now2,ma1bnow,ma2bnow;

////////////////////////

extern string _资金管理_ ="任选一个";

extern bool zijiguanli1= true;//false true、、

extern bool zijiguanli2= false;//false true、、

extern bool zijiguanli3= false;//false true、、

///////////////////////////////////

extern double cheng=1;

double aa=0;

int s=0,b=0;

double CurrentBasket=0;

double LotMM=0;

double lotstart=0;

double LotsMax=100;

extern double lotab=0.1;

double lots=0;

double TP=25,TPP=0,SL=50,SLL=0;

int slip=6;

///////////////////////////////////////

double mode=0;

double LastOrderType;

double LastPricesell;

double LastPricebuy;

double LastPrice;

double OpenSells;

double OpenSellStops;

double OpenBuys;

double OpenBuyStops;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

jiancha();//检查判断

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

xianshi();//显示管理

//----

return(0);

}

//+------------------------------------------------------------------+

void jiancha()

{

b=0;s=0;

for (int cnt=0; cnt<=OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol()==Symbol() )

{

mode=OrderType();LastOrderType=OrderType();

if (OrderType() == OP_SELL){ s++; LastPricesell=OrderOpenPrice();}

if (OrderType() == OP_BUY ){ b++; LastPricebuy=OrderOpenPrice();}

LastPrice=OrderOpenPrice();

if (OrderType()==OP_SELL) {OpenSells++;}

if (OrderType()==OP_SELLSTOP) {OpenSellStops++;}

if (OrderType()==OP_BUY) {OpenBuys++;}

if (OrderType()==OP_BUYSTOP) {OpenBuyStops++;}

}

}

}//end jiancha

//+------------------------------------------------------------------+

void MoneyManagement() {

lotstart=(AccountBalance()*lotab/10000);

lots=lotstart;

if(cheng==0){cheng=1;}

CurrentBasket=AccountEquity()-AccountBalance();

/////////////////////////////////////////////////////////////////

if(zijiguanli1){ LotMM = lots;}

/////////////////////////////////////////////////////////////////

if(zijiguanli2){

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lots*(OrdersTotal()*cheng)+ lotstart,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(zijiguanli3){

if(s+b==0){aa=1;}

if(s+b==1){aa=3;}

if(s+b==2){aa=7;}

if(s+b==3){aa=11;}

if(s+b==4){aa=20;}

if(s+b==5){aa=31;}

if(s+b==6){aa=42;}

if(s+b==7){aa=54;}

if(s+b==8){aa=66;}

if(s+b==9){aa=76;}

if(s+b=10){aa=66;}

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lotstart*aa,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(LotMM

if(LotMMLotsMax){LotMM=LotsMax;}

}//end zijiguanli

//+------------------------------------------------------------------+

void macd() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

void ma()

{

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

ma1now2 = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,1);

ma2now = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,0);

ma2now2 = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,1);

ma1bnow = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_OPEN,0);

ma2bnow = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_OPEN,0);

}

//+------------------------------------------------------------------+

void zhangchang() {

//这边要写一些东西

if(ma1nowma2now

&& ma1now2

&& s+b==0

){buyme();}

if(ma1now

&& ma1now2ma2now2

&& s+b==0

){sellme();}

}

//+------------------------------------------------------------------+

void buyme(){

if (TP==0) { TPP=0; } if(TP0) { TPP=Ask+TP*Point; }

if (SL==0) { SLL=0; } if(SL0) { SLL=Ask-SL*Point; }

OrderSend(Symbol(),OP_BUY,LotMM,Ask,slip,SLL,TPP," M"+Period()+"",0,0,Violet);

return(0); }

//+------------------------------------------------------------------+

void sellme(){

if (TP==0) { TPP=0; } if(TP0) { TPP=Bid-(TP*Point); }

if (SL==0) { SLL=0; } if(SL0) { SLL=Bid+(SL*Point); }

OrderSend(Symbol(),OP_SELL,LotMM,Bid,2,SLL,TPP,"M" +Period()+"",0,0,GreenYellow);

return(0); }

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

void xianshi() {

//这边要写一些东西

}

//+------------------------------------------------------------------+

///////////////////////////////end

恭喜!恭喜,这EA可以正常操作了

有什么问题要问吗?

但是我老实告诉你

我是自学成功的

没有上过什么EA课程

不要问太深奥或无聊的问题

我可能不知道怎样答你的问题

其实也不用问什么

自己想出答案会更好更刻骨铭心

哈哈和。。。

05-25-2009 09:25 AM

yes810

第八课-移动止赢

移动止赢就是到口的肉就不要吐出去了

哈哈和。。。

这样形容你明白吗?

其实也不是这个意思

是赢到尽头的意思

速成班不必学会怎样写Traingstop

copy&Press就可以了

子程式如下:

///////////////////////

void TrailingStop()

{

for(cnt=OrdersTotal();cnt=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() == Symbol() )//&& OrderMagicNumber()==MAGICMA)

{

if (OrderType()==OP_SELL)

{

if(TrailingStop0)

{

if((OrderOpenPrice()-Ask)(Point*TrailingStop))

{

if((OrderStopLoss()(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Poi nt*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

if (OrderType()==OP_BUY)

{

if(TrailingStop0)

{

if(Bid-OrderOpenPrice()Point*TrailingStop)

{

if(OrderStopLoss()

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

}

}

}//end TrailingStop

////////////////////////////////////

这TrailingStop是可以一直用的

所以我们要加在start那边加

TrailingStop();

发现新的词句

cnt

TrailingStop

我们更正如下:

int cnt;

double TrailingStop=0;

按“编写”

0错误 0警告

厉害,哈哈和。。。

加入成功

把double TrailingStop=0;

0改成10,就可以操作了

改成这样也可以

extern double TrailingStop=10;

自己试一试看看效果如何?

怎样?容易吗?

哈哈和。。。

05-25-2009 09:30 AM

yes810

第九课-显示画面

显示的子程式如下

//////////////////////////////////////////////

void xianshi()

{

string name_8 = "xianshi1";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8, "伺服器时间::"+TimeToStr(CurTime( ))+"", 13, "Arial", White);

ObjectSet(name_8, OBJPROP_CORNER, 0);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 15);

text="EA制作速成班";

name_8 = "xianshi2";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8, ""+text+"", 15, "Arial", Yellow);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 5);

name_8 = "Lableyeddrice1";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8, "M"+Period()+" 货币 "+Symbol()+"", 10, "Arial", Silver);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 130);

ObjectSet(name_8, OBJPROP_YDISTANCE, 32);

//////这个显示上方

name_8 = "LableCurPrice2";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr(Ask, Digits)+"::买上", 15, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 30);

//////这个显示下方

name_8 = "Lab345rPrice3";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr(Bid, Digits)+"::卖下", 15, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 50);

name_8 = "Acc87lance";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr( AccountBalance(), 2)+"::账面资金", 13, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 70);

name_8 = "LableC5rice6";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr( AccountEquity(), 2)+"::净值资金", 13, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 90);

name_8 = "Labl456rice6";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr( AccountMargin(), 2)+"::保证资金", 13, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 110);

name_8 = "Labl4hcjce6";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr( AccountFreeMargin(), 2)+"::可用资金", 13, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 130);

name_8 = "Accvf7lance";

ObjectDelete(name_8);

ObjectCreate(name_8, OBJ_LABEL, 0, 0, 0);

ObjectSetText(name_8,""+DoubleToStr( AccountProfit(), 2)+"::账面盈亏", 13, "Arial", Lime);

ObjectSet(name_8, OBJPROP_CORNER, 1);

ObjectSet(name_8, OBJPROP_XDISTANCE, 15);

ObjectSet(name_8, OBJPROP_YDISTANCE, 150);

//我们可以无限的加

}

////////////////////////////////////////////////////

研究一下

你应该会用了

这显示有什么了不起吗?

有什么作用吗?

用你的脚想一想你应该会领悟的

哈哈和。。。

05-25-2009 09:33 AM

yes810

第十课-解决问题2

每一个程式的开始就是一个问题

没有问题就是有问题

有问题就有答案

没有答案就不是问题

哈哈和。。。

速成班基础篇教程到这里就结束了

结束就是新的开始

开始什么

开始更上一层楼

其它基础的东东

你可以在Metaeditor的右边找到

有中文的

所以我也不必重复

接下来

我们要快速的学习“策略篇”

因为一个成败的EA取决于策略

什么是策略?

策略就是战略

什么是战略?

战略就是你怎样把EA弄到直线上升

而不是楼梯下降

如果你要学习这一篇

可以,你必须交功课

功课:

在上面EA的基础上

请加上以下指标

a)macd

如果你做不出来

你的基础都有问题

怎样更上一层楼呢!

是不是

哈哈和。。。

05-25-2009 09:36 AM

yes810

第十一课::偷师

* EA速成班的学员是不必学会如何编写头痛的程式

不过这一招一定要会“偷师”

* 偷师就是“移花接木”

偷师就是“借花献佛”

* 怎样偷师?

就是copy&press那些公开的EA源码

* 比如:

以下是牛版主公开的源码

[原创]MT4阻力支撑源码公布

本指标为CDP公式在MT4上的实现,使用MT4的Expert调用方式,代码如下:

==================================================

//+------------------------------------------------------------------+

//| CDP.mq4 |

//| Copyright ?2005,520FXCorp. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright, 520FX Corp."

#property link. "http://www.FXunion.com"

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

double cdp,H,L,C,Hn,Ln;

double PT,AH,NH,AL,NL;

//----

H=iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,1);

L=iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW,1);

C=iMA(NULL,0,1,0,MODE_SMA,PRICE_CLOSE,1);

Hn=iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,2);

Ln=iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW,2);

cdp=(H+L+2*C)/4;

PT=Hn-Ln;

AH=cdp+PT;

NH=cdp*2-L;

AL=cdp-PT;

NL=cdp*2-H;

Comment("强支撑:",AL,"弱支撑:",NL,"弱阻力",NH,"强阻力",AH);

ObjectDelete("水平线");

ObjectDelete("水平线1");

ObjectDelete("水平线2");

ObjectDelete("水平线3");

ObjectCreate("水平线",OBJ_HLINE,0,D'2005.11.01 10:30',AL);

ObjectCreate("水平线1",OBJ_HLINE,0,D'2005.11.01 10:30',NL);

ObjectCreate("水平线2",OBJ_HLINE,0,D'2005.11.01 10:30',NH);

ObjectCreate("水平线3",OBJ_HLINE,0,D'2005.11.01 10:30',AH);

return(0);

}

//+------------------------------------------------------------------+

*  比如我们也不知道是什么东东

什么水平线?

* 第一步要做的就是把它当着是一个“子程式”

这样想你应该知道怎样加入你的EA里去

* 首先在“主程式”加入

水平线();

然后:

水平线(){

//这里加入程式

* 就是

水平线(){

//----

double cdp,H,L,C,Hn,Ln;

double PT,AH,NH,AL,NL;

//----

H=iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,1);

L=iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW,1);

C=iMA(NULL,0,1,0,MODE_SMA,PRICE_CLOSE,1);

Hn=iMA(NULL,0,1,0,MODE_SMA,PRICE_HIGH,2);

Ln=iMA(NULL,0,1,0,MODE_SMA,PRICE_LOW,2);

cdp=(H+L+2*C)/4;

PT=Hn-Ln;

AH=cdp+PT;

NH=cdp*2-L;

AL=cdp-PT;

NL=cdp*2-H;

Comment("强支撑:",AL,"弱支撑:",NL,"弱阻力",NH,"强阻力",AH);

ObjectDelete("水平线");

ObjectDelete("水平线1");

ObjectDelete("水平线2");

ObjectDelete("水平线3");

ObjectCreate("水平线",OBJ_HLINE,0,D'2005.11.01 10:30',AL);

ObjectCreate("水平线1",OBJ_HLINE,0,D'2005.11.01 10:30',NL);

ObjectCreate("水平线2",OBJ_HLINE,0,D'2005.11.01 10:30',NH);

ObjectCreate("水平线3",OBJ_HLINE,0,D'2005.11.01 10:30',AH);

return(0);

* 这样就完成“偷师”的方案。

* 希望牛版主不介意,把这个当教材

哈哈和。。。

05-25-2009 09:54 AM

yes810

第拾贰课:偷师2

* 看看这个EA,学习学习

* /* 尚未通过检测

//+------------------------------------------------------------------+

//| WYD_AE_H1.mq4 |

//| Copyright 2008, Xilin Lu ( Zhejiang Lanxi ) |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

================================================== =========================

功能简介: 本智能的中文名字:开门见喜。

工作原理:本智能交易以一小线的开盘价和收盘价为触发器。

在每H1线形成的过程中,开盘3分钟内执行。

当 Minute()<=3 时:

第一步,首先检查是否未平仓的单子,若有则平仓。

第二步,开新单,开仓前检查资金是否足够。不够时不能下单。

注意事项:虽然本智能对图表的运行时间没有要求,但它只在( Minute()0 && Minute()<=3 )

时段才有可能下单,这样做不仅能保证是H1的开盘价送单,而且可大大节约运算时间。

================================================== =================== + */

#property copyright "Copyright 2008, Xilin Lu ( Zhejiang Lanxi )"

#property link. "http://www.FXunion.com"

//+------------------------------------------------------------------+

//| 交易变量。

//+------------------------------------------------------------------+

extern double nLotsNumber = 0.1; // 每次交易手数

extern double nMaxMargin = 0.3; // 最大保证金使用比率

extern double nGainPoint = 20; // 止赢点数

extern double nLossPoint = 50; // 止损点数

//+------------------------------------------------------------------+

//| 全局变量。

//+------------------------------------------------------------------+

int nAllowSend=0; // 是否允许下单变量

//+------------------------------------------------------------------+

int start() {

double YyBaoZhenJing,KyBaoZhenJing,XyBaoZhenJing;

int cnt,total,nTradingMode,i;

//--- 判断K线开盘时间,以减少运行次数。 ------------------

if( Minute() ==0 ) { return(0); } // 正点时间任何时间段均不运行。

if( Minute()3 ) { nAllowSend=0; return(0); } // 从此行起可以编写您认为有价值的交易时间,我们现在是开盘3分钟内。

//-------------------------------------------------------------

//--- 判断是否已下单。 ----------------------------------------

if( nAllowSend==1 ) { return(0); } // 本次循环已下单,不能重复下单。 它在Minute()=3时重新置为可下单

//-------------------------------------------------------------

//-- 检查开仓信息于,若有则平仓 -------------------------------

total=OrdersTotal();

if( total != 0 )

{

for(cnt=0;cnt

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()!=Symbol()) continue;

if(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,White);

break;

}

if(OrderType()==OP_SELL)

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,White);

break;

}

}

}

//-------------------------------------------------------------

//--- 如果开仓保证金超过上限,则返还不交易。 ------------------

KyBaoZhenJing = AccountFreeMargin();

YyBaoZhenJing = AccountMargin();

if( YyBaoZhenJing / (YyBaoZhenJing + KyBaoZhenJing) = nMaxMargin ) { return(0); }

//-------------------------------------------------------------

//--- 重新评估开仓保证金,如果开仓保证金超过上限,则返还不交易。 ------

XyBaoZhenJing = MarketInfo( Symbol(), MODE_MARGINREQUIRED); // 一个标准手需保证金金额。

XyBaoZhenJing = XyBaoZhenJing * nLotsNumber ; // 下单需用的保证金

if( (YyBaoZhenJing+XyBaoZhenJing) / (YyBaoZhenJing+KyBaoZhenJing) = nMaxMargin ) { return(0); }

//---------------------------------------------------------------------

//+--- 判断条件 -----------------------------------------------------+

// 注意:你可以在这里编写一些判断条件,

// 当条件满足时再发出下定单指令,否则 return(0);

// 它就是你的智能交易系统了,祝你成功!

//+------------------------------------------------------------------+

//--- 发送定单。 ----------------------------

i=OrderSend( Symbol(),OP_BUY,nLotsNumber,Ask,3,Ask-nLossPoint*Point,Ask+nGainPoint*Point,"H1 Open Buy",1234,0,Green);

if(i0 ) { Alert( "买进",Symbol(),",开仓成功!" ); nAllowSend=1; } // 发送成功,将nAllowSend=1防止重复下单。

else { Alert( "买进",Symbol(), ",开仓不成功!" ); }

//-------------------------------------------------------------

return(0);

}

//+------------------------------------------------------------------+

* 以上EA是“一气呵成”的写法

* 这种编写方式是“有经验”的写法

不值得速成班学员学习

只能看看就好

* 这EA有一段可取之处

就是保证金的处理

//--- 如果开仓保证金超过上限,则返还不交易。 ------------------

KyBaoZhenJing = AccountFreeMargin();

YyBaoZhenJing = AccountMargin();

if( YyBaoZhenJing / (YyBaoZhenJing + KyBaoZhenJing) = nMaxMargin ) { return(0); }

//-------------------------------------------------------------

//--- 重新评估开仓保证金,如果开仓保证金超过上限,则返还不交易。 ------

XyBaoZhenJing = MarketInfo( Symbol(), MODE_MARGINREQUIRED); // 一个标准手需保证金金额。

XyBaoZhenJing = XyBaoZhenJing * nLotsNumber ; // 下单需用的保证金

if( (YyBaoZhenJing+XyBaoZhenJing) / (YyBaoZhenJing+KyBaoZhenJing) = nMaxMargin ) { return(0); }

* 这一小段,我们可以放在

战场策略开始那边,一开始策略就先判断保证金

* 怎样“偷师”呢!

这就是重要的两段话,我把它弄简单一点

//--- 如果开仓保证金超过上限,则返还不交易。 ------------------

if( AccountMargin() / (AccountMargin() + AccountFreeMargin()) = 1 ) { return(0); }

BaoZhenJing = MarketInfo( Symbol(), MODE_MARGINREQUIRED); // 一个标准手需保证金金额。

BaoZhenJing = BaoZhenJing * LotMM ; // 下单需用的保证金

if( (AccountMargin()+BaoZhenJing) / (AccountMargin()+AccountFreeMargin()) = 1 ) { return(0); }

//---------------------------------------------------------------------

copy&press这段去

zhangchang{

//开始这边

* 然后,应该有一个新的词句

加到#property上面就可以了。

* 我不知道有没有效

你自己试一试看看

* 为什么要你试

因为学习就是试一试

05-25-2009 10:10 AM

yes810

第拾叁课:偷师3

* 看看这个某位网友发表的EA,学习学习

* 一些交易系统的编写心得我编写EA的目的:建立系统的交易方法,

机械化运行,排除情感的影响,实现稳定赢利。

做EA一年了,最初做的是突破系统,依据突破方向追买追卖,

测试近半年,效果一般,决定放弃,但这个EA使我坚信了一点,

即只有跟着趋势交易才能实现EA的稳定赢利。

因此,我认为要做一个成功的EA,关键就在于如何应用一切可能的方法去判断趋势。

我发现很多很普通的指标都很容易做到这点,

举个例子,GBP/USD日线图,用一个长周期的RVI做趋势判断(RVI-110),

当RVI在“0”值上方趋势为上升,反之则为下降,

开仓及平仓用一个短周期RVI做信号指示(RVI-13),

在上升趋势时,采用RVI MAIN 上穿RVI SIGNAL作为买入信号;

在下降趋势时,采用RVI MAIN 下破RIV SIGNAL作卖出信号,

这个系统很简单,却很实用,配合好的止损止赢策略,

赢利是有保证的,我还为此编写了一个EA,

有兴趣的可以看看(附MQ4文件,写得很粗糙,高手别笑话)。

//+------------------------------------------------------------------+

//| RVITradeSys.mq4 |

//| Copyright 2007, ABKCN|

//| service@fxunion.com|

//+-----------------------------------------------------------------

extern double TakeProfit = 400;

extern double Lots = 0.1;

extern double TrailingStop = 80;

extern double Stops=200;

extern double RVIPERIODSHORT=13;

extern double RVIPERIODLONG=110;

double Points;

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int init ()

{

Points = MarketInfo (Symbol(), MODE_POINT);

//----

return(0);

}

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int deinit()

{

return(0);

}

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

double RVISIGNAL_C=0, RVISIGNAL_P=0,RVIMAIN_C=0,RVIMAIN_P=0;

double RVISIGNAL15_C,RVISIGNAL15_P,RVIMAIN15_C,RVIMAIN15_ P;

double TRENDSIDE=2,BSSIGNAL=2;

double LONGRVISIGNAL_C=0, LONGRVISIGNAL_P=0;

int cnt=0, total;

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit less than 10");

return(0);

}

//================================================== ===========

RVISIGNAL_C=iRVI(NULL,0,RVIPERIODSHORT,MODE_SIGNAL ,0);

RVISIGNAL_P=iRVI(NULL,0,RVIPERIODSHORT,MODE_SIGNAL ,1);

RVIMAIN_C =iRVI(NULL,0,RVIPERIODSHORT,MODE_MAIN,0);

RVIMAIN_P =iRVI(NULL,0,RVIPERIODSHORT,MODE_MAIN,1);

LONGRVISIGNAL_C=iRVI(NULL,0,RVIPERIODLONG,MODE_SIG NAL,0);

//================================================== ===========

if(OrdersTotal()<1)

{

if(AccountFreeMargin()<(1000*Lots))

{

Print("We have no money");

return(0);

}

//计算大方向及买卖信号

if (LONGRVISIGNAL_C0) { TRENDSIDE=0; }//0为上升1为下降

if (LONGRVISIGNAL_C<0) { TRENDSIDE=1; }

if (RVIMAIN_P<=RVISIGNAL_P && RVIMAIN_CRVISIGNAL_C) { BSSIGNAL=0; } //0买入1卖出

if (RVIMAIN_P=RVISIGNAL_P && RVIMAIN_C

//BUY CONDITIONS

if(TRENDSIDE==0 && BSSIGNAL==0)

{

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Stops*Points,Ask+TakeProfit*Points,"macd sample",16384,0,Red);

if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());

return(0);

}

//SELL CONDITIONS

if(TRENDSIDE==1 && BSSIGNAL==1)

{

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Stops*Po ints,Bid-TakeProfit*Points,"macd sample",16384,0,Red);

if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());

return(0);

}

return(0);

}

//平仓处理及追踪止损

total=OrdersTotal();

for(cnt=0;cnt

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL &&

OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY)

{

if(TRENDSIDE==1 && BSSIGNAL==1)

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ;

return(0);

}

if(TrailingStop0)

{

if(Bid-OrderOpenPrice()Points*TrailingStop)

{

if(OrderStopLoss()

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Points*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

else

{

if(TRENDSIDE==0 && BSSIGNAL==0)

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ;

return(0);

}

if(TrailingStop0)

{

if((OrderOpenPrice()-Ask)(Points*TrailingStop))

{

if(OrderStopLoss()==0.0 ||

OrderStopLoss()(Ask+Points*TrailingStop))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Poi nts*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

return(0);

}

// the end.

* 这个EA也是“一气呵成”的EA

说过了

不值得速成班学员为学习EA的榜样

* 那看来作什么呢?

答案是:自我学习

* 学习什么呢?

* 因为速成班学员个个都是“编写懒惰虫”

也不可以这么讲

因为我们不会什么C++啊!

怎样编怎样写啊!

没有办法

总得找出路嘛!

因此我们最精通的就是“移花接木”

* 请学员们把以上的EA

移花接木的放到自己的EA上去

* 方法简单:

第一步:copy&press指标

把他弄成子程式

* 第二步

把他的战场策略移植到我们的

战场策略,完毕。

就是这么简单。

* 为什么可以这样的简单?

其它的源码呢!

对,其它的就不要了

* 为什么?

因为我们的速成班EA结构no1啊!

无限发展空间啊!

你还不知道吗?

哈哈和。。。

* 如果你做不到

你就别想成为EA策略高手!

哈哈和。。。

05-26-2009 01:31 AM

yes810

第拾肆课:如何加其它指标

* 如何添加macd指标

//+------------------------------------------------------------------+

//| MT4-EA制作速成班.mq4 |

//| Copyright 2007, MT4-EA制作速成班. |

//| http://www.FXunion.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2007, MT4-EA制作速成班."

#property link. "http://www.FXunion.com"

extern double ma1=1,ma2=2;

double ma1now,ma1now2,ma2now,ma2now2,ma1bnow,ma2bnow;

////////////////////////

extern string _资金管理_ ="任选一个";

extern bool zijiguanli1= true;//false true、、

extern bool zijiguanli2= false;//false true、、

extern bool zijiguanli3= false;//false true、、

extern bool maok= false;//false true、、

extern bool macdok= true;//false true、、

///////////////////////////////////

extern double cheng=1;

double aa=0;

int s=0,b=0;

double CurrentBasket=0;

double LotMM=0;

double lotstart=0;

double LotsMax=100;

extern double lotab=0.1;

double lots=0;

double TP=100,TPP=0,SL=200,SLL=0;

int slip=6;

//////////////////////////////////

double mode=0;

double LastOrderType;

double LastPricesell;

double LastPricebuy;

double LastPrice;

double OpenSells;

double OpenSellStops;

double OpenBuys;

double OpenBuyStops;

///////////////////////////////

int cnt;

extern int TrailingStop=0;

///////////////////////////////

string text="";

////////////////////////

double MacdCurrent, MacdPrevious;

double Macd_1, Macd_2, Macd_3, Macd_4, Ma_Quick, Ma_Slow;

double MaCurrent, MaPrevious;

double top, bottom;

////////////////////////////

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

jiancha();//检查判断

MoneyManagement();//资金管理

macd();//指标管理

ma();//指标管理

zhangchang();//战场管理

xianshi();//显示管理

TrailingStop();//移动止赢

//----

return(0);

}

//+------------------------------------------------------------------+

void jiancha()

{

b=0;s=0;

for (int cnt=0; cnt<=OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol()==Symbol() )

{

mode=OrderType();LastOrderType=OrderType();

if (OrderType() == OP_SELL){ s++; LastPricesell=OrderOpenPrice();}

if (OrderType() == OP_BUY ){ b++; LastPricebuy=OrderOpenPrice();}

LastPrice=OrderOpenPrice();

if (OrderType()==OP_SELL) {OpenSells++;}

if (OrderType()==OP_SELLSTOP) {OpenSellStops++;}

if (OrderType()==OP_BUY) {OpenBuys++;}

if (OrderType()==OP_BUYSTOP) {OpenBuyStops++;}

}

}

}//end jiancha

//+------------------------------------------------------------------+

void MoneyManagement() {

lotstart=(AccountBalance()*lotab/10000);

lots=lotstart;

if(cheng==0){cheng=1;}

CurrentBasket=AccountEquity()-AccountBalance();

/////////////////////////////////////////////////////////////////

if(zijiguanli1){ LotMM = lots;}

/////////////////////////////////////////////////////////////////

if(zijiguanli2){

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lots*(OrdersTotal()*cheng)+ lotstart,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(zijiguanli3){

if(s+b==0){aa=1;}

if(s+b==1){aa=3;}

if(s+b==2){aa=7;}

if(s+b==3){aa=11;}

if(s+b==4){aa=20;}

if(s+b==5){aa=31;}

if(s+b==6){aa=42;}

if(s+b==7){aa=54;}

if(s+b==8){aa=66;}

if(s+b==9){aa=76;}

if(s+b=10){aa=66;}

if(CurrentBasket<0 ) {LotMM=NormalizeDouble(lotstart*aa,2); }

if(CurrentBasket==0 ) {LotMM=NormalizeDouble(LotMM*0,2); }

}

/////////////////////////////////////////////////////////////////

if(LotMM

if(LotMMLotsMax){LotMM=LotsMax;}

}//end zijiguanli

//+------------------------------------------------------------------+

void macd() {

Macd_1 = iMACD(NULL,0,3,20,9,PRICE_CLOSE,MODE_MAIN,1);

Macd_2 = iMACD(NULL,0,3,20,9,PRICE_CLOSE,MODE_MAIN,2);

Macd_3 = iMACD(NULL,0,3,20,9,PRICE_CLOSE,MODE_MAIN,3);

Macd_4 = iMACD(NULL,0,3,20,9,PRICE_CLOSE,MODE_MAIN,4);

Ma_Quick = iMA(NULL,0,20,0,MODE_EMA,PRICE_CLOSE,0);

Ma_Slow = iMA(NULL,0,65,0,MODE_EMA,PRICE_CLOSE,0);

top = High[iHighest(NULL,0,MODE_HIGH,10,1)];

bottom = Low[iLowest(NULL,0,MODE_LOW,10,1)];

}

//+------------------------------------------------------------------+

void ma()

{

ma1now = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,0);

ma1now2 = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_CLOSE,1);

ma2now = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,0);

ma2now2 = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_CLOSE,1);

ma1bnow = iMA(NULL,0,ma1,0,MODE_EMA,PRICE_OPEN,0);

ma2bnow = iMA(NULL,0,ma2,0,MODE_EMA,PRICE_OPEN,0);

}

//+------------------------------------------------------------------+

void zhangchang() {

//这边要写一些东西

if(maok){

if(ma1nowma2now

&& ma1now2

&& s+b==0

){buyme();}

if(ma1now

&& ma1now2ma2now2

&& s+b==0

){sellme();}

}//end ma

if(macdok){

if(

s+b==0

&& Macd_1 < Macd_2

&& Macd_2 Macd_3

&& Ma_Quick < Ma_Slow

&& Bid < Low[1]

&& Macd_2 0

//||

// s+b==0

//&& Macd_2 < Macd_3

//&& Macd_3 Macd_4

//&& Ma_Quick < Ma_Slow

//&& Bid < Low[2] && Macd_3 0

)

{sellme(); }

/////////

if( s+b==0

&& Macd_1 Macd_2 && Macd_2 < Macd_3

&& Ma_Quick Ma_Slow && Ask High[1] && Macd_2 < 0

//||

//s+b==0

//&& Macd_2 Macd_3

//&& Macd_3 < Macd_4 && Ma_Quick Ma_Slow

//&& Ask High[2] && Macd_3 < 0

)

{ buyme(); }

} //end macd

}//end zhangchang