符號是一種斷斷續續的指標線(xiàn)。在指標線(xiàn)有值區域,指標線(xiàn)顯示;在指標線(xiàn)無(wú)值區域,指標線(xiàn)隱藏。例如下圖:當價(jià)格上穿、下穿均線(xiàn)時(shí),均線(xiàn)上出現一個(gè)標記符號。
原理也很簡(jiǎn)單:在上圖中,存在二條指標線(xiàn),一條是均線(xiàn),另一條是笑臉?lè )柧€(xiàn)。
均線(xiàn)在任何位置都有值,所以均線(xiàn)是一條連續的曲線(xiàn);
當價(jià)格上、下穿均線(xiàn)時(shí),符號線(xiàn)被賦予了均線(xiàn)值;而在其他位置上,符號線(xiàn)被賦了空值。所以只是在價(jià)格上、下穿均線(xiàn)的位置上,符號線(xiàn)才有值,才能出現笑臉?lè )?。因為符號線(xiàn)只是個(gè)別位置有值,所以符號線(xiàn)僅在個(gè)別位置顯現。
符號也正好落在均線(xiàn)上,因為符號線(xiàn)值=均線(xiàn)值。如果符號線(xiàn)被賦了別的值,例如(符號線(xiàn)=均線(xiàn)+10點(diǎn)),那么符號水平坐標不變,垂直坐標將是均線(xiàn)上方的10點(diǎn)位置。
源碼如下:
//======================================================
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow
extern int 均線(xiàn)=10;
double mk[];
double temp0,temp1;
int init()
{
IndicatorBuffers(1);
SetIndexBuffer(0,mk);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,204);
IndicatorDigits(Digits);
return(0);
}
int start()
{
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars-均線(xiàn);
for(int i=0; i<limit; i++)
{
temp0=iMA(NULL,0,均線(xiàn),0,0,0,i);
temp1=iMA(NULL,0,均線(xiàn),0,0,0,i+1);
mk[i]=EMPTY_VALUE;
if(Close[i]>temp0 && Close[i+1]<temp1) mk[i]=temp0;
if(Close[i]<temp0 && Close[i+1]>temp1) mk[i]=temp0;
}
return(0);
}
//源碼到此已結束
=============================================
語(yǔ)句簡(jiǎn)要解釋如下:
=============================================
#property indicator_chart_window
指標放在主圖
#property indicator_buffers 1
設置指標線(xiàn)數為1條
#property indicator_color1 Yellow
設置第一條指標線(xiàn)顏色為黃色
extern int 均線(xiàn)=10;
設立一個(gè)自定義變量,允許外部值修改,整數形,變量名為"均線(xiàn)",默認值10
double mk[];
設立一個(gè)自定義數組,雙精度型
double temp0,temp1;
設立二個(gè)自定義變量,雙精度型,變量名為temp0、temp1
int init()
設立初始化函數init。init為系統規定函數名,函數內容自定義。該函數在指標被加載時(shí)僅運行一次
{
IndicatorBuffers(1);
指標線(xiàn)數量為1條
SetIndexBuffer(0,mk);
第一條指標線(xiàn)的數組為mk
SetIndexStyle(0,DRAW_ARROW);
第一條指標線(xiàn)的線(xiàn)型為箭頭符號
SetIndexArrow(0,204);
第一條指標線(xiàn)的箭頭符號為第204種符號,如果換一個(gè)編號,那出現的就是另一種符號。箭頭符號的編碼詳見(jiàn)《MT4編程參考》
IndicatorDigits(Digits);
設置指標線(xiàn)的小數位數
Digits=當前匯率的小數位數,如日元叉盤(pán)Digits=2,其他幣對Digits==4
return(0);
函數結束,返回零值
}
int start()
設立觸發(fā)函數start。start為系統規定函數名,函數內容自定義。當數據變動(dòng)時(shí),start函數被觸發(fā)
{
int limit;
設立整數型自定義變量limit
int counted_bars=IndicatorCounted();
設立整數型自定義變量counted_bars,并將IndicatorCounted()的值賦給counted_bars
IndicatorCounted()為緩存數量,即已經(jīng)計算過(guò)值的燭柱數
if(counted_bars>0) counted_bars--;
如果counted_bars大于零,則將counted_bars的值減掉1
這是為了配合下一句,以避免limit相差1而發(fā)生出錯
limit=Bars-counted_bars-均線(xiàn);
這是給limit賦值
Bars為圖表中的柱數
counted_bars為已經(jīng)賦值的柱數
這樣limit的結果就是未賦值的燭柱數
再減去“均線(xiàn)”是因為圖表最右邊段均線(xiàn)無(wú)意義
for(int i=0; i<limit; i++)
循環(huán)語(yǔ)句,括號中有三個(gè)語(yǔ)句:
第一句int i=0; 表示循環(huán)從i=0開(kāi)始
第二句i<limit; 這是循環(huán)的條件,如果條件滿(mǎn)足則執行大括號中的循環(huán)體,如果條件不滿(mǎn)足,則中止循環(huán),跳到大括號下面的語(yǔ)句執行
第三句i++,這是循環(huán)步調控制語(yǔ)句,每循環(huán)一次后執行一次此語(yǔ)句。
i++相當于i=i+1,即i值在原有數值上增加1
{
temp0=iMA(NULL,0,均線(xiàn),0,0,0,i);
把均線(xiàn)在i位置上的值賦給temp0
iMA:均線(xiàn)取值函數
temp1=iMA(NULL,0,均線(xiàn),0,0,0,i+1);
把均線(xiàn)在(i+1)位置上的值賦給temp1
mk[i]=EMPTY_VALUE;
給數組mk在i位置上賦空值
EMPTY_VALUE就是空值
if(Close[i]>temp0 && Close[i+1]<temp1) mk[i]=temp0;
條件判斷語(yǔ)句。如果在i位置上價(jià)格大于均線(xiàn),并且在(i+1)位置上價(jià)格小于均線(xiàn)(即價(jià)格上穿均線(xiàn)),則給數組mk在i位置上賦該位置的均線(xiàn)值
Close[i]:在i位置上收盤(pán)價(jià)。
&&:邏輯運算符“并且”
if(Close[i]<temp0 && Close[i+1]>temp1) mk[i]=temp0;
與上一句相似
}
return(0);
start函數結束語(yǔ)句