1、最簡單的 同花順公式 錯在哪啊?
公式入門
我們大多數的用戶並不是完全了解「公式編輯器」的意義,簡單地,我們可以從以下幾個角度進行理解:
一、指標分析:
「公式編輯器」好比是一個工作母床,通過這個工作母床可以製造出所需要的各式各樣的零件,同樣,在指標分析的工作中,利用編輯器可以編寫出相應的分析
條件,這種方法是在技術分析當中最為常用的方法之一。例如,指標KD、指標MA等等,通過對這些指標的觀察、分析,找出一些合適的條件作為買入賣出點。當
然,我們也許需要的是一些自己的指標,一些自己的准確的指標,更多的MB、MC、MD等等,這一切我們通過「公式編輯器」可以實現。
二、條件選股:
編寫公式都要用到什麼東西?
我們留下了許多問題--都是公式編寫的基礎問題,所以我們這節課來解決這些基礎的問題。
什麼是技術指標?
MA均線就是一種技術指標,我們在炒股的時候,經常會將一些行情數據進行數學計算得出一些曲線等等,方便我們掌握股市的變動情況。
什麼是條件選股?
簡單講,就是按照您的設定的條件用電腦幫助您完成一些太多太復雜的挑選--比如您有一些好的心得和方法,可使有1000多隻股票,您就是有100雙眼睛有時也不
一定可以看得過來,這時電腦就派上用場了!
什麼是參數?
比如講:10日均線,您可以把10日當作參數,好處在於,您覺得需要修改成5日的時候,就可以使用一些簡單的方法,例如參數精靈來很方便的修改和調整。參數
需要名字,例如M就不錯。還要規定參數的范圍,例如1日至260日。這樣我們就可以在1到260之間任意調節M的值了,M最常用的數填在「預設」一欄,例如你最喜
歡用10日均線,那就填10吧。
什麼是周期?
這么解釋吧!我們有的投資者喜歡使用日線圖作技術分析;有的喜歡用5分鍾的K線;有的喜歡使用長一點時間的,例如周線。所以在公式設計中,允許不同喜好
的使用者選擇不同的分析時間--就是可以選擇不同的周期。
什麼是函數?
函數在公式編寫非常重要,如果作個比喻,我們用一種語言去告訴電腦我的想法,並且讓它去幫我做,那麼函數就是這種語言的單詞。
我們在公式編輯器中選擇插入函數,就可以看到裡面有許多的函數,我們在附錄中有一個簡表,大家可以到那裡去檢索!
例一:
一根K線有四個價格組成:
最高價:HIGH
收盤價:CLOSE
最低價:LOW
開盤價:OPEN
成交量:VOL
成交額:AMO
例二:
兩條均線不斷地交叉,就專門設定了一條函數來描述兩條線交叉:CROSS(X,Y)
假如下圖中的兩條均線一條名叫X,另外一條叫Y
CROSS(X,Y)表示X向上穿過了Y
CROSS(Y,X)表示Y向上穿過了X
例三:
前面的CLOSE,還是VOL,都表示當天,或者您使用的不是日線,那就表示本周期的數據,那麼前幾天的怎麼表示呢?
REF(X,M)
例如:
REF(Close,5)表示5天前的收盤;
REF(Vol,10)表示10天前的成交量;
這里的M就是參數,您現在明白了什麼是參數了嗎?
例四:
如果我想把兩個條件並列在一起怎麼辦?
AND
X AND Y就表示條件X和條件Y
好了!本課結束吧--有點稍慢,下面會好一些!
編寫一條最簡單的指標線
通過前幾課的學習,我們今天開始使用軟體的公式編輯功能編寫我們自己的第一條指標線。
其實不難,你應該對自己有信心!
按照主菜單-工具-公式**-選擇-「技術指標」-點擊「新建」,然後在公式編輯器中留下你的第一行腳印吧!
點擊:「確認」,現在看一下我們第一條指標線。
這條指標線與你的想法相符嗎?
總結與補充:
1、如果選擇:「主圖疊加」,我們的指標線會與K線圖顯示在同一個圖形框中,現在我們的指標線顯示在其下方,即「副圖」中;
2、參數可以有,也可以沒有,但是鼓勵大家設置參數,這是非常好的習慣;
3、一個句子完了,別忘了以分號結尾;
你的公式寫得對不對,可以通過「測試公式」來檢查,如果錯了,它會告訴你錯在哪裡。
編寫最常用的均量和均價線
均價線,不就是那個「移動平均線MA」什麼的嗎?不過,話說回來,聽說10個人裡面有11個人都在使用,我可得學習學習!
原理是??
5日平均線=(今天收盤價+昨天收盤價+.....--5天前的收盤價)/5;
10日平均線=(今天收盤價+昨天收盤價+......+10天前的收盤價)/10;
150日平均線=(今天收盤價+昨天收盤價+......+150天前的收盤價)/150;
200日平均線......不是這么麻煩吧?難道我每天都要寫這么多得數才得到一條平均線????
你有什麼辦法?
MA1=MA(CLOSE,5);
MA2=MA(CLOSE,10);
MA3=MA(CLOSE,50);
......
當然是有簡單的方法了!你把我在上面說過的話寫下來,按照前面幾課講的,寫在公式的編輯欄當中就可以了!
注意:
「MA」表示的就是計算平均值。
在括弧內寫上計算的對象和計算的時間長度。
MA1,MA2,MA3......是好幾條指標線,別忘記了用分號把它們分開。
最後呢?電腦自己會把它們一起畫出來。
均量線???
均價線都有了,照著葫蘆畫瓢,把收盤價CLOSE換成成交量VOL就行了!
MA1:MA(VOL,5);
MA2:MA(VOL,10);
MA3:MA(VOL,150);
MA4:MA(VOL,200);
今天有幾只發生MA金叉?
我們學習了編寫MA移動平均線,關於這幾條指標線如何使用?我想大家可能都比我清楚。例如短期均線和長期均線發生了金叉或者死叉,......等等,葛蘭維爾
的八項法則......如果說如何用分析家軟體編寫一個條件,讓電腦把今天兩個市場的股票中所有發生了黃金交叉的股票選出來呢?
想知道嗎?這就是「條件選股」,按照「條件」電腦自動「選擇股票」出來,可以供您分析,要不然的話,技術分析的投資者都會累死了!
跟我學!
第一步:「工具」欄中選中「公式**器」
第二步:我們現在選擇「新建」一個「條件選股」公式,結果出現了下面的編輯欄!然後在裡面寫上您的條件!
第三步:按照說明書上的步驟選股就行了!
注意:
1、在條件選股中點擊「新建」;
2、原來MA5:MA(CLOSE,5);
表示的是一條指標線,可是現在我們在條件選股當中只要引用它,不需要把它畫出來。所以我們在冒號的後面加一個符號,表示等會要引用它:MA5:=MA(CLOSE
,5);
這個在分析家的公式編輯中,叫做「中間表達式」。
X=1;
Y=X+1;
Y=?
我們學過上面的數學,都知道把X=1代入到Y的計算中去,「X=1;」就是一個中間表達式,您明白了嗎?
條件選股總結:
1、指標和條件選股在結構上沒有差別,只是在內容上,條件選股要多加上我們的條件,比如大於10,或者交叉等等!
2、中間表達式可以幫助我們清晰的表達我們的公式,不至於使公式的結構特別的混亂!
如何編寫BIAS指標?
如果大家都是均線的忠實愛好者的話,那麼大家一定牢牢記得在均線大師哥南威爾的8***則當中的第四條和第五條中曾經提到了當股價偏離均線太遠的時候,便
會向它靠攏,但是並不提到多遠才會靠攏--為了解決這個問題,也為了我們更好地用客觀數據來體現股價運動的過程,乖離率這個指標應運而生。
本課我們的任務就是通過對乖離率的原理到編寫方法的學習來加強我們對公式設計的理解。
首先,什麼是乖離率?
以當日的均線價格為准,股價和均價之間的差距稱為乖離程度,以乖離程度除以均價的百分比就是乖離率。
當日股價與10日均線的乖離率=(當日股價-10日均價)/10日均價*100;
當日股價與20日均線的乖離率=(當日股價-20日均價)/20日均價*100;
當日股價與30日均線的乖離率=(當日股價-30日均價)/30日均價*100;
原理就是這么簡單,可是怎麼使用呢?您別急,所用的指標其實都是在觀察當中得出一定的啟示,您先實現這幾條指標線,讓它們以圖形的方式出現在您的面前
,然後您再去觀察,一定會事半功倍!
比如編寫10日乖離率
第一步:乖離率的命名,崇尚人家的習慣,依舊使用BIAS,那麼第一條就叫做BIAS1好了!
第二步:當日股價用CLOSE表示;
10均價我們在前一節課剛剛學過,順手拈來,用MA(CLOSE,10)表示;
第三步:一樣使用加減乘除符號以及括弧,只是要注意只有小括弧,沒有中大括弧,那麼公式就有了--
BIAS1:(CLOSE-MA(CLOSE,10))/MA(CLOSE,10)*100;
這樣的話我們在技術指標編輯器中將另外兩條指標也同樣寫下來,就得到了BIAS指標,請看下圖:
第四步:就是您得自己好好觀察您的指標公式在各個股票的表現,得出您自己的結論,因為每一個投資者即使是在使用同樣一個指標的時候,都會有不同的理解
,我們無法判斷優劣,但是有一條可以告訴我們答案,那就是永遠讓市場說話,因為它永遠是對的!
如果您不介意的話,可以參考BIAS,不過僅供參考!
您明白怎麼編寫了嗎?
====================================================================================
我能不能直接用寫好的指標公式?
我想用KD指標選股,能不能直接寫成「D>20」就可以執行了?
當然可以!考慮到了這種偷懶的做法,所以我們一共提供了兩種供偷懶的人士使用,其中一種與上面的要求只是在寫法上稍有不同!
第一個方法:
第一步:在條件選股的編輯器中點擊「引入指標公式」。
引入「其他公式」。然後,我們從中選擇一個,例如「KD」,讓我們來看一下結果如何?
第二步:上一步的操作結果請看右邊的圖形,系統自動的把KD指標的整個編寫內容搬來了!
現在需要我們做的就是:續上一行條件「D<20」,OK!完成!
有沒有簡單的方法?
第二個方法:就一句話:「KDJ,D」<20;
「KDJ,D」
表示現在我要是用KDJ指標當中的D指標,不過大家要看清楚是怎麼寫的哦!寫錯了計算機可是不會改錯的!
總結:
用上面的方法可以引用所有指標,所以不必寫那麼多!
注意格式上,兩邊用引號括起來,指標名稱KDJ和指標線名稱D之間用「,」隔開!
額外加餐
現在我們可以很方便的做另外一件事了,我們可以將通常說的KDJ買入條件完整的表達出來了:
「KD指標發生了黃金交叉,並且D<20」
T1:=「KDJ,K」;--引用K線;
T2:=「KDJ,D」;--引用D線;
條件: AND在分析家中就表示「並且」,將兩個條件並列起來
CROSS(T1,T2)ANDT2<20;
第九課 放量、縮量、上漲、下跌、收陽、收陰
在前面的學習當中,我們見到了一些基本的表達方法、方式,今天我們的任務是學習一些常見的概念如何編寫,例如上面所列出來的放量、上漲等等,因為這些
都是在公式編寫過程當中要用到的基本的小的形態特徵,許多的技術指標的選股條件都是由它們組成的。
放量:
1、今日比昨日的成交量放大了1倍:
VOL/REF(VOL,1)>2;
2、今日的五日均量比前五天的五日均量放大了3倍:
AA:=MA(VOL,5);
BB:=REF(AA,5);
AA/BB>4;
3、今天的成交量達到了整個流通盤的10%以上:
VOL/CAPITAL>10/100;
(注意,10%的表達式是10/100,或者0.1)
縮量:
1、今日比昨日的成交量縮小了1倍:
VOL/REF(VOL,1)<0.5;
2、今日的五日均量比前五天的五日均量縮小了一半:
AA:=MA(VOL,1)<0.5;
BB:=REF(AA,5);
AA/BB<0.5;
3、今天的成交量不足整個流通盤的0.5%:
VOL/CAPITAL<0.5/100;
上漲:
1、今日漲幅達到了7%以上:
CLOSE/REF(CLOSE,1)>1.07;
2、十日均價繼續上漲:
AA:=MA(CLOSE,10);
BB:=REE(AA,1);
AA>BB;
下跌:
同上面的表達方式一樣,將方向改變了而已:
收陽、收陰:
1、當天收陽:CLOSE>OPEN;
2、當天收陰:CLOSE<OPEN;
高開、低開:
1、當天股價高開,言下之意開盤高於昨日收盤:OPEN>REF(CLOSE,1);
2、當天股價低開:OPEN<REF(CLOSE,1);
跳空:
跳空亦有向上和向下兩種:
當日開盤在昨日最高之上,即為向上跳空:OPEN>REF(HIGH,1);
反之,開盤小於昨日的最高價,為向下跳空:POEN<REF(LOW,1);
事實上,我們在編公式的過程,就是將這些條件有機地結合起來作為我們判斷的條件。舉一個很簡單的例子,如果是K線形態呈現出放量上攻的態勢,那麼如何編
寫這個公式呢?高開高走又應該如何編寫呢?
我們把放量和上漲的兩個條件組合在一起,讓某一天的形態特徵同時滿足兩個條件就達到目的;同樣地將高開的高走兩個條件結合在一起,也就找到了我們所需
的條件。
結果就是:
放量上攻之一,以上面所舉例組合:
AA:=VOL/REF(VOL,1)>2;
BB:=CLOSE/REF(CLOSE,1)>1.07;
AA AND BB;
高開高走:
AA:=OPEN>REF(CLOSE,1);
BB:=CLOSE>OPEN;
AA AND BB;
OK!本課到此結束,留下一個問題,看看您有沒有真正的理解,向上跳空之後兩天內並未回補如何編寫呢?
提示:實際上就是昨天發生了跳空缺口,這兩天的最低價一直在兩天前的最高價之上。
AA:=REF(OPEN,1)>REF(HIGH,2);
BB:=REF(LOW,1)>REF(HIGH,2);
CC:=LOW>REF(HIGH,2);
AA AND BB AND CC;
仔細一想,若BB成立,AA一定成立,AA實際上沒有存在的必要,你想通了嗎?
更簡單的方法,下面的一句話可以的上面的四句:
COUNT(LOW>REF(HIGH,2),2)=2;
第十課 漲停板攻擊?
學了這么多了,應該教點實戰的內容了!我們來學習一下別人的經驗,「漲停板追擊」,同時這裡面還潤孕育著一個簡單但是又頗有意義的道理!
一、量化的概念
我們都知道,按規定漲幅不得超過10%,但是由於四捨五入的關系,常常有9.98%、10.23%等等的漲停板,所以我們要找一個合適的數值,然後用分析家的語言告
訴計算機,這個過程學名叫量化!
比如我們考察之後,決定讓大於9.99%的都為漲停。
二、編寫公式
其實就一句話:今日收盤除以昨日收盤的值大於1.0999
X:=CLOSE/REF(CLOSE,1)>1.0999;
三、測試我們的條件
大家都知測試的功能,要不然你怎麼知道你的經驗在歷史上的表現是好還是不好呢?
按照下圖指引進入條件選股的界面,之後選中您的條件,具體辦法請參見(使用說明書)。然後填入測試時間和測試標准!
在這里我們的測試方法是:
測試時間是從2000/01/01到2001/03/02,測試股票共計583隻,初始投入100,000元。
當滿足買入公式中定義的條件時,也就是漲停板時,按照收盤價使用相同資金買入一隻股票,當滿足以下平倉條件時按照收盤價平倉;買入5日後強制平倉或者虧
損達到3%止損平倉或者利潤達到5%止贏平倉,然後按照以上的規則統計在測試的時間段內的所有交易的狀況。
這是一種追漲的短線方法,所以測試的時間我們只用5天,目標利潤為5%,(非常抱歉,因為其中的設置和選擇方法十分靈活而且需要較好的理解能力,所以我們
在這里就不介紹具體的內容了)
點擊開始測試!一切OK!來看結果吧!
1、從成功率上看,實際達到5%的獲利要求的交易次數67.89%,我們已經比較滿意這個結果了,可是要用於實戰,可不可以再提高呢?
2、所謂的提高就是優化的一個內容,簡單說,優化就是讓它更好!優化我們的條件,讓它的表現更好!
3、加上一個縮量的條件,比如當日成交量小於5日的均量;Y:=VOL<MA(VOL,5);大家可以做一下測試,看看結果如何!以下是同樣測試條件下的結果。 X
AND Y;
您滿意嗎?我們的成功率已達到了80%,剩下的任務就是您如何操作的問題了!
註:請大家考慮一下在實戰當中,如果您按此買入可不可行?
總結:編寫公式並不是為了編公式而編寫復雜的公式,您個人對某一個特徵或者形態的理解最重要。所以光有經驗不夠,您還得把它轉化成您自己的應對策略!
您需要不斷總結、測試、優化您的公式。
第十一課 多頭排列--良好的上升趨勢
均線的多頭排列一直以來都被大家視為一種良好的上升趨勢的表現,因為這種形態的形成需要較長的時間,和較大的能量,而被主力或者莊家利用作為騙線的可
能性就比較小,股市當中也遵循慣性的原理,當一個趨勢形成之後,要改變它,是不容易的,因為股價有著沿著原來的運動方向上的慣性!
首先,讓我們來看看幾種多頭排列:
5、10、30日均線:5、10、30日均線:30、60、90日均線:
在圖一中和圖二中我們採用的是同一周期的均線,即都是5、10、30日均線,我們可以觀察到在同一周期下的均線排列有相同之處,也有很大不同之處:圖一中的
5日均線=10日均線、30日均線平滑優美,而在圖二中的5日和10日均線不斷的碰及30日均線然後上升;
在圖三中我們選用的是30、60、90日均線,相對來說均線的多頭排列也顯得很平滑。
為什麼會有這樣的差別呢?如果您要是認真一點的話,就可以發現原來前兩圖的K線走得不一樣,一個一波拉到頭,一個分成幾波拉到頭,而在圖三當中我們採用
了較長周期的均線系統,從而在一定程度上過濾了這種現象,具體在使用的過程中,您可要多注意它們的區別!
好了,我們來看一下如何編寫,拿第一個為例,觀察它們的特徵:
5/10/30日均線依次從上而下的排列,這種情況維持一段時間,假設我們這里定為4天以上:
5/10/30日均線依次從上而下的排列:
AA:=MA(CLOSE,5);
BB:=MA(CLOSE,10);
CC:=MA(CLOSE,30);
T1:=AA>BB AND BB>CC;
以上情況維持一段時間,假設我們這里定為4天以上:
COUNT(T1,4)=4;
COUNT(X,N)表示統計在N天內滿足條件X的有幾天。
最終的結果就是如下所示:
AA:=MA(CLOSE,5);
BB:=MA(CLOSE,10);
CC:=MA(CLOSE,30);
T1:=AA>BB AND BB>CC;
COUNT(T1,4 )=4
編寫完畢,我們在上面的例子當中,舉的是最簡單的一個,其實您在編寫的過程當中,還可以加上一些比較准確地描述,以取得更好的效果,例如同時三條均線
向上發散等,當然還有您自己的心得。
=================================================================
第十二課 逃頂K線形態之--黃昏之星
一、概念學習
當市場出現一條大陽線後,通常會產生跳空高開的情況,有時便會出現十字星或類似十字星的小陰線(小陽線)。另一種相反的情況是出現在一條大陰線後,在
這兩種情況下形成的類似十字星的K線都被稱為「星型線」。
當該形態出現在一段上升行情的當中,就很容易形成所謂的經典K線形態--黃昏之星。
二、編制過程
通過我們前面的學習,其實已經可以比較輕松的編制這個條件了--前人已經清晰地把這個形態的具體特徵描述出來,剩下的工作就是把這些特徵用數字表示--這
就是前面提到的量化的過程!
該圖組合一共由三根K線合成,我們按照以下的步驟一步一步地一邊尋找每日K線的特徵,一邊進行編寫:
為了結構簡單起見,首先將二天的高開低收用中間表達式表達出來,因為我們在後面的編寫過程中會分別使用到這些數據。
1、今日K線的:開-a1, a1:=open;
收-a2, a2:=close;
高-a3, a3:=high;
2、昨天K線的:開-b1, b1:=ref(open,1);
收-b2, b2:=ref(close,1);
高-b3, b3:=ref(high,1);
低-b4, b4:=ref(low,1);
3、前天K線的:開-c1, c1:=ref(open,2);
收-c2, c2:=ref(close,2);
高-c3, c3:=ref(high,2);
低-c4, c4:=ref(low,2);
4、我們將會分別描述出三天的K線形態,然後匯總,首先我們觀察今日K線的特徵,今天是一根低開低走的大陰線,我們給它一些數字上的定義:
a、今日開盤價小於昨日收盤價; aa:=a1<b2 and
b、今日的陰線實體較長,我們用開盤價和收盤價相比,長度大於4%:a1/a2>1.04;
5、昨日K線的特徵,是一根十字形態的K線,並且在左右兩根K線之上,分別表達為:
a、昨日跳開,高於前天的收盤: bb:=b1>c3
b、昨日收盤同樣在缺口之上: and b2>c3
c、線形實體長度很小,也就是昨日開盤和收盤之差比昨日開盤的值小於0.01:and abs(b1-b2)/b1<0.01
d、K線有上下影線,可以表示為最高價和最低價不等於收盤價也不等於開盤價:and b3>b1 and b3>b2 and b4<b1 and b4<b2
e、當日的最高價為20天以來的最高價: and b3=hhv(high,20);
6、前日K線的特徵:股價大幅上揚,幅度較前一日收盤高出4%並且收盤大於開盤:cc:=c2/ref(close,3)>1.04 and c2>c1;
綜合選股條件:最後我們將三天的K線特徵會合起來,合成一個最後的條件就是由圖所示內容: aa and bb and cc
另外,團IDC網上有許多產品團購,便宜有口碑
2、股票開盤價今日和昨日的怎麼相差很懸殊??如昨日是30,今日就變成15了
像你說的這種情況是因為分紅除權,30變15是因為10股送十股,也就是說假如你有1手分紅後就變成兩手了,其實就是切大餅,跟沒送一樣
3、大數據概念上市公司有哪些?
?
4、如何通過雪球查詢股票之前的變動狀況
一. 雪球公司介紹
雪球 聰明的投資者都在這里。
web 1.0:新聞資訊,股價信息,K線圖
web 2.0:SNS 訂閱,分享,聊天
web 3.0:移動 APP,交易閉環
雪球現在員工數還不到100,其中技術人員佔一半。去年9月C輪融資4kw刀。我們現在的技術棧由下列組件組成:Java,Scala,Akka,Finagle,Nodejs,Docker ,Hadoop。我們當前是租用IDC機房自建私有雲,正在往「公私混合雲」方向發展。
在雪球上,用戶可以獲取滬深港美2w+股票的新聞信息,股價變化情況,也可以獲取債券,期貨,基金,比特幣,信託,理財,私募等等理財產品的各類信息,也可以關注雪球用戶建立的百萬組合,訂閱它們的實時調倉信息,還可以關注雪球大V。雪球當前有百萬日活躍用戶,每天有4億的API調用。App Store 財務免費榜第 18 名。歷史上曾排到財務第二,總免費榜第 19。
二. 雪球當前總體架構
作為一個典型的移動互聯網創業公司,雪球的總體架構也是非常典型的設計:
最上層是三個端:web端,android端和iOS端。流量比例大約為 2:4:4 。web3.0 的交易功能,在 web 端並不提供。
接入層以及下面的幾個層,都在我們的自建機房內部。雪球當前只部署了一個機房,還屬於單機房時代。正在進行「私有雲+公有雲混合部署」方案推進過程中。
我們當前使用 nodejs 作為 web 端模板引擎。nodejs 模塊與android 和 ios 的 app 模塊一起屬於大前端團隊負責。
再往下是位於 nginx 後面的 api 模塊。跟 linkedin 的 leo 和微博的 v4 一樣,雪球也有一個遺留的大一統系統,名字就叫 snowball 。最初,所有的邏輯都在 snowball 中實現的。後來慢慢的拆出去了很多 rpc 服務,再後來慢慢的拆出去了一些 http api 做成了獨立業務,但即便如此,snowball 仍然是雪球系統中最大的一個部署單元。
在需要性能的地方,我們使用 netty 搭建了一些獨立的介面,比如 quoto server,是用來提供開盤期間每秒一次的股價查詢服務,單機 qps 5w+,這個一會再細說;而 IM 服務,起初設計里是用來提供聊天服務,而現在,它最大的用途是提供一個可靠的 push 通道,提供 5w/s 的消息下發容量,這個也一會再細說。
雪球的服務化拆分及治理採用 twitter 開源的 finagle rpc 框架,並在上面進行了一些二次開發和定製。定製的功能主要集中在 access log 增強,和 fail fast,fail over 策略及降級開關等。 finagle 的實現比較復雜,debug 和二次開發的門檻較高,團隊內部對此也進行了一些討論。
雪球的業務比較復雜,在服務層中,大致可以分為幾類:第一類是web1.0,2.0 及基礎服務,我們稱為社區,包括用戶,帖子,新聞,股價,搜索等等,類比對象就是新浪財經門戶+微博;第二類是組合及推薦,主要提供股票投資策略的展示和建議,類比對象是美國的motif;第三類是通道,類似股市中的「支付寶」,接入多家券商,提供瞬間開戶,一鍵下單等等各種方便操作的功能。
雪球的業務實現中,包含很多非同步計算邏輯,比如搜索建索引,比如股票漲跌停發通知,比如組合收益計算等等,為此,我們設計了一個獨立的 Thread/Task 模塊,方便管理所有的後台計算任務。但隨著這些 task 越來越多,邏輯差異越來越大,一個統一的模塊並不是總是最佳的方案,所以,我們又把它拆成了兩大類:流式的,和批量式的。
雪球的推薦體系包括組合推薦「買什麼」和個性化推薦。我們最近正在重新梳理我們的大數據體系,這個感興趣的話可以單聊。
最下面是基礎設施層。雪球基礎設施層包括:redis,mysql,mq,zk,hdfs,以及容器 docker。
線上服務之外,我們的開發及後台設施也很典型:gitlab開發,jenkins打包,zabbix 監控系統向 openfalcon 遷移,redimine向confluence遷移,jira,以及內部開發的 skiing 後台管理系統。
** 三. 雪球架構優化歷程**
首先描述一下標題中的「股市動盪」定語修飾詞吧:
上證指數從年初的3000點半年時間漲到了5000多,6月12號達到最高點5200點,然後就急轉直下,最大單日跌幅 8.48%,一路跌回4000點以下。最近一周都在3900多徘徊。
3月最後一周,A股開戶 166萬戶,超過歷史最高紀錄 2007年5月第二周165萬戶。
4月份,證監會宣布A股支持單用戶開設多賬戶。
6月底,證金公司代表國家隊入場救市。
7月份,證監會宣布嚴打場外配資。
中國好聲音廣告第一晚,帶來超過平時峰值200倍的注冊量
挑戰:小 VS 大:
小:小公司的體量,團隊小,機器規模小
大:堪比大公司的業務線數量,業務復雜度,瞬間峰值沖擊
雪球的業務線 = 1個新浪財經 + 1 個微博 + 1 個 motif + 1 個大智慧/同花順。由於基數小,API調用瞬間峰值大約為平時峰值的 30+ 倍。
挑戰:快速增長,移動互聯網 + 金融,風口,A股大盤劇烈波動。
首先,在app端,在我們核心業務從 web2.0 sns 向 3.0 移動交易閉環進化的過程中,我們開發了一個自己的 hybrid 框架:本地原生框架,加離線 h5 頁面,以此來支撐我們的快速業務迭代。當前,雪球前端可以做到 2 周一個版本,且同時並行推進 3 個版本:一個在 app store 等待審核上線,一個在內測或公測,一個在開發。我們的前端架構師孟祥宇在今年的 wot 上有一個關於這方面的詳細分享,有興趣的可以稍後再深入了解。
雪球App實踐—構建靈活、可靠的Hybrid框架 http://wot.51cto.com/2015mobile/ http://down.51cto.com/data/2080769
另外,為了保障服務的可用性,我們做了一系列的「端到端服務質量監控」。感興趣的可以搜索我今年4月份在環信SM meetup上做的分享《移動時代端到端的穩定性保障》。其中在 app 端,我們採用了一種代價最小的數據傳輸方案:對用戶的網路流量,電池等額外消耗幾乎為0
每個請求里帶上前一個請求的結果
succ or fail : 1 char
失敗原因:0 - 1 char
請求介面編號: 1 char
請求耗時:2 - 3 char
其它:網路制式,etc
炒股的人大多都會盯盤:即在開盤期間,開著一個web頁面或者app,實時的看股價的上下跳動。說到「實時」,美股港股當前都是流式的數據推送,但國內的A股,基本上都是每隔一段時間給出一份系統中所有股票現價的一個快照。這個時間間隔,理論上是3秒,實際上一般都在5秒左右。 交了錢簽了合同,雪球作為合作方就可以從交易所下屬的數據公司那裡拿到數據了,然後提供給自己的用戶使用。
剛才介紹總體架構圖的時候有提到 quote server ,說到這是需要性能的地方。
業務場景是這樣的,雪球上個人主頁,開盤期間,每秒輪詢一次當前用戶關注的股票價格變動情況。在內部,所有的組合收益計算,每隔一段時間需要獲取一下當前所有股票的實時價格。起初同時在線用戶不多,這個介面就是一個部署在 snowball 中的普通介面,股價信息被實時寫入 redis ,讀取的時候就從 redis 中讀。後來,A股大漲,snowball 抗不住了。於是我們就做了一個典型的優化:獨立 server + 本地內存存儲。開盤期間每次數據更新後,數據接收組件主動去更新 quote server 內存中的數據。 後續進一步優化方案是將這個介面以及相關的處理邏輯都遷移到公有雲上去。
對於那些不盯盤的人,最實用的功能就是股價提醒了。在雪球上,你除了可以關注用戶,還可以關注股票。如果你關注的某隻股票漲了或跌了,我們都可以非常及時的通知你。雪球上熱門股票擁有超過 50w 粉絲(招商銀行,蘇寧雲商)粉絲可以設置:當這支股票漲幅或跌幅超過 x%(默認7%)時提醒我。曾經連續3天,每天超過1000股跌停,證監會開了一個會,於是接下來2天超過1000股漲停
原來做法:
股票漲(跌)x%,掃一遍粉絲列表,過濾出所有符合條件的粉絲,推送消息
新做法:
預先建立索引,開盤期間載入內存
1%:uid1,uid2
2%:uid3,uid4,uid5
3%:uid6
問題:有時候嫌太及時了:頻繁跌停,打開跌停,再跌停,再打開。。。的時候
內部線上記錄:
4台機器。
單條消息延時 99% 小於 30秒。
下一步優化目標:99% 小於 10 秒
IM 系統最初的設計目標是為雪球上的用戶提供一個聊天的功能:
送達率第一
雪球IM:Netty + 自定義網路協議
Akka : 每個在線client一個actor
推模式:client 在線情況下使用推模式
多端同步:單賬號多端可登錄,並保持各種狀態同步
移動互聯網時代,除了微信qq以外的所有IM,都轉型成了推送通道,核心指標變成了瞬間峰值性能。原有架構很多地方都不太合適了。
優化:
分配更多資源:推送賬號actor池
精簡業務邏輯:重復消息只存id,實時提醒內容不推歷史設備,不更新非活躍設備的session列表等等
本地緩存:拉黑等無法精簡的業務邏輯遷移到本地緩存
優化代碼:非同步加密存儲,去除不合理的 akka 使用
akka這個解釋一下:akka 有一個自己的 log adapter,內部使用一個 actor 來處理所有的 log event stream 。當瞬間峰值到來的時候,這個 event stream 一下子就堵了上百萬條 log ,導致 gc 顛簸非常嚴重。最後的解決辦法是,繞過 akka 的 log adapter,直接使用 logback 的 appender
線上記錄:5w/s (主動限速)的推送持續 3 分鍾,p99 性能指標無明顯變化
7月10號我們在中國好聲音上做了3期廣告。在廣告播出之前,我們針對廣告可能帶來的對系統的沖擊進行了壓力測試,主要是新用戶注冊模塊,當時預估廣告播出期間2小時新注冊100萬
壓測發現 DB 成為瓶頸:
昵稱檢測 cache miss > 40%
昵稱禁用詞 where like 模糊查詢
手機號是否注冊 cache miss > 80%
注冊新用戶:5 insert
優化:
redis store:昵稱,手機號
本地存儲:昵稱禁用詞
業務流程優化:DB insert 操作同步改非同步
下一步優化計劃:
將 sns 系統中所有的上行操作都改成類似的非同步模式
介面調用時中只更新緩存,而且主動設置5分鍾過期,然後寫一個消息到 mq 隊列,隊列處理程序拿到消息再做其它耗時操作。
為了支持失敗重試,需要將主要的資源操作步驟都做成冪等。
前置模塊HA:
合作方合規要求:業務單元部署到合作方內網,用戶的敏感數據不允許離開進程內存
業務本身要求:業務單元本身為有狀態服務,業務單元高可用
解決方案:
使用 Hazelcast In-Memory Data Grid 的 replication map 在多個 jvm 實例之間做數據同步。
java 啟動參數加上 -XX:+DisableAttachMechanism -XX:-UsePerfData,禁止 jstack,jmap 等等 jdk 工具連接
關於前置模塊,其實還有很多很奇葩的故事,鑒於時間關系,這里就不展開講了。以後有機會可以當笑話給大家講。
組合凈值計算性能優化:
一支股票可能在超過20萬個組合里(南車北車中車,暴風科技)
離線計算,存儲計算後的結果
股價3秒變一次,涉及到這支股票的所有組合理論上也需要每 3 秒重新計算一次
大家可能會問,為什麼不用戶請求時,實時計算呢?這是因為「組合凈值」中還包括分紅送配,分股,送股,拆股,合股,現金,紅利等等,業務太過復雜,開發初期經常需要調整計算邏輯,所以就設計成後台離線計算模式了。當前正在改造,將分紅送配邏輯做成離線計算,股價組成的凈值實時計算。介面請求是,將實時計算部分和離線計算部分合並成最終結果。
實際上,我們的計算邏輯是比較低效的:循環遍歷所有的組合,對每個組合,獲取所有的價值數據,然後計算。完成一遍循環後,立即開始下一輪循環。
優化:
分級:活躍用戶的活躍組合,其它組合。
批量:拉取當前所有股票的現價到 JVM 內存里,這一輪的所有組合計算都用這一份股價快照。
關於這個話題的更詳細內容,感興趣的可以參考雪球組合業務總監張岩楓在今年的 arch summit 深圳大會上的分享:構建高可用的雪球投資組合系統技術實踐 http://sz2015.archsummit.com/speakers/201825
最後,我們還做了一些通用的架構和性能優化,包括jdk升級到8,開發了一個基於 zookeeper 的 config center 和開關降級系統
四. 聊聊關於架構優化的一些總結和感想
在各種場合經常聽說的架構優化,一般都是優化某一個具體的業務模塊,將性能優化到極致。而在雪球,我們做的架構優化更多的是從問題出發,解決實際問題,解決到可以接受的程度即可。可能大家看起來會覺得很凌亂,而且每個事情單獨拎出來好像都不是什麼大事。
我們在對一個大服務做架構優化時,一般是往深入的本質進行挖掘;當我們面對一堆架構各異的小服務時,「架構優化」的含義其實是有一些不一樣的。大部分時候,我們並不需要(也沒有辦法)深入到小服務的最底層進行優化,而是去掉或者優化原來明顯不合理的地方就可以了。
在快速迭代的創業公司,我們可能不會針對某一個服務做很完善的架構設計和代碼實現,當出現各種問題時,也不會去追求極致的優化,而是以解決瓶頸問題為先。
即使我們經歷過一回將 snowball 拆分服務化的過程,但當我們重新上一個新的業務時,我們依然選擇將它做成一個大一統的服務。只是這一次,我們會提前定義好每個模塊的 service 介面,為以後可能的服務化鋪好路。
在創業公司里,重寫是不能接受的;大的重構,從時間和人力投入上看,一般也是無法承擔的。而「裱糊匠」式做法,哪裡有性能問題就加機器,加緩存,加資料庫,有可用性問題就加重試,加log,出故障就加流程,加測試,這也不是雪球團隊工作方式。我們一般都採用最小改動的方式,即,准確定義問題,定位問題根源,找到問題本質,制定最佳方案,以最小的改動代價,將問題解決到可接受的范圍內。
我們現在正在所有的地方強推3個數據指標:qps,p99,error rate。每個技術人員對自己負責的服務,一定要有最基本的數據指標意識。數字,是發現問題,定位根源,找到本質的最重要的依賴條件。沒有之一。
我們的原則:保持技術棧的一致性和簡單性,有節制的嘗試新技術,保持所有線上服務依賴的技術可控,簡單來說,能 hold 住。
能用cache的地方絕不用db,能非同步的地方,絕不同步。俗稱的:吃一塹,長一智。
特事特辦:業務在發展,需求在變化,實現方式也需要跟著變化。簡單的來說:遺留系統的優化,最佳方案就是砍需求,呵呵。