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