admin
2025-04-08 70b51a2636858fb8cfbf39d3764d88d07286d8ad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
B
èS‡g®’ã@søddlmZmZmZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl mZddl mZddlmZddl mZmZeƒZe ¡Zede›ƒdd    „ZeƒGd
d „d ƒZeƒZd d „Zdd„Zdd„Zdd„ZGdd„dƒZdS)é)Úprint_functionÚabsolute_importÚunicode_literalsN)Ú
data_cache)Ú basic_methods)Ú
get_logger)Úhx_qc_value_utilÚtooluall_K_line开始运行--cCsdS)N©r
r
r
õ5D:\量化低吸\low_suction_hx\strategy\all_K_line.pyÚ    init_data sr c@s4eZdZiZdd„Zdd„Zdd„Zedd„ƒZd    S)
Ú KLineHistorycCsdS)Nr
)Úselfr
r
r Ú__init__,szKLineHistory.__init__cCs||_||_||_dS)N)Ú
today_dateÚNext_trading_dayÚsymbols)rrrrr
r
r Úinit/szKLineHistory.initcCsÀt |jd¡}tt ¡ dd¡ƒtdƒkr6t ¡j    }n
t ¡j}i}xv|j
D]l}|dd…}t ƒ  ||¡}|s°t j|dd…d|d}|r°t ƒ |dd…|dd d    ¡|¡|||<qLW|S)
NéZú:ÚZ160000iúÿÿÿ)Úend_daterÚbobz%Y-%m-%d)rÚpre_num_trading_dayrÚintr    Úget_now_time_strÚreplacerÚ    DataCacheÚpre_trading_dayrÚHistoryKDataManagerÚget_history_barsrÚget_history_k_barsÚsave_history_barsÚstrftime)rZstart_time_datarZ$all_symbol_K_line_history_90day_dictÚsymbolÚcodeZk_barsr
r
r Úk_line_history_90day6s  
    z!KLineHistory.k_line_history_90daycsL    d}d}d}d}d}g}d}d}    g}
