在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時:

1.JPG

15.JPG

但是如果把時區弄成M15,就會變成像上圖一樣的錯亂指標

解決的方法就是把P1、P2的值改變就好了

 

===

啊這個指標要怎麼用?

我也不知,可能是紅棒就買,黑棒就賣吧,我猜

結果還是要寫EA才有辦法驗證它的用處啊 (我猜這個應該是原作者寫EA的副產品啦)

 

 

 

 

arrow
arrow
    全站熱搜

    迷途工程師 發表在 痞客邦 留言(0) 人氣()