久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    :《飛狐公式編寫基礎》和《通達信公式教程》--2-- 指標公...

     木衲 2010-03-29
    一、STKINDI示例代碼

    函數注釋如下:
    引用任意證券任意周期的任意指標輸出
    用法 :
    STKINDI(STKLABEL,INDINAME,INDITYPE,PERIOD)
    INDITYPE為指標類型,有效值范圍為(0-2),依次表示技術指標、條件選股、交易系統公式;
    PERIOD為周期類型,有效值范圍為(-1-11),依次表示:
    當前周期、分筆成交、1分鐘、5分鐘、15分鐘、30分鐘、60分鐘、日、周、月、年、多日、多分鐘
    例如:STKINDI('1A0001','MA.MA1',0,DATAPERIOD);

    例1:引用大盤的漲跌家數。
    ①被引用公式,設被引用的公式名稱為“漲跌家數”,其公式代碼如下:
    A:ADVANCE;
    D:DECLINE;

    ②引用大盤的漲跌家數,示例代碼如下:
    fStkName:=if(STRCMP(STKMARKET, 'SH'),'399301','1A0001');
    fAdvance:=STKINDI(fStkName,'漲跌家數.A',0,6);
    fDecline:=STKINDI(fStkName,'漲跌家數.D',0,6);

    說明:大盤函數advance、decline只能被大盤所使用,不能在個股中直接使用,這段代碼,示范了如何利用STKINDI函數達到在個股中引用的目的。

    例2:在日k線中引用本股票5分鐘的obv該怎么寫?
    求解:代碼如下
    StkIndi(StkLabel,'OBV',0,2);{注意,公式的名稱應使用大寫字母}

    二、橫向統計相關函數的用法簡介:

    1、橫向統計數據函數 ESTDATA(N),取得橫向統計日線數據(1-N),僅在日線分析周期有效;
    2、用法舉例:
    例:設計一個公式,統計當日A股板塊漲停板的股票數。

    3、方法如下:
    ①設計一個公式,判斷個股是否漲停,代碼如下,設公式名稱是“漲停判斷”:

    bl:=if(STKINBLOCK('ST板塊'),1.05,1.1);{如果為ST漲停為5%,否則為10%}
    ztb:abs(c-intpart(ref(c,1)*bl*100+0.5)/100)<0.0001;{如果漲停返回1,否則返回0}
    {注:對新股的漲停未做判斷,另外個股因歷史的原因,是否被ST或PT處理無法判斷,因此對歷史數據的判斷并不準確}

    ②建立橫向統計數據項:鼠標點菜單“管理/橫向統計管理”,在“橫向統計管理”對話框中,點“新增”,找到剛才設計的公式“漲停判斷”。

    ⑴數據名稱改為“漲停板”
    ⑵選擇技術指標“漲停判斷”,計算周期“日線”、指標線“ztb”為默認,不作修改。
    ⑶橫向統計方法選“全部累加”。
    ⑷“計算時選擇除權后的數據”不選即前面不打勾。
    ⑸點“設置范圍”按鈕,選擇統計范圍。
    ⑹置好范圍后,點確定。

    至此,我們就設計了一個橫向統計數據項“漲停板”,在圖中序號是1,則引用時是estdata(1)。

    ③設計一個引用“漲停板”的公式,公式代碼如下,設公式的名稱是zttj:
    漲停板統計:estdata(1);

    在K線圖中,調用公式zttj,就可以看到我們所需要的結果了。

    練習:如果對橫向統計有興趣的話,可以仿此,做一個跌停板統計公式。當然可以把漲停、跌停做成二合一公式。

    三、如何計算當日交易分鐘數:

    T定義為1分鐘周期圖上,開盤后的交易分鐘數,
    1、代碼之一



    --------------------------------------------------------------------------------
    T:=IF(BETWEEN(HOUR,9,11),(HOUR-9.5)*60+MINUTE,
       IF(BETWEEN(HOUR,13,15),(HOUR-9.5-1.5)*60+MINUTE,240));
    --------------------------------------------------------------------------------


    稍加優化:


    --------------------------------------------------------------------------------

    T:=IF(BETWEEN(HOUR,9,11),(HOUR-9.5)*60+MINUTE,
       IF(BETWEEN(HOUR,13,15),(HOUR-11)*60+MINUTE,240));


    --------------------------------------------------------------------------------

    代碼解釋:
    如果小時數介于9和11間,返回值(HOUR-9.5)*60+MINUTE
      否則
        如果小時數介于13和15之間,返回值(HOUR-9.5-1.5)*60+MINUTE
          否則返回值240

    2、觀察所有的股票一天的1分鐘周期圖,可以發現,都是起始于9:31,結束于15:00,并且中午休市不顯示,因此代碼一可以簡化為如下公式代碼二,請自行解釋代碼。
    公式代碼二:



    --------------------------------------------------------------------------------

    T:=IF(HOUR<=11,(HOUR-9.5)*60+MINUTE,
       IF(HOUR>=11,(HOUR-11)*60+MINUTE,240));


    --------------------------------------------------------------------------------

    3、公式代碼二,在1分鐘周期中,其實返回240的情況可以合并如下(為什么?)
    公式代碼三:
    T:=IF(HOUR<=11,(HOUR-9.5)*60+MINUTE,(HOUR-11)*60+MINUTE);

    整理后得到,公式代碼四:
    T:=IF(HOUR<12,HOUR*60+MINUTE-570,HOUR*60+MINUTE-660);

    4、公式代碼四,可以改寫如下的公式代碼五:
    T1:=IF(HOUR<12,570,660);
    T:=HOUR*60+MINUTE-T1;

      呵呵,570就是9.5小時對應的分鐘數,660是11小時對應的分鐘數。其實一開始我們就可以寫出這個公式了。我在飛狐公式入門五的答貼中,提示了“用時間類的函數,例如現在是10:30的話,怎么算交易時間呢?如果‘現在’是14:00,又怎么算交易時間?”

    公式代碼五,是南客喜歡的表達方式,比公式代碼四要多寫一行,但更靈活、易于變化。

      好了,問題解決了,也該給喜歡思考的弟兄一點問題。
      問題1:在5--60分鐘周期圖上,設計一個計算當日交易分鐘數的公式,進一步設計出量比公式。
      問題2:國內A、B股等的交易分2個時段,即上午和下午各交易2小時,在中午休市1.5小時,如果設想一個股市,一天之中,交易3個或更多個時段,當日交易分鐘數的公式,又該怎么寫?為了方便寫公式,假設為3個時段:上午為9:30--11:30,下午為13:00--15:00,晚上為19:00--21:00。

      提示:公式改寫為適用于5--60分鐘周期,還需考慮當日是否停牌。為了減少難度,先不考慮停牌的情況,等公式調試成功后,再考慮如何加入判斷是否停牌的條件。

    四、相關系數函數CORR簡單介紹及示例代碼:

    相關系數函數CORR,可以比較兩只個股或個股與大盤的指標或價格在N周期內走勢的相似程度,函數返回的數值越大,相似程序越高。

    下面是最后N周期內,個股與大盤收盤價走勢相似程度的示例代碼:

    ts0:=barssince(c);
    ts1:=barslast(barssince(backset(islastbar,N+1))=0);
    ts:=if(ts0<n,ts0,ts1);{上市時間短于參數N,調整疊加的基準日}
    bl:=ref(IndexC/C,Ts);{確定基準日壓縮比率}
    fc:c*bl/bl;
    fIndexC:IndexC/bl;{按比率壓縮大盤指數,以便跟個股收盤比較}
    相似程度:CORR(fc,fIndexC,N),linethick0;

    簡單的應用方法:
    1、指標作為副圖指標,可通過對“相似程度”排序,找出近期走勢跟大盤相似程度較高的個股。
    2、也可以把代碼中的IndexC換成其它作為樣本的個股,找出同類走勢的個股。


    轉貼《教育統計學》中,對相關系數的描述:

    相關系數

    在教育研究中,常涉及到兩個事物(變量)的相互關系問題,例如,學習成績與非智力因素的關系,數學成績與物理成績的關系,男女生學習成績的關系,等等。其關系表現為以下三種變化;第一,正相關:一個變量增加或減少時,另一個變量也相應增加或減少;第二,負相關:一個變量增加或減少時,另一個變量卻減少或增加;第三,無相關:說明兩個變量是獨立的,即由一個變量值,無法預測另一個變量值。統計學中,就用“相關系數"來從數量上描述兩個變量之間的相關程度,用符號“r"來表示。

    相關系數取值范圍限于:-1≤r≤+1

    相關系數表示的意義
    相關系數(r) 0.00   0.00-±0.3   ±0.30-±0.50 ±0.50-±0.80  ±0.80-±1.00
    相關程度       無相關  微正負相關     實正負相關        顯著正負相關       高度正負相關

    五、不同股票(證券)引用不同大盤指數的參考代碼:

    對于indexc替換成如下的index_c:


    --------------------------------------------------------------------------------

    index_sh_c:=
    if(STKTYPE=1,"1A0002$close",
      if(STKTYPE=2,"1A0003$close",
        if(STKTYPE=3,"1B0008$close",indexc)));{對A股、B股及基金引用不同指數}

    index_sz_c:=
    if(STKTYPE=1,"399002$close",
      if(STKTYPE=2,"399003$close",
        if(STKTYPE=3,"399305$close",indexc)));

    index_c:if(STRCMP(STKMARKET, 'SH')=0,index_sh_c,index_sz_c);

    --------------------------------------------------------------------------------



    以上代碼僅考慮了A股、B股、基金,其它未作區分,可根據自己的需要進行修改。
    對于indexo替換成如下的index_o:


    --------------------------------------------------------------------------------index_sh_o:=
    if(STKTYPE=1,"1A0002$open",
      if(STKTYPE=2,"1A0003$open",
        if(STKTYPE=3,"1B0008$open",indexo)));

    index_sz_o:=
    if(STKTYPE=1,"399002$open",
      if(STKTYPE=2,"399003$open",
        if(STKTYPE=3,"399305$open",indexo)));

    index_o:if(STRCMP(STKMARKET, 'SH')=0,index_sh_o,index_sz_o);--------------------------------------------------------------------------------
    對于indexh替換成如下的index_h:


    --------------------------------------------------------------------------------
    index_sh_h:=
    if(STKTYPE=1,"1A0002$high",
      if(STKTYPE=2,"1A0003$high",
        if(STKTYPE=3,"1B0008$high",indexh)));

    index_sz_h:=
    if(STKTYPE=1,"399002$high",
      if(STKTYPE=2,"399003$high",
        if(STKTYPE=3,"399305$high",indexh)));

    index_h:if(STRCMP(STKMARKET, 'SH')=0,index_sh_h,index_sz_h);

    --------------------------------------------------------------------------------

    對于indexl替換成如下的index_l:



    --------------------------------------------------------------------------------
    index_sh_l:=
    if(STKTYPE=1,"1A0002$low",
      if(STKTYPE=2,"1A0003$low",
        if(STKTYPE=3,"1B0008$low",indexl)));

    index_sz_l:=
    if(STKTYPE=1,"399002$low",
      if(STKTYPE=2,"399003$low",
        if(STKTYPE=3,"399305$low",indexl)));

    index_l:if(STRCMP(STKMARKET, 'SH')=0,index_sh_l,index_sz_l);

    --------------------------------------------------------------------------------

    對于indexa替換成如下的index_A:



    --------------------------------------------------------------------------------
    index_sh_A:=
    if(STKTYPE=1,"1A0002$Amount",
      if(STKTYPE=2,"1A0003$Amount",
        if(STKTYPE=3,"1B0008$Amount",indexA)));

    index_sz_A:=
    if(STKTYPE=1,"399002$Amount",
      if(STKTYPE=2,"399003$Amount",
        if(STKTYPE=3,"399305$Amount",indexA)));

    index_A:if(STRCMP(STKMARKET, 'SH')=0,index_sh_A,index_sz_A);

    --------------------------------------------------------------------------------

    對于indexv替換成如下的index_V:



    --------------------------------------------------------------------------------
    index_sh_V:=
    if(STKTYPE=1,"1A0002$Vol",
      if(STKTYPE=2,"1A0003$Vol",
        if(STKTYPE=3,"1B0008$Vol",indexV)));

    index_sz_V:=
    if(STKTYPE=1,"399002$Vol",
      if(STKTYPE=2,"399003$Vol",
        if(STKTYPE=3,"399305$Vol",indexV)));

    index_V:if(STRCMP(STKMARKET, 'SH')=0,index_sh_V,index_sz_V);

    --------------------------------------------------------------------------------

    六、控制語句if...then...else示例
    通過參數N,控制調整均線數,代碼參考如下:

    input:p1(5,0,300),p2(10,0,300),p3(20,0,300),p4(30,0,300),n(4,1,4);{參數定義}
    IF n>0 then MA1:MA(CLOSE,P1);{如果n>=1則輸出ma1指標線}
    IF n>1 then MA2:MA(CLOSE,P2);{如果n>=2則輸出ma1指標線}
    IF n>2 then MA3:MA(CLOSE,P3);{如果n>=3則輸出ma1指標線}
    IF n>3 then MA4:MA(CLOSE,P4);{如果n>=4則輸出ma1指標線}

    由于目前IF cond THEN expr1 ELSE expr2 中條件cond暫時只能用常數,因此,可配合主要是參數、常數函數

    例2:修改成交量公式VOL,當流通盤不為零且當前周期為日以上周期時,顯示換手率,代碼參考如下(仿此,大家繞過指標模組,可以自行設計,“綁定”到周期、券種等的公式)

    VOL,VOLSTICK;

    MA1:MA(VOL,M1);
    MA2:MA(VOL,M2);
    MA3:MA(VOL,M3);
    if capital>0 and DATAPERIOD>=6 then 換手率:vol/capital;

    當切換到60分鐘及以下周期,或者切換到大盤(此時流通盤=0),會發現“換手率”指標線、名稱及數值都不顯示。

    稍加改進,使用復合語句,可適用于任意周期:

    例3,修改成交量公式,流通盤不為0時,顯示換手率(60分鐘及以下周期,計算當日最新的換手率),代碼參考如下:




    PHP代碼:--------------------------------------------------------------------------------
    VOL,VOLSTICK;
    MA1:MA(VOL,M1);
    MA2:MA(VOL,M2);
    MA3:MA(VOL,M3);

    IF CAPITAL>0 then //如果換手率>0,則
      IF DATATYPE>=6 then //如果周期為日及以上的較長周期,則
        b:=VOL/CAPITAL*100
      else //否則
      begin //復合語句開始,即以下3條語句,視為1條語句,end表示復合語句結束
        tj:=DAY>REF(DAY,1) or BARSSINCE(CLOSE)=0;
        ts:=BARSLAST(tj)+1;
        b:=SUM(VOL,ts)/CAPITAL*100;
      end;
    換手率:b;--------------------------------------------------------------------------------
    修改或創建這個公式后,大家會發現,只要流通盤=0,則換手率指標線就不會被顯示,例如切換到大盤觀察。

    七、循環語句示例:移動平均線的N種寫法

    移動平均線的N種寫法(V3.5.30828 以上版本支持)


    PHP代碼:
    --------------------------------------------------------------------------------

    INPUT:n(5,1,300);  //參數申明
    VARIABLE:k=0;      //變量申明
    FOR i=0 TO n-1 DO
      k:=k+ref(close,i); //把最近 n 天的收盤價累加
    MA1:k/n;           //實現MA(C,N)

    ///////////////////////////////////////////
    INPUT:N(5,1,300);      //參數申明
    VARIABLE:i=0,k=0,j=0; //變量申明
    VAR1:=C;
    FOR j=1 TO DATACOUNT DO
    BEGIN
    IF j>=n THEN
    BEGIN
      WHILE i<n DO  
      BEGIN
       k:=k+VAR1[j-i];
       i:=i+1;
      END;
      MA2[j]:k/n;        //實現MA(C,N)
      i:=0;
      k:=0;
    END;
    END;

    ///////////////////////////////////////////
    INPUT:N(5,1,300);      //參數申明
    VARIABLE:i=0,k=0,VAR1:=C; //變量申明
    FOR j=1 TO DATACOUNT DO
    BEGIN
    k:=k+VAR1[j];
    IF j>=n THEN
    BEGIN
      IF j>n THEN
        k:=k-VAR1[j-n];
      MA3[j]:k/n;        //實現MA(C,N)
      i:=0;
    END;
    END;


    /////////////////////////////

    --------------------------------------------------------------------------------



    還有很多寫法

    還可以只計算最后1個有效數值,比如用于提高預警速度,大家練習試試

    //////////////////////////////////////////////////////////

    南客再附上一段歷史流通盤的代碼:
    //說明:本公式,無法計算增發、職工股上市等情形,公式原型為原子兄用VBS設計的代碼
    var1:=splitdata(1)+splitdata(2);
    cap:=c;
    cap[datacount]:=1;
    for i=datacount downto 2 do cap[i-1]:=cap
    /(1+var1/10);
    capi:=cap*capital/100;
    歷史流通盤∥萬股:capi;
    drawnumber(cap>ref(cap,1) or barscount(c)=1,capi,capi,0);

    八、序列數據量
    所屬類別: 常數函數 參數數量: 0

    序列數據量。
    用法:
    DATACOUNT,返回序列數據數量
    注意:該函數返回常數

      解說:以日周期為例,我們知道,個股的收盤價就是一個序列變量,每天都有一個數值,總共有很多個數值,到底有多少個數值?如果個股數據是完整的,數值的個數就是上市后總的有效交易天數(即K線的數量)。顯然人工去點不現實,這里提供的函數,就是計算這個數據的。

      代碼示例:

    K線數:datacount;

    ②在飛狐新開發的公式系統中,序列變量可以用數組表示,比如:
    fc:=close;
    定義了一個序列變量fc,它等于個股所有的收盤價。請看下面代碼:

    fc:=c;
    第1天收盤價:fc[1];
    最后1天收盤價:fc[datacount];

    圖示如下

      想想看1:如何表示第1根K線的日期(通常是上市的日期),如果想將股票按上市日期先后排序,這個公式會很有用。
      想想看2:編寫一個選股公式,選出上市天數少于N的公式。

    與barscount的區別:顯然,這是一個序列變量,隨K線的位置不同而不同。而datacount是一個常量,不管在哪個K線的位置上,它都是同一個數值。
     
    新增函數應用:如何遍歷板塊股票代碼

    PHP代碼:--------------------------------------------------------------------------------
    bk:='深圳A股';
    variable:j=1,k=0,dm_len=0,lstr[6]='00000',blksum:=STKCOUNT(bk),dmstr[blksum]='';
    lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
    while j<=blksum do begin
      dm:=NumToStr(k,0);
      dm_len:=strlen(dm);
      dm:=lstr[dm_len]+dm;
      if stkinblock(dm,bk) then begin
        dmstr[j]:=dm;
        j:=j+1;
      end;

      k:=k+1;
    end;

    //以下是一些字符串函數及運算的綜合應用
    EXPLAIN(1,dmstr[1]);  //在解盤中,輸出深圳A股第1只股票的代碼
    EXPLAIN(1,stknameex(dmstr[2]));//第2只股票的名稱
    EXPLAIN(1,dmstr[3]+stknameex(dmstr[3]));//第3只股票的代碼及名稱
    EXPLAIN(1,'深圳A股第4只股票的代碼是:'+dmstr[4]);
    EXPLAIN(1,dmstr[5]+'最后收盤價:'+numtostr(close,2));
    EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');--------------------------------------------------------------------------------
      如果您有編程的功底,上面代碼一看就明白,但對沒有編程經驗的狐友們來說就不容易了。下面盡量詳細地對思路和公式代碼做一些解說,并對代碼進行適當擴展。
      1、所謂遍歷股票代碼,就是能夠訪問某板塊中所有的股票代碼,如果連訪問都不能實現,怎么做一些更加強大的諸如橫向統計、排序的功能?
      2、上面的公式代碼是以深圳A股板塊為例,我們看看深圳A股的股票代碼,它們都是很有規律的,000001、000002、...、000999、001696、001896,請注意這些代碼的特征:
      ①股票代碼要理解成字符串,而不是數值,如果是數值的話,股票代碼就成了1、2、...、999、1696、1896。
      ②這些代碼如果轉換成數值,大體集中在某個數的范圍,如上面所示,深圳A股代碼的數值目前都小于1896,代碼的數值大多都是呈遞增1的規律,少量有跳躍的情況,比如000040跳到000042,000041不存在。
      因此,我們初步可以設計一個循環


    PHP代碼:--------------------------------------------------------------------------------
    j:=0;
    while j<=1896 do
    begin
      j:=j+1;
    end;--------------------------------------------------------------------------------

      上面這段代碼,是個循環,每次循環都執行一次由begin和end所包圍起來的語句,這里只有一條語句即j:=j+1,目的讓變量j從1每次循環都遞增1,直到j=1896為止。
      j:=j+1這條賦值語句,初次接觸的話不大好理解,大意是這樣,右邊的j比如現在等于2,這條語句是讓右邊的j現有的數值加上1,然后再送回到變量j之中,執行完這條語句后,j就由2遞增1變成了等于3。
      j:=j+1,看起來有點象計數器的功能吧?每循環一次,計數器就增加1,因此也可以稱變量j為計數器(變量)。
      好了,思路敏捷的狐友,馬上就能想到,這個計數器會生成從0到1896總共1897個數值,如果進行轉換,也就是把數值轉換成字符串,則深圳A股所有的股票代碼都包含在里面了。
      呵呵,的確是這樣,因此我們設計下面一個稍加改進的循環,來逼近我們要完成的任務:

    PHP代碼:--------------------------------------------------------------------------------
    j:=0;
    while j<=1896 do
    begin
      dm:=NumToStr(j,0);  //把數值j轉換成字符串并賦值給變量dm,保留小數位數0
      j:=j+1;
    end;
    EXPLAIN(islastbar,dm); //當處在最后一根K線位置時,輸出字符串dm的內容--------------------------------------------------------------------------------

      最后一行代碼,是用解盤函數輸出字符串變量dm的結果,我們可以在“解”中觀察,不過這里由于dm是單值變量,不是序列變量,只能保存最后的一次結果,因此只能觀察到結果是1896。

    如果想觀察其它的結果,只好改循環首語句,比如:
    while j<=1 do

     大家可以發現這些結果,還有一點小問題,沒有前導的0,即我們要的是000001、0001896,而不是1、1896這樣的字符串,怎么辦呢?
      給它們的前面加上0就可以了,但加上0的個數有講究的,比如1在前面要加上5個0,1896前面只需加上2個0,很明顯,要加的0的個數,等于6減字符串的字符個數。因此,設計公式代碼如下:


    PHP代碼:--------------------------------------------------------------------------------
    variable:lstr[6]='00000';//定義一個數組lstr[6],共6個元素,并讓所有6個元素初始都等于字符串'00000'

    //下面對字符串數組lstr[]第2至第6個元素重新進行賦值,以便巧妙應用
    lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
    j:=0;
    while j<=1896 do
    begin
      dm:=NumToStr(j,0);  //把數值j轉換成字符串并賦值給變量dm,保留小數位數0
      dm_len:=strlen(dm); //求出dm的長度,并賦值給變量dm_len
      dm:=lstr[dm_len]+dm;  //由dm的長度,確定應該給dm的前面加上多少個字符0
      j:=j+1;
    end;
    EXPLAIN(islastbar,dm); //當處在最后一根K線位置時,輸出字符串dm的內容--------------------------------------------------------------------------------  對這行代碼稍加解釋:dm:=lstr[dm_len]+dm,如果某次循環右邊的dm等于'19',則它的字符串長度為dm_len等于2,則這行代碼此時等價于dm:=lstr[2]+dm,而lstr[2]等于'0000',結果就是在'19'的前面加上4個字符'0'即成了'000019',然后再把'000019'賦值給dm,于是左邊的dm就等于'000019'

      到此為止,我們只是實現了所生成的字符串,可以讓深圳A股的代碼全部被包含在其中,但還有大量的“廢”字符串,我們要把沒用的字符串過濾掉。取出我們真正需要的。  要用到的函數  ①stkinblock(dm,bk),函數注釋:如果股票代碼dm從屬于板塊bk,則函數返回數值1,否則返回數值0  ②條件控制語句IF cond THEN expr1 ELSE expr2,意思是:當滿足 cond 條件的時候,執行語句 expr1,否則執行 expr2 語句  設計代碼如下:PHP代碼:--------------------------------------------------------------------------------
    variable:lstr[6]='00000';
    lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
    j:=0;
    bk:='深圳A股'; //bk賦值為字符串'深圳A股'
    while j<=1896 do
    begin
      dm:=NumToStr(j,0);  //把數值j轉換成字符串并賦值給變量dm,保留小數位數0
      dm_len:=strlen(dm); //求出dm的長度,并賦值給變量dm_len
      dm:=lstr[dm_len]+dm;  //由dm的長度,確定應該給dm的前面加上多少個字符0
      if stkinblock(dm,bk) then //如果股票代碼dm屬于bk,則執行下面由begin、end包含的語句
      begin
        dm1:=dm;  //真正需要的股票代碼是這里的dm1
      end;
      j:=j+1;
    end;
    EXPLAIN(islastbar,dm1); //當處在最后一根K線位置時,輸出字符串dm1的內容--------------------------------------------------------------------------------

    公式代碼設計到這里似乎可以結束了,因為我們要的結果都可以生成了。其實還有改進的余地:  ①dm1只是個單值的字符串變量,它只能保存最后的結果,而不能保存所有的結果。這里考慮使用數組,數組可以自行定義很多個元素,讓每個元素保存一個結果。  ②循環首的j<1896總覺得不對勁,不夠智能化,比如將來“深圳A股”板塊最后的代碼不是0001896,則這段公式代碼的結果就不對了。  針對以上問題,設計公式代碼如下: PHP代碼:--------------------------------------------------------------------------------
    variable:lstr[6]='00000';
    lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
    j:=0;  //記錄循環次數的計數器
    k:=1;  //記錄股票代碼的個數的計數器
    bk:='深圳A股'; //bk賦值為字符串'深圳A股'
    blksum:=STKCOUNT(bk); //板塊所包含證券數量
    variable:dmstr[blksum]='';  //定義一個字符串數組用于記錄股票代碼,元素個數為blksum,初始值為空
    while k<=blksum do  //當計數器k<=blksum時,執行以下循環
    begin
      dm:=NumToStr(j,0);  //把數值j轉換成字符串并賦值給變量dm,保留小數位數0
      dm_len:=strlen(dm); //求出dm的長度,并賦值給變量dm_len
      dm:=lstr[dm_len]+dm;  //由dm的長度,確定應該給dm的前面加上多少個字符0
      if stkinblock(dm,bk) then //如果股票代碼dm屬于bk,則執行下面由begin、end包含的語句
      begin
        dmstr[k]:=dm;  //真正需要的股票代碼,記錄到字符串數組dmstr的第k個元素中
        k:=k+1;  //記錄找到的股票代碼的個數
      end;
      j:=j+1;  //記錄循環的次數
    end;
    EXPLAIN(islastbar,dmstr[1]); //當處在最后一根K線位置時,輸出深圳A股第1只股票的代碼--------------------------------------------------------------------------------

      有了以上公式,我們就可以把范圍擴大,比如遍歷'A股板塊'的所有股票代碼,很簡單,只需改一條語句,即把 bk:='深圳A股' 改成 bk:='A股板塊'。  公式代碼如下(且慢執行,等下面的解說):PHP代碼:--------------------------------------------------------------------------------
    variable:lstr[6]='00000';
    lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
    j:=0;  //記錄循環次數的計數器
    k:=1;  //記錄股票代碼的個數的計數器
    bk:='A股板塊'; //bk賦值為字符串'深圳A股'
    blksum:=STKCOUNT(bk); //板塊所包含證券數量
    variable:dmstr[blksum]='';  //定義一個字符串數組用于記錄股票代碼,元素個數為blksum,初始值為空
    while k<=blksum do  //當計數器k<=blksum時,執行以下循環
    begin
      dm:=NumToStr(j,0);  //把數值j轉換成字符串并賦值給變量dm,保留小數位數0
      dm_len:=strlen(dm); //求出dm的長度,并賦值給變量dm_len
      dm:=lstr[dm_len]+dm;  //由dm的長度,確定應該給dm的前面加上多少個字符0
      if stkinblock(dm,bk) then //如果股票代碼dm屬于bk,則執行下面由begin、end包含的語句
      begin
        dmstr[k]:=dm;  //真正需要的股票代碼,記錄到字符串數組dmstr的第k個元素中
        k:=k+1;  //記錄找到的股票代碼的個數
      end;
      j:=j+1;  //記錄循環的次數
    end;
    EXPLAIN(islastbar,dmstr[1]); //當處在最后一根K線位置時,輸出字符串深圳A股第1只股票的代碼--------------------------------------------------------------------------------  假如你試圖執行這段代碼,你會發現好慢哦~~  為何會這樣?因為從深圳A股切換到上海A股的股票代碼時,是從1896跳躍到600000,中間有508104次空循環,這中間沒有一個代碼是真正的股票代碼,因此可以這樣來提高循環的執行效率,在公式代碼中插入如下幾行代碼:if j=1896 then j:=599999;if j=600999 then break;  優化后的代碼如下: PHP代碼:--------------------------------------------------------------------------------
    variable:lstr[6]='00000';
    lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
    j:=0;  //記錄循環次數的計數器
    k:=1;  //記錄股票代碼的個數的計數器
    bk:='A股板塊'; //bk賦值為字符串'深圳A股'
    blksum:=STKCOUNT(bk); //板塊所包含證券數量
    variable:dmstr[blksum]='';  //定義一個字符串數組用于記錄股票代碼,元素個數為blksum,初始值為空
    while k<=blksum do  //當計數器k<=blksum時,執行以下循環
    begin
      dm:=NumToStr(j,0);  //把數值j轉換成字符串并賦值給變量dm,保留小數位數0
      dm_len:=strlen(dm); //求出dm的長度,并賦值給變量dm_len
      dm:=lstr[dm_len]+dm;  //由dm的長度,確定應該給dm的前面加上多少個字符0
      if stkinblock(dm,bk) then //如果股票代碼dm屬于bk,則執行下面由begin、end包含的語句
      begin
        dmstr[k]:=dm;  //真正需要的股票代碼,記錄到字符串數組dmstr的第k個元素中
        k:=k+1;  //記錄找到的股票代碼的個數
      end;
      if j=1896 then j:=599999;  //計數器j直接跳到到上海A股對應的最小代碼
      if j=600999 then break;  //如果記錄到這個代碼則跳出循環
      j:=j+1;  //記錄循環的次數
    end;

    //以下是一些字符串函數及運算的綜合應用
    EXPLAIN(1,dmstr[1]);  //在解盤中,輸出深圳A股第1只股票的代碼
    EXPLAIN(1,stknameex(dmstr[2]));//第2只股票的名稱
    EXPLAIN(1,dmstr[3]+stknameex(dmstr[3]));//第3只股票的代碼及名稱
    EXPLAIN(1,'深圳A股第4只股票的代碼是:'+dmstr[4]);
    EXPLAIN(1,dmstr[5]+'最后收盤價:'+numtostr(close,2));
    EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');--------------------------------------------------------------------------------  這行代碼 if j=600999 then break 有什么用?以防萬一,如果有人改了市場規則,把500001之類的股票計入上海A股的話,這里的循環會出不來的,會造成電腦死循環,飛狐長時間沒有響應。 以上公式代碼,只是個示例,效率不太高,如果能有個方法,直接給出板塊中所有的股票代碼,那就不需要這段公式代碼。  給出這個示例,是想通過大致解剖整個公式代碼的設計過程,讓大家對循環、條件語句有個初步的認識。  最后,給大家個練習的機會:  1、修改上述代碼,計算“A股板塊”的成交量(這就是橫向統計了)  2、以上公式代碼,使用的是while循環,有辦法改成fox循環嗎?(當心,在修改代碼的過程中,如果不慎的話,有可能造成死循環,對于win9x操作系統,也許很難退出,對于NT以上操作系統,可以強行退出)  3、高級問題:通過以上代碼,可以做出橫向排序,不過建議不要用代碼本身來實現排序(會很慢的),應使用今天發布的新函數SORTPOS(X,D,N1,N2)來實現。  4、借用論壇的一個問題:ff:=barslast(date=1030107);周期:=5;VERTLInE(ff=0 or ff=周期*1 or ff=周期*2 or ff=周期*3 or ff=周期*4 or ff=周期*5or ff=周期*6 or ff=周期*7 or ff=周期*8 or ff=周期*9 or ff=周期*10or ff=周期*11 or ff=周期*12 or ff=周期*13 or ff=周期*14 or ff=周期*15or ff=周期*16 or ff=周期*17 or ff=周期*18 or ff=周期*19 or ff=周期*20or ff=周期*21 or ff=周期*22 or ff=周期*23 or ff=周期*24 or ff=周期*25or ff=周期*26 or ff=周期*27 or ff=周期*28 or ff=周期*29 or ff=周期*30or ff=周期*31 or ff=周期*32 or ff=周期*33 or ff=周期*34 or ff=周期*35or ff=周期*36 or ff=周期*37 or ff=周期*38 or ff=周期*39 or ff=周期*40),POInTDOT;  把以上代碼,改成用循環表示。  5、一個數列定義如下:f[1]=1,f[2]=1,f[n]=f[n-1]+f[n-2],你能用循環計算出f[10]等于多少嗎?這個數列是很有名的,許多股票預測都會用到它。  呵呵,具體我也記不住了,誰能告訴我它叫什么?

    VBS入門續:條件語句

    VBS入門續:條件語句

    條件語句是程序中的最基本、最重要的語句之一,今天通過一個簡單實例學習條件語句。

    問題:設計一個指標,除首日外,如果當日漲停(設10%為漲停),則公式輸出1,否則輸出0。

    公式代碼:
    fc:=c;
    n=1.099;
    <%
    vc=ffl.vardata("fc")
    vn=ffl.vardata("n")
    vs=ffl.vardata("js")

    last=ubound(vc)

    vc(0)=0
    for i=last to 1 step -1
    if vc(i)>=vn*vc(i-1) then
      vc(i)=1
    else
      vc(i)=0
    end if
    next
    ffl.vardata("fc")=vc
    %>
    fc




    VBS程序條件語句部分解釋,參閱VBS幫助文件,如下代碼為條件語句:

    if vc(i)>=vn*vc(i-1) then  ----如果...則,這里的條件是判斷當日漲停否
        vc(i)=1                             ----vc(i)賦值1
    else                                      ----否則
        vc(i)=0                             ----vc(i)賦值0
    end if                                   ----條件語句結束

    飛狐基本函數簡介之指標線形描述函數

    這一組中的函數,全部不能單獨使用,一定要和其它指標一起用才能發揮效力,因為它們都是描述其它指標的。

    指標在主圖或副圖中的顯示,主要分為棒狀(柱狀)和線狀兩種。這一組中的函數,全部是為了指揮指標的顯示而設計的。

    掌握好這組函數,可以使指標輸出顯示豐富多彩,色彩繽紛。

    使用的一般形式:

    指標,描述函數1,描述函數2,...;

    一、

    函數: STICK

    參數: 無

    返回: 無

    說明: 畫棒狀線

    示例:   

    STICK的英文是棍、棒的意思。

    一般指標的顯示,在軟件中默認是線狀的。即如果不加指標線形描述函數,則指標以線狀的形式輸出顯示。

    如公式:

    0.98*L;{主圖疊加}

    如加上棒狀線的描述,則變成這樣了:

    0.98*L,STICK;{主圖疊加}

    一般的信號,不加描述函數,會成箭頭狀。加了STICK之后,就成棒狀了。

    副圖1公式:  C>REF(C,1) AND C>REF(C,2);

    副圖2公式:  C>REF(C,1) AND C>REF(C,2),STICK;

    我個人調試公式的體會,還是副圖1的顯示清楚,因為可以看到連續信號的出現。

    二、

    函數: COLORSTICK

    參數: 無

    返回: 無

    說明: 以零軸為中心畫彩色棒狀線,零軸下為陰線顏色,零軸上為陽線顏色

    示例:

    這樣零軸就如楚漢交界,涇渭分明了。

    C-REF(C,1),COLORSTICK;{副圖指標}

    三、

    函數: LINESTICK

    參數: 無

    返回: 無

    說明: 同時畫棒狀線與指標線。

    示例:   

    LINE是線,STICK是棒,LINESTICK自然是線棒一起顯示了。

    A:=C-REF(C,1);

    A,LINESTICK;{不作說明,都認為是副圖指標}

    那么,即想顯示指標線和棒狀線,又想以零軸為中心顯示彩色棒狀線,怎么寫公式呢?這樣行嗎?

    A:=C-REF(C,1);

    A,LINESTICK,COLORSTICK;

    各位可以自己試一下,結論是否定的。結果是只有彩色柱,沒有指標線了。

    這樣我們初步可以得出一個結論:在同一個指標中,有多個相同性質的描述函數時,軟件只認最后一個描述函數。

    即想顯示指標線和棒狀線,又想以零軸為中心顯示彩色棒狀線,可以用分開的兩句語句來達成目標:

    A:=C-REF(C,1);

    A,LINESTICK;

    A,COLORSTICK;

    四、

    函數: VOLSTICK

    參數: 無

    返回: 無

    說明: 畫成交量柱狀線。

    示例:   

    這是專門為顯示成交量設計的。

    股票軟件不同,顯示成交量的陰陽線是很不同的。總的來說,是根據價來定的,具體方法各有不同,很難說哪種方法就好了,哪種方法就不好了。

    飛狐中的方法是這樣的:今天的收盤價大于昨天的收盤價,顯示陽柱;小于等于則顯示陰柱。

    五、

    函數: CROSSDOT

    參數: 無

    返回: 無

    說明: 畫叉狀線或x狀線。

    示例:   

    呵呵,叉狀線和X狀線有什么區別?應該是一樣的吧。

    CROSS是交叉,DOT是點。

    當指標線連續性較好時,顯示交叉點比較順眼。連續性不好時,看起來比較凌亂。

    0.98*L,CROSSDOT;

    MA(C,30),CROSSDOT;{主圖疊加}

    六、

    函數: CIRCLEDOT

    參數: 無

    返回: 無

    說明: 畫小圓圈線

    示例:   

    CIRCLE,圓圈。把CROSSDOT的X顯示換成圓圈的樣子。如果結合后面的COLOR函數一起用,可以畫出不同顏色的圈圈,有時也比較實用。

    七、

    函數: POINTDOT

    參數: 無

    返回: 無

    說明: 畫點狀線

    示例:   

    POINT是點、加點的意思。這個點狀線,在K線顯示數不多的情況下,看起來太小了。正因如此,在K線顯示數較多的情況下,就可以彌補CIRCLEDOT顯示太大的缺陷。

    0.98*L,CIRCLEDOT;

    MA(C,30),POINTDOT;{主圖疊加}

    八、

    函數: SHIFT

    參數: 1--127

    返回: 無

    說明: 指標線向后(向右)偏移x個周期

    示例: ma1:ma(close,5),shift3;將MA1指標線向后偏移3個周期

    SHIFT,移位。這是個飛狐比較有特色的的特色函數。

    以以下公式為例子:

    MA(C,30);

    MA(C,30),POINTDOT,SHIFT5;{主圖疊加}

    要注意兩個問題:

    1、移位后的指標顯示數值和不移位時的數值是不一樣了。移位了五個時間單位,就顯示五個時間單位之前的原數值。

    2、所移位的周期數,不能設為參數來調整。移位的最大周期數是127。如果寫成SHIFT666,調試公式也能通過,不過軟件自動取了127來移位。

    另外說點題外話。

    用SHIFT10之后,當前日的指標顯示的就是原10天前的指標數值。也就是說,把最近十天的K線數據,置之不理了。

    從人的記憶的特征來看,越近發生的事,對目前的影響力就越大。這樣看,用SHIFT就一無是處了,因為它拋棄了最近的數據,而去找較早的數據。

    從混沌學牽一發就能動全身的觀點看,SHIFT就大有道理了。佛教中說前世的因,后世的果,相差時間就長得不好說了。

    這些討論一般難得見到。易股論壇中有位臺--灣的老兄,發了兩帖,來討論K線左移(或者說是指標線右移),我才留心了一下。巫山的朋友有體會的,不妨說說。

    九、

    函數: LINETHICK

    參數: 0--7

    返回: 無

    說明: 改變指標線粗細,LINETHICK0 表示不畫出指標線,不影響坐標,但可在頂部顯示數值。  

    示例: ma1:ma(close,5),linethick3;

    ma1:ma(close,5),linethick0;表示不畫出ma1指標線,不影響坐標,但可在頂部顯示ma1數值

    THICK,厚的。LINETHICK就可以理解為線(棒)的粗細了。

    V,STICK,LINETHICKN;

    N分別取1、2、3、4、5、6、7,做七個副圖公式。

    這個N也不能做成參數調整的。

    LINETHICK0是非常常用的,因為一個公式中指標一多,顯示會很亂,把有些顯示去掉,就用這一招。

    有時會碰到相反的情況,指標線(柱)顯示不多,而頂部數值的顯示太多了,那么怎么畫出指標線,而又在頂部不顯示數值呢?

    一般用STICKLINE(畫柱),PARTLINE(畫線)等繪圖函數來解決。

    PARTLINE(1,MA(C,30));{主圖疊加}

    十、

    函數: COLOR

    參數: 000000--FFFFFF

    返回: 無

    說明: 改變指標線顏色。

    常用: 黑色:colorblack 紅色:colorred  綠色:colorgreen 藍色:colorblue

        白色:colorwhite 灰色:colorgray 黃色:coloryellow 青色:colorcyan

        晶紅色:colormagenta 棕色:colorbrown

    示例: ma1:ma(close,5),coloryellow; 或 ma1:ma(close,5),colorff0000;

    附錄: 238種常用顏色代碼速查表

    COLOR,顏色,色彩。是這組函數中最常用的一個。不但能定義指標線(柱)的顏色,而且能定義頂部指標文字的顏色--用LINETHICK0時也一樣。

    顏色的種類應該夠用了。至于各指標線(柱)之間的顏色搭配,實在是一種很藝術性的事。既要有美感,又要不觸目驚心,我只能憑感覺挑選,其它也沒有什么招數了。要是有學過美術的人來指點幾招就好了。

    楓葉秋雨兄提供的“飛狐色彩值吸取器”,實在是好東西,給我們挑選顏色提供了很大的方便。
     
     

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 国产亚洲欧美另类一区二区 | 久久国产加勒比精品无码| 国产成人精品亚洲日本在线观看| 国产亚洲欧美在线观看三区| 国产偷国产偷亚洲清高APP| 国产精品久久久久久AV福利| 亚洲AV成人中文无码专区 | 欧美成人精品高清在线观看| 又粗又黑又大的吊AV| 人妻少妇精品中文字幕| 好湿好爽好疼免费视频| 黑巨茎大战俄罗斯美女| 久久精品国产亚洲av麻豆软件| 日韩精品中文字幕人妻| 久久亚洲中文字幕伊人久久大| 中文字幕av无码免费一区| 办公室强奷漂亮少妇同事| 国产成人乱色伦区| 欧洲一区二区中文字幕| 国产SUV精品一区二区四| 国产精品中文字幕在线| 欧美伦费免费全部午夜最新| 久久人与动人物a级毛片| 伊人久久精品无码麻豆一区| 中文有无人妻vs无码人妻激烈| 亚洲欧洲日产国码AV天堂偷窥| 波多野结衣在线精品视频| 成年视频人免费网站动漫在线| 奇米四色7777中文字幕| 国产美女A做受大片观看| 东方四虎在线观看av| 97精品国产一区二区三区| 亚洲香蕉网久久综合影视 | 欧美XXXX黑人又粗又长| 午夜福利在线观看6080| 亚洲A成人片在线播放| 军人妓女院BD高清片| 国产明星精品无码AV换脸| 亚洲综合色婷婷六月丁香宅男大增 | 午夜男女爽爽影院免费视频下载| 鲁丝片一区二区三区免费|