g} t ¡j |¡} | ˆdd<x>tdtˆƒdƒD]&} ˆ| dd}ˆ| dd}tˆ| ddƒ}tˆ| ddƒ}tˆ| ddƒ}tˆ| d    dƒ}t |¡}t    |ƒ}t 
|¡}t    |ƒ}ˆ| d
}ˆ| dd
}t  ||¡}|ˆ| d <t|||dƒ}|ˆ| d <tt d d„ˆDƒƒdƒ}t ttˆƒƒ‡fdd„d}tt dd„ˆDƒƒdƒ}t ttˆƒƒ‡fdd„d}t||ddƒ}|||||dœ}ˆd |¡dˆ| d krödks
n| ˆ| d¡||krtdˆdd<d|kr8dkr€nnDtˆƒdkr€|tˆdddƒdkr€||dkr€dˆdd<d|kr˜dkrànnDtˆƒdkrà|tˆdddƒdkrà||dkràd ˆdd<d|krødkr@nnDtˆƒdkr@|tˆdddƒd!kr@||dkr@d"ˆdd<|dkrtˆƒdkr||dkrd#ˆdd<nd$ˆdd<d|kr˜dkrÒnn6tˆƒdkrÒ|tˆdddƒd%krÒd&ˆdd<|dkrtˆƒdkr||d!krd'ˆdd<dˆ| d kr$d(krnnê| d)kr||d!kr|dkrN| }    |d7}|d*kr|
rx|
d+d|    krd,ˆ| dˆ|    d    kr¤d-krnnh|
 |    | f¡tˆ| dˆ|    d    ddƒ}|  ˆ|    d d.¡ˆ| d d.¡|f¡| ˆdd/<nd}d}    |dkrÌd}t||dƒd%krz|dkrTd0ˆ| d1<n$|dkrld2ˆ| d1<n d3ˆ| d1<nPt||dƒd4kr|dkr¦d5ˆ| d1<n$|dkr¾d6ˆ| d1<n d7ˆ| d1<n<|dkräd8ˆ| d1<n$|dkrüd9ˆ| d1<n d:ˆ| d1<||dkr@||dkr2d;ˆ| d<<n d=ˆ| d<<n(||dkr\d>ˆ| d<<n d?ˆ| d<<t||ƒd@krt||ƒd@krt||ƒd@kr¾t||ƒdkr¾dAˆ| d<<n^t||ƒdkrÞdBˆ| d<<n>t||ƒd@krt||ƒdkrdCˆ| d<<n dDˆ| d<<t||ƒd@krDt||ƒkrännœt||ƒd@krädEˆ| d<<t||ƒd@kr†dFˆ| d<<n^t||ƒdkr¦dGˆ| d<<n>t||ƒdkrØt||ƒdkrØdHˆ| d<<n dIˆ| d<<t||ƒd@krZt||ƒd@krft||ƒd@kr&dJˆ| d<<n>t||ƒd@krXt||ƒdkrXdKˆ| d<<n dLˆ| d<<qZt||ƒd@krZdMˆ| d<<qZWt|ƒdk    rHdNˆddO<||dPkrêdQ|tˆdddƒkrØdRk    rHnn dSˆddO<n^||k    r|dk    rtˆƒdTk    rdUˆddO<n.||k    rH|dk    rHtˆƒdTk    rHdVˆddO<dS)WNg{®Gáz„?rÚsec_nameéÚcloseÚhighÚopenéÚlowÚvolumeÚ today_growthZtoday_amplitudecss|]}|dVqdS)r*Nr
)Ú.0Úir
r
r ú    <genexpr>|sz7KLineHistory.get_property_limit_mark.<locals>.<genexpr>cs ˆ|dS)Nr*r
)Úii)Ú    it_K_liner
r Ú<lambda>}óz6KLineHistory.get_property_limit_mark.<locals>.<lambda>)Úkeycss|]}|dVqdS)r-Nr
)r0r1r
r
r r2~scs ˆ|dS)Nr-r
)r3)r4r
r r5r6)Úhistorical_high_priceÚhistorical_high_price_indexÚhistorical_low_priceÚhistorical_low_price_indexÚhistorical_average_priceéüÿÿÿérZlow_price_aheadÚ risk_positionéréÚ recent_monster_second_break_riskg¸…ëQ¸ò?gÍÌÌÌÌÌü?Úrecent_second_break_riskgø?Ú+recent_second_break_near_high_position_riskÚrecent_high_position_riskZhigh_price_aheadgš™™™™™ñ?Zrecent_second_crash_riskZrecent_low_position_riskgš™™™™™™?é<ééÿÿÿÿg\Âõ(\ï?gR¸…ëQð?z%Y-%m-%d %H:%M:%SZ)rise_and_fall_is_small_start_and_end_dateZ increases_upÚtoday_volume_shapeÚincreases_downZincreases_balancegÍÌÌÌÌÌì?Z decreases_upZdecreases_downZdecreases_balanceZ remained_upZ remained_downZremained_balanceZup_upÚ    attributeZup_downZdown_upÚ    down_downgü©ñÒMbP?Úone_line_limit_upÚlimit_down_then_limit_upÚ&limit_up_then_limit_down_then_limit_upÚlimit_upÚ frying_plateÚfirst_frying_plateÚ#one_line_limit_up_then_frying_plateÚ3one_line_limit_up_then_frying_plate_then_limit_downÚnot_first_frying_plateÚlimit_up_then_limit_downÚone_line_limit_downÚ
limit_downÚtouch_limit_downZlow_amplitude_oscillationZlong_term_amplitudegffffffò?g®Gáz®ï?gq=
×£pñ?Z(low_amplitude_oscillation_remains_stableéXZ"low_amplitude_oscillation_and_riseZ%low_amplitude_oscillation_and_decline)rrÚcode_name_dictÚgetÚrangeÚlenÚroundrÚlimit_up_priceÚfloatÚlimit_down_priceÚintraday_growthÚmaxÚminÚupdateÚappendr#Úabs)r4r$r8r:r;r9r<Zlarge_amplitude_dayZ current_countÚstartÚresultsZ
dates_listr'r1Zprevious_closeZ previous_highÚ current_openZ current_closeÚ current_highÚ current_lowr`rbZcurrent_today_volumeZcurrent_yesterday_volumeZcurrent_today_growthZcurrent_today_amplitudeZnew_propertiesZaverage_consensus_pricer
)r4r Úget_property_limit_markWs& 
 
    "
     * * *  *  .
 
0"
 
 
 
 
 
 
  $$$ . $ $ .
 
z$KLineHistory.get_property_limit_markN)    Ú__name__Ú
__module__Ú __qualname__Úall_stocks_base_K_line_dictrrr&Ú staticmethodrnr
r
r
r r (s
!r c
 
sît ¡}i}xPt ¡jD]B}||}t |¡}t|ƒ}|s<qt ||¡||i}|     |¡qW‡fdd„‰y<t
j ˆ|ƒddd}t dddd    }|  |¡WdQRXWn0tk
rÖ}    ztd
|    ›ƒWdd}    ~    XYnXtd t ¡›ƒdS) NcsZt|tjƒr| d¡St|tƒr6‡fdd„| ¡DƒSt|tƒrR‡fdd„|DƒS|SdS)Nz%Y-%m-%d %H:%M:%Scsi|]\}}ˆ|ƒ|“qSr
r
)r0ÚkÚv)Úconvert_datetimer
r ú
<dictcomp>qszNall_stocks_all_k_line_dict_write.<locals>.convert_datetime.<locals>.<dictcomp>csg|] }ˆ|ƒ‘qSr
r
)r0Úelement)rvr
r ú
<listcomp>sszNall_stocks_all_k_line_dict_write.<locals>.convert_datetime.<locals>.<listcomp>)Ú
isinstanceÚdatetimer#ÚdictÚitemsÚlist)Úobj)rvr
r rvms 
 
 
z:all_stocks_all_k_line_dict_write.<locals>.convert_datetimeFr>)Ú ensure_asciiÚindentz;local_storage_data/all_stocks_all_K_line_property_dict.jsonÚwzutf-8)Úencodingz5An error occurred while converting the data to JSON: u历史k线写完了!)Úk_line_historyr&rrÚfiltered_stocksÚcopyÚdeepcopyr~rnrfÚjsonÚdumpsr+ÚwriteÚ    ExceptionÚprintr    r)
rrÚ#all_stocks_all_K_line_property_dictr1Zi_k_lineZ i_k_line_copyZit_K_line_reversedZsymbol_K_line_property_dictÚ    json_dataÚfÚerrorr
)rvr Ú all_stocks_all_k_line_dict_write[s&
   r‘cCs”xŽtj ¡D]€\}}d|dkrj|tjkrŒ|ddtjkrŒt d|›d|dd›d¡tj |¡q t d|dd›d|d›¡q WdS)    NrKru=在K线中昨日涨停,但是在开盘啦中没有,key===u       å…¬å¸åç§°===r'ú u!K线中缺失昨日属性键值  z :values[0]===)    rrr}Úyesterday_limit_up_code_listÚ limit_up_typeÚloggerÚinfoÚ'yesterday_frying_plate_last_minute_listrg)r7Úvaluesr
r
r Úcheck_limit_up_attribute…s   r™c
Csސx֐z®yjtj ¡ d¡}dd„}tj|ks:|tjkrr|tjkrâ|t ¡jƒ}|dkrn|tj    kràt
dƒnrt
dtj ddd    dd
…›d t ¡j›d ƒt ƒt d ddd&}t |¡t_ t
dttj ƒ›ƒWdQRXn|tjjƒ}|dkrt
dƒnpt
dtj ddd    dd
…›dtjj›d ƒt ƒt d ddd&}t |¡t_ t
dttj ƒ›ƒWdQRXWn<tk
r°}zt |¡t
d|›ƒWdd}~XYnXWdtj ¡}| d¡}t d¡XqWdS)Nz%H:%M:%ScSs*tjddddd…|kr&d}|SdS)Nz SZSE.000034rré
T)rr)Ú target_dateZdata_date_and_target_dater
r
r Úcheck_data_date§sz1check_time_and_data_date.<locals>.check_data_dateTuæœªåˆ°ã€18:31】 ä½† æ—¢æœ‰æ•°æ® ã€æ˜¯ã€‘ ä¸Šä¸ªäº¤æ˜“日数据 ã€ä¸æ‰§è¡Œæ‹‰å–K线】  Îµ=ε=ε=ε=ε=ε=ε=ε=ε=ε=ε=ε=ε(/’-‘)/up未到【18:31】 ä¸” æ—¢æœ‰æ•°æ® ã€ä¸æ˜¯ã€‘ ä¸Šä¸ªäº¤æ˜“日数据 æ‰§è¡Œæ‹‰å–K线  ã€æ—¢æœ‰æ•°æ®æ—¥æœŸï¼šz SZSE.000034rrršu ä¸Šä¸ªäº¤æ˜“日:u】z;local_storage_data/all_stocks_all_K_line_property_dict.jsonÚrzutf-8)rƒu7data_cache.all_stocks_all_K_line_property_dict的个数uŒåˆ°äº†ã€18:31】 ä½† æ—¢æœ‰æ•°æ® ã€æ˜¯ã€‘ æœ¬äº¤æ˜“日数据 ã€ä¸æ‰§è¡Œæ‹‰å–K线】  Îµ=ε=ε=ε=ε=ε=ε=ε=ε=ε=ε=ε=ε(/’-‘)/um到了【18:31】 ä¸” æ—¢æœ‰æ•°æ® ã€ä¸æ˜¯ã€‘ æœ¬äº¤æ˜“日数据 æ‰§è¡Œæ‹‰å–K线  ã€æ—¢æœ‰æ•°æ®æ—¥æœŸï¼šu æœ¬äº¤æ˜“日:u;实时检测是否拉取K线线程报错An error occurred: r()r{Únowr#rÚ opening_timeÚ closing_timeÚupdate_data_timerrÚchecking_data_timerŒrr‘r+rˆÚloadr^rr‹ÚloggingÚ    exceptionÚtimeÚsleep)Únow_timerœZcheck_pre_trading_dayrZcheck_today_daterÚ current_timeZformatted_timer
r
r Úcheck_time_and_data_date•sJ
 
0
 
.
  
$
 
rªcCsVd}xL|D]D}d|kr
|ddksF|ddksF|ddksF|ddkr
|d7}q
W|S)NrrKrMrNrOrPr(r
)Ú k_line_dataÚ limit_up_dayr1r
r
r Úcount_limit_up_dayés
 r­csfeZdZdZdZiZ‡fdd„Zedd„ƒZdd„Z    d    d
„Z
dd d „Z dd„Z dd„Z dd„Z‡ZS)rNrcs.|js(tt|ƒj|f|ž|Ž|_| ¡|jS)N)Ú_HistoryKDataManager__instanceÚsuperrÚ__new__Ú_HistoryKDataManager__load_data)ÚclsÚargsÚkwargs)Ú    __class__r
r r°szHistoryKDataManager.__new__cCsdS)Nr
)r²r
r
r Z __load_dataszHistoryKDataManager.__load_datacCs(t ¡›d}tj |¡s$t |¡|S)u5
        èŽ·å–ç¼“å­˜è·¯å¾„
        @return:
        z /datas/k_bars)ÚconstantÚget_path_prefixÚosÚpathÚexistsÚmakedirs)rÚdir_pathr
r
r Z__get_cache_dir
s 
z#HistoryKDataManager.__get_cache_dirc Cs°| ¡}g}x`t |¡D]R\}}}xF|D]>}| |¡dkr<q(tj ||¡}| d¡d}    | |    |f¡q(WqW|r¬|jdd„dd|dd…}x|D]}
t     |
d¡q–WdS)NrÚ_cSst|d dd¡ƒS)Nrú-r)rr)Úxr
r
r r5!r6z9HistoryKDataManager.__del_outdate_datas.<locals>.<lambda>T)r7Úreverser()
Ú#_HistoryKDataManager__get_cache_dirr¸ÚwalkÚfindr¹ÚjoinÚsplitrgÚsortÚremove) rr%r¼ÚdatasÚrootÚdirsÚfilesÚfileÚpath_ÚdayÚdr
r
r Z__del_outdate_datass
 
z'HistoryKDataManager.__del_outdate_datasFc     Csì| ¡}|›d|›d}|›d|›}tj |¡r:|s:dS||jkrNi|j|<|rÞ||j||<g}xR|D]J}    t |    ¡}
x0|
D](} t|
| ƒtjkr~|
|      d¡|
| <q~W| 
|
¡qjWt |ddd} |   |›¡WdQRX|  |¡dS)    u½
        ä¿å­˜åŽ†å²K线
        @param code: ä»£ç 
        @param day: K线最新的日期(取datas最新一条数据的日期)
        @param datas: æ•°æ®
        @return:
        r½z.txtú/Nz%Y-%m-%d %H:%M:%Szutf-8r‚)rƒÚmode)rÁr¸r¹rºÚ)_HistoryKDataManager__history_k_day_datasr†r‡Útyper{r#rgr+rŠÚ'_HistoryKDataManager__del_outdate_datas) rr%rÎrÈÚforceÚ    cache_dirÚ    file_nameÚpath_strÚfdatasrÏÚddrtrr
r
r r"&s&
 
 
 
 
z%HistoryKDataManager.save_history_barsc     Cs
||jkr&||j|kr&|j||S| ¡}|›d|›d}|›d|›}tj |¡s\dSt|ddd–}| ¡}|rüt|ƒ}xv|D]n}    xh|    D]`}
t|    |
ƒt    kr|    |
d¡d    kr|    |
d
¡d    kr|    |
d ¡d    krt j   |    |
d ¡|    |
<qWq†W|SWdQRXdS) u\
        èŽ·å–åŽ†å²K线
        @param code:
        @param day:
        @return:
        r½z.txtrÐNzutf-8r)rƒrÑr¾rrr’z%Y-%m-%d %H:%M:%S) rÒrÁr¸r¹rºr+ÚreadlineÚevalrÓÚstrrÃr{Ústrptime) rr%rÎrÖr×rØrÚlinerÈrÏrtr
r
r r Cs" 
 
Fz$HistoryKDataManager.get_history_barscCs2||jkr.||j|kr.|j||ddSdS)ud
        èŽ·å–ä¹‹å‰çš„æ”¶ç›˜ä»·
        @param code:
        @param day:
        @return:
        rr)N)rÒ)rr%rÎr
r
r Ú get_pre_close]sz!HistoryKDataManager.get_pre_closecCsd| ¡}tƒ}xPt |¡D]B\}}}x6|D].}| |¡dkr*| | d¡ddd…¡q*WqW|S)uo
        èŽ·å–æŸä¸€å¤©çš„åŽ†å²K线的代码数据
        @param day:
        @return: ä»£ç é›†åˆ
        rr½r(Né)rÁÚsetr¸rÂrÃÚaddrÅ)rrÎr¼ÚcodesrÉrÊrËrÌr
r
r Úget_history_bars_codeshs
$z*HistoryKDataManager.get_history_bars_codes)F)rorprqr®Z_HistoryKDataManager__dbrÒr°Ú classmethodr±rÁrÔr"r ràråÚ __classcell__r
r
)rµr rûs  
 
 r)Ú
__future__rrrr†r¤r¸r¦r{rˆr¶Úutils.juejin_apiÚutilsÚstrategyrrÚstrategy.logging_configrrr    r•Ú
start_timerŒr r r„r‘r™rªr­rr
r
r
r Ú<module>s4   .*T