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<lots){LotMM=0.01;} if(LotMM>LotsMax){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<lots){LotMM=0.01;} 意思就是: 如果LotMM小过lots,LotMM就等于0.01。 if(LotMM>LotsMax){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<lots){LotMM=lots;} if(LotMM>LotsMax){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点就出场 * 是这样编写的: ma1now>ma2now 这样一句是不够条件的 ma1now>ma2now && ma1now2<ma2now2 这个就是黄金交叉的编写法 * 反过来 ma1now<ma2now && ma1now2>ma2now2 这个就是死亡交叉的编写法 * 但是条件还是不够的 再加 ma1now>ma2now && ma1now2<ma2now2 && s+b==0 s+b==0 意思就是 买上+买下等于没有 没有下注,如果遇到条件符合就可以下注的意思 && 的意思就是“再加”什么什么的条件 那么整句是这样编写 if(什么什么){就什么什么} 就是用这个 if(ma1now>ma2now && ma1now2<ma2now2 && s+b==0 ){buyme();} if(ma1now<ma2now && ma1now2>ma2now2 && 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<lots){LotMM=lots;} if(LotMM>LotsMax){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(ma1now>ma2now && ma1now2<ma2now2 && s+b==0 ){buyme();} if(ma1now<ma2now && ma1now2>ma2now2 && s+b==0 ){sellme();} } //+------------------------------------------------------------------+ void buyme(){ if (TP==0) { TPP=0; } if(TP>0) { TPP=Ask+TP*Point; } if (SL==0) { SLL=0; } if(SL>0) { 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(TP>0) { TPP=Bid-(TP*Point); } if (SL==0) { SLL=0; } if(SL>0) { 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<lots){LotMM=lots;} if(LotMM>LotsMax){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(ma1now>ma2now && ma1now2<ma2now2 && s+b==0 ){buyme();} if(ma1now<ma2now && ma1now2>ma2now2 && s+b==0 ){sellme();} } //+------------------------------------------------------------------+ void buyme(){ if (TP==0) { TPP=0; } if(TP>0) { TPP=Ask+TP*Point; } if (SL==0) { SLL=0; } if(SL>0) { 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(TP>0) { TPP=Bid-(TP*Point); } if (SL==0) { SLL=0; } if(SL>0) { 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(TrailingStop>0) { 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(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { 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,学习学习 * #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<total;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(i>0 ) { 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_C>0) { TRENDSIDE=0; }//0为上升1为下降 if (LONGRVISIGNAL_C<0) { TRENDSIDE=1; } if (RVIMAIN_P<=RVISIGNAL_P && RVIMAIN_C>RVISIGNAL_C) { BSSIGNAL=0; } //0买入1卖出 if (RVIMAIN_P>=RVISIGNAL_P && RVIMAIN_C<RVISIGNAL_C) { BSSIGNAL=1; } //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<total;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(TrailingStop>0) { if(Bid-OrderOpenPrice()>Points*TrailingStop) { if(OrderStopLoss()<Bid-Points*TrailingStop) { 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(TrailingStop>0) { 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<lots){LotMM=lots;} if(LotMM>LotsMax){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(ma1now>ma2now && ma1now2<ma2now2 && s+b==0 ){buyme();} if(ma1now<ma2now && ma1now2>ma2now2 && 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 EAjujishou |
打赏
最新创建圈子
- 新闻EA运行效果图圈 2019-05-05
圈主:admin 帖子:1