在MQL4的論壇上看到別人貼的指標程式碼
解譯了之後,想說就把他的程式邏輯記錄下來吧,供有想寫MT4的人參考 (本人也是大外行,剛起步,有大神路過的話,要鞭請小力,感激>_<)
PS1: 對初學者來說,indicator比EA的難度簡單太多了XD
建議初學者可以先從別人寫的指標開始看起,當練功是不錯的方法
PS2: 裡面的函數不知道在幹嘛的話
直接按MetaEditor裡的「幫助」=> 「MQL4幫助檔」,去找那個函數的定義就好了
====以下是程式碼跟我寫的註釋,程式邏輯寫在最後面===
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2012, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Waddah Attar"
#property link "waddahattar@hotmail.com"
//----
extern int IPeriod=180;
//----
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_level1 0
extern int P1=1; //設定P1的初始值=1
extern int P2=5; //設定P2的初始值=5
//---- buffers
double ExtMapBuffer1[]; //設定了兩個buffer,後面要用,儲存結果用的
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM,0,2); //初始化,設定了指標的形式跟buffer的參數
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM,0,2);
SetIndexBuffer(1,ExtMapBuffer2);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Float Pivot |
//+------------------------------------------------------------------+
int start()
{
//----
int i,j;
double max,min,pivot,A,B;
i=1000;
while(i>=0) //用了while,想做1000次?不確定做這麼多次要幹嘛
{
////////先寫了了A的部分↓
j=iBarShift(Symbol(),P1,Time[i],false); //用了j,Time[i],i變動,當前K棒就會移動
max=iHigh(Symbol(),P1,iHighest(Symbol(),P1,MODE_HIGH,IPeriod,j)); //最大值 = 當前K棒的最高
min=iLow(Symbol(),P1,iLowest(Symbol(),P1,MODE_LOW,IPeriod,j)); //最小值 = 當前K棒的最低
pivot=(iClose(Symbol(),P1,j+1)+iClose(Symbol(),P1,j+2)+iClose(Symbol(),P1,j+3))/3; //定義了pivot這個變數,是對 當前這根K棒 和 前面2根K棒 的 收盤價 取平均
A=(Close[i]-((max+min+pivot)/3))/Point;
//寫後面判斷用的A的實際內容,是 (當前K棒的收盤價 - 前三項變數的平均 )/Point (點數),但Point沒有定義,是預留關鍵字?(不確定)
////////A結束↑
///////接著寫B的部分↓,同A,不解釋
j=iBarShift(Symbol(),P2,Time[i],false);
max=iHigh(Symbol(),P2,iHighest(Symbol(),P2,MODE_HIGH,IPeriod,j));
min=iLow(Symbol(),P2,iLowest(Symbol(),P2,MODE_LOW,IPeriod,j));
pivot=(iClose(Symbol(),P2,j+1)+iClose(Symbol(),P2,j+2)+iClose(Symbol(),P2,j+3))/3;
B=(Close[i]-((max+min+pivot)/3))/Point;
////////B結束↑
//設定了buffer的初始值的樣子,通通初始化成0
ExtMapBuffer1[i]=0;
ExtMapBuffer2[i]=0;
////////開始比較上面的A跟B的結果
if(A>0 && B>0) //如果A跟B都大於0,buffer1=A+B
{
ExtMapBuffer1[i]=(A+B);
}
if(A<0 && B<0) //如果A跟B都小於0,buffer2=A+B
{
ExtMapBuffer2[i]=(A+B);
}
i--; //因為while loop的起始值是1000,想要往下扣到0的樣子,感覺邏輯反過來,在coding上有好處?
}
return(0);
}
//+------------------------------------------------------------------+
=========
上面的碼貼在MT4的metaEditor裡面,存檔就可以用了
他的程式邏輯如下:
1. 一開始設置了3個變數:IPeriod、P1、P2
IPeriod看來是個週期,不過設180不知道是要幹嘛的
P1、P2是後面要設定時區用的
2. 為了後面的比較邏輯之用,他設計了A、B兩個值,這兩個值又分別是根據他們的max、min、pivot來得到的
A、B的程式碼都是一樣的,只差在P1跟P2兩個參數,也就是使用的時區(timeframe)不一樣,P1=1是m1,P2=5是m5
所以他的邏輯簡單說就是:用同一方法但是不同時區得到的參數來做交易的參考(不過這個程式碼只是指標,沒有寫到交易的部分^^)
A跟B的程式碼都一樣,所以講A就好了
A = (當前K棒的收盤價 - max、min、pivot的平均值 ) / point ( 點數 )
max就是當前K棒的最高值,min就是當前K棒的最低值,這個超直觀
pivot則是當前K棒跟它前兩根K棒的收盤價的平均,即三根K棒的平均,會這麼做大概可以猜得到是想讓曲線更平滑才這樣取吧,
總之原作者的設計概念就是納入了上述的想法,雖然猜的到是想要讓代表性更好,不過公式我猜是亂兜的啦,反正看得出變化,可以判斷來做交易就好了
所以我們其實也可以如法炮製,製造別的A的公式
3. 比較部分
裡面包含兩個 if 判斷,還預先定義了2個buffer1跟2,不過他取了很長的名字,不知在幹嘛(方便辨識可是不方便打字)
a. 判斷1: A>0 並且 B>0,則在buffer 1 中存入 A+B 的值
b. 判斷1: A<0 並且 B<0,則在buffer 2 中存入 A+B 的值
A的時區預設是P1 =1,也就是m1,是短時區
B的時區預設是P1 =5,也就是m5,是長時區
也就是長短時區的值要同向時,才會在buffer中存入值,不然就都不存,這時那一跟K棒的指標的值就會是預設的0 ( 他在宣告buffer時有先將所有的值都設成0了)
出來結果長這樣,時區=m1時:
但是如果把時區弄成M15,就會變成像上圖一樣的錯亂指標
解決的方法就是把P1、P2的值改變就好了
===
啊這個指標要怎麼用?
我也不知,可能是紅棒就買,黑棒就賣吧,我猜
結果還是要寫EA才有辦法驗證它的用處啊 (我猜這個應該是原作者寫EA的副產品啦)
留言列表