信指標(biāo)公式編寫指南:從入門到打造自己的選股器)
簡介面向股票技術(shù)分析愛好者與通達(dá)信軟件用戶的通達(dá)信指標(biāo)公式編輯教程PDF文檔系統(tǒng)講解TDX公式系統(tǒng)的四大類公式編輯器——技術(shù)指標(biāo)、條件選股、五彩K線、交易系統(tǒng)并介紹公式管理器、公式編輯器的各項(xiàng)功能與操作要點(diǎn)。資源為單個(gè)PDF文件大小約1.23MB內(nèi)容精煉便于隨時(shí)查閱。目前已有1795人學(xué)習(xí)下載。文檔從公式系統(tǒng)基礎(chǔ)概念講起詳細(xì)說明每類公式的用途、編寫方法及相互轉(zhuǎn)換關(guān)系例如指標(biāo)公式附加買賣邏輯可生成交易系統(tǒng)公式附加選股條件可生成條件選股公式附加色彩邏輯可生成五彩K線公式同時(shí)涵蓋參數(shù)精靈、動(dòng)態(tài)提示、畫線方法等實(shí)用編輯技巧適合希望自主編寫和優(yōu)化指標(biāo)的投資者系統(tǒng)學(xué)習(xí)。通達(dá)信指標(biāo)公式編寫從入門到能寫自己的選股器這些年折騰通達(dá)信公式的人不少但真正能寫出一套順手指標(biāo)的人真不多。原因倒不是這玩意有多難而是大部分教程都在堆函數(shù)列表看完也不知道怎么串起來用。我最早接觸通達(dá)信公式系統(tǒng)的時(shí)候也走了不少彎路對(duì)著函數(shù)參考啃了半天寫出來的東西不是信號(hào)亂跳就是加載直接報(bào)錯(cuò)。今天這篇不講虛的從公式編輯器怎么打開、函數(shù)怎么調(diào)到完整寫一個(gè)自定義指標(biāo)的思路再到選股公式怎么改成預(yù)警條件一次聊透。適合剛接觸公式編輯、想自己動(dòng)手寫指標(biāo)的朋友也適合已經(jīng)會(huì)寫簡單均線、但想搞懂背后邏輯的老手。通達(dá)信的公式系統(tǒng)說白了就是一套內(nèi)嵌的腳本語言語法上類似C語言和Excel函數(shù)的混合體。它的核心價(jià)值在于你可以不依賴任何外部程序直接在行情軟件里定義自己的買賣規(guī)則、畫線邏輯、信號(hào)提示。比如“5日均線上穿20日均線”用CROSS函數(shù)一句話就寫好再比如“量比大于2且漲幅小于3%”用條件判斷也能在幾十秒內(nèi)搞定。這篇文章會(huì)從最基礎(chǔ)的環(huán)境開始一步步帶你把一個(gè)模糊的想法變成一條能跑、能預(yù)警、能選股的公式。1. 公式系統(tǒng)的基本盤編輯器在哪公式有哪些類型很多新手第一次打開通達(dá)信根本不知道公式編輯器藏在哪兒。路徑其實(shí)很簡單菜單欄找到“功能”往下拉選“公式系統(tǒng)”再點(diǎn)“公式管理器”或者更進(jìn)一步直接在行情界面按CtrlF也能調(diào)出窗口。打開之后你會(huì)看到左側(cè)一欄的分類列表技術(shù)指標(biāo)、條件選股、交易系統(tǒng)、五彩K線、組合條件這五類對(duì)應(yīng)了公式的幾種核心用途。技術(shù)指標(biāo)公式最常見用于在K線副圖或主圖上繪制線、柱、文字。輸出結(jié)果是連續(xù)的數(shù)值序列比如MACD、KDJ、RSI都是這一類。條件選股公式用于篩選滿足特定條件的股票輸出必須是“成立”或“不成立”沒有中間地帶。交易系統(tǒng)公式用來定義買入和賣出信號(hào)通常包含兩條邏輯線一條管開倉一條管平倉。五彩K線公式通過給K線染色來標(biāo)記某種K線形態(tài)本質(zhì)上是對(duì)條件選股的圖形化表達(dá)用于視覺復(fù)盤。組合條件把多個(gè)選股條件用“與/或”關(guān)系串起來相當(dāng)于把一把細(xì)篩子疊在一起過一遍。搞清楚這五類的區(qū)別很重要。很多人一開始就在技術(shù)指標(biāo)編輯器里寫帶“FILTER”的選股語句結(jié)果保存都過不了就是因?yàn)楣筋愋秃驼Z法不匹配。寫之前想清楚你的最終目的是一條畫線的副圖指標(biāo)還是一個(gè)能跑出股票列表的選股器這決定了你在哪個(gè)編輯器里干活。編輯器的界面看懂了就很簡單上半部分是代碼輸入?yún)^(qū)下半部分通常會(huì)有一個(gè)“測(cè)試公式”按鈕和“確定”按鈕。代碼區(qū)里寫邏輯寫完先點(diǎn)“測(cè)試公式”檢查語法通過后再點(diǎn)“確定”應(yīng)用。需要提醒的是通達(dá)信的公式語言雖然叫“函數(shù)”但它和Excel函數(shù)完全不同前者是操作K線、成交量、資金流這些時(shí)序數(shù)據(jù)的后者是操作單元格的。你不需要會(huì)編程也能入手但至少要理解“序列”這個(gè)概念——公式處理的不是單個(gè)數(shù)而是一整條從第一根K線到最后一根K線的數(shù)據(jù)流。2. 常用函數(shù)拆解40個(gè)函數(shù)覆蓋90%的寫指標(biāo)需求通達(dá)信公式系統(tǒng)內(nèi)置幾百個(gè)函數(shù)但實(shí)際高頻使用的也就三四十個(gè)。我按使用頻率和用途分成了幾類逐步說清楚它們的行為邏輯和典型應(yīng)用場(chǎng)景。K線基礎(chǔ)類這些函數(shù)是數(shù)據(jù)源也就是公式的“原料”。OPEN、HIGH、LOW、CLOSE、VOL分別對(duì)應(yīng)開盤價(jià)、最高價(jià)、最低價(jià)、收盤價(jià)、成交量。注意通達(dá)信里收盤價(jià)通常簡寫為CLOSE也可以用C代替但用全稱更清晰。VOL默認(rèn)是手?jǐn)?shù)不是金額想要成交金額用AMOUNT。統(tǒng)計(jì)與數(shù)學(xué)運(yùn)算類MA(X,N)是簡單移動(dòng)平均EMA(X,N)是指數(shù)移動(dòng)平均。兩者的區(qū)別在于MA給每一根K線的權(quán)重都是1/NEMA對(duì)近期數(shù)據(jù)分配更高權(quán)重響應(yīng)更快。寫趨勢(shì)指標(biāo)時(shí)EMA往往更跟手但噪聲也更大。HHV(X,N)和LLV(X,N)取N周期內(nèi)的最高值和最低值比如“過去20天的最低價(jià)”就是LLV(LOW,20)。REF(X,N)取N天前的值REF(CLOSE,1)就是昨天的收盤價(jià)。SUM(X,N)求和常用于統(tǒng)計(jì)N日內(nèi)滿足某個(gè)條件的次數(shù)。COUNT(條件,N)統(tǒng)計(jì)N周期內(nèi)條件成立的次數(shù)這個(gè)函數(shù)在選股和信號(hào)確認(rèn)里非常實(shí)用比如“5天內(nèi)有3天收陽線”就是COUNT(CLOSEOPEN,5)3。交叉與信號(hào)類CROSS(A,B)判斷A上穿B也就是“今天A大于B且昨天A小于等于B”。這個(gè)函數(shù)返回的不是數(shù)值而是“真/假”信號(hào)用于觸發(fā)買入提示。還有一個(gè)鏡像的用法CROSS(B,A)就是下穿。交叉類函數(shù)最核心的使用場(chǎng)景是金叉死叉但很多人忽略了一點(diǎn)——CROSS 只判斷“穿過”的那一瞬間如果兩根線糾纏反復(fù)交叉信號(hào)會(huì)非常密集此時(shí)建議疊加一個(gè)確認(rèn)條件比如“成交量大于5日均量”之類。條件判斷與邏輯運(yùn)算IF(條件,A,B)是萬能的條件賦值函數(shù)滿足條件時(shí)取A不滿足取B。AND、OR、NOT分別是對(duì)條件做“與”“或”“非”運(yùn)算。通達(dá)信的條件表達(dá)式里、、、、注意是單等號(hào)不是雙等號(hào)用于比較“不等”用!。這個(gè)細(xì)節(jié)我見過很多人寫錯(cuò)一通百通的是通達(dá)信里的“等于”和賦值都是系統(tǒng)會(huì)根據(jù)上下文區(qū)分。資金與量能類DYNAINFO(37)是實(shí)時(shí)量比DYNAINFO(3)是漲速WINNER(CLOSE)是獲利盤比例。量能飽和度這類寫法雖然有爭(zhēng)議但我可以分享一個(gè)簡化版的計(jì)算邏輯先算出當(dāng)日成交量和前期均量的比值再結(jié)合股價(jià)位置做歸一化輸出一個(gè)0到1之間的數(shù)值。這類函數(shù)通常依賴當(dāng)天的分筆數(shù)據(jù)做歷史回測(cè)時(shí)會(huì)有偏差寫公式時(shí)要有心理預(yù)期。字符串與格式化類STRCAT(A,B)拼接字符串CON2STR(X,N)把數(shù)值轉(zhuǎn)成指定位數(shù)的小數(shù)字符串DRAWTEXT配合這些函數(shù)可以在圖上輸出自定義文字。比如想在副圖里顯示“當(dāng)前價(jià)”的標(biāo)簽就可以寫DRAWTEXT(1,0,STRCAT(現(xiàn)價(jià),CON2STR(CLOSE,2)))。函數(shù)不用全背我的習(xí)慣是建立一個(gè)自己的速查表把用過且好用的函數(shù)記下來下次寫新公式時(shí)直接復(fù)制粘貼過去檢查參數(shù)。熟能生巧這句話在公式語言上體現(xiàn)得特別明顯。3. 一個(gè)實(shí)戰(zhàn)案例從零寫一個(gè)“均線粘合突破”副圖指標(biāo)紙上談兵沒意思我們來把一條條函數(shù)拼成一個(gè)能用的指標(biāo)。這個(gè)例子的需求是連續(xù)N天5日均線、10日均線、20日均線纏繞在一起即三線距離很小隨后某一天股價(jià)放量突破20日均線副圖上給出一個(gè)明確的“關(guān)注”信號(hào)。這個(gè)思路兼顧了趨勢(shì)和突破適合做震蕩末期的啟動(dòng)觀察。第一步定義三條均線MA5:MA(CLOSE,5); MA10:MA(CLOSE,10); MA20:MA(CLOSE,20);注意這里用的是:而不是。在通達(dá)信公式里:表示“只計(jì)算但不在圖上顯示”如果只寫這條中間變量會(huì)被繪制出來干擾副圖。分清:和是寫公式最基操的一關(guān)。第二步定義“粘合”的條件。三個(gè)均線彼此接近最直觀的算法是計(jì)算它們的最大值和最小值然后看極差相對(duì)于MA20的比例是否小于某一個(gè)閾值比如3%MAXMA:MAX(MAX(MA5,MA10),MA20); MINMA:MIN(MIN(MA5,MA10),MA20); NIANHE: (MAXMA-MINMA)/MA20*100 3;這段代碼的意思是先取三條均線里的最高值和最低值算出差值歸一化到MA20上如果比例小于3%就認(rèn)為當(dāng)前處于粘合狀態(tài)。閾值3%不是固定死的個(gè)股波動(dòng)率不同可以自行調(diào)整。第三步定義“放量突破”。放量可以用“今天的量是5日均量的1.5倍”刻畫突破則寫為“今天的收盤價(jià)上穿MA20”。組合起來FANGLIANG:VOL MA(VOL,5)*1.5; TUPO:CROSS(CLOSE,MA20);第四步把三個(gè)條件串起來輸出信號(hào)。為了讓信號(hào)不要太密集我習(xí)慣讓信號(hào)在粘合條件成立后的N天內(nèi)有效用COUNT來實(shí)現(xiàn)COND:NIANHE AND TUPO; SIGNAL: COUNT(COND,10)0;整體完整代碼為MA5:MA(CLOSE,5); MA10:MA(CLOSE,10); MA20:MA(CLOSE,20); MAXMA:MAX(MAX(MA5,MA10),MA20); MINMA:MIN(MIN(MA5,MA10),MA20); NIANHE: (MAXMA-MINMA)/MA20*100 3; FANGLIANG:VOL MA(VOL,5)*1.5; TUPO:CROSS(CLOSE,MA20); COND:NIANHE AND TUPO; SIGNAL: COUNT(COND,10)0;代碼寫完回到編輯器點(diǎn)擊“測(cè)試公式”系統(tǒng)會(huì)提示有沒有語法錯(cuò)誤。通過后“SIGNAL”那一行的冒號(hào)如果是單冒號(hào)并且末尾有分號(hào)它就會(huì)在副圖里顯示成一條線數(shù)值為1時(shí)表示信號(hào)成立為0時(shí)沒有信號(hào)。如果你不想要線只想要圖標(biāo)提示可以在最后一行改用DRAWTEXT或DRAWICONDRAWICON(COUNT(COND,10)0,LOW,1);這樣就會(huì)在滿足條件的K線下方畫一個(gè)預(yù)設(shè)圖標(biāo)復(fù)盤的時(shí)候一眼就能掃到。4. 把副圖指標(biāo)改造成選股公式只需兩步副圖指標(biāo)和條件選股公式在代碼層面幾乎沒有區(qū)別區(qū)別在于輸出形式。選股公式不允許輸出繪圖的“線”它只要求輸出一個(gè)“真/假”條件。所以改造過程非常簡單把指標(biāo)公式的最終邏輯提出來剝掉所有繪圖語句留下一個(gè)布爾表達(dá)式。還是拿上面的“均線粘合突破”例子。副圖最后一句是SIGNAL: COUNT(COND,10)0;選股公式里你只需要字段名從SIGNAL:改成XG:即可也可以直接去掉賦值符號(hào)寫COUNT(COND,10)0;。但注意選股公式里變量定義也要用:最后一行可以直接用XG:或者直接裸寫條件。完整的選股版MA5:MA(CLOSE,5); MA10:MA(CLOSE,10); MA20:MA(CLOSE,20); MAXMA:MAX(MAX(MA5,MA10),MA20); MINMA:MIN(MIN(MA5,MA10),MA20); NIANHE: (MAXMA-MINMA)/MA20*100 3; FANGLIANG:VOL MA(VOL,5)*1.5; TUPO:CROSS(CLOSE,MA20); XG: NIANHE AND TUPO;日常使用中我會(huì)設(shè)計(jì)條件選股公式時(shí)特意加上COUNT預(yù)防信號(hào)過期——比如COUNT(NIANHE AND TUPO,5)0這樣就相當(dāng)于選中“最近5天內(nèi)出現(xiàn)過一次粘合突破的股票”。這比單純?cè)谛盘?hào)當(dāng)天選股要寬容一些適合每周盤后刷一遍。選股公式寫好后打開“功能”菜單里的“條件選股”把公式加入執(zhí)行列表設(shè)定好選擇范圍比如滬深A(yù)股、周期日線或30分鐘點(diǎn)擊“執(zhí)行選股”系統(tǒng)就會(huì)把符合條件的股票拉出來。如果你用的是Level-2數(shù)據(jù)源還可以在盤中設(shè)置預(yù)警用同樣的公式實(shí)時(shí)掃描。5. 常見問題速查表那些年我踩過的坑公式寫多了經(jīng)常遇到一些看起來莫名其妙的問題。我把這幾年周圍朋友和自己在實(shí)踐中遇到的高頻問題整理成了一張速查表按癥狀列出原因和解決思路。問題一公式測(cè)試通過但圖上什么都不顯示。多半是輸出值被賦成了中間變量用了:而不是:。檢查一下代碼看是不是所有輸出行都用了:。還有一種可能是輸出值全為常數(shù)或沒有實(shí)際連接到K線數(shù)據(jù)上比如寫了IF(1,0,0)這種無條件恒成立的表達(dá)式。問題二信號(hào)太多密密麻麻沒法看。這類情況通常是條件太寬松。解決辦法是疊加確認(rèn)條件比如加上量能要求、價(jià)格位置過濾比如只提示CLOSEMA60的標(biāo)的或者用FILTER(條件,10)讓同一個(gè)信號(hào)10天內(nèi)只出現(xiàn)一次。FILTER函數(shù)專門干這個(gè)它能讓信號(hào)臨時(shí)的密集重復(fù)被壓掉。問題三保存公式提示“缺少分號(hào)”或“非法變量名”。通達(dá)信語法非常嚴(yán)格語句之間用分號(hào)分隔變量名不要帶中文和下劃線以外的特殊字符更不要用數(shù)字開頭。另外要注意的是通達(dá)信的注釋符號(hào)是{}不是C語言的//或/* */。如果你從網(wǎng)上復(fù)制別人的公式大概率會(huì)因?yàn)樽⑨尫?hào)或全角字符導(dǎo)致報(bào)錯(cuò)把全角括號(hào)、冒號(hào)替換成半角即可解決。問題四指標(biāo)的信號(hào)歷史回看時(shí)對(duì)不上今天有信號(hào)盤后看就沒了。這是很多人在選股公式里遇到的常見情況。問題通常出在使用了未來函數(shù)典型的有ZIG之字轉(zhuǎn)向、BACKSET向前賦值、PEAK/TROUGH波峰波谷以及部分DYNAINFO動(dòng)態(tài)函數(shù)。這些函數(shù)在盤中能取到當(dāng)期數(shù)據(jù)但一旦歷史K線補(bǔ)全它們會(huì)根據(jù)后續(xù)數(shù)據(jù)重新計(jì)算導(dǎo)致信號(hào)“漂移”或“消失”。新手階段建議從選股公式里徹底禁用未來函數(shù)等熟練判斷數(shù)據(jù)時(shí)序之后再進(jìn)階使用。問題五公式里寫了中文注釋但保存后亂碼。通達(dá)信舊版本對(duì)編碼支持不太好公式文件容易出現(xiàn)GBK和UTF-8混用導(dǎo)致亂碼。最穩(wěn)妥的方案是寫注釋時(shí)用英文或者存成.fnc文件后用文本編輯器手動(dòng)改編碼再導(dǎo)入。我自己寫公式的習(xí)慣是所有變量名英文所有注釋用{ }包裹且盡量簡短這樣基本上能避免亂碼問題。問題六別人分享的公式帶密碼解鎖不了。帶密碼的公式通常是作者做了加密處理通達(dá)信本身不提供找回密碼的功能。常見的所謂“解密”工具多數(shù)是把代碼還原成中間計(jì)算過程但不保證和原公式邏輯完全一致而且運(yùn)行未知來源的破解工具本身也有安全風(fēng)險(xiǎn)。我的建議是拿到加密公式就當(dāng)黑盒參考自己用已知函數(shù)重新實(shí)現(xiàn)類似邏輯反而更能鍛煉寫公式的能力。6. 從公式到策略信號(hào)落地的那一步最磨人公式寫出來、選股能跑通只是完成了很小一部分。真正讓人崩潰的是信號(hào)落地到交易策略時(shí)出現(xiàn)的各種偏差。比如你用同一個(gè)條件選股公式在不同周期上跑結(jié)果可能完全不同日線上是“均線粘合突破”30分鐘線上可能就變成了一堆噪聲。這背后的原因也不復(fù)雜——均線的N值固定但高低周期上的波動(dòng)率分位不一樣。我的經(jīng)驗(yàn)是任何公式必須先明確生態(tài)位。你是做日線級(jí)別波段還是做60分鐘級(jí)別短線還是做周線中線同一個(gè)“均線粘合突破”邏輯不同周期需要的參數(shù)完全不同。日線可以用5、10、2030分鐘級(jí)別我一般會(huì)把參數(shù)調(diào)到3、5、10并且把粘合閾值從3%放寬到5%因?yàn)槎讨芷诓▌?dòng)天然更大。周期和參數(shù)不匹配是絕大多數(shù)公式“時(shí)靈時(shí)不靈”的根源。另外信號(hào)本身的置信度也值得打磨。不要去追“100%勝率”的圣杯那在邏輯上就不存在。更現(xiàn)實(shí)的做法是給信號(hào)分層信號(hào)A是“粘合突破量能放大”信號(hào)B是“粘合突破但量能一般”信號(hào)C是“正在粘合還未突破”。A類信號(hào)我才會(huì)考慮B類只觀察C類放進(jìn)自選池跟蹤。在公式里可以用不同顏色的圖標(biāo)或文字區(qū)分這樣復(fù)盤效率會(huì)高很多。7. 調(diào)試公式的三個(gè)土辦法很多人寫公式一報(bào)錯(cuò)就發(fā)懵其實(shí)通達(dá)信自帶的調(diào)試手段雖然樸素但足夠用。第一個(gè)辦法是“拆中間變量”。比如NIANHE這個(gè)中間變量你可以先只輸出它不加載后面的條件看看在K線圖上是不是真的在預(yù)想的區(qū)間變成了1。如果NIANHE一直沒有1說明粘合的閾值設(shè)得太嚴(yán)或者均線參數(shù)有問題。第二個(gè)辦法是“用 STICKLINE 畫柱驗(yàn)證”。這個(gè)函數(shù)可以按你的條件畫出紅綠柱子方便直接觀察信號(hào)出現(xiàn)的位置是否符合直覺。比如STICKLINE(COND,0,1,3,0)會(huì)在滿足條件時(shí)畫一根實(shí)體柱。第三個(gè)辦法是“固定時(shí)間窗口斷點(diǎn)”。盯住某一段歷史行情手動(dòng)記錄幾個(gè)關(guān)鍵點(diǎn)然后看公式在那幾個(gè)點(diǎn)是否給出了信號(hào)。如果信號(hào)比預(yù)期晚了幾天八成是用了未來函數(shù)或者REF的偏移量沒寫對(duì)。這三個(gè)辦法組合起來基本能解決90%的邏輯錯(cuò)誤。真正的難點(diǎn)不在語法而在“你的想法到底用什么函數(shù)組合最貼切”多試幾次就有手感了。8. 一些長遠(yuǎn)建議向DLL插件和外部數(shù)據(jù)擴(kuò)展當(dāng)公式系統(tǒng)的內(nèi)置函數(shù)滿足不了復(fù)雜需求時(shí)通達(dá)信還支持DLL插件擴(kuò)展。我這兩年為了處理一些自研的資金流算法寫過一個(gè)DLL通過#INCLUDE引入后可以像調(diào)用內(nèi)置函數(shù)一樣使用自己編譯的C代碼。DLL插件的優(yōu)點(diǎn)是計(jì)算速度快、邏輯完全自主可控適合做機(jī)器學(xué)習(xí)特征提取或高頻因子計(jì)算門檻也比公式語言高不少需要一點(diǎn)C/C基礎(chǔ)還需要熟悉通達(dá)信定義的接口數(shù)據(jù)結(jié)構(gòu)。如果你不想走到DLL這一步也可以先用通用數(shù)據(jù)接口把通達(dá)信的行情導(dǎo)出到Excel或Python里做分析再用選股公式把結(jié)果導(dǎo)回通達(dá)信。這條路沒有DLL那么硬核但足以應(yīng)對(duì)大多數(shù)量化研究的初階需求。坦率說指標(biāo)公式只是交易系統(tǒng)的一個(gè)環(huán)節(jié)它解決的是“定義規(guī)則”的問題不解決“規(guī)則有效”的問題。任何公式都要經(jīng)過歷史回測(cè)、樣本外驗(yàn)證、實(shí)盤跟蹤幾個(gè)遞進(jìn)階段才能談得上可用。寫公式最忌諱的是拿著后視鏡調(diào)參調(diào)出一套在歷史上完美的大師線一到實(shí)盤就失靈。我自己現(xiàn)在寫公式的原則就是四個(gè)字少即是多。邏輯越簡單、參數(shù)越少公式就越穩(wěn)定越好維護(hù)越不容易被市場(chǎng)風(fēng)格變化擊穿。參數(shù)超過五個(gè)的策略通常不是聰明而是過擬合。每次寫好公式我還會(huì)在通達(dá)信里把周期切換到周線或月線再跑一遍看它是否還能成立如果只在某個(gè)周期上神奇那就基本說明這個(gè)公式靠的是數(shù)據(jù)擬合而不是市場(chǎng)邏輯。說到底通達(dá)信公式語言不過是一把刀真正決定你做出什么東西來的是拿刀的人對(duì)市場(chǎng)、對(duì)交易規(guī)則的認(rèn)知。工具給你自由但認(rèn)知決定邊界。本文還有配套的精品資源點(diǎn)擊獲取