雙端無後源碼
A. XXL admin 源碼解析
xxl-job 的 admin 服務是 xxl-job 的調度中心,負責管理和調度注冊的 job,關於 xxl-job 的使用,可以閱讀 「參考閱讀」 中的《XXL-JOB分布式調度框架全面詳解》,這里主要是介紹 admin 中的源碼。
admin 服務除了管理頁面上的一些介面外,還有一些核心功能,比如:
1、根據 job 的配置,自動調度 job;
2、接收 executor 實例的請求,實現注冊和下線;
3、監視失敗的 job,進行重試;
4、結束一些異常的 job;
5、清理和統計日誌;
這些功能都是在 admin 服務啟動後,在後台自動運行的,下面將詳細介紹 admin 服務這些功能敏罩的實現。
XxlJobAdminConfig 是 admin 服務的配置類,在 admin 服務啟動時,它除了配置 admin 服務的一些參數外,還會啟動 admin 服務的所有後台線程。
該類的屬性主要分為5類:
1、配置文件中的參數,比如 accessToken;
2、DAO 層各個數據表的 mapper;
3、Spring 容器中的一些 Bean,比如 JobAlarmer、DataSource 等;
4、私有變數 XxlJobScheler 對象;
5、私有靜態變數 adminConfig,指向實例自身。
該類有兩個重要方法,分別實現自介面 InitializingBean、DisposableBean,作用如下:
這兩個方法分別調用了 XxlJobScheler 對象的 init 、 destroy 方法,源碼如下:
XxlJobAdminConfig 作為 admin 服務的配置類,作用就是在 Spring 容器啟動時,調用 XxlJobScheler 的初始化方法,來初始化和啟動 admin 服務的功能。
XxlJobScheler 的作用就是調用各個輔助類(xxxHelper)來啟動和結束不同的線程和功能,初始化方法 init 的代碼如下:
下面我們主要介紹 init 中各個類及其作用,最後再簡單一下介紹 destroy 的作用纖拿森。
當 admin 服務向 executor 實例發出一個調度請求來執行 job 時,會調用 XxlJobTrigger.trigger() 方法把要傳輸的參數(比如 job_id、jobHandler、job_log_id、阻塞策略等,包裝成 TriggerParam 對象)傳給 ExecutorBiz 對象來執行一次調度。
xxl-job 對調度過程做了兩個優化:
JobTriggerPoolHelper 在 toStart 方法中初始化了它的兩個線程池屬性,代碼如下:
每次有調度請求時,就會在這兩個線程池中創建線程,創建線程的邏輯在 addTrigger 方法中。
不同 job 存在執行時長的差異,為了避免不同耗時 job 之間相互阻塞,xxl-job 根據 job 的響應時間,對 job 進行了區分,主要體現在:
如果快 job 與調用頻繁的慢 job 在同一個線程池中創建線程,慢 job 會佔用大量的線程,導致快 job 線程不能及時運行,降低了線程池和線程的利用率。xxl-job 通過快慢隔離,避免了這個問題。
不能,因為慢 job 還是會佔用大量線程,搶佔了快 job 的線程資源;增加線程池中的線程數不但沒有提升利用率,還會導致大量線程看空閑,利用率反而降低了。最好的方法還是用兩個線程池把兩者隔離,可以合理地使用各自線程池的資源。
為了記錄慢 job 的超時次毀畝數,代碼中使用一個 map(變數 jobTimeoutCountMap )來記錄一分鍾內 job 超時次數,key 值是 job_id,value 是超時次數。在調用 XxlJobTrigger.trigger() 方法之前,會先判斷 map 中,該 job_id 的超時次數是否大於 10,如果大於10,就是使用 slowTriggerPool,代碼如下:
調用 XxlJobTrigger.trigger() 方法後,根據兩個值來更新 jobTimeoutCountMap 的值:
和上面的代碼相結合,一個 job 在一分鍾內有10次調用超過 500 毫秒,就認為該 job 是一個 頻繁調度且耗時的 job。
代碼如下:
在該類中,屬性變數 minTim 和 jobTimeoutCountMap 都使用 volatile 來修飾,保證了並發調用 addTrigger 時數據的一致性和可見性。
admin 服務發起 job 調度請求時,是在靜態方法 public static void trigger() 中調用靜態變數 private static JobTriggerPoolHelper helper 的 addTrigger 方法來發起請求的。minTim 和 jobTimeoutCountMap 雖然不是 static 修飾的,但可以看做是全局唯一的(因為持有它們的對象是全局唯一的),因此這兩個參數維護的是 admin 服務全局的調度時間和超時次數,為了避免記錄的數據量過大,需要每分鍾清空一次數據的操作。
admin 服務提供了介面給 executor 來注冊和下線,另外,當 executor 長時間(90秒)沒有發心跳時,要把 executor 自動下線。前一個功能通過暴露一個介面來接收請求,後一個功能需要開啟一個線程,定時更新過期 executor 的狀態。
xxl-job 為了提升 admin 服務的性能,在前一個功能的介面接收到 executor 的請求時,不是同步執行,而是在線程池中開啟一個線程,非同步執行 executor 的注冊和下線請求。
JobRegistryHelper 類就負責管理這個線程池和定時線程的。
線程池的定義和初始化代碼如下:
executor 實例在發起注冊和下線請求時,會調用 AdminBizImpl 類的對應方法,該類的方法如下:
可以看到,AdminBizImpl 類的兩個方法都是調用了 JobRegistryHelper 方法來實現,其中 JobRegistryHelper.registry 方法代碼如下(registryRemove 代碼與之相似):
這兩個方法是通過在線程池 registryOrRemoveThreadPool 中創建線程來非同步執行請求,然後把數據更新或新建到數據表 xxl_job_registry 中。
當 executor 注冊到 admin 服務後(數據入庫到 xxl_job_registry 表),是不會在頁面上顯示的,需要要用戶手動添加 job_group 數據(添加到 xxl_job_group 表),admin 服務會自動把用戶添加的 job_group 數據與 xxl_job_registry 數據關聯。這就需要 admin 定時從 xxl_job_group 表讀取數據,關聯 xxl_job_registry 表和 xxl_job_group 表的數據。
這個功能是與 「executor 自動下線」 功能在同一個線程中實現,該線程的主要邏輯是:
相關代碼如下:
從這里可以看出,如果是對外介面(接收請求等)的功能,使用線程池和非同步線程來實現;如果是一些自動任務,則是通過一個線程來定時執行。
如果一個 Job 調度後,沒有響應返回,需要定時重試。作為一種「自動執行」的任務,很顯然可以像前面 JobRegistryHelper 一樣,使用一個線程定時重試。
在這個類中,定義了一個監視線程,以每10 秒一次的頻率運行,對失敗的 job 進行重試。如果 job 剩餘的重試次數大於0,就會 job 進行重試,並把發送告警信息。線程的定義如下:
在這個線程中,它利用 「資料庫執行 UPDATE 語句時會加上互斥鎖」 的特性,使用了 「基於資料庫的分布式鎖」,代碼如下所示:
在這個語句中,會把 jobLog 的狀態設置為 -1,這是一個無效狀態值,當其他線程通過有效狀態值來搜索失敗記錄時,會略過該記錄,這樣該記錄就不會被其他線程重試,達到的分布式鎖的功能(這個鎖是一個行鎖)。或者說,-1狀態類似於 java 中的對象頭的鎖標志位,表明該記錄已經被加鎖了,其他線程會「忽略」該記錄。
在 try 代碼塊中加鎖和解鎖,如果加鎖後重試時拋出異常,會導致該記錄永遠無法解鎖。所以,應該在 finnally 塊中執行解鎖操作,或者使用 redis 給鎖加一個過期時間來實現分布式鎖。
從失敗的日誌中取出 jobId,查詢出對應的 jobInfo 數據,如果日誌中的剩餘重試次數大於 0,就執行重試。代碼如下:
調度任務使用的就是前面介紹的 JobTriggerPoolHelper.trigger 方法,最後更新 jobLog 的 alarm_status 值,有兩個作用:
這個類與 JobRegistryHelper 類似,都有一個線程池、一個線程,通過前面 JobRegistryHelper 的學習,可以大膽猜測:
實際上,該類中線程池和線程的作用就是用來 「完成」 一個 job。
當 executor 接收到 admin 的調度請求後,會非同步執行 job,並立刻返回一個回調。
admin 接受到回調後,和前面的 「注冊、下線」 一樣,在線程池中創建線程來處理回調,主要是更新 job 和日誌。
當有回調請求時, public callback 方法(該方法被 AdminBizImpl 調用)會在線程池中創建一個線程,遍歷回調請求的參數列表,依次處理回調參數,代碼如下:
從代碼可以看出,最後調用 XxlJobCompleter.updateHandleInfoAndFinish 方法完成回調邏輯。
如果一個 job 較長時間前被調度,但是一直處於 「運行中」 且它所屬的 executor 已經超過 90 秒沒有心跳了,那麼可以認為該 job 已經丟失了,需要把該 job 結束掉。這個就是線程 monitorThread 的主要功能。
monitorThread 會以 60秒 一次的頻率,從 xxl_job_log 表中找出 10分鍾前調度、仍處於」運行中「狀態、executor 已經下線 的 job,然後調用 XxlJobCompleter.updateHandleInfoAndFinish 來更新 handler 的信息和結束 job,代碼如下:
從代碼可以看出,上面的兩個功能最後都調用了 XxlJobCompleter.updateHandleInfoAndFinish 方法,關於該方法的介紹,可以看後面 XxlJobCompleter 部分的介紹,這里不詳細展開。
如果去看 XxlJobTrigger.triger 方法,會發現每次調度 job 時,都會先新增一個 jobLog 記錄,這也是為什麼 JobFailMonitorHelper 中的線程在重試時,先查詢 jobLog 的原因。
JobLog 作為 job 的調度記錄,還可以用來統計一段時間內 job 的調度次數、成功數等;另外,會清理超出有效期(配置的參數 logretentiondays )的日誌,避免日誌數據過大。很顯然,這又是一個 」自動任務「,可以使用一個線程定時完成。
該類持有一個線程變數,線程以 每分鍾一次的頻率,執行兩個操作:
在線程 run 方法的前半部分,線程會統計 3 天內,每天的調度次數、運行次數、成功運行數、失敗次數;然後更新或新增 xxl_job_log_report 表的數據。
在線程 run 方法的後半部分,線程按天對日誌進行清理,如果當前時間與上次清理的時間相隔超過一天,就會清理日誌記錄,代碼如下:
如果不使用參數 lastCleanLogTime 來記錄上次清理的時間,只是清理一天前創建的數據記錄。那麼該線程每分鍾執行一次時,都會刪除前天當前時刻的數據,導致前一年的數不完整。
使用參數 lastCleanLogTime 來記錄上次清理的時間,並且與當前時間相差超過一天時才清理,能保證前一天的日誌是完整的。
不明白為什麼清理日誌時,不是一次性刪除全部的過期日誌,而是每次刪除 1000條。按理說,這些舊的日誌數據應該已經不在 buffer pool 中了,trigger_time 欄位又是普通索引,那麼 DELETE 操作會先更新到 change buffer 中,之後再合並。現在先查詢再刪除,相當於多了一次 IO 且沒有使用到 change buffer。
admin 服務是用來管理和調度 job 的,用戶也可以在它的管理後台新建一個 job,配置 CRON 和 JobHandler,然後 admin 服務就會按照配置的參數來調度 job。很顯然,這種「自動化工作」也是由線程定時執行的。
1、如果使用線程調度 Job,存在的第一個問題是:如果某個 Job 在調度時比較耗時,就可能阻塞後續的 Job,導致後續 job 的執行有延遲,怎麼解決這個問題?
在前面 JobTriggerPoolHelper 我們已經知道,admin 在調度 job 時是 」使用線程池、線程「 非同步執行調度任務,避免了主線程的阻塞。
2、使用線程定時調度 job,存在的第二個問題是:怎麼保證 job 在指定的時間執行,而不會出現大量延遲?
admin 使用 」預讀「 的方式,提前讀取在未來一段時間內要執行的 job,提前取到內存中,並使用 「時間輪演算法」 按時間分組 job,把未來要執行的 job 下一個時間段執行。
3、還隱藏第三個問題:admin 服務是可以多實例部署的,在這種情況下該怎麼避免一個 job 被多個實例重復調度?
admin 把一張數據表作為 「分布式鎖」 來保證只有一個 admin 實例能執行 job 調度,又通過隨機 sleep 線程一段時間,來降低線程之間的競爭。
下面我們就通過代碼來了解 xxl-job 是怎麼解決上述問題的。
在該類中,定義了一個調度線程,用來調度要執行的 job 和已經過期一段時間的 job,定義代碼如下:
該線程會預讀出 「下次執行時間 <= now + 5000 毫秒內」 的部分 job,根據它們下一次執行時間劃分成三段,執行三種不同的邏輯。
1、下次執行時間在 (- , now - 5000) 范圍內
說明過期時間已經大於 5000 毫秒,這時如果過期策略要求調度,就調度一次。代碼如下:
2、下次執行時間在 [now - 5000, now) 范圍內
說明過期時間小於5000毫秒,只能算是延遲不能算是過期,直接調度一次,代碼如下:
如果 job 的下一次執行時間在 5000 毫秒以內,為了省下下次預讀的 IO 耗時,這里會記錄下 job id,等待後面的調度。
3、下次執行時間在 [now, now + 5000) 范圍內
說明還沒到執行時間,先記錄下 job id, 等待後面的調度 ,代碼如下:
上面的3個步驟結束後,會更新 jobInfo 的 trigger_last_time、trigger_next_time、trigger_status 欄位:
可以看到,通過預讀,一方面會把過期一小段時間的 job 執行一遍,另一方面會把未來一小段時間內要執行的 job 取出,保存進一個 map 對象 ringData 中,等待另一個線程調度。這樣就避免了某些 job 到了時間還沒執行。
因為 admin 是可以多實例部署的,所以在調度 job 時,需要考慮怎麼避免 job 被多次調度。
xxl-job 在前面 JobFailMonitorHelper 中遍歷失敗的 job 時,會對每個 job 設置一個無效的狀態作為 」分布式行鎖「,如果設置失敗就跳過。而在這里,如果還使用該方法,有可能出現,一個 job 被設置為無效狀態後,線程就崩潰了,導致該 job 永遠無法被調度。因此,要盡量避免對 job 狀態的修改。
在這里,admin 服務使用一張表 xxl_job_lock 作為分布式鎖,每個 admin 實例都要先嘗試獲取該表的鎖,獲取成功才能繼續執行;同時,為了降低不同實例之間的競爭,會在線程開始執勤隨機 sleep 一段時間。
如何獲取分布式鎖?
在線程中會開啟一個事務,設置為手動提交,然後對表 xxl_job_lock 執行 FOR UPDATE 查詢。如果該線程執行語句成功,其他實例的線程就會排隊等待該表的鎖,實現了分布式鎖功能。代碼如下:
怎麼降低鎖的競爭?
為了降低鎖競爭,在線程開始前會先 sleep 4000 5000 毫秒的隨機值(不能大於 5000 毫秒,5000 毫秒是預讀的時間范圍);在線程結束當前循環時,會根據耗時和是否有預讀數據,選擇不同的 sleep 策略:
代碼如下:
在前面的線程中,對即將要開始的 job,不是立刻調度,而是按照執行的時刻(秒),把 job id 保存進一個 map 中,然後由 ringThread 線程按時刻進行調度,這只典型的「時間輪演算法」。代碼如下:
每次輪詢調度時,只取出當前時刻(秒)、前一秒內的 job,不會去調度與現在相隔太久的 job。
在執行輪詢調度前,有一個時間在 0 1000 毫秒范圍內的 sleep。如果沒有這個 sleep,該線程會一直執行,而 ringData 中當前時刻(秒)的數據可能已經為空,會導致大量無效的操作;增加了這個 sleep 之後,可以避免這種無效的操作。之所以 sleep 時間在 1000 毫秒以內,是因為調度時刻最小精確到秒,一秒的 sleep 可以避免 job 的延遲。
因為在前面的 scheleThread 線程中,最後一個操作是把 job 的 next_trigger_time 值更新為大於 now + 5000 毫秒,其他 admin 實例 scheleThread 線程的查詢條件是:next_trigger_time < now + 5000,不會查詢出這里調度的 job,所以不需要加分布式鎖。
至此,XxlJobScheler-init 方法的作用我們介紹完畢,下面我們簡單介紹一下 XxlJobScheler-destroy 方法
destroy 方法很簡單,就是銷毀前面初始化的線程池和線程,它銷毀的順序與前面啟動的順序相反。
代碼如下:
因為各個 toStop 方法都很相似,所以我們只介紹 JobScheleHelper 的 toStop 方法。
該方法的步驟如下:
1、設置停止標志位為 true;
2、sleep 一段時間,讓出 CPU 時間片給線程執行任務;
3、如果線程不是終止狀態(線程正在 sleep),中斷它;
4、線程執行 join 方法,直到線程結束,執行最後一次。
代碼如下:
至此,JobScheleHelper 的主要功能就介紹完了,可以看出, admin 服務在啟動時,啟動了多個線程池和線程,非同步執行任務和非同步響應 executor 的請求。
下面,我們介紹前面涉及到的 XxlJobTrigger 和 XxlJobCompleter。
XxlJobTrigger 是調度 job 時的封裝類,它主要工作就是接受傳入的 jobId、調度參數等,查詢對應的 jobGroup、jobInfo,然後調用 ExecutorBiz 對象來執行調度(run 方法)。
該類中三個核心方法及其調用關系如下: trigger -> processTrigger -> runExecutor ,
該方法的功能比較簡單,就是根據傳入的參數查詢 jobGroup 和 jobInfo 對象,設置相關的欄位值,然後調用 processTrigger 方法。
該方法的主要工作分為以下幾步:
1、保存一條調度日誌;
2、從 jobInfo、jobGroup 中取出欄位值,構造 TriggerParam 對象;
3、根據 jobInfo 的路由策略,從 jobGroup 中取出要調度的 executor 地址;
4、調用 runExecutor 方法執行調度;
5、保存調度參數、設置調度信息、更新日誌。
這里不會修改 jobInfo、jobGroup 對象的欄位值,只取出欄位值來使用,對這兩個對象欄位的修改,是在前一步 trigger 方法中進行的。
該方法會執行調度,並返回調度結果,它的核心代碼如下:
這里使用 XxlJobScheler 類取出 ExecutorBiz 對象,以 「懶載入」 的方式給每個 address 創建一個 ExecutorBiz 對象,代碼如下:
可以看出,該類中的三個方法其實可以歸類為:pre -> execute -> post,在執行前、執行時、執行後做一些前置和收尾工作。
該類在前面 JobCompleteHelper 中被使用,最終 job 的完成就是在該類中執行的,該類有兩個主要方法:
下面主要介紹 finishJob 方法。
finishJob 的主要功能是:如果當前任務執行成功了,就調度它的所有子任務,最後把子任務的調度消息添加到當前 job 的日誌中。代碼如下:
需要注意的是:
1、這里依賴於 JobTriggerPoolHelper 來調度 job,所以在 JobCompleteHelper 的監視線程開始時,有一個 50 秒的等待,就是等待 JobTriggerPoolHelper 啟動完成;
2、在 finishJob 方法中,調度子任務的時候,默認子任務的調度結果是成功,注意,這里是指 「調度」 這個行為是成功的,而不是指子任務執行是成功的。
1、XxlJobAdminConfig 作為 admin 服務的啟動入口,要盡可能保持簡潔,作用類似於一個倉庫,來管理和持有所有的類和對象,並不會去啟動具體的線程,它只需要「按下啟動器的按鈕」就可以了;
2、XxlJobScheler 是 admin 服務的啟動器類,它會調用各個輔助類(xxxHelper)來啟動對應的線程;
3、對外的介面,比如調度 job、接收注冊或下線等,都是使用線程池 + 線程 的非同步方式實現,避免 job 對主線程的阻塞;
4、對「自動任務「類的功能,都是使用線程定時執行;
XXL-JOB分布式調度框架全面詳解: https://juejin.cn/post/6948397386926391333
時間輪演算法:https://spongecaptain.cool/post/widget/timingwheel
一個開源的時間輪演算法介紹:https://spongecaptain.cool/post/widget/timingwheel2
B. Kafka 源碼解析之 Topic 的新建/擴容/刪除
[TOC]
本篇接著講述 Controller 的功能方面的內容,在 Kafka 中,一個 Topic 的新建、擴容或者刪除都是由 Controller 來操作的,本篇文章也是主要聚焦在 Topic 的操作處理上(新建、擴容、刪除),實際上 Topic 的創建在 Kafka 源碼解析之 topic 創建過程(三) 中已經講述過了,本篇與前面不同的是,本篇主要是從 Controller 角度來講述,而且是把新建、擴容、刪除這三個 Topic 級別的操作放在一起做一個總結。
這里把 Topic 新建與擴容放在一起講解,主要是因為無論 Topic 是新建還是擴容,在 Kafka 內部其實都是 Partition 的新建,底層的實現機制是一樣的,Topic 的新建與擴容的整體流程如下圖所示:
Topic 新建與擴容觸發條件的不同如下所示:
下面開始詳細講述這兩種情況。
Topic 擴容
Kafka 提供了 Topic 擴容工具,假設一個 Topic(topic_test)只有一個 partition,這時候我們想把它擴容到兩個 Partition,可以通過下面兩個命令來實現:
這兩種方法的區別是:第二種方法直接指定了要擴容的 Partition 2 的副本需要分配到哪台機器上,這樣的話我們可以精確控制到哪些 Topic 放下哪些機器上。
無論是使用哪種方案,上面兩條命令產生的結果只有一個,將 Topic 各個 Partition 的副本寫入到 ZK 對應的節點上,這樣的話 /brokers/topics/topic_test 節點的內容就會發生變化, 監聽器就會被觸發 ,該監聽器的處理流程如下:
其 doHandleDataChange() 方法的處理流程如下:
下面我們看下 onNewPartitionCreation() 方法,其實現如下:
關於 Partition 的新建,總共分了以下四步:
經過上面幾個階段,一個 Partition 算是真正創建出來,可以正常進行讀寫工作了,當然上面只是講述了 Controller 端做的內容,Partition 副本所在節點對 LeaderAndIsr 請求會做更多的工作,這部分會在後面關於 LeaderAndIsr 請求的處理中只能夠詳細講述。
Topic 新建
Kafka 也提供了 Topic 創建的工具,假設我們要創建一個名叫 topic_test,Partition 數為2的 Topic,創建的命令如下:
跟前面的類似,方法二是可以精確控制新建 Topic 每個 Partition 副本所在位置,Topic 創建的本質上是在 /brokers/topics 下新建一個節點信息,並將 Topic 的分區詳情寫入進去,當 /brokers/topics 有了新增的 Topic 節點後,會觸發 TopicChangeListener 監聽器,其實現如下:
只要 /brokers/topics 下子節點信息有變化(topic 新增或者刪除),TopicChangeListener 都會被觸發,其 doHandleChildChange() 方法的處理流程如下:
接著看下 onNewTopicCreation() 方法實現
上述方法主要做了兩件事:
onNewPartitionCreation() 的實現在前面 Topic 擴容部分已經講述過,這里不再重復,最好參考前面流程圖來梳理 Topic 擴容和新建的整個過程。
Kafka Topic 刪除這部分的邏輯是一個單獨線程去做的,這個線程是在 Controller 啟動時初始化和啟動的。
TopicDeletionManager 初始化
TopicDeletionManager 啟動實現如下所示:
TopicDeletionManager 啟動時只是初始化了一個 DeleteTopicsThread 線程,並啟動該線程。TopicDeletionManager 這個類從名字上去看,它是 Topic 刪除的管理器,它是如何實現 Topic 刪除管理呢,這里先看下該類的幾個重要的成員變數:
前面一小節,簡單介紹了 TopicDeletionManager、DeleteTopicsThread 的啟動以及它們之間的關系,這里我們看下一個 Topic 被設置刪除後,其處理的整理流程,簡單做了一個小圖,如下所示:
這里先簡單講述上面的流程,當一個 Topic 設置為刪除後:
先看下 DeleteTopicsListener 的實現,如下:
其 doHandleChildChange() 的實現邏輯如下:
接下來,看下 Topic 刪除線程 DeleteTopicsThread 的實現,如下所示:
doWork() 方法處理邏輯如下:
先看下 onTopicDeletion() 方法,這是 Topic 最開始刪除時的實現,如下所示:
Topic 的刪除的真正實現方法還是在 startReplicaDeletion() 方法中,Topic 刪除時,會先調用 onPartitionDeletion() 方法刪除所有的 Partition,然後在 Partition 刪除時,執行 startReplicaDeletion() 方法刪除該 Partition 的副本,該方法的實現如下:
該方法的執行邏輯如下:
在將副本狀態從 OfflineReplica 轉移成 ReplicaDeletionStarted 時,會設置一個回調方法 (),該方法會將刪除成功的 Replica 設置為 ReplicaDeletionSuccessful 狀態,刪除失敗的 Replica 設置為 ReplicaDeletionIneligible 狀態(需要根據 StopReplica 請求處理的過程,看下哪些情況下 Replica 會刪除失敗,這個會在後面講解)。
下面看下這個方法 completeDeleteTopic(),當一個 Topic 的所有 Replica 都刪除成功時,即其狀態都在 ReplicaDeletionSuccessful 時,會調用這個方法,如下所示:
當一個 Topic 所有副本都刪除後,會進行如下處理:
至此,一個 Topic 算是真正刪除完成。
C. 網頁播放器源代碼 問題,,
<EMBED autostart="true" SRC="文件地址" width="500" height="300" loop="-1">
Realplay 的html播放器代碼
[code]
<object id="player" name="player" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="400" height="272">
<param name="_ExtentX" value="18415">
<param name="_ExtentY" value="9102">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="bt.rm">
<param name="CONTROLS" value="Imagewindow">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object><br>
<object ID="RP2" CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" WIDTH="400" HEIGHT="57">
<param name="_ExtentX" value="18415">
<param name="_ExtentY" value="1005">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="bt.rm">
<param name="CONTROLS" VALUE="ControlPanel,StatusBar">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object>
[/code]
===================================================================
===================================================================
RealPlayer
代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>RealMedia</title>
</head>
<body>
<p>RealMedia</p>
<p> <object id="RVOCX" classid="CLSID:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width="320" height="172">
<param name="SRC" value="realmedia.rm">
<param name="CONTROLS" value="ImageWindow">
<param name="CONSOLE" value="cons">
<embed autostart="true" src="realmedia.rm" type="audio/x-pn-realaudio-plugin" width="320" height="172" controls="ImageWindow" console="cons"> </embed>
<param name="autostart" value="true">
</object>
</p>
<p>
<object id=RVOCX classid="CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA" width="320" height="30" >
<param name="SRC" value="realmedia.rm">
<param name="CONTROLS" value="ControlPanel">
<param name="CONSOLE" value="cons">
<embed src="realmedia.rm" type="audio/x-pn-realaudio-plugin" width="320" height="30" controls="ControlPanel" console="cons" > </embed>
</object>& </p>
</body>
</html>
Windows Media Player
代碼:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Windows Media</title>
</head>
<body>
<p>Windows Media</p>
<p><object id="PlayerEx2" classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" width="320" height="217">
<param name="autoStart" value="true" />
<param name="URL" value="windowsmedia.wmv" />
<embed autostart="true" src="windowsmedia.wmv" type="video/x-ms-wmv" width="320" height="217" controls="ImageWindow" console="cons"> </embed>
</object>&</p>
</body>
</html>
======================================================================
======================================================================
15:08 2006-8-5 網友 nweisha 回復
<object classid=clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95 width=190 height=70>
<param name=showstatusbar value=1>
<param name=autostart value=false>
<param name=filename value=music/107442.wma>
<embed src=music/107442.wma width="190" height="70"></embed>
</object>
你可以改大點,這個是放無圖的wma,你可以改成wmp,尺寸自己改了。
======================================================================
======================================================================
15:30 2006-8-5
-- 通用播放器源代碼
演示地址:
www.51837.com/film/film.asp?url=http://www.51837.com/film/sz.rm&type=rm
由film.asp傳遞參數給play.asp文件並播放
play.asp源代碼如下:
<html>
<head>
<title>[視頻點播]</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../inc_file/51837.css" type="text/css">
</head>
<body leftmargin="0" topmargin="0" class="high" bgcolor="#337b49"><center>
<% if request("type")="rm" then%>
<object id="vid" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width=427 height=300>
<param name="_ExtentX" value="11298">
<param name="_ExtentY" value="7938">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="<%=request("url")%>">
<param name="CONTROLS" value="Imagewindow">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object><BR><object id="vid2" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width=427 height=30>
<param name="_ExtentX" value="11298">
<param name="_ExtentY" value="794">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="<%=request("url")%>">
<param name="CONTROLS" value="ControlPanel">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object>
</object><%else%>
<object id="MediaPlayer" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"
codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701
standby="Loading Microsoft? Windows Media? Player components..." type="application/x-oleobject" width=427 height=330>
<param name="URL" value="<%=request("url")%>">
<param name="UIMode" value="full">
<param name="AutoStart" value="true">
<param name="Enabled" value="true">
<param name="enableContextMenu" value="true">
</object><%end if%><font color=#ffffff>注意:如不能觀看者請下載 <a href="rp8-cn-setup.exe"><font color=#ffffff>RealPlayer V8.0</font></a> <a href="mpsetup_9x.exe"><font color=#ffffff>Windows Media Player V9.0</font></a></font></center></body></html>
======================================================================================================================================================================================================================================================================================
======================================================================================================================================================================================================================================================================================
15:37 2006-8-5
網頁背景音樂代碼:
將這段代碼插入到您的<head></head>之間
當您打開網站時即可聽到背景音樂:
<bgsound src=china.mid loop="-1">
這種當網頁最小化之後,音樂會消失
網頁背景音樂的代碼:
<embed src="http://XXX.com/XXX.mp3" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="1" height="1"></embed>
1.mid表示音效文件
<embed src="1.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="1" height="1"></embed>
上面的網頁背景音樂代碼可以加入FLASH動畫的絕對地址(或相對地址)
<embed width=1 height=1 autostart="true" loop="true" controls=PlayButton console=clip1 nolabels=true type="audio/x-pn-realaudio-plugin" src="1.ram"> </embed>
ram格式的音樂文件專用網頁背景音樂代碼:
<embed src="1.mid" align="center" border="0" width="1" height="1" width="100" autostart="true" loop="true">
指定播放器的大小(width、heigh)、是否自動(autostart標記)、是否循環播放(loop標記),而瀏覽者則可以自主地決定是否播放音樂。
此代碼可以當作網頁中插入FLASH動畫的代碼用。只要把1.mid替換為FLASH動畫的相對地址或決對地址就OK了。
<embed src="1.mp3" align="center" border="0" width="1" height="1" width="100" autostart="true" loop="true">
此代碼可以加mp3形式的音樂為網頁背景音樂
<EMBED src="http://XXX.com/XXX.mp3" width="0" height="0" border=0 autostart="ture" loop="ture"></EMBED>
1.mid表示音效文件
<bgsound src="1.mid" loop=3>
表示將1.mid音效文件插入到頁面為背景音樂,並循環播放3次。
<embed src="1.mid" hidden="true">
1.mid表示音效文件
<bgsound src="1.mid" loop="infinte">
1.mid表示音效文件
<embed src="1.mid" hidden="true" loop="true">
1.mid表示音效文件
<bgsound src=1.mid loop="-1">
1.mid表示音效文件
網頁音樂播放器代碼
rm文件在線播放
<embed height=25 src=www.xiake.com/biyun/ren/a.rm type=audio/x-pn-realaudio-plugin width=50 autostart="false" controls="PlayButton">
autostart="false" 打開頁面時處於候命狀態,autostart="true" 打開頁面時馬上聽聲音 height=25 width=50 有不同數值,播放器面板有些不同
midi、au、avi文件在線播放
<EMBED SRC="http://www.shunde.net.cn/~biyun/wlsd/wy/yinyue/H/1.mid"; width="47" height="24" AUTOSTART=TRUE>autostart="false" 打開頁面時處於候命狀態,autostart="true" 打開頁面時馬上聽聲音 height=25 width=50 有不同數值,播放器面板有些不同
asf文件在線播放
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
</head>
<body topmargin="0" leftmargin="0">
<object classid=clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=7.0 height=53 id=NSPlay0 name=NSPlay type=application/x-oleobject width=87 VIEWASTEXT standby="Loading Microsoft Windows Media Player components..." border="0"><param name="AudioStream" value="-1">
<param name="AutoSize" value="0">
<param name="AutoStart" value="1">
<param name="AnimationAtStart" value="-1">
<param name="AllowScan" value="-1">
<param name="AllowChangeDisplaySize" value="-1">
<param name="AutoRewind" value="0">
<param name="Balance" value="0">
<param name="BaseURL" value>
<param name="BufferingTime" value="10">
<param name="CaptioningID" value>
<param name="ClickToPlay" value="-1">
<param name="CursorType" value="0">
<param name="CurrentPosition" value="-1">
<param name="CurrentMarker" value="0">
<param name="DefaultFrame" value>
<param name="DisplayBackColor" value="0">
<param name="DisplayForeColor" value="65280">
<param name="DisplayMode" value="0">
<param name="DisplaySize" value="1">
<param name="Enabled" value="-1">
<param name="EnableContextMenu" value="-1">
<param name="EnablePositionControls" value="-1">
<param name="EnableFullScreenControls" value="-1">
<param name="EnableTracker" value="-1">
<param name="Filename" value="http://music.sdcatv.net/biyun/wlsd/down/yin/gequ/asf/5.asf";>
<param name="InvokeURLs" value="-1">
<param name="Language" value="-1">
<param name="Mute" value="0">
<param name="PlayCount" value="1">
<param name="PreviewMode" value="0">
<param name="Rate" value="1">
<param name="SAMILang" value>
<param name="SAMIstyle" value>
<param name="SAMIFileName" value>
<param name="SelectionStart" value="-1">
<param name="SelectionEnd" value="-1">
<param name="SendOpenStateChangeEvents" value="-1">
<param name="SendWarningEvents" value="-1">
<param name="SendErrorEvents" value="-1">
<param name="SendKeyboardEvents" value="0">
<param name="SendMouseClickEvents" value="0">
<param name="SendMouseMoveEvents" value="0">
<param name="SendPlayStateChangeEvents" value="-1">
<param name="ShowCaptioning" value="0">
<param name="ShowControls" value="-1">
<param name="ShowAudioControls" value="0">
<param name="ShowDisplay" value="0">
<param name="ShowGotoBar" value="0">
<param name="ShowPositionControls" value="-1">
<param name="ShowStatusBar" value="-1">
<param name="ShowTracker" value="-1">
<param name="TransparentAtStart" value="-1">
<param name="VideoBorderWidth" value="0">
<param name="VideoBorderColor" value="0">
<param name="VideoBorder3D" value="-1">
<param name="Volume" value="0">
<param name="WindowlessVideo" value="0">
</object>
其中<param name="AutoStart" value="0"> 0為打開頁面處於待命狀態,為1時打開頁面直接播放 </body>
</html>
流式收聽mp3方法:
http://*.mp3,http://*.mp3,http://...?a href="http://" target="_blank">http://*.mp3,
把上面的的文件另存為*.m3u,就可實現在線播放*.mp3(支持連續播放)
mpeg影象在線播放:
等等,讓它下載<img border="0" dynsrc="http://music.cnvnet.com/video/0321.mpeg ;
" start="fileopen">
rm影像在線播放 代碼:
<object id="vid" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width=114 height=100>
<param name="_ExtentX" value="3016">
<param name="_ExtentY" value="2646">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://music.cnvnet.com/mtv/20010618/002.ram";>
<param name="CONTROLS" value="Imagewindow">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object>
加幾個控制器
<object id="vid" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width=427 height=300>
<param name="_ExtentX" value="11298">
<param name="_ExtentY" value="7938">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://music.cnvnet.com/mtv/20010618/001.ram";>
<param name="CONTROLS" value="Imagewindow">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object> <object id="vid2" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" width=427 height=30>
<param name="_ExtentX" value="11298">
<param name="_ExtentY" value="794">
<param name="AUTOSTART" value="-1">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="-1">
<param name="SRC" value="http://music.cnvnet.com/mtv/20010618/001.ram";>
<param name="CONTROLS" value="ControlPanel">
<param name="CONSOLE" value="clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#000000">
</object>
<embed src="http://wmt2.aboutmedia.com.tw/Aboutmedia/warner/mtv/naying-021011_01v_120k.wmv"
autostart="true" loop="true" width="200" height="150" >
把這個網址http://wmt2.aboutmedia.com.tw/Aboutmedia/warner/mtv/naying-021011_01v_120k.wmv換成你要看的電影就行了
有圖像的rm格式:
<OBJECT classid='clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA' height=288 id=video1 width=305 VIEWASTEXT>
<param name='_ExtentX' value='5503'>
<param name='_ExtentY' value='1588'>
<param name='AUTOSTART' value='-1'>
<param name='SHUFFLE' value='0'>
<param name='PREFETCH' value='0'>
<param name='NOLABELS' value='0'>
<param name='SRC' value='http://media.ct.e.cn/ram/new/xiaoxin1.ram'>
<param name='CONTROLS' value='Imagewindow,StatusBar,ControlPanel'>
<param name='CONSOLE' value='RAPLAYER'>
<param name='LOOP' value='0'>
<param name='NUMLOOP' value='0'>
<param name='CENTER' value='0'>
<param name='MAINTAINASPECT' value='0'>
<param name='BACKGROUNDCOLOR' value='#000000'>
</OBJECT>
無圖像的rm格式:如相聲,歌曲。。。
<object ID='video2' WIDTH='300' HEIGHT='62' CLASSID='CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA'>
<param name='_ExtentX' value='9657'>
<param name='_ExtentY' value='847'>
<param name='AUTOSTART' value='-1'>
<param name='SHUFFLE' value='0'>
<param name='PREFETCH' value='0'>
<param name='NOLABELS' value='0'>
<param name='SRC' value='http://210.242.69.206/ramgen/broadcast/BCC/encoder/hipop.rm'>
<param name='CONTROLS' value='StatusBar,controlpanel'>
<param name='CONSOLE' value='Clip1'>
<param name='LOOP' value='0'>
<param name='NUMLOOP' value='0'>
<param name='CENTER' value='0'>
<param name='MAINTAINASPECT' value='0'>
<param name='BACKGROUNDCOLOR' value='#000000'>
</object>
最簡單的media格式的播放器。。自動識別有無圖像,但是版本是你機器的!
<embed src='mms://61.175.132.221/tv/mtv/f4/makeawish.wmv' width=200 height=200 autostart=true loop=true></embed>
有圖像的media播放器,自動調用網上的插件。
<object id=nstv classid='CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6' width=280 height=265 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject>
<param name='URL' value='http://202.99.11.42/xiangsheng/ymjr.wma'>
<PARAM NAME='UIMode' VALUE='full'><PARAM NAME='AutoStart' VALUE='true'>
<PARAM NAME='Enabled' VALUE='true'>
<PARAM NAME='enableContextMenu' VALUE='false'>
<param name='WindowlessVideo' VALUE='true'></object>
無圖像的media播放器。。。同上。
<object id=nstv classid='CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6' width=280 height=60 codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=Loading Microsoft? Windows Media? Player components... type=application/x-oleobject>
<param name='URL' value='http://202.99.11.42/xiangsheng/ymjr.wma'>
<PARAM NAME='UIMode' VALUE='full'><PARAM NAME='AutoStart' VALUE='true'>
<PARAM NAME='Enabled' VALUE='true'>
<PARAM NAME='enableContextMenu' VALUE='false'>
</object>
只是界面不同的media的調插件播放器。。建議不用這個,,你可以看!
D. 下了一個網站源碼,但沒有後台怎麼辦
一、正常情況下,如果註明是整站程序,一般包括後台,在網站的下載頁面或程序包中都沒有說明的,可以查看一下網站的文件夾,一般網站默認以admin文件夾作為後台文件夾。輸入網站域名/admin,一般可以打開後台目錄。
二、沒有後台,及相關程序文件夾,說明這個僅僅是頁面模板文件,需要和其他的網站內容管理系統進行整合,通常是使用開源系統來進行整合。
1)一般情況下,在下載頁的文件介紹中,都可能告訴你這個是什麼程序的網站源碼,如織夢、帝國等,就需要配合他們的網站內容管理程序來搭建網站。
2)純的HTML頁面代碼,這需要使用某一系統的標簽化語言進行改寫。將其變成改系統的模板頁面,就可以安裝調用出來。通常需要專業人士進行改寫。
三、有部分程序文件,不僅僅只是有模板頁面,那麼可能是網站程序不全。直接放棄掉吧。
E. 源碼是什麼意思啊
源碼指編寫的最原始程序的代碼。
用戶平時使用軟體時就是程序把「源碼」翻譯成我們可直觀的形式表現出來供用戶使用的。任何一個網站頁面,換成源碼就是一堆按一定格式書寫的文字和符號。
源碼主要功用
1、生成目標代碼,即計算機可以識別的代碼。
2、對軟體進行說明,即對軟體的編寫進行說明。為數不少的初學者,甚至少數有經驗的程序員都忽視軟體說明的編寫,因為這部分雖然不會在生成的程序中直接顯示,也不參與編譯。
但是說明對軟體的學習、分享、維護和軟體復用都有巨大的好處。因此,書寫軟體說明在業界被認為是能創造優秀程序的良好習慣,一些公司也硬性規定必須書寫。
(5)雙端無後源碼擴展閱讀:
計算機裡面運行的所有東西都是用程序編出來的,而編寫程序要用到計算機語言,用計算機語言直接編出來的程序就叫源碼,比如用VisualBasic編寫的源碼文件一般為.bas文件,而用C++編寫的一般為.cpp文件,源代碼不能直接運行,必須編譯後才能運行。源碼經過編譯處理後就可以直接在操作系統下運行了。
從字面意義上來講,源文件是指一個文件,指源代碼的集合.源代碼則是一組具有特定意義的可以實現特定功能的字元(程序開發代碼)。「源代碼」在大多數時候等於「源文件」。
F. 股市當中有哪些好用的指標,帶源碼的
指標不是萬能的,不是萬能鑰匙,靈丹妙葯,指標五花八門,林林總總,不計其數。每一類指標只能反映股票運行規律的一個側面。
我自以為是的適合自己的好用的主圖指標如下:
DRAWKLINE(H,O,L,C);
漲停1:=(C/REF(C,1))>=1.095 AND (C/REF(C,1))<=1.105;
STICKLINE(漲停1,O,C,4,0),COLORYELLOW;
漲停2:=(C/REF(C,1))>1.105 AND (C/REF(C,1))<=1.195;
STICKLINE(漲停2,O,C,4,0),COLORLIRED;
漲停3:=(C/REF(C,1))>1.195 ;
STICKLINE(漲停3,O,C,4,0),COLORMAGENTA;
EXPMA17:EXPMEMA(C,17)COLORMAGENTA LINETHICK2;
MA55:MA(C,55) COLORWHITE;
MA89:MA(C,89)COLORYELLOW ;
MA144:MA(C,144) COLORRED LINETHICK2;
CCL:=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,20))/MA(CLOSE,20);
DDL:=DMA(CLOSE,CCL);
上:=(1+7/100)*DDL,DOTLINE,COLORGREEN;
下:=(1-7/100)*DDL,DOTLINE,COLORGREEN;
中:=(上+下)/2,DOTLINE,COLORGREEN;
上上:=EMA(上,181),DOTLINE,COLORRED;
下下:=EMA(下,181),DOTLINE,COLORRED;
中中:=EMA(中,181),DOTLINE,COLORRED;
DRAWICON(上>=上上,上上,17);
主十增倉:10*WINNER(CLOSE*0.9)*8,NODRAW COLORYELLOW;
十換手:SUM(VOL/CAPITAL*100,10),NODRAW COLORWHITE;
ER:=V/FINANCE(7)*100;
MAXCYC:=DMA((C+O)/2,ER/TMA(ER,(1-ER),1));
T1T:=BARSLAST(C>MAXCYC*POW(1.1,0.9));
T2T:=BARSLAST(C<maxcyc*pow(1.1,-0.9)); p=""> </maxcyc*pow(1.1,-0.9));>
T3T:=CROSS(T1T,T2T) OR CROSS(T2T,T1T) OR BARSSINCE(T1T+1)=0 OR BARSSINCE(T2T+1)=0 OR BARSCOUNT(C)=0;
T4T:=REF(MAXCYC,BARSLAST(T3T));
主力盈利:LN(C/T4T)/LN(1.1)*10,NODRAW;
{盈利天:BARSLASTCOUNT(主力盈利>0) COLORMAGENTA,NODRAW;}
獲利比例:WINNER(CLOSE)*100,NODRAW;
DRAWICON(獲利比例>0 AND 獲利比例<=2,L*0.98,9);
DRAWICON(獲利比例>2 AND 獲利比例<=5,L*0.98,23);
P1:=90;
AO:=P1+(100-P1)/2;
BO:=(100-P1)/2;
CCO:=COST(AO);
DDO:=COST(BO);
籌碼集中度:(CCO-DDO)/(CCO+DDO)*100/2,COLORRED,NODRAW;
DRAWICON(獲利比例>80 AND 籌碼集中度<10,L*0.98,25);
翻倍:=REFDATE(REF(LLV(LOW,90),3),DATE)=LOW AND (CLOSE-LOW>0-CLOSE OR OPEN-LOW>CLOSE-OPEN);
STICKLINE(翻倍,H,H*1.2,2,0),COLORLIRED;
DRAWTEXT(翻倍,H*1.2,'機會來了'),COLORYELLOW;
DRAWTEXT(翻倍,H*1.15,'堅決持有'),COLORCYAN;
DRAWTEXT(翻倍,H*1.1,'後市暴漲'),COLORMAGENTA;
N:=1.5;
M:=3;
DIFF:=EMA((EMA(CLOSE,N*12)-EMA(CLOSE,N*26))/EMA(CLOSE,N*26)*1000,M);
DEAF:=EMA(DIFF,N*9),COLOR000088;
加倉:IF(DIFF>=REF(DIFF,1) AND DEAF<ref(deaf,1),diff,drawnull),colorlired,nodraw; p=""> </ref(deaf,1),diff,drawnull),colorlired,nodraw;>
短線出局:=IF(DIFF REF(DEAF,1),DIFF,DRAWNULL),NODRAW;
STICKLINE(加倉 ,C,C*1.0015,8,0),COLORYELLOW;
在告訴你答案之前,先簡短的講講我的經歷吧!十多年前,我是世界500強企業的一名職員。通過自學,考試後現在轉行為證券公司的一名投顧。在我轉行之前也是到處找資料學習。相關的書籍啊,指標啊等等,但掌握了一些基礎知識後發現即使學會了這些東西還是遠遠不能在這個市場上生存的。通過認真思考我發現,如果做投資沒有自己的交易體系,那是很危險的一件事。在自己的交易體系建立之前,我做過外匯,做過權證,做過商品期貨,做過期權,當然也有股票。現在從業了,所以也就只是做做股票的模擬盤。所以對於指標類的東西還是有所發言權的。言歸正傳,下面來回答一下你的問題吧!
1.如果你真的想在這個投資市場上暢意的行走,你首先應該建立自己的交易體系。
2.在你建立交易體系之後,我現在正式回答你的問題。正常情況下,你只需要認真研究系統默認的幾個指標就可以了,K線,均線,量,KDJ,MACD就這幾個,其它雜亂的指標都是通過這幾個基礎指標編輯演變而成的,因為是手機截圖,所以這里截了兩個圖,如果需要操盤,建議最好是用電腦。
3.K線,K線就是紅綠柱,他代表最高價,最低價,開盤價和收盤價。在這里我就不詳細贅述了。
4.均線,均線分日,月,周,季,年均線等。那要看你是什麼周期,比如日均線m5就是五天內的平均價,也就是五日均線。M10就是十天均線等等。
5.量,量就比較復雜一點,常常需要配合其他指標使用,它代表成交量或成交額。周期也是和均線一樣。
6.MACD和KDJ,同樣需要結合周期來使用,最常見的就是金叉和死叉,但是也需要結合市場環境來看。
給大家一個去掉不適合自己參與的過濾選股器吧,懂代碼的可以自己修改,不懂得那就直接用,有幾個參數最好自己做一下修改,比如,股價,交易密度,等等。
它的功能是選出適合自己的帶有漲停板的活躍股,他不是操作的依據,只是幫你過濾掉那些不適合參與的股票,每天盤後下載數據,復盤選股,他不適合最預警,只適合復盤高效選股。
僅供參考(通達信使用者)
公式名稱:去掉無效選股
參數:N=2:2000:60(周期數)
N1=1:200:3(漲停板個數)
SS=2:2000:50(股價)
NN=2:30:15(交易密度)
ENTERLONG:=CROSS(MA(CLOSE,5),MA(CLOSE,20));{這是一個均線自動交易代碼暫時先保存著以備後用}
EXITLONG:=CROSS(MA(CLOSE,5),MA(CLOSE,3));{這是一個均線自動交易代碼暫時先保存著以備後用}
ZTTJ1:=(CLOSE>=ZTPRICE(REF(CLOSE,1),0.1));
ZTTJ:=(CLOSE>=ZTPRICE(REF(CLOSE,1),IF(FINANCE(3)=3,0.2,0.1)));
ZTTM:=COUNT(ZTTJ,N)>=N1;
AR2:=EVERY(ZTTJ,2);
AR3:=COUNT(AR2,60)>=1;
RZ1:=INBLOCK('殼資源')=0; RZ2:=INBLOCK('商譽減值')=0; RZ4:=INBLOCK('風險品種')=0;
RZ6:=INBLOCK('細分龍頭')=1; RZ7:=INBLOCK('已高送轉')=0;
{通達信去掉創業板*ST} S1:=IF(CODELIKE(馄'),1,0);
{通達信去掉退市股}{去掉不需要的板塊}{通達信去掉*、S、ST}
S2:=IF(NAMELIKE('S'),0,1); S3:=IF(NAMELIKE('*'),0,1);
{通達信去掉停牌}
S4:=DYNAINFO(17)>0;
S5:= BETWEEN(FINANCE(7)/10000000,1,400) AND FINANCE(7)*C/100000000<360 AND C<ss p="" ;
{去掉融券融資 AND S6}
S6:=FINANCE(52)=0;
S7:=IF(CODELIKE(鬈'),0,1);{通達信去掉科創板}
S10:=FINANCE(30)>=-5;
S12:=DYNAINFO(39)<500;
S13:=SUM(DYNAINFO(37),20)>0.2;
S14:=FINANCE(30)/FINANCE(20)*100>-50;
ST:S2 AND S3 AND S4 AND S7 AND RZ4 AND S13 AND ZTTM AND C<ss;{and p="" s1}
AA1:=C/REF(C,1)>1.03 AND C<ss p="" s7;{強勢選股}
AB1:=FROMOPEN*NN;
AB2:=DYNAINFO(50)>AB1;
S11:=IF(AB2,AA1,DRAWNULL);
大家好,給大家分享一個監測莊家動向的指標——獵庄擒牛。指標通過對莊家資金的監測,可以捕捉到莊家何時進場拉升,何時出貨離場。洞察到莊家的這些動向之後,散戶獵庄擒牛並不只是說說而已。
「獵庄擒牛」指標要點:
一、指標提示「莊家出現」信號時,表明監測到此處有莊家大資金進場,行情即將開啟拉升,可跟進建倉。
二、指標提示「莊家出貨」信號時,表明監測到此處莊家在進行籌碼派發,應果斷止盈離場,落袋為安。
效果圖:
「獵庄擒牛」主要作用就是對莊家大資金動向的監測,從而給出預警信號。當然指標還有其它關於籌碼和趨勢的信號判斷,這里就不做過多講解,大家拿到後可以去慢慢摸索。
大道至簡,簡單有效不要復雜。股市中最有效的技術指標就是那些最貼近市場本質的數據跟蹤指標,我最常用的就是K線,均線,MACD和量能及均量線,夠用了。
在一個多變復雜的市場中,越簡單反而才是越有效,過於復雜的技術工具適應能力太差。
通達信精準指標——趨勢布林線主圖+神針起爆副圖+源碼 給大家分享一個趨勢布林線主圖,搭配神針起爆副圖,適用於短線和中長線,是基於系統布林線而研發的,比系統自帶的更加精準。 主圖當出現紅色箭頭為建倉信號,當出現綠色箭頭為減倉或者平倉信號。 副圖紅色趨勢為上升趨勢,綠色趨勢為下跌趨勢,紅色趨勢變為綠色交叉點為減倉信號。 綠色趨勢變為紅色為建倉信號,出現神針起爆紅柱可作為啟動點和建倉點。
主副圖點位一一對應,產生共振。 源碼
這套指標主要利用主副圖共振點來進行操作,精準率很高,喜歡的朋友可以關注我的首頁,留言指標二字,我會免費分享給大家。
好用的公式有很多,但是適合自己才行!今天我分享幾個我自己經常用的公式分享給大家!
擒牛大中短
這個公式主要就是抓買賣點的指標,不含未來函數,可以放心操作!
主力波段吸籌該公式是精準判斷操作位置,依然沒有未來函數!
其次,如果大家想炒股,先學習一些基本的炒股知識,並且少量投入,切不可一梭哈。不要迷信技術指標,所謂的指標都是事後才出來的,有精力的可以去看看指標編程,無非都出自於成交量、成交額、均線等等,所以都是滯後的。簡單的K線、成交量、2條均線,輔助參考判斷即可。技術指標越復雜,越難以付諸實施。
所以,還請大家不要迷戀技術指標,我曾經花了1年多的時間研究、編寫各種技術指標,到現在,我已經放棄了,只留了交易軟體裡面最原始的指標,做輔助判斷而已,記住只是輔助判斷。還請大家不要走彎路,一入股市深似海,到處都是坑,切記!!!
這個我認為因人而異,畢竟適合自己的指標才是好指標。這里我們來分享下我常用的指標
第一,均線,均線是時候非常實用的指標,無論是短線,中線,長線都非常實用。
(1)如果是短線,5日均線就夠了。5日均線比較神奇。
①當K線從5日均線下方上穿5日均線,而且均線開始拐頭,結合量能,底部放量,那麼短線就可以把我了,而且是超短機會。基本都有不錯的收益。
②當市場均線多頭排列,只要K線在5日均線上方,沿著5日均線上行,那麼也是一個持倉的機會。
(2)中線,中線一般就是看20日均線,這個均線比較實用,也稱為萬能均線,只要K線站穩在20日均線上方,而且拐頭向上,結合籌碼,籌碼低位單峰,中線就可以把握。
(3)長線,長線就是60日均線上穿120日均線,而且趨勢上行。
第二,MACD,領略到精髓,賺錢非常簡單。
1、 MACD在0軸上方——每發生一次金叉,股價將創新高,但是二次金叉不要追。2、 MACD在0軸下方——每發生一次死叉,股價將創新低新低後可以適當的補倉。3, MACD在0軸上方——金叉死叉次數越多越好、牛股,4,, MACD在0軸下方——金叉死叉次數越多越差、熊股。5,MACD水下兩次金叉,第二次金叉就是買入機會。6.MACD的黃白兩線不能和柱狀形成背離,背離則會產生行情反轉。
好了我就分享了我常用的這兩個希望對大家有幫助。
如果想聽實話,我就告訴你。最好用的指標是:K線、成交量(手)、均線和MACD。其它指標都可以忽略。
你進入叢林,容易繞花眼睛,七選八選-選個漏眼。其實最顯眼的就是最好的。