您现在的位置: 比特财富网 >> 财经 >  >> 外匯
MT4 EA制作速成班——基礎篇
外_匯_邦 WaiHuiBang.com

# 什麼是MT4?
我就當你了解什麼是MT4了
MT4就是META. TRADER 4

# 什麼是EA?
我也當你了解什麼是EA了
EA 就是 Expert Adviser
EA 就是智能交易系統
智能教育系統就是:
-軟件自己判斷下訂單
-軟件自己判斷提成利潤
-軟件自己判斷砍倉止輸

# 什麼是速成班?
就是你在很短很快的時間內就可以學會如何編寫EA
是的,快則8個學習小時
慢則24個學習小時

# 什麼叫“易學難精”?
就是你很快的就上手,難在成為厲害的高手。www.emoneybtc.com
這需要時間慢慢的去研究編寫。
久而久之你就可以是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,學習學習

* /* 尚未通過檢測
//+------------------------------------------------------------------+
//| 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<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|
//| [email protected]|
//+-----------------------------------------------------------------
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 zhangchang

外_匯_邦 WaiHuiBang.com
  風險提示:比特財富網的各種信息資料僅供參考,不構成任何投資建議,不對任何交易提供任何擔保,亦不構成任何邀約,不作為任何法律文件,投資人據此進行投資交易而產生的後果請自行承擔,本網站不承擔任何責任,理財有風險,投資需謹慎。
比特財富網 版權所有 © www.emoneybtc.com