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