hqchart 1.1.12733 → 1.1.12741
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/jscommon/jschinamapdata.js +3 -0
- package/src/jscommon/umychart.NetworkFilterTest.js +48803 -0
- package/src/jscommon/umychart.aliYunnetwork.js +47 -0
- package/src/jscommon/umychart.complier.js +25402 -0
- package/src/jscommon/umychart.console.js +12 -0
- package/src/jscommon/umychart.deal.js +1452 -0
- package/src/jscommon/umychart.dragdiv.js +48 -0
- package/src/jscommon/umychart.index.data.js +4132 -0
- package/src/jscommon/umychart.js +90801 -0
- package/src/jscommon/umychart.keyboard.js +1659 -0
- package/src/jscommon/umychart.listctrl.js +690 -0
- package/src/jscommon/umychart.mind.js +2203 -0
- package/src/jscommon/umychart.network.js +44 -0
- package/src/jscommon/umychart.news.js +823 -0
- package/src/jscommon/umychart.regressiontest.js +400 -0
- package/src/jscommon/umychart.report.js +5803 -0
- package/src/jscommon/umychart.scrollbar.js +1345 -0
- package/src/jscommon/umychart.stock.js +4218 -0
- package/src/jscommon/umychart.style.js +625 -0
- package/src/jscommon/umychart.testdata.js +150 -0
- package/src/jscommon/umychart.uniapp.h5/umychart.uniapp.h5.js +237 -35
- package/src/jscommon/umychart.user.js +137 -0
- package/src/jscommon/umychart.version.js +30 -0
- package/src/jscommon/umychart.vue/umychart.vue.js +237 -35
- package/src/jscommon/umychart.worker.js +114 -0
- package/src/jscommon/umychart.ws.stock.js +110 -0
- package/src/jscommon/vendor.js +2 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (c) 2018 jones
|
|
3
|
+
|
|
4
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
|
|
6
|
+
开源项目 https://github.com/jones2000/HQChart
|
|
7
|
+
|
|
8
|
+
jones_2000@163.com
|
|
9
|
+
|
|
10
|
+
个股指标回测
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
指标回测
|
|
16
|
+
计算: Trade: {Count 交易次数 Days:交易天数 Success:成功交易次数 Fail:失败交易次数}
|
|
17
|
+
Day: {Count:总运行 Max:最长运行 Min:最短运行 Average:平均运行}
|
|
18
|
+
Profit: 总收益 StockProfit:个股收益 Excess:超额收益 MaxDropdown:最大回撤 Beta:β(Beta)系数(指标里面需要又大盘数据)
|
|
19
|
+
NetValue: [ {Date:日期, Net:净值, Close:股票收盘价, IndexClose:大盘的收盘价}, ]
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
function RegressionTest()
|
|
24
|
+
{
|
|
25
|
+
//只读数据不能修改
|
|
26
|
+
this.HistoryData; //K线数据
|
|
27
|
+
this.BuyData; //策略买数据
|
|
28
|
+
this.SellData; //策略卖数据
|
|
29
|
+
this.IndexClose; //大盘收盘价
|
|
30
|
+
this.NetCalculateModel=0; //净值及收益计算模型 0=使用B点开盘价计算 1=使用B点下一天的开盘价计算
|
|
31
|
+
|
|
32
|
+
this.InitialCapital=10000; //初始资金1W
|
|
33
|
+
|
|
34
|
+
//计算结果数据
|
|
35
|
+
this.Data=new Map(); //key:DATA_NAME value:数据
|
|
36
|
+
|
|
37
|
+
this.SetPolicyData=function(obj) //设置策略结果的数据 {KLineData:个股K线数据, BuyData:策略买数据, SellData:策略卖数据, IndexClose:大盘收盘价}
|
|
38
|
+
{
|
|
39
|
+
this.HistoryData=obj.KLineData; //K线数据
|
|
40
|
+
this.BuyData=obj.BuyData; //策略买数据
|
|
41
|
+
this.SellData=obj.SellData; //策略卖数据
|
|
42
|
+
if (obj.IndexClose) this.IndexClose=obj.IndexClose; //大盘收盘价 如果没有大盘数据 就不计算β(Beta)系数 和指数涨幅数据
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.ClearData=function() //清空所有的结果数据
|
|
46
|
+
{
|
|
47
|
+
this.Data=new Map()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
this.GetBSData=function(startDate) //BS点配对 { B:[{Data:K线数据, Count:天数, NextOpen:下一天的开盘价 }], S:{Data:K线数据}}
|
|
51
|
+
{
|
|
52
|
+
var index=null;
|
|
53
|
+
for(var i=0;i<this.HistoryData.length;++i)
|
|
54
|
+
{
|
|
55
|
+
var item=this.HistoryData[i];
|
|
56
|
+
if (item.Date>=startDate)
|
|
57
|
+
{
|
|
58
|
+
index=i;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (index===null) return null;
|
|
63
|
+
|
|
64
|
+
console.log(`[RegressionTest::GetBSData] startDate=${startDate} index=${index}`);
|
|
65
|
+
var aryBS=[];
|
|
66
|
+
var bsItem=null;
|
|
67
|
+
for(var i=index;i<this.HistoryData.length;++i)
|
|
68
|
+
{
|
|
69
|
+
var buyItem=this.BuyData[i];
|
|
70
|
+
var sellItem=this.SellData[i];
|
|
71
|
+
var kLineItem=this.HistoryData[i];
|
|
72
|
+
if (bsItem===null)
|
|
73
|
+
{
|
|
74
|
+
if (buyItem>0)
|
|
75
|
+
{
|
|
76
|
+
var bItem={Data:kLineItem, Count:0 };
|
|
77
|
+
if (i+1<this.HistoryData.length) bItem.NextOpen=this.HistoryData[i+1].Open; //获取下一天的开盘价
|
|
78
|
+
bsItem={ B:[bItem], S:null}; //B可以多个,S一个
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
{
|
|
83
|
+
for(var j in bsItem.B) ++bsItem.B[j].Count; //天数+1
|
|
84
|
+
if (buyItem>0)
|
|
85
|
+
{
|
|
86
|
+
var bItem={Data:kLineItem, Count:0};
|
|
87
|
+
if (i+1<this.HistoryData.length) bItem.NextOpen=this.HistoryData[i+1].Open; //获取下一天的开盘价
|
|
88
|
+
bsItem.B.push(bItem);
|
|
89
|
+
}
|
|
90
|
+
else if (sellItem>0)
|
|
91
|
+
{
|
|
92
|
+
bsItem.S={Data:kLineItem};
|
|
93
|
+
aryBS.push(bsItem);
|
|
94
|
+
bsItem=null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
var data={StartDate:this.HistoryData[index].Date, StartIndex:index, Count:this.HistoryData.length-index, BSData:aryBS };
|
|
100
|
+
|
|
101
|
+
console.log('[RegressionTest::GetBSData] data',data);
|
|
102
|
+
return data;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.Calculate=function(data)
|
|
106
|
+
{
|
|
107
|
+
var day={ Count:data.Count, Max:null, Min:null, Average:null }; //Count:总运行 Max:最长运行 Min:最短运行 Average:平均运行
|
|
108
|
+
var trade={Count:0, Days:0, Success:0 , Fail:0, SuccessRate:0}; //Count 交易次数 Days:交易天数 Success:成功交易次数 Fail:失败交易次数
|
|
109
|
+
|
|
110
|
+
for(var i in data.BSData)
|
|
111
|
+
{
|
|
112
|
+
var item=data.BSData[i];
|
|
113
|
+
for(var j in item.B)
|
|
114
|
+
{
|
|
115
|
+
var bItem=item.B[j];
|
|
116
|
+
if (day.Max===null) day.Max=bItem.Count;
|
|
117
|
+
else if (day.Max<bItem.Count) day.Max=bItem.Count;
|
|
118
|
+
|
|
119
|
+
if (day.Min===null) day.Min=bItem.Count;
|
|
120
|
+
else if (day.Min>bItem.Count) day.Min=bItem.Count;
|
|
121
|
+
|
|
122
|
+
++trade.Count;
|
|
123
|
+
trade.Days+=bItem.Count;
|
|
124
|
+
|
|
125
|
+
if (item.S.Data.Close>bItem.Data.Open) ++trade.Success;
|
|
126
|
+
else ++trade.Fail;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (trade.Count>0)
|
|
131
|
+
{
|
|
132
|
+
day.Average=trade.Days/trade.Count;
|
|
133
|
+
trade.SuccessRate=trade.Success/trade.Count;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
//计算收益(总收益)
|
|
137
|
+
var profit=1,buyPrice;
|
|
138
|
+
for(var i in data.BSData)
|
|
139
|
+
{
|
|
140
|
+
var item=data.BSData[i];
|
|
141
|
+
if (this.NetCalculateModel===1 && item.B[0].NextOpen>0 ) buyPrice=item.B[0].NextOpen;
|
|
142
|
+
else buyPrice=item.B[0].Data.Open;
|
|
143
|
+
var sellPrice=item.S.Data.Close;
|
|
144
|
+
var value=(sellPrice-buyPrice)/buyPrice+1;
|
|
145
|
+
profit*=value;
|
|
146
|
+
}
|
|
147
|
+
profit-=1; //公式:[(1+收益1)*(1+收益2)*(1+收益3)……(1+收益n)-1] x 100%
|
|
148
|
+
|
|
149
|
+
//标的证券收益
|
|
150
|
+
var yClose=this.HistoryData[data.StartIndex].Close; //使用前收盘
|
|
151
|
+
var close=this.HistoryData[this.HistoryData.length-1].Close; //最后一个大盘收盘价
|
|
152
|
+
var stockProfit=(close-yClose)/yClose;
|
|
153
|
+
|
|
154
|
+
console.log(`[RegressionTest::Calculate] stock profit first[${this.HistoryData[data.StartIndex].Date}, YClose=${this.HistoryData[data.StartIndex].YClose}] end[${this.HistoryData[this.HistoryData.length-1].Date}, Close=${this.HistoryData[this.HistoryData.length-1].Close}]`);
|
|
155
|
+
|
|
156
|
+
var netValue=this.CaclulateNetValue(data);
|
|
157
|
+
var maxDropdown=null, beta=null;
|
|
158
|
+
if (netValue && netValue.length>0)
|
|
159
|
+
{
|
|
160
|
+
maxDropdown=this.CaclulateMaxDropdown(netValue);
|
|
161
|
+
if (this.IndexClose) beta=this.CaclulateBeta(netValue);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
//Profit:收益 StockProfit:标的证券收益 Excess:超额收益(加上BS配对的数据)
|
|
165
|
+
var result={ Day:day, Trade:trade, Profit:profit, StockProfit:stockProfit, Excess:profit-stockProfit, NetValue:netValue, MaxDropdown:maxDropdown, Beta:beta,BSDataPair:data.BSData};
|
|
166
|
+
|
|
167
|
+
console.log('[RegressionTest::Calculate] NetCalculateModel, result ',this.NetCalculateModel, result);
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
this.CaclulateNetValue=function(data) //计算净值
|
|
172
|
+
{
|
|
173
|
+
var index=data.StartIndex;
|
|
174
|
+
|
|
175
|
+
var aryDay=[]; //{Close:收盘 , Open:开盘, Position:持仓数量, Cache:现金 , MarketValue:总市值}
|
|
176
|
+
var lastDayItem={Position:0, Cache:this.InitialCapital };
|
|
177
|
+
var bsItem=null, buyPrice;
|
|
178
|
+
for(var i=index;i<this.HistoryData.length;++i)
|
|
179
|
+
{
|
|
180
|
+
var buyItem=this.BuyData[i];
|
|
181
|
+
var sellItem=this.SellData[i];
|
|
182
|
+
var kLineItem=this.HistoryData[i];
|
|
183
|
+
var dayItem={Date:kLineItem.Date, Position:lastDayItem.Position, Cache:lastDayItem.Cache, Open:kLineItem.Open, Close:kLineItem.Close};
|
|
184
|
+
dayItem.MarketValue=dayItem.Position*dayItem.Close+dayItem.Cache; //市值 股票+现金
|
|
185
|
+
|
|
186
|
+
if (bsItem===null)
|
|
187
|
+
{
|
|
188
|
+
if (buyItem>0) //买
|
|
189
|
+
{
|
|
190
|
+
bsItem={ B:{Data:kLineItem}, S:null};
|
|
191
|
+
if (this.NetCalculateModel===1 && i+1<this.HistoryData.length && this.HistoryData[i+1].Open>0)
|
|
192
|
+
buyPrice=this.HistoryData[i+1].Open; //使用B点下一天的开盘价买
|
|
193
|
+
else
|
|
194
|
+
buyPrice=dayItem.Open;
|
|
195
|
+
|
|
196
|
+
let position=parseInt(dayItem.Cache/buyPrice); //开盘价买
|
|
197
|
+
let cache=dayItem.Cache-buyPrice*position; //剩余的现金
|
|
198
|
+
|
|
199
|
+
dayItem.Position=position;
|
|
200
|
+
dayItem.Cache=cache;
|
|
201
|
+
dayItem.MarketValue=dayItem.Position*dayItem.Close+dayItem.Cache; //市值 股票+现金
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else
|
|
205
|
+
{
|
|
206
|
+
if (sellItem>0) //卖
|
|
207
|
+
{
|
|
208
|
+
bsItem.S={Data:kLineItem};
|
|
209
|
+
bsItem=null;
|
|
210
|
+
|
|
211
|
+
let stockValue=dayItem.Position*dayItem.Close; //卖掉的股票钱
|
|
212
|
+
dayItem.Position=0;
|
|
213
|
+
dayItem.Cache+=stockValue; //卖掉的钱放到现金里面
|
|
214
|
+
dayItem.MarketValue=dayItem.Position*dayItem.Close+dayItem.Cache; //市值 股票+现金
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
//缓存上一天的数据
|
|
219
|
+
lastDayItem.Position=dayItem.Position;
|
|
220
|
+
lastDayItem.Cache=dayItem.Cache;
|
|
221
|
+
|
|
222
|
+
dayItem.Net=dayItem.MarketValue/this.InitialCapital; //净值
|
|
223
|
+
if (this.IndexClose) dayItem.IndexClose=this.IndexClose[i]; //指数收盘价
|
|
224
|
+
aryDay.push(dayItem);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
//console.log('[RegressionTest::CaclulateNetValue] aryDay',aryDay);
|
|
228
|
+
if (aryDay.length<=0) return [];
|
|
229
|
+
|
|
230
|
+
var netValue=[]; //净值 {Date:日期, Net:净值, Close:股票收盘价, IndexClose:大盘的收盘价}
|
|
231
|
+
for(var i=0;i<aryDay.length;++i)
|
|
232
|
+
{
|
|
233
|
+
var item=aryDay[i];
|
|
234
|
+
var dataItem={ Net:item.Net, Date:item.Date, Close:item.Close };
|
|
235
|
+
if (item.IndexClose) dataItem.IndexClose=item.IndexClose;
|
|
236
|
+
netValue.push(dataItem);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
//console.log('[RegressionTest::CaclulateNetValue] netValue',netValue);
|
|
240
|
+
|
|
241
|
+
return netValue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
this.CaclulateMaxDropdown=function(data) //最大回撤
|
|
245
|
+
{
|
|
246
|
+
var maxNet=data[0].Net; //最大净值
|
|
247
|
+
var maxValue=0;
|
|
248
|
+
var maxDay;
|
|
249
|
+
for(var i=1;i<data.length;++i)
|
|
250
|
+
{
|
|
251
|
+
var item=data[i];
|
|
252
|
+
var value=1-(item.Net/maxNet); //1-策略当日净值 / 当日之前策略最大净值
|
|
253
|
+
if (maxValue<value)
|
|
254
|
+
{
|
|
255
|
+
maxValue=value;
|
|
256
|
+
maxDay=item;
|
|
257
|
+
}
|
|
258
|
+
if (maxNet<item.Net) maxNet=item.Net; //取当前最大的净值
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
console.log('[RegressionTest::CaclulateMaxDropdown] maxDay',maxDay);
|
|
262
|
+
return maxValue;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
this.CaclulateBeta=function(data) //β(Beta)系数,参数是净值数组NetValue
|
|
266
|
+
{
|
|
267
|
+
var lastItem=data[0]; //上一天的数据
|
|
268
|
+
var indexProfit=[]; //大盘涨幅
|
|
269
|
+
var bsProfit=[]; //策略涨幅
|
|
270
|
+
var indexProfitTotal=0, bsProfitTotal=0;
|
|
271
|
+
for(var i=1; i<data.length; ++i)
|
|
272
|
+
{
|
|
273
|
+
indexProfit[i-1]=0;
|
|
274
|
+
bsProfit[i-1]=0;
|
|
275
|
+
|
|
276
|
+
var item=data[i];
|
|
277
|
+
|
|
278
|
+
if (item.IndexClose>0 && lastItem.IndexClose>0) indexProfit[i-1]=(item.IndexClose-lastItem.IndexClose)/lastItem.IndexClose;
|
|
279
|
+
if (item.Net>0 && lastItem.Net>0) bsProfit[i-1]=(item.Net-lastItem.Net)/lastItem.Net;
|
|
280
|
+
//if (item.Close>0 && lastItem.Close>0) bsProfit[i-1]=(item.Close-lastItem.Close)/lastItem.Close;
|
|
281
|
+
|
|
282
|
+
indexProfitTotal+=indexProfit[i-1];
|
|
283
|
+
bsProfitTotal+=bsProfit[i-1];
|
|
284
|
+
|
|
285
|
+
lastItem=item;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
var averageIndexProfit=indexProfitTotal/indexProfit.length;
|
|
289
|
+
var averageBSProfit=bsProfitTotal/bsProfit.length;
|
|
290
|
+
|
|
291
|
+
var betaCOV=0; //协方差
|
|
292
|
+
for(var i=0;i<indexProfit.length;++i)
|
|
293
|
+
{
|
|
294
|
+
betaCOV+=(bsProfit[i]-averageBSProfit)*(indexProfit[i]-averageIndexProfit);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
var betaVAR=0; //标准差:方差的开2次方
|
|
298
|
+
for(var i=0;i<indexProfit.length;++i)
|
|
299
|
+
{
|
|
300
|
+
betaVAR+=(indexProfit[i]-averageIndexProfit)*(indexProfit[i]-averageIndexProfit);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return betaCOV/betaVAR;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
this.Execute=function(obj) //开始计算[ { Name:名字 , Date:起始日期 格式(20180101) }, ....]
|
|
307
|
+
{
|
|
308
|
+
|
|
309
|
+
for(var i in obj )
|
|
310
|
+
{
|
|
311
|
+
var item=obj[i];
|
|
312
|
+
if (this.Data.has(item.Name)) //已经计算过了不计算
|
|
313
|
+
{
|
|
314
|
+
console.log(`[RegressionTest::Execute] id=${i} Name=${item.Name} Date:${item.Date} is exsit.`);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
console.log(`[RegressionTest::Execute] id=${i} Name=${item.Name} Date:${item.Date}`);
|
|
319
|
+
var data=this.GetBSData(item.Date);
|
|
320
|
+
var result=this.Calculate(data);
|
|
321
|
+
this.Data.set(item.Name, result);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
//计算叠加数据 (日期必须匹配)
|
|
329
|
+
RegressionTest.CaclulateOverlayData=function(obj) //{Main:主数据, Sub:[]//多组叠加数据}
|
|
330
|
+
{
|
|
331
|
+
if (!obj.Main || !obj.Sub) return null;
|
|
332
|
+
var count=obj.Main.length;
|
|
333
|
+
for(var i in obj.Sub)
|
|
334
|
+
{
|
|
335
|
+
var item=obj.Sub[i];
|
|
336
|
+
if (item.length!=count)
|
|
337
|
+
{
|
|
338
|
+
console.log(`[RegressionTest::OverlayData] id=${i} data count not match. MainData count=${count}`);
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
var result=[]; //[0]:主数据 , [1...]:叠加数据
|
|
344
|
+
|
|
345
|
+
var firstData={Sub:[]};
|
|
346
|
+
firstData.Main=obj.Main[0];
|
|
347
|
+
result.push([]);
|
|
348
|
+
for(var i=0;i<obj.Sub.length;++i)
|
|
349
|
+
{
|
|
350
|
+
var subData=obj.Sub[i];
|
|
351
|
+
firstData.Sub[i]=subData[0];
|
|
352
|
+
result.push([]);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
for(var i=0;i<obj.Main.length;++i)
|
|
356
|
+
{
|
|
357
|
+
var value=obj.Main[i];
|
|
358
|
+
var valuePer=(value-firstData.Main)/firstData.Main;
|
|
359
|
+
result[0][i]=valuePer;
|
|
360
|
+
|
|
361
|
+
for(var j=0;j<obj.Sub.length;++j)
|
|
362
|
+
{
|
|
363
|
+
var subData=obj.Sub[j];
|
|
364
|
+
var subValue=subData[i];
|
|
365
|
+
var subValuePer=(subValue-firstData.Sub[j])/firstData.Sub[j];
|
|
366
|
+
result[j+1][i]=subValuePer;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return result;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
RegressionTest.GetPolicyData=function(data) //获取指标数据里面需要计算回测的数据
|
|
375
|
+
{
|
|
376
|
+
var policyData={KLineData:null, IndexClose:null, BuyData:null, SellData:null};
|
|
377
|
+
policyData.KLineData=data.HistoryData.Data; //个股K线数据,
|
|
378
|
+
|
|
379
|
+
for(var i in data.OutVar)
|
|
380
|
+
{
|
|
381
|
+
var item=data.OutVar[i];
|
|
382
|
+
if (item.Name=='INDEXCLOSE')
|
|
383
|
+
{
|
|
384
|
+
policyData.IndexClose=item.Data; //绑定大盘收盘数据
|
|
385
|
+
}
|
|
386
|
+
else if (item.Name=='DRAWICON') //买卖盘BS函数
|
|
387
|
+
{
|
|
388
|
+
if (item.Draw && item.Draw.Icon)
|
|
389
|
+
{
|
|
390
|
+
if (item.Draw.Icon.ID===13) policyData.BuyData=item.Draw.DrawData; //买
|
|
391
|
+
else if (item.Draw.Icon.ID===14) policyData.SellData=item.Draw.DrawData; //卖
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (policyData.KLineData && policyData.BuyData && policyData.SellData) return policyData;
|
|
397
|
+
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
|