| 
 
在設計公式時,我們經(jīng)常遇到這樣的問題,如何使買賣信號一一對應? 比如下面的代碼:
 input:n(26,5,300),p(2,0.1,10);
 close;
 mid :  ma(close,n);
 upper: mid + p*std(close,n);
 lower: mid - p*std(close,n);
 
 tjb:=cross(close,lower);
 tjs:=cross(upper,close);
 drawicon(tjb,close,4);
 drawicon(tjs,close,5);
 
 圖示如下,可以看出,買入信號連續(xù)發(fā)出多次后,才出現(xiàn)賣出信號,賣出信號連續(xù)發(fā)出多次后,才發(fā)出買入信號。
 如何過濾連續(xù)的買入、賣出信號,使買入后只要沒有發(fā)出賣出信號,就不再發(fā)出買入信號;同樣,賣出后只要沒有出現(xiàn)買入信號,就不再發(fā)出賣出信號。即買入、賣出信號一一對應。容易想到的是使用過濾函數(shù)filter(),但這個函數(shù)是難以實現(xiàn)的,因為未來有多少個連續(xù)的買入(或賣出)信號是未知的。
 另一種方法是,從前一次賣出(或買入)信號開始累加買入(或賣出)信號,如果累加次數(shù)等于1,則發(fā)出真正的買入(或賣出)信號。
 
 但這里還有一個問題,如果首次信號是賣出信號的話,也應該過濾,因為沒有買入哪來賣出?應讓首次信號是買入信號才合理。方法是,在第1根K線的位置,虛擬一個賣出信號。
 以下是實現(xiàn)上述想法的常規(guī)函數(shù)代碼:
 
 input:n(26,5,300),p(2,0.1,10);
 close;
 mid :  ma(close,n);
 upper: mid + p*std(close,n);
 lower: mid - p*std(close,n);
 
 //以下為常規(guī)函數(shù)處理代碼//
 tjb:=cross(close,lower);//初始買入信號,可換成其它任意買入條件
 tjs:=cross(upper,close);//初始賣出信號,可換成其它任意賣出條件
 
 {以下代碼,使買、賣信號一一對應}
 tsb:=barssince(tjb);
 tss:=barssince(tjs);
 if tjs[datacount]<tjb[datacount] then begin
 a:=setlbound(tjs,1);
 tjs:=tjs or barpos=1;
 end;
 tjbuy:=count(tjb,barslast(tjs))=1 and tjb;  //買入信號
 tjsell:=count(tjs,barslast(tjb))=1 and tjs; //賣出信號
 
 drawicon(tjbuy,low,4);
 drawicon(tjsell,high,5);
 圖示如下:
          (文章來源:南方財富 http://www.ianooi.com) |