hqchart 1.1.12886 → 1.1.12893

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.
@@ -0,0 +1,2453 @@
1
+ //市场多空
2
+ function MarketLongShortIndex()
3
+ {
4
+ this.newMethod=BaseIndex; //派生
5
+ this.newMethod('Long-Short');
6
+ delete this.newMethod;
7
+
8
+ this.Index=new Array(
9
+ new IndexInfo("多头区域",null),
10
+ new IndexInfo("空头区域",null),
11
+ new IndexInfo("市场多空指标",null),
12
+ );
13
+
14
+ this.Index[0].LineColor=g_JSChartResource.UpBarColor;
15
+ this.Index[1].LineColor=g_JSChartResource.DownBarColor;
16
+ this.Index[2].LineColor=g_JSChartResource.Index.LineColor[0];
17
+
18
+ this.LongShortData; //多空数据
19
+
20
+ this.CreateChart=function(id)
21
+ {
22
+ if (id==2){
23
+ var newChartLine = new ChartLine();
24
+ newChartLine.LineWidth = 2;
25
+ return newChartLine;
26
+ }
27
+
28
+ return new ChartStraightLine();
29
+ }
30
+
31
+ this.GetOutData=function()
32
+ {
33
+ return { LongShortData:this.LongShortData };
34
+ }
35
+
36
+ //请求数据
37
+ this.RequestData=function(hqChart,windowIndex,hisData)
38
+ {
39
+ var self = this;
40
+ var param=
41
+ {
42
+ HQChart:hqChart,
43
+ WindowIndex:windowIndex,
44
+ HistoryData:hisData
45
+ };
46
+
47
+ this.LongShortData=[];
48
+
49
+ if (param.HQChart.Period>0) //周期数据
50
+ {
51
+ this.NotSupport(param.HQChart,param.WindowIndex,"不支持周期切换");
52
+ param.HQChart.Draw();
53
+ this.SendEvent(hqChart,windowIndex,hisData,"不支持周期切换");
54
+ return false;
55
+ }
56
+
57
+ //请求数据
58
+ JSNetwork.HttpRequest({
59
+ url: g_JSChartResource.Index.MarketLongShortApiUrl,
60
+ data:
61
+ {
62
+
63
+ },
64
+ type:"post",
65
+ dataType: "json",
66
+ async:true,
67
+ success: function (recvData)
68
+ {
69
+ self.RecvData(recvData,param);
70
+ self.SendEvent(hqChart,windowIndex,hisData);
71
+ }
72
+ });
73
+
74
+ return true;
75
+ }
76
+
77
+ this.RecvData=function(recvData,param)
78
+ {
79
+ if (recvData.data.length<=0) return;
80
+
81
+ var aryData=new Array();
82
+ for(var i in recvData.data)
83
+ {
84
+ var item=recvData.data[i];
85
+ var indexData=new SingleData();
86
+ indexData.Date=item[0];
87
+ indexData.Value=item[1];
88
+ aryData.push(indexData);
89
+ }
90
+
91
+ var aryFittingData=param.HistoryData.GetFittingData(aryData);
92
+
93
+ var bindData=new ChartData();
94
+ bindData.Data=aryFittingData;
95
+ bindData.Period=param.HQChart.Period; //周期
96
+ bindData.Right=param.HQChart.Right; //复权
97
+
98
+ this.LongShortData=bindData.GetValue();
99
+ this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);
100
+
101
+ param.HQChart.UpdataDataoffset(); //更新数据偏移
102
+ param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
103
+ param.HQChart.Draw();
104
+ }
105
+
106
+
107
+ this.BindData=function(hqChart,windowIndex,hisData)
108
+ {
109
+ var paint=this.CreatePaints(hqChart,windowIndex);
110
+ var isOverlay=this.IsOverlay();
111
+ if (paint.length!=this.Index.length) return false;
112
+
113
+ //paint[0].Data.Data=SWLData;
114
+ paint[2].Data.Data=this.LongShortData;
115
+ paint[0].Data.Data[0]=8;
116
+ paint[1].Data.Data[0]=1;
117
+
118
+ var titleIndex=windowIndex+1;
119
+
120
+ //指定[0,9]
121
+ if (isOverlay)
122
+ {
123
+ this.OverlayIndex.Frame.Frame.YSpecificMaxMin={Max:9,Min:0,Count:3};
124
+ var titlePaint=hqChart.TitlePaint[titleIndex];
125
+ var titleInfo={ Data:[], Title:'' };
126
+ titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);
127
+ for(var i in paint)
128
+ {
129
+ var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);
130
+ if (i!=2) titleData.DataType="StraightLine";
131
+ titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;
132
+ }
133
+ }
134
+ else
135
+ {
136
+ hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin={Max:9,Min:0,Count:3};
137
+ for(var i in paint)
138
+ {
139
+ hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);
140
+ if (i!=2) hqChart.TitlePaint[titleIndex].Data[i].DataType="StraightLine";
141
+ }
142
+ }
143
+
144
+ return true;
145
+ }
146
+
147
+ }
148
+
149
+ //市场择时
150
+ function MarketTimingIndex()
151
+ {
152
+ this.newMethod=BaseIndex; //派生
153
+ this.newMethod('Market-Timing');
154
+ delete this.newMethod;
155
+
156
+ this.Index=new Array(
157
+ new IndexInfo("因子择时",null)
158
+ );
159
+
160
+ this.TimingData; //择时数据
161
+ this.TitleColor=g_JSChartResource.FrameSplitTextColor
162
+
163
+ this.CreateChart=function(id)
164
+ {
165
+ return new ChartMACD();
166
+ }
167
+
168
+ this.GetOutData=function()
169
+ {
170
+ return { TimingData:this.TimingData };
171
+ }
172
+
173
+ //请求数据
174
+ this.RequestData=function(hqChart,windowIndex,hisData)
175
+ {
176
+ var self = this;
177
+ var param=
178
+ {
179
+ HQChart:hqChart,
180
+ WindowIndex:windowIndex,
181
+ HistoryData:hisData
182
+ };
183
+
184
+ this.LongShortData=[];
185
+
186
+ if (param.HQChart.Period>0) //周期数据
187
+ {
188
+ this.NotSupport(param.HQChart,param.WindowIndex,"不支持周期切换");
189
+ param.HQChart.Draw();
190
+ this.SendEvent(hqChart,windowIndex,hisData,"不支持周期切换");
191
+ return false;
192
+ }
193
+
194
+ //请求数据
195
+ JSNetwork.HttpRequest({
196
+ url: g_JSChartResource.Index.MarketLongShortApiUrl,
197
+ data:
198
+ {
199
+
200
+ },
201
+ type:"post",
202
+ dataType: "json",
203
+ async:true,
204
+ success: function (recvData)
205
+ {
206
+ self.RecvData(recvData,param);
207
+ self.SendEvent(hqChart,windowIndex,hisData);
208
+ }
209
+ });
210
+
211
+ return true;
212
+ }
213
+
214
+ this.RecvData=function(recvData,param)
215
+ {
216
+ if (recvData.data.length<=0) return;
217
+
218
+ var aryData=new Array();
219
+ for(var i in recvData.data)
220
+ {
221
+ var item=recvData.data[i];
222
+ var indexData=new SingleData();
223
+ indexData.Date=item[0];
224
+ indexData.Value=item[2];
225
+ aryData.push(indexData);
226
+ }
227
+
228
+ var aryFittingData=param.HistoryData.GetFittingData(aryData);
229
+
230
+ var bindData=new ChartData();
231
+ bindData.Data=aryFittingData;
232
+ bindData.Period=param.HQChart.Period; //周期
233
+ bindData.Right=param.HQChart.Right; //复权
234
+
235
+ this.TimingData=bindData.GetValue();
236
+ this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);
237
+
238
+ param.HQChart.UpdataDataoffset(); //更新数据偏移
239
+ param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
240
+ param.HQChart.Draw();
241
+ }
242
+
243
+
244
+ this.BindData=function(hqChart,windowIndex,hisData)
245
+ {
246
+ var paint=this.CreatePaints(hqChart,windowIndex);
247
+ var isOverlay=this.IsOverlay();
248
+
249
+ if (paint.length!=this.Index.length) return false;
250
+
251
+ //paint[0].Data.Data=SWLData;
252
+ paint[0].Data.Data=this.TimingData;
253
+ paint[0].NotSupportMessage=null;
254
+
255
+ var titleIndex=windowIndex+1;
256
+
257
+ if (isOverlay)
258
+ {
259
+ var titlePaint=hqChart.TitlePaint[titleIndex];
260
+ var titleInfo={ Data:[], Title:'' };
261
+ titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);
262
+ for(var i in paint)
263
+ {
264
+ var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);
265
+ titleData.StringFormat=STRING_FORMAT_TYPE.THOUSANDS;
266
+ titleData.FloatPrecision=0;
267
+ titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;
268
+ }
269
+ }
270
+ else
271
+ {
272
+ for(var i in paint)
273
+ {
274
+ hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.TitleColor);
275
+ hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.THOUSANDS;
276
+ hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=0;
277
+ }
278
+ }
279
+
280
+ return true;
281
+ }
282
+ }
283
+
284
+ //市场关注度
285
+ function MarketAttentionIndex()
286
+ {
287
+ this.newMethod=BaseIndex; //派生
288
+ this.newMethod('Market-Attention');
289
+ delete this.newMethod;
290
+
291
+ this.Index=new Array(
292
+ new IndexInfo("市场关注度",null)
293
+ );
294
+
295
+ this.Data; //关注度数据
296
+ this.TitleColor=g_JSChartResource.FrameSplitTextColor;
297
+ this.ApiUrl=g_JSChartResource.Index.MarketAttentionApiUrl;
298
+
299
+ this.CreateChart=function(id)
300
+ {
301
+ return new ChartMACD();
302
+ }
303
+
304
+ this.GetOutData=function()
305
+ {
306
+ return { Data:this.Data };
307
+ }
308
+
309
+ //调整框架
310
+ this.SetFrame=function(hqChart,windowIndex,hisData)
311
+ {
312
+ var isOverlay=this.IsOverlay();
313
+ if (isOverlay)
314
+ this.OverlayIndex.Frame.Frame.YSpecificMaxMin={Max:6,Min:0,Count:3};
315
+ else
316
+ hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin={Max:6,Min:0,Count:3};
317
+ }
318
+
319
+ //请求数据
320
+ this.RequestData=function(hqChart,windowIndex,hisData)
321
+ {
322
+ var self = this;
323
+ var param=
324
+ {
325
+ HQChart:hqChart,
326
+ WindowIndex:windowIndex,
327
+ HistoryData:hisData
328
+ };
329
+
330
+ this.Data=[];
331
+
332
+ if (param.HQChart.Period>0) //周期数据
333
+ {
334
+ this.NotSupport(param.HQChart,param.WindowIndex,"不支持周期切换");
335
+ param.HQChart.Draw();
336
+ this.SendEvent(hqChart,windowIndex,hisData,"不支持周期切换");
337
+ return false;
338
+ }
339
+
340
+ //请求数据
341
+ JSNetwork.HttpRequest({
342
+ url: this.ApiUrl,
343
+ data:
344
+ {
345
+ "symbol":param.HQChart.Symbol,
346
+ "startdate":20100101,
347
+ },
348
+ type:"post",
349
+ dataType: "json",
350
+ async:true,
351
+ success: function (recvData)
352
+ {
353
+ self.RecvData(recvData,param);
354
+ self.SendEvent(hqChart,windowIndex,hisData);
355
+ }
356
+ });
357
+
358
+ return true;
359
+ }
360
+
361
+ this.RecvData=function(recvData,param)
362
+ {
363
+ if (recvData.date.length<0) return;
364
+
365
+ var aryData=new Array();
366
+ for(var i in recvData.date)
367
+ {
368
+ var indexData=new SingleData();
369
+ indexData.Date=recvData.date[i];
370
+ indexData.Value=recvData.value[i];
371
+ aryData.push(indexData);
372
+ }
373
+
374
+ var aryFittingData=param.HistoryData.GetFittingData(aryData);
375
+
376
+ var bindData=new ChartData();
377
+ bindData.Data=aryFittingData;
378
+ bindData.Period=param.HQChart.Period; //周期
379
+ bindData.Right=param.HQChart.Right; //复权
380
+
381
+ this.Data=bindData.GetValue();
382
+ this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);
383
+ this.SetFrame(param.HQChart,param.WindowIndex,param.HistoryData);
384
+
385
+ param.HQChart.UpdataDataoffset(); //更新数据偏移
386
+ param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
387
+ param.HQChart.Draw();
388
+ }
389
+
390
+
391
+ this.BindData=function(hqChart,windowIndex,hisData)
392
+ {
393
+ var paint=this.CreatePaints(hqChart,windowIndex);
394
+ var isOverlay=this.IsOverlay();
395
+
396
+ if (paint.length!=this.Index.length) return false;
397
+
398
+ //paint[0].Data.Data=SWLData;
399
+ paint[0].Data.Data=this.Data;
400
+ paint[0].NotSupportMessage=null;
401
+
402
+ var titleIndex=windowIndex+1;
403
+ if (isOverlay)
404
+ {
405
+ var titlePaint=hqChart.TitlePaint[titleIndex];
406
+ var titleInfo={ Data:[], Title:'' };
407
+ titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);
408
+ for(var i in paint)
409
+ {
410
+ var titleData=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);
411
+ titleData.StringFormat=STRING_FORMAT_TYPE.THOUSANDS;
412
+ titleData.FloatPrecision=0;
413
+ titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;
414
+ }
415
+ }
416
+ else
417
+ {
418
+ for(var i in paint)
419
+ {
420
+ hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.TitleColor);
421
+ hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.THOUSANDS;
422
+ hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=0;
423
+ }
424
+ }
425
+
426
+ return true;
427
+ }
428
+ }
429
+
430
+
431
+ /*
432
+ 行业,指数热度
433
+ */
434
+ function MarketHeatIndex()
435
+ {
436
+ this.newMethod=BaseIndex; //派生
437
+ this.newMethod('Market-Heat');
438
+ delete this.newMethod;
439
+
440
+ this.Index=new Array(
441
+ new IndexInfo("热度",5),
442
+ new IndexInfo('MA',10),
443
+ new IndexInfo('MA',null)
444
+ );
445
+
446
+ this.Data; //关注度数据
447
+
448
+ this.ApiUrl=g_JSChartResource.Index.MarketHeatApiUrl;
449
+
450
+ this.Index[0].LineColor=g_JSChartResource.FrameSplitTextColor;
451
+ this.Index[1].LineColor=g_JSChartResource.Index.LineColor[0];
452
+ this.Index[2].LineColor=g_JSChartResource.Index.LineColor[1];
453
+
454
+ this.CreateChart=function(id)
455
+ {
456
+ if (id==0) return new ChartMACD();
457
+
458
+ return new ChartLine();
459
+ }
460
+
461
+ //请求数据
462
+ this.RequestData=function(hqChart,windowIndex,hisData)
463
+ {
464
+ var self = this;
465
+ var param=
466
+ {
467
+ HQChart:hqChart,
468
+ WindowIndex:windowIndex,
469
+ HistoryData:hisData
470
+ };
471
+
472
+ this.Data=[];
473
+
474
+ if (param.HQChart.Period>0) //周期数据
475
+ {
476
+ this.NotSupport(param.HQChart,param.WindowIndex,"不支持周期切换");
477
+ param.HQChart.Draw();
478
+ return false;
479
+ }
480
+
481
+ //请求数据
482
+ JSNetwork.HttpRequest({
483
+ url: this.ApiUrl,
484
+ data:
485
+ {
486
+ "symbol":param.HQChart.Symbol,
487
+ "startdate":20100101,
488
+ },
489
+ type:"post",
490
+ dataType: "json",
491
+ async:true,
492
+ success: function (recvData)
493
+ {
494
+ self.RecvData(recvData,param);
495
+ }
496
+ });
497
+
498
+ return true;
499
+ }
500
+
501
+ this.RecvData=function(recvData,param)
502
+ {
503
+ if (recvData.date.length<0) return;
504
+
505
+ var aryData=new Array();
506
+ for(var i in recvData.date)
507
+ {
508
+ var indexData=new SingleData();
509
+ indexData.Date=recvData.date[i];
510
+ indexData.Value=recvData.value[i];
511
+ aryData.push(indexData);
512
+ }
513
+
514
+ var aryFittingData=param.HistoryData.GetFittingData(aryData);
515
+
516
+ var bindData=new ChartData();
517
+ bindData.Data=aryFittingData;
518
+ bindData.Period=param.HQChart.Period; //周期
519
+ bindData.Right=param.HQChart.Right; //复权
520
+
521
+ this.Data=bindData.GetValue();
522
+ this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);
523
+
524
+ param.HQChart.UpdataDataoffset(); //更新数据偏移
525
+ param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
526
+ param.HQChart.Draw();
527
+ }
528
+
529
+
530
+ this.BindData=function(hqChart,windowIndex,hisData)
531
+ {
532
+ var paint=this.CreatePaints(hqChart,windowIndex);
533
+ var isOverlay=this.IsOverlay();
534
+
535
+ if (paint.length!=this.Index.length) return false;
536
+
537
+ paint[0].Data.Data=this.Data;
538
+ paint[0].NotSupportMessage=null;
539
+
540
+ var MA=HQIndexFormula.MA(this.Data,this.Index[0].Param);
541
+ paint[1].Data.Data=MA;
542
+
543
+ var MA2=HQIndexFormula.MA(this.Data,this.Index[1].Param);
544
+ paint[2].Data.Data=MA2;
545
+
546
+ var titleIndex=windowIndex+1;
547
+
548
+ if (isOverlay)
549
+ {
550
+ var titlePaint=hqChart.TitlePaint[titleIndex];
551
+ var titleInfo={ Data:[], Title:'' };
552
+ titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);
553
+ for(var i in paint)
554
+ {
555
+ var name=''
556
+ if(i==0) name=hqChart.Name+this.Index[i].Name;
557
+ else name="MA"+this.Index[i-1].Param;
558
+ var titleData=new DynamicTitleData(paint[i].Data,name,this.Index[i].LineColor);
559
+ titleData.StringFormat=STRING_FORMAT_TYPE.DEFAULT;
560
+ titleData.FloatPrecision=2;
561
+ titlePaint.OverlayIndex.get(this.OverlayIndex.Identify).Data[i]=titleData;
562
+ }
563
+ }
564
+ else
565
+ {
566
+ for(var i in paint)
567
+ {
568
+ var name=""; //显示的名字特殊处理
569
+ if(i==0) name=hqChart.Name+this.Index[i].Name;
570
+ else name="MA"+this.Index[i-1].Param;
571
+
572
+ hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,name,this.Index[i].LineColor);
573
+ hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.DEFAULT;
574
+ hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=2;
575
+ }
576
+ }
577
+
578
+ //hqChart.TitlePaint[titleIndex].Explain="热度说明";
579
+
580
+ return true;
581
+ }
582
+
583
+ }
584
+
585
+ //自定义指数热度
586
+ function CustonIndexHeatIndex()
587
+ {
588
+ this.newMethod=BaseIndex; //派生
589
+ this.newMethod('Market-Heat');
590
+ delete this.newMethod;
591
+
592
+ this.Index=new Array(
593
+ new IndexInfo('区域',3),
594
+ new IndexInfo("热度指数",10),
595
+ new IndexInfo('MA',5),
596
+ new IndexInfo('MA',10)
597
+ );
598
+
599
+ this.Data; //关注度数据
600
+
601
+ this.ApiUrl=g_JSChartResource.Index.CustomIndexHeatApiUrl;
602
+
603
+ this.Index[1].LineColor=g_JSChartResource.Index.LineColor[1];
604
+ this.Index[2].LineColor=g_JSChartResource.Index.LineColor[2];
605
+ this.Index[3].LineColor=g_JSChartResource.Index.LineColor[3];
606
+
607
+ this.Create=function(hqChart,windowIndex)
608
+ {
609
+ for(var i in this.Index)
610
+ {
611
+ var paint=null;
612
+ if (i==0)
613
+ {
614
+ paint = new ChartStraightArea();
615
+ }
616
+ else
617
+ {
618
+ paint=new ChartLine();
619
+ paint.Color=this.Index[i].LineColor;
620
+ }
621
+
622
+ paint.Canvas=hqChart.Canvas;
623
+ paint.Name=this.Name+"-"+i.toString();
624
+ paint.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
625
+ paint.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
626
+
627
+ hqChart.ChartPaint.push(paint);
628
+ }
629
+ }
630
+
631
+ //请求数据
632
+ this.RequestData=function(hqChart,windowIndex,hisData)
633
+ {
634
+ var self = this;
635
+ var param=
636
+ {
637
+ HQChart:hqChart,
638
+ WindowIndex:windowIndex,
639
+ HistoryData:hisData
640
+ };
641
+
642
+ this.Data=[];
643
+
644
+ if (param.HQChart.Period>0) //周期数据
645
+ {
646
+ this.NotSupport(param.HQChart,param.WindowIndex,"不支持周期切换");
647
+ param.HQChart.Draw();
648
+ return false;
649
+ }
650
+
651
+ //请求数据
652
+ JSNetwork.HttpRequest({
653
+ url: this.ApiUrl,
654
+ data:
655
+ {
656
+ "stock":param.HQChart.CustomStock,
657
+ "date":{"startdate":param.HQChart.QueryDate.Start,"enddate":param.HQChart.QueryDate.End},
658
+ "day":[this.Index[0].Param,this.Index[1].Param],
659
+ },
660
+ type:"post",
661
+ dataType: "json",
662
+ async:true,
663
+ success: function (recvData)
664
+ {
665
+ self.RecvData(recvData,param);
666
+ }
667
+ });
668
+
669
+ return true;
670
+ }
671
+
672
+ this.RecvData=function(recvData,param)
673
+ {
674
+ if (recvData.data==null || recvData.data.length<0) return;
675
+
676
+ //JSConsole.Chart.Log(recvData.data);
677
+ var aryData=new Array();
678
+ for(let i in recvData.data)
679
+ {
680
+ let item=recvData.data[i];
681
+ let indexData=new SingleData();
682
+ indexData.Date=item[0];
683
+ indexData.Value=item[1];
684
+ aryData.push(indexData);
685
+ }
686
+
687
+ var aryFittingData=param.HistoryData.GetFittingData(aryData);
688
+
689
+ var bindData=new ChartData();
690
+ bindData.Data=aryFittingData;
691
+ bindData.Period=param.HQChart.Period; //周期
692
+ bindData.Right=param.HQChart.Right; //复权
693
+
694
+ this.Data=bindData.GetValue();
695
+ this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);
696
+
697
+ param.HQChart.UpdataDataoffset(); //更新数据偏移
698
+ param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
699
+ param.HQChart.Draw();
700
+ }
701
+
702
+
703
+ this.BindData=function(hqChart,windowIndex,hisData)
704
+ {
705
+ let paint=hqChart.GetChartPaint(windowIndex);
706
+
707
+ if (paint.length!=this.Index.length) return false;
708
+
709
+ paint[0].NotSupportMessage=null;
710
+ paint[0].Data.Data=
711
+ [
712
+ { Value: 0, Value2: 0.2, Color: 'rgb(50,205,50)', Title: '热度1', TitleColor:'rgb(245,255 ,250)'},
713
+ { Value: 0.2, Value2: 0.4, Color: 'rgb(255,140,0)', Title: '热度2', TitleColor:'rgb(245,255 ,250)'},
714
+ { Value: 0.4, Value2: 0.8, Color: 'rgb(255,106,106)', Title: '热度3', TitleColor:'rgb(245,255 ,250)'},
715
+ { Value: 0.8, Value2: 1, Color: 'rgb(208, 32 ,144)', Title: '热度4', TitleColor:'rgb(245,255 ,250)'}
716
+ ];
717
+
718
+ paint[1].Data.Data = this.Data;
719
+
720
+ let MA=HQIndexFormula.MA(this.Data,this.Index[2].Param);
721
+ paint[2].Data.Data=MA;
722
+
723
+ let MA2=HQIndexFormula.MA(this.Data,this.Index[3].Param);
724
+ paint[3].Data.Data=MA2;
725
+
726
+ //指定框架最大最小[0,1]
727
+ hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 1, Min: 0, Count: 3 };
728
+
729
+ let titleIndex=windowIndex+1;
730
+
731
+ for(let i=1;i<paint.length;++i)
732
+ {
733
+ let name=this.Index[i].Name; //显示的名字特殊处理
734
+ if (name=='MA') name="MA"+this.Index[i].Param;
735
+
736
+ hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,name,this.Index[i].LineColor);
737
+ hqChart.TitlePaint[titleIndex].Data[i].StringFormat=STRING_FORMAT_TYPE.DEFAULT;
738
+ hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision=2;
739
+ }
740
+
741
+ hqChart.TitlePaint[titleIndex].Title='热度'+'('+this.Index[0].Param+','+this.Index[1].Param+','+this.Index[2].Param+','+this.Index[3].Param+')';
742
+
743
+ return true;
744
+ }
745
+
746
+ }
747
+
748
+
749
+ /*
750
+ 本福特系数(财务粉饰)
751
+ */
752
+ function BenfordIndex()
753
+ {
754
+ this.newMethod=BaseIndex; //派生
755
+ this.newMethod('财务粉饰');
756
+ delete this.newMethod;
757
+
758
+ this.Index = new Array(
759
+ new IndexInfo('区域', null),
760
+ new IndexInfo("系数", null)
761
+ );
762
+
763
+ this.Data; //财务数据
764
+
765
+ this.ApiUrl=g_JSChartResource.Index.StockHistoryDayApiUrl;
766
+
767
+ this.Index[0].LineColor=g_JSChartResource.Index.LineColor[0];
768
+ this.Index[1].LineColor='rgb(105,105,105)';
769
+
770
+ this.CreateChart=function(id)
771
+ {
772
+ if (id==0) return new ChartStraightArea();
773
+
774
+ return new ChartLineMultiData();
775
+ }
776
+
777
+ this.GetOutData=function()
778
+ {
779
+ return { Data:this.Data };
780
+ }
781
+
782
+ //请求数据
783
+ this.RequestData=function(hqChart,windowIndex,hisData)
784
+ {
785
+ var self = this;
786
+ var param=
787
+ {
788
+ HQChart:hqChart,
789
+ WindowIndex:windowIndex,
790
+ HistoryData:hisData
791
+ };
792
+
793
+ this.Data=[];
794
+
795
+ if (param.HQChart.Period!=2) //周期数据
796
+ {
797
+ this.NotSupport(param.HQChart,param.WindowIndex,"只支持月线");
798
+ param.HQChart.Draw();
799
+ this.SendEvent(hqChart,windowIndex,hisData,"只支持月线");
800
+ return false;
801
+ }
802
+
803
+ var aryField=["finance.benford","announcement2.quarter","announcement1.quarter","announcement3.quarter","announcement4.quarter"];
804
+ var aryCondition=
805
+ [
806
+ {item:["date","int32","gte","20130101"]},
807
+ {item:[ "announcement1.year","int32","gte",0,
808
+ "announcement2.year","int32","gte",0,
809
+ "announcement3.year","int32","gte",0,
810
+ "announcement4.year","int32","gte",0,
811
+ "or"]}
812
+ ];
813
+ //请求数据
814
+ JSNetwork.HttpRequest({
815
+ url: this.ApiUrl,
816
+ data:
817
+ {
818
+ "symbol":[param.HQChart.Symbol],
819
+ "field":aryField,
820
+ "condition":aryCondition
821
+ },
822
+ type:"post",
823
+ dataType: "json",
824
+ async:true,
825
+ success: function (recvData)
826
+ {
827
+ self.RecvData(recvData,param);
828
+ self.SendEvent(hqChart,windowIndex,hisData);
829
+ }
830
+ });
831
+
832
+ return true;
833
+ }
834
+
835
+ this.JsonDataToMapSingleData=function(recvData)
836
+ {
837
+ var stockData=recvData.stock[0].stockday;
838
+ var mapData=new Map();
839
+ for(var i in stockData)
840
+ {
841
+ var item=stockData[i];
842
+ var indexData=new SingleData();
843
+ indexData.Date=item.date;
844
+ indexData.Value=new Array();
845
+ if (item.finance1!=null && item.announcement1!=null)
846
+ {
847
+ let year=item.announcement1.year;
848
+ let quarter=item.announcement1.quarter;
849
+ let value=item.finance1.benford;
850
+ indexData.Value.push({Year:year,Quarter:quarter,Value:value});
851
+ }
852
+ if (item.finance2!=null && item.announcement2!=null)
853
+ {
854
+ let year=item.announcement2.year;
855
+ let quarter=item.announcement2.quarter;
856
+ let value=item.finance2.benford;
857
+ indexData.Value.push({Year:year,Quarter:quarter,Value:value});
858
+ }
859
+ if (item.finance3!=null && item.announcement3!=null)
860
+ {
861
+ let year=item.announcement3.year;
862
+ let quarter=item.announcement3.quarter;
863
+ let value=item.finance3.benford;
864
+ indexData.Value.push({Year:year,Quarter:quarter,Value:value});
865
+ }
866
+ if (item.finance4!=null && item.announcement4!=null)
867
+ {
868
+ let year=item.announcement4.year;
869
+ let quarter=item.announcement4.quarter;
870
+ let value=item.finance4.benford;
871
+ indexData.Value.push({Year:year,Quarter:quarter,Value:value});
872
+ }
873
+
874
+ mapData.set(indexData.Date,indexData);
875
+ }
876
+
877
+ var aryData=new Array();
878
+ for( var item of mapData)
879
+ {
880
+ aryData.push(item[1]);
881
+ }
882
+
883
+ return aryData;
884
+ }
885
+
886
+ this.RecvData=function(recvData,param)
887
+ {
888
+ JSConsole.Chart.Log(recvData);
889
+ if (recvData.stock==null || recvData.stock.length<=0) return;
890
+
891
+ var aryData=this.JsonDataToMapSingleData(recvData);
892
+
893
+ var aryFittingData=param.HistoryData.GetFittingMonthData(aryData);
894
+
895
+ var bindData=new ChartData();
896
+ bindData.Data=aryFittingData;
897
+ bindData.Period=param.HQChart.Period; //周期
898
+ bindData.Right=param.HQChart.Right; //复权
899
+
900
+ this.Data=bindData.GetValue();
901
+ this.BindData(param.HQChart,param.WindowIndex,param.HistoryData);
902
+
903
+ param.HQChart.UpdataDataoffset(); //更新数据偏移
904
+ param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
905
+ param.HQChart.Draw();
906
+ }
907
+
908
+
909
+ this.BindData=function(hqChart,windowIndex,hisData)
910
+ {
911
+ var paint=this.CreatePaints(hqChart,windowIndex);
912
+
913
+ if (paint.length!=this.Index.length) return false;
914
+
915
+ paint[0].NotSupportMessage = null;
916
+
917
+ paint[0].Data.Data=
918
+ [
919
+ { Value: 0, Value2: 0.2, Color: 'rgb(50,205,50)', Title: '安全区', TitleColor:'rgb(245,255 ,250)'},
920
+ { Value: 0.2, Value2: 0.4, Color: 'rgb(255,140,0)', Title: '预警区', TitleColor:'rgb(245,255 ,250)'},
921
+ { Value: 0.4, Value2: 1, Color: 'rgb(255,106,106)', Title: '警示区', TitleColor:'rgb(245,255 ,250)'}
922
+ ];
923
+
924
+ paint[1].Data.Data = this.Data;
925
+
926
+ //指定框架最大最小[0,1]
927
+ hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 1, Min: 0, Count: 3 };
928
+
929
+ var titleIndex = windowIndex + 1;
930
+
931
+ hqChart.TitlePaint[titleIndex].Data[1] = new DynamicTitleData(paint[1].Data, this.Index[1].Name, this.Index[1].LineColor);
932
+ hqChart.TitlePaint[titleIndex].Data[1].DataType = "MultiReport";
933
+
934
+ hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();
935
+
936
+ return true;
937
+ }
938
+ }
939
+
940
+
941
+ /*
942
+ 点位研判函数
943
+
944
+ HJ_1:=REF(LOW,1);
945
+ HJ_2:=SMA(ABS(LOW-HJ_1),13,1)/SMA(MAX(LOW-HJ_1,0),13,1)*100;
946
+ HJ_3:=EMA(IF(CLOSE*1.2,HJ_2*13,HJ_2/13),13);
947
+ HJ_4:=LLV(LOW,34);
948
+ HJ_5:=HHV(HJ_3,34);
949
+ HJ_6:=IF(LLV(LOW,56),1,0);
950
+ HJ_7:=EMA(IF(LOW<=HJ_4,(HJ_3+HJ_5*2)/2,0),3)/618*HJ_6;
951
+ HJ_8:=HJ_7>REF(HJ_7,1);
952
+ HJ_9:=REF(LLV(LOW,100),3);
953
+ HJ_10:=REFDATE(HJ_9,DATE);
954
+ HJ_11:=LOW=HJ_10;
955
+ HJ_12:=HJ_8 AND HJ_11;
956
+ HJ_13:=HJ_12>REF(HJ_12,1);
957
+ 启动买点:HJ_13>REF(HJ_13,1),COLORRED,LINETHICK1;
958
+ */
959
+ function LighterIndex3()
960
+ {
961
+ this.newMethod=BaseIndex; //派生
962
+ this.newMethod('点位研判函数');
963
+ delete this.newMethod;
964
+
965
+ this.Index=new Array(
966
+ new IndexInfo("启动买点",null)
967
+ );
968
+
969
+ this.Index[0].LineColor='rgb(255,0,0)';
970
+
971
+ this.BindData=function(hqChart,windowIndex,hisData)
972
+ {
973
+ var paint=hqChart.GetChartPaint(windowIndex);
974
+
975
+ if (paint.length!=this.Index.length) return false;
976
+
977
+ var closeData=hisData.GetClose();
978
+ var highData=hisData.GetHigh();
979
+ var lowData=hisData.GetLow();
980
+
981
+ //HJ_1:=REF(LOW,1);
982
+ var hj_1=HQIndexFormula.REF(lowData,1);
983
+
984
+ //HJ_2:=SMA(ABS(LOW-HJ_1),13,1)/SMA(MAX(LOW-HJ_1,0),13,1)*100;
985
+ var hj_2=HQIndexFormula.ARRAY_MULTIPLY(
986
+ HQIndexFormula.ARRAY_DIVIDE(
987
+ HQIndexFormula.SMA(HQIndexFormula.ABS(HQIndexFormula.ARRAY_SUBTRACT(lowData,hj_1)),13,1),
988
+ HQIndexFormula.SMA(HQIndexFormula.MAX(HQIndexFormula.ARRAY_SUBTRACT(lowData,hj_1),0),13,1)
989
+ ),
990
+ 100
991
+ );
992
+
993
+ //HJ_3:=EMA(IF(CLOSE*1.2,HJ_2*13,HJ_2/13),13);
994
+ var hj_3=HQIndexFormula.EMA(
995
+ HQIndexFormula.ARRAY_IF(HQIndexFormula.ARRAY_MULTIPLY(closeData,1.2),HQIndexFormula.ARRAY_MULTIPLY(hj_2,13),HQIndexFormula.ARRAY_DIVIDE(hj_2,13)),
996
+ 13
997
+ );
998
+
999
+ //HJ_4:=LLV(LOW,34);
1000
+ var hj_4=HQIndexFormula.LLV(lowData,34);
1001
+
1002
+ //HJ_5:=HHV(HJ_3,34);
1003
+ var hj_5=HQIndexFormula.HHV(hj_3,34);
1004
+
1005
+ //HJ_6:=IF(LLV(LOW,56),1,0);
1006
+ var hj_6=HQIndexFormula.ARRAY_IF(HQIndexFormula.LLV(lowData,56),1,0);
1007
+
1008
+ //HJ_7:=EMA(IF(LOW<=HJ_4,(HJ_3+HJ_5*2)/2,0),3)/618*HJ_6;
1009
+ //hj_7_temp=(HJ_3+HJ_5*2)/2,0) 太长了 这部分单独算下
1010
+ var hj_7_temp=HQIndexFormula.ARRAY_DIVIDE(HQIndexFormula.ARRAY_ADD(hj_3,HQIndexFormula.ARRAY_MULTIPLY(hj_5,2)),2);
1011
+
1012
+ var hj_7=HQIndexFormula.ARRAY_MULTIPLY(
1013
+ HQIndexFormula.ARRAY_DIVIDE(
1014
+ HQIndexFormula.EMA(
1015
+ HQIndexFormula.ARRAY_IF(HQIndexFormula.ARRAY_LTE(lowData,hj_4),hj_7_temp,0),
1016
+ 3
1017
+ ),
1018
+ 618
1019
+ ),
1020
+ hj_6
1021
+ );
1022
+
1023
+ //HJ_8:=HJ_7>REF(HJ_7,1);
1024
+ var hj_8=HQIndexFormula.ARRAY_GT(hj_7,HQIndexFormula.REF(hj_7,1));
1025
+
1026
+ //HJ_9:=REF(LLV(LOW,100),3);
1027
+ var hj_9=HQIndexFormula.REF(HQIndexFormula.LLV(lowData,100),3);
1028
+
1029
+ //HJ_10:=REFDATE(HJ_9,DATE); 用当日的数据 产生数组
1030
+ var hj_10=HQIndexFormula.REFDATE(hj_9,-1);
1031
+
1032
+ //HJ_11:=LOW=HJ_10;
1033
+ var hj_11=HQIndexFormula.ARRAY_EQ(lowData,hj_10);
1034
+
1035
+ //HJ_12:=HJ_8 AND HJ_11;
1036
+ var hj_12=HQIndexFormula.ARRAY_AND(hj_8,hj_11);
1037
+
1038
+ var buyData=null;
1039
+ paint[0].Data.Data=hj_12;
1040
+
1041
+ var titleIndex=windowIndex+1;
1042
+
1043
+ for(var i in paint)
1044
+ {
1045
+ hqChart.TitlePaint[titleIndex].Data[i]=new DynamicTitleData(paint[i].Data,this.Index[i].Name,this.Index[i].LineColor);
1046
+ }
1047
+
1048
+ hqChart.TitlePaint[titleIndex].Title=this.FormatIndexTitle();
1049
+
1050
+ return true;
1051
+ }
1052
+ }
1053
+
1054
+
1055
+
1056
+ ////////////////////////////////////////////////////////////////////////////////////////////////
1057
+ // 指标计算方法
1058
+ //
1059
+ //
1060
+ //
1061
+
1062
+ function HQIndexFormula()
1063
+ {
1064
+
1065
+ }
1066
+
1067
+ //指数平均数指标 EMA(close,10)
1068
+ HQIndexFormula.EMA=function(data,dayCount)
1069
+ {
1070
+ var result = [];
1071
+
1072
+ var offset=0;
1073
+ if (offset>=data.length) return result;
1074
+
1075
+ //取首个有效数据
1076
+ for(;offset<data.length;++offset)
1077
+ {
1078
+ if (data[offset]!=null && !isNaN(data[offset]))
1079
+ break;
1080
+ }
1081
+
1082
+ var p1Index=offset;
1083
+ var p2Index=offset+1;
1084
+
1085
+ result[p1Index]=data[p1Index];
1086
+ for(var i=offset+1;i<data.length;++i,++p1Index,++p2Index)
1087
+ {
1088
+ result[p2Index]=((2*data[p2Index]+(dayCount-1)*result[p1Index]))/(dayCount+1);
1089
+ }
1090
+
1091
+ return result;
1092
+ }
1093
+
1094
+ HQIndexFormula.SMA=function(data,n,m)
1095
+ {
1096
+ var result = [];
1097
+
1098
+ var i=0;
1099
+ var lastData=null;
1100
+ for(;i<data.length; ++i)
1101
+ {
1102
+ if (data[i]==null || isNaN(data[i])) continue;
1103
+ lastData=data[i];
1104
+ result[i]=lastData; //第一天的数据
1105
+ break;
1106
+ }
1107
+
1108
+ for(++i;i<data.length;++i)
1109
+ {
1110
+ result[i]=(m*data[i]+(n-m)*lastData)/n;
1111
+ lastData=result[i];
1112
+ }
1113
+
1114
+ return result;
1115
+ }
1116
+
1117
+
1118
+ /*
1119
+ 求动态移动平均.
1120
+ 用法: DMA(X,A),求X的动态移动平均.
1121
+ 算法: 若Y=DMA(X,A)则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1.
1122
+ 例如:DMA(CLOSE,VOL/CAPITAL)表示求以换手率作平滑因子的平均价
1123
+ */
1124
+ HQIndexFormula.DMA=function(data,data2)
1125
+ {
1126
+ var result = [];
1127
+ if (data.length<0 || data.length!=data2.length) return result;
1128
+
1129
+ var index=0;
1130
+ for(;index<data.length;++index)
1131
+ {
1132
+ if (data[index]!=null && !isNaN(data[index]) && data2[index]!=null && !isNaN(data2[index]))
1133
+ {
1134
+ result[index]=data[index];
1135
+ break;
1136
+ }
1137
+ }
1138
+
1139
+ for(index=index+1;index<data.length;++index)
1140
+ {
1141
+ if (data[index]==null || data2[index]==null)
1142
+ result[index]=null;
1143
+ else
1144
+ {
1145
+ if (data[index]<1)
1146
+ result[index]=(data2[index]*data[index])+(1-data2[index])*result[index-1];
1147
+ else
1148
+ result[index]= data[index];
1149
+ }
1150
+ }
1151
+
1152
+ return result;
1153
+ }
1154
+
1155
+
1156
+ HQIndexFormula.HHV=function(data,n)
1157
+ {
1158
+ var result = [];
1159
+ if (n>data.length) return result;
1160
+
1161
+ var max=-10000;
1162
+ for(var i=n,j=0;i<data.length;++i,++j)
1163
+ {
1164
+ if(i<n+max)
1165
+ {
1166
+ max=data[i]<data[max]?max:i;
1167
+ }
1168
+ else
1169
+ {
1170
+ for(j=(max=i-n+1)+1;j<=i;++j)
1171
+ {
1172
+ if(data[j]>data[max])
1173
+ max = j;
1174
+ }
1175
+ }
1176
+
1177
+ result[i] = data[max];
1178
+ }
1179
+
1180
+ return result;
1181
+ }
1182
+
1183
+ HQIndexFormula.LLV=function(data,n)
1184
+ {
1185
+ var result = [];
1186
+ if (n>data.length) return result;
1187
+
1188
+ var min=-10000;
1189
+
1190
+ for(var i=n;i<data.length;++i,++j)
1191
+ {
1192
+ if(i<n+min)
1193
+ {
1194
+ min=data[i]>data[min]?min:i;
1195
+ }
1196
+ else
1197
+ {
1198
+ for(var j=(min=i-n+1)+1;j<=i;++j)
1199
+ {
1200
+ if(data[j]<data[min])
1201
+ min = j;
1202
+ }
1203
+ }
1204
+ result[i] = data[min];
1205
+ }
1206
+
1207
+ return result;
1208
+ }
1209
+
1210
+ HQIndexFormula.REF=function(data,n)
1211
+ {
1212
+ var result=[];
1213
+
1214
+ if (data.length<=0) return result;
1215
+ if (n>=data.length) return result;
1216
+
1217
+ result=data.slice(0,data.length-n);
1218
+
1219
+ for(var i=0;i<n;++i)
1220
+ result.unshift(null);
1221
+
1222
+ return result;
1223
+ }
1224
+
1225
+ HQIndexFormula.REFDATE=function(data,n)
1226
+ {
1227
+ var result=[];
1228
+
1229
+ if (data.length<=0) return result;
1230
+
1231
+ //暂时写死取最后一个
1232
+ n=data.length-1;
1233
+ for(var i in data)
1234
+ {
1235
+ result[i]=data[n];
1236
+ }
1237
+
1238
+ return result;
1239
+ }
1240
+
1241
+
1242
+
1243
+ HQIndexFormula.SUM=function(data,n)
1244
+ {
1245
+ var result=[];
1246
+
1247
+ if (n==0)
1248
+ {
1249
+ result[0]=data[0];
1250
+
1251
+ for (var i=1; i<data.length; ++i)
1252
+ {
1253
+ result[i] = result[i-1]+data[i];
1254
+ }
1255
+ }
1256
+ else
1257
+ {
1258
+
1259
+ for(var i=n-1,j=0;i<data.length;++i,++j)
1260
+ {
1261
+ for(var k=0;k<n;++k)
1262
+ {
1263
+ if (k==0) result[i]=data[k+j];
1264
+ else result[i]+=data[k+j];
1265
+ }
1266
+ }
1267
+ }
1268
+
1269
+ return result;
1270
+ }
1271
+
1272
+ //两个数组相减
1273
+ HQIndexFormula.ARRAY_SUBTRACT=function(data,data2)
1274
+ {
1275
+ var result=[];
1276
+ var IsNumber=typeof(data2)=="number";
1277
+ if (IsNumber)
1278
+ {
1279
+ for(var i in data)
1280
+ {
1281
+ if (data[i]==null || isNaN(data[i]))
1282
+ result[i]=null;
1283
+ else
1284
+ result[i]=data[i]-data2;
1285
+ }
1286
+ }
1287
+ else
1288
+ {
1289
+ var count=Math.max(data.length,data2.length)
1290
+
1291
+ for(var i=0;i<count;++i)
1292
+ {
1293
+ if (i<data.length && i<data2.length)
1294
+ {
1295
+ if (data[i]==null || data2[i]==null) result[i]=null;
1296
+ else result[i]=data[i]-data2[i];
1297
+ }
1298
+ else
1299
+ result[i]=null;
1300
+ }
1301
+ }
1302
+
1303
+ return result;
1304
+ }
1305
+
1306
+ //数组 data>data2比较 返回 0/1 数组
1307
+ HQIndexFormula.ARRAY_GT=function(data,data2)
1308
+ {
1309
+ var result=[];
1310
+ var IsNumber=typeof(data2)=="number";
1311
+ if (IsNumber)
1312
+ {
1313
+ for(var i in data)
1314
+ {
1315
+ result[i]=(data[i]>data2 ? 1:0);
1316
+ }
1317
+ }
1318
+ else
1319
+ {
1320
+ var count=Math.max(data.length,data2.length)
1321
+
1322
+ for(var i=0;i<count;++i)
1323
+ {
1324
+ if (i<data.length && i<data2.length)
1325
+ result[i]=data[i]>data2[i] ? 1:0;
1326
+ else
1327
+ result[i]=null;
1328
+ }
1329
+ }
1330
+
1331
+ return result;
1332
+ }
1333
+
1334
+ //数组 data>=data2比较 返回 0/1 数组
1335
+ HQIndexFormula.ARRAY_GTE=function(data,data2)
1336
+ {
1337
+ var result=[];
1338
+ var IsNumber=typeof(data2)=="number";
1339
+ if (IsNumber)
1340
+ {
1341
+ for(var i in data)
1342
+ {
1343
+ result[i]=(data[i]>=data2 ? 1:0);
1344
+ }
1345
+ }
1346
+ else
1347
+ {
1348
+ var count=Math.max(data.length,data2.length)
1349
+
1350
+ for(var i=0;i<count;++i)
1351
+ {
1352
+ if (i<data.length && i<data2.length)
1353
+ result[i]=data[i]>=data2[i] ? 1:0;
1354
+ else
1355
+ result[i]=null;
1356
+ }
1357
+ }
1358
+
1359
+ return result;
1360
+ }
1361
+
1362
+ //数组 data<data2比较 返回 0/1 数组
1363
+ HQIndexFormula.ARRAY_LT=function(data,data2)
1364
+ {
1365
+ var result=[];
1366
+ var IsNumber=typeof(data2)=="number";
1367
+ if (IsNumber)
1368
+ {
1369
+ for(var i in data)
1370
+ {
1371
+ result[i]=(data[i]<data2 ? 1:0);
1372
+ }
1373
+ }
1374
+ else
1375
+ {
1376
+ var count=Math.max(data.length,data2.length)
1377
+
1378
+ for(var i=0;i<count;++i)
1379
+ {
1380
+ if (i<data.length && i<data2.length)
1381
+ result[i]=data[i]<data2[i] ? 1:0;
1382
+ else
1383
+ result[i]=null;
1384
+ }
1385
+ }
1386
+
1387
+ return result;
1388
+ }
1389
+
1390
+ //数组 data<=data2比较 返回 0/1 数组
1391
+ HQIndexFormula.ARRAY_LTE=function(data,data2)
1392
+ {
1393
+ var result=[];
1394
+ var IsNumber=typeof(data2)=="number";
1395
+ if (IsNumber)
1396
+ {
1397
+ for(var i in data)
1398
+ {
1399
+ result[i]=(data[i]<=data2 ? 1:0);
1400
+ }
1401
+ }
1402
+ else
1403
+ {
1404
+ var count=Math.max(data.length,data2.length)
1405
+
1406
+ for(var i=0;i<count;++i)
1407
+ {
1408
+ if (i<data.length && i<data2.length)
1409
+ result[i]=data[i]<=data2[i] ? 1:0;
1410
+ else
1411
+ result[i]=null;
1412
+ }
1413
+ }
1414
+
1415
+ return result;
1416
+ }
1417
+
1418
+ //数组 data==data2比较 返回 0/1 数组
1419
+ HQIndexFormula.ARRAY_EQ=function(data,data2)
1420
+ {
1421
+ var result=[];
1422
+ var IsNumber=typeof(data2)=="number";
1423
+ if (IsNumber)
1424
+ {
1425
+ for(var i in data)
1426
+ {
1427
+ result[i]=(data[i]==data2 ? 1:0);
1428
+ }
1429
+ }
1430
+ else
1431
+ {
1432
+ var count=Math.max(data.length,data2.length)
1433
+
1434
+ for(var i=0;i<count;++i)
1435
+ {
1436
+ if (i<data.length && i<data2.length)
1437
+ result[i]=(data[i]==data2[i] ? 1:0);
1438
+ else
1439
+ result[i]=null;
1440
+ }
1441
+ }
1442
+
1443
+ return result;
1444
+ }
1445
+
1446
+ HQIndexFormula.ARRAY_IF=function(data,trueData,falseData)
1447
+ {
1448
+ var result=[];
1449
+ var IsNumber=[typeof(trueData)=="number",typeof(falseData)=="number"];
1450
+ for(var i in data)
1451
+ {
1452
+ if (data[i])
1453
+ {
1454
+ if (IsNumber[0]) result[i]=trueData;
1455
+ else result[i]=trueData[i];
1456
+ }
1457
+ else
1458
+ {
1459
+ if (IsNumber[1]) result[i]=falseData;
1460
+ else result[i]=falseData[i];
1461
+ }
1462
+ }
1463
+
1464
+ return result;
1465
+ }
1466
+
1467
+ HQIndexFormula.ARRAY_AND=function(data,data2)
1468
+ {
1469
+ var result=[];
1470
+ var IsNumber=typeof(data2)=="number";
1471
+ if (IsNumber)
1472
+ {
1473
+ for(var i in data)
1474
+ {
1475
+ result[i]=(data[i] && data2? 1:0);
1476
+ }
1477
+ }
1478
+ else
1479
+ {
1480
+ var count=Math.max(data.length,data2.length)
1481
+
1482
+ for(var i=0;i<count;++i)
1483
+ {
1484
+ if (i<data.length && i<data2.length)
1485
+ result[i]=(data[i] && data2[i] ? 1:0);
1486
+ else
1487
+ result[i]=0;
1488
+ }
1489
+ }
1490
+
1491
+ return result;
1492
+ }
1493
+ HQIndexFormula.ARRAY_OR=function(data, data2)
1494
+ {
1495
+ var result=[];
1496
+ var IsNumber=typeof(data2)=="number";
1497
+ if (IsNumber)
1498
+ {
1499
+ for(var i in data)
1500
+ {
1501
+ result[i]=(data[i] || data2? 1:0);
1502
+ }
1503
+ }
1504
+ else
1505
+ {
1506
+ var count=Math.max(data.length,data2.length)
1507
+
1508
+ for(var i=0;i<count;++i)
1509
+ {
1510
+ if (i < data.length && data[i])
1511
+ {
1512
+ result[i] = 1;
1513
+ continue;
1514
+ }
1515
+ if (i < data2.length && data2[i])
1516
+ {
1517
+ result[i] = 1;
1518
+ continue;
1519
+ }
1520
+ result[i] = 0;
1521
+ }
1522
+ }
1523
+
1524
+ return result;
1525
+ }
1526
+ //数组相乘
1527
+ //支持多个参数累乘 如:HQIndexFormula.ARRAY_MULTIPLY(data,data2,data3,data3) =data*data2*data3*data4
1528
+ HQIndexFormula.ARRAY_MULTIPLY=function(data,data2)
1529
+ {
1530
+ if (arguments.length==2)
1531
+ {
1532
+ var result=[];
1533
+ var IsNumber=typeof(data2)=="number";
1534
+ if (IsNumber)
1535
+ {
1536
+ for(var i in data)
1537
+ {
1538
+ if (data[i]==null || isNaN(data[i]))
1539
+ result[i]=null;
1540
+ else
1541
+ result[i]=data[i]*data2;
1542
+ }
1543
+ }
1544
+ else
1545
+ {
1546
+ var count=Math.max(data.length,data2.length);
1547
+ for(var i=0;i<count;++i)
1548
+ {
1549
+ if (i<data.length && i<data2.length)
1550
+ result[i]=data[i]*data2[i];
1551
+ else
1552
+ result[i]=null;
1553
+ }
1554
+ }
1555
+
1556
+ return result;
1557
+ }
1558
+
1559
+ var result=HQIndexFormula.ARRAY_MULTIPLY(arguments[0],arguments[1]);
1560
+
1561
+ for(var i=2;i<arguments.length;++i)
1562
+ {
1563
+ result=HQIndexFormula.ARRAY_MULTIPLY(result,arguments[i]);
1564
+ }
1565
+
1566
+ return result;
1567
+ }
1568
+
1569
+ //数组相除
1570
+ HQIndexFormula.ARRAY_DIVIDE=function(data,data2)
1571
+ {
1572
+ var result=[];
1573
+ var IsNumber=typeof(data2)=="number";
1574
+ if (IsNumber)
1575
+ {
1576
+ for(var i in data)
1577
+ {
1578
+ result[i]=data[i]/data2;
1579
+ }
1580
+ }
1581
+ else
1582
+ {
1583
+ var count=Math.max(data.length,data2.length);
1584
+ for(var i=0;i<count;++i)
1585
+ {
1586
+ if (i<data.length && i<data2.length)
1587
+ {
1588
+ if(data[i]==null || data2[i]==null || isNaN(data[i]) || isNaN(data2[i]))
1589
+ result[i]=null;
1590
+ else if (data2[i]==0)
1591
+ result[i]=null;
1592
+ else
1593
+ result[i]=data[i]/data2[i];
1594
+ }
1595
+ else
1596
+ result[i]=null;
1597
+ }
1598
+ }
1599
+
1600
+ return result;
1601
+ }
1602
+
1603
+ //数组相加
1604
+ //支持多个参数累加 如:HQIndexFormula.ARRAY_ADD(data,data2,data3,data3) =data+data2+data3+data4
1605
+ HQIndexFormula.ARRAY_ADD=function(data,data2)
1606
+ {
1607
+ if (arguments.length==2)
1608
+ {
1609
+ var result=[];
1610
+ var IsNumber=typeof(data2)=="number";
1611
+ if (IsNumber)
1612
+ {
1613
+ for(var i in data)
1614
+ {
1615
+ result[i]=data[i]+data2;
1616
+ }
1617
+ }
1618
+ else
1619
+ {
1620
+ var count=Math.max(data.length,data2.length);
1621
+ for(var i=0;i<count;++i)
1622
+ {
1623
+ if (i<data.length && i<data2.length)
1624
+ {
1625
+ if (data[i]==null || data2[i]==null || isNaN(data[i]) || isNaN(data2[i])) result[i]=null
1626
+ else result[i]=data[i]+data2[i];
1627
+ }
1628
+ else
1629
+ {
1630
+ result[i]=null;
1631
+ }
1632
+ }
1633
+ }
1634
+
1635
+ return result;
1636
+ }
1637
+
1638
+ var result=HQIndexFormula.ARRAY_ADD(arguments[0],arguments[1]);
1639
+
1640
+ for(var i=2;i<arguments.length;++i)
1641
+ {
1642
+ result=HQIndexFormula.ARRAY_ADD(result,arguments[i]);
1643
+ }
1644
+
1645
+ return result;
1646
+ }
1647
+
1648
+ HQIndexFormula.MAX=function(data,data2)
1649
+ {
1650
+ var result=[];
1651
+ var IsNumber=typeof(data2)=="number";
1652
+ if (IsNumber)
1653
+ {
1654
+ for(var i in data)
1655
+ {
1656
+ if (data[i]==null) result[i]=null;
1657
+ else result[i]=Math.max(data[i],data2);
1658
+ }
1659
+ }
1660
+ else
1661
+ {
1662
+ var count=Math.max(data.length,data2.length);
1663
+ for(var i=0;i<count;++i)
1664
+ {
1665
+ if (i<data.length && i<data2.length)
1666
+ {
1667
+ if (data[i]==null || data2[i]==null) result[i]=null;
1668
+ else result[i]=Math.max(data[i],data2[i]);
1669
+ }
1670
+ else
1671
+ result[i]=null;
1672
+ }
1673
+ }
1674
+
1675
+ return result;
1676
+ }
1677
+
1678
+ HQIndexFormula.MIN=function(data,data2)
1679
+ {
1680
+ var result=[];
1681
+ var IsNumber=typeof(data2)=="number";
1682
+ if (IsNumber)
1683
+ {
1684
+ for(var i in data)
1685
+ {
1686
+ if (data[i]==null) result[i]=null;
1687
+ else result[i]=Math.min(data[i],data2);
1688
+ }
1689
+ }
1690
+ else
1691
+ {
1692
+ var count=Math.max(data.length,data2.length);
1693
+ for(var i=0;i<count;++i)
1694
+ {
1695
+ if (i<data.length && i<data2.length)
1696
+ {
1697
+ if (data[i]==null || data2[i]==null) result[i]=null;
1698
+ else result[i]=Math.min(data[i],data2[i]);
1699
+ }
1700
+ else
1701
+ result[i]=null;
1702
+ }
1703
+ }
1704
+
1705
+ return result;
1706
+ }
1707
+
1708
+
1709
+ HQIndexFormula.ABS=function(data)
1710
+ {
1711
+ var result=[];
1712
+ for(var i in data)
1713
+ {
1714
+ if (data[i]==null) result[i]=null;
1715
+ else result[i]=Math.abs(data[i]);
1716
+ }
1717
+
1718
+ return result;
1719
+ }
1720
+
1721
+
1722
+ HQIndexFormula.MA=function(data,dayCount)
1723
+ {
1724
+ var result=[];
1725
+
1726
+ for (var i = 0, len = data.length; i < len; i++)
1727
+ {
1728
+ if (i < dayCount)
1729
+ {
1730
+ result[i]=null;
1731
+ continue;
1732
+ }
1733
+
1734
+ var sum = 0;
1735
+ for (var j = 0; j < dayCount; j++)
1736
+ {
1737
+ sum += data[i - j];
1738
+ }
1739
+ result[i]=sum / dayCount;
1740
+ }
1741
+ return result;
1742
+ }
1743
+
1744
+ /*
1745
+ 加权移动平均
1746
+ 返回加权移动平均
1747
+ 用法:EXPMA(X,M):X的M日加权移动平均
1748
+ EXPMA[i]=buffer[i]*para+(1-para)*EXPMA[i-1] para=2/(1+__para)
1749
+ */
1750
+ HQIndexFormula.EXPMA=function(data,dayCount)
1751
+ {
1752
+ var result=[];
1753
+ if (dayCount>=data.length) return result;
1754
+
1755
+ var i=dayCount;
1756
+ for(;i<data.length;++i) //获取第1个有效数据
1757
+ {
1758
+ if (data[i]!=null)
1759
+ {
1760
+ result[i]=data[i];
1761
+ break;
1762
+ }
1763
+ }
1764
+
1765
+ for (i=i+1; i < data.length; ++i)
1766
+ {
1767
+ if (result[i-1]!=null && data[i]!=null)
1768
+ result[i]=(2*data[i]+(dayCount-1)*result[i-1])/(dayCount+1);
1769
+ else if (result[i-1]!=null)
1770
+ result[i]=result[i-1];
1771
+ }
1772
+
1773
+ return result;
1774
+ }
1775
+
1776
+ //加权平滑平均,MEMA[i]=SMA[i]*para+(1-para)*SMA[i-1] para=2/(1+__para)
1777
+ HQIndexFormula.EXPMEMA=function(data,dayCount)
1778
+ {
1779
+ var result=[];
1780
+ if (dayCount>=data.length) return result;
1781
+
1782
+ var index=0;
1783
+ for(;index<data.length;++index)
1784
+ {
1785
+ if (data[index] && !isNaN(data[index])) break;
1786
+ }
1787
+
1788
+ var sum=0;
1789
+ for(var i=0; index<data.length && i<dayCount;++i, ++index)
1790
+ {
1791
+ if (data[index] && !isNaN(data[index]))
1792
+ sum+=data[index];
1793
+ else
1794
+ sum+=data[index-1];
1795
+ }
1796
+
1797
+ result[index-1]=sum/dayCount;
1798
+ for(;index<data.length;++index)
1799
+ {
1800
+ if(result[index-1]!=null && data[index]!=null)
1801
+ result[index]=(2*data[index]+(dayCount-1)*result[index-1])/(dayCount+1);
1802
+ else if(result[index-1]!=null)
1803
+ result[index] = result[index-1];
1804
+ }
1805
+
1806
+ return result;
1807
+ }
1808
+
1809
+
1810
+ HQIndexFormula.STD=function(data,n)
1811
+ {
1812
+ var result=[];
1813
+
1814
+ var total=0;
1815
+ var averageData=[]; //平均值
1816
+ for(var i=n-1;i<data.length;++i)
1817
+ {
1818
+ total=0;
1819
+ for(var j=0;j<n;++j)
1820
+ {
1821
+ total+=data[i-j];
1822
+ }
1823
+
1824
+ averageData[i]=total/n;
1825
+ }
1826
+
1827
+ for(var i=n-1;i<data.length;++i)
1828
+ {
1829
+ total=0;
1830
+ for(var j=0;j<n;++j)
1831
+ {
1832
+ total+=Math.pow((data[i-j]-averageData[i]),2);
1833
+ }
1834
+
1835
+ result[i]=Math.sqrt(total/n);
1836
+ }
1837
+
1838
+
1839
+ return result;
1840
+ }
1841
+
1842
+ //平均绝对方差
1843
+ HQIndexFormula.AVEDEV=function(data,n)
1844
+ {
1845
+ var result=[];
1846
+
1847
+ var total=0;
1848
+ var averageData=[]; //平均值
1849
+ for(var i=n-1;i<data.length;++i)
1850
+ {
1851
+ total=0;
1852
+ for(var j=0;j<n;++j)
1853
+ {
1854
+ total+=data[i-j];
1855
+ }
1856
+
1857
+ averageData[i]=total/n;
1858
+ }
1859
+
1860
+ for(var i=n-1;i<data.length;++i)
1861
+ {
1862
+ total=0;
1863
+ for(var j=0;j<n;++j)
1864
+ {
1865
+ total+=Math.abs(data[i-j]-averageData[i]);
1866
+ }
1867
+
1868
+ result[i]=total/n;
1869
+ }
1870
+
1871
+
1872
+ return result;
1873
+ }
1874
+
1875
+ HQIndexFormula.COUNT=function(data,n)
1876
+ {
1877
+ var result=[];
1878
+
1879
+
1880
+ for(var i=n-1;i<data.length;++i)
1881
+ {
1882
+ var count=0;
1883
+ for(var j=0;j<n;++j)
1884
+ {
1885
+ if (data[i-j]) ++count;
1886
+ }
1887
+
1888
+ result[i]=count;
1889
+ }
1890
+
1891
+ return result;
1892
+ }
1893
+
1894
+ //上穿
1895
+ HQIndexFormula.CROSS=function(data,data2)
1896
+ {
1897
+ var result=[];
1898
+ if (data.length!=data2.length) return result=[];
1899
+
1900
+ var index=0;
1901
+ for(;index<data.length;++index)
1902
+ {
1903
+ if (data[index]!=null && !isNaN(data[index]) && data2[index]!=null && isNaN(data2[index]))
1904
+ break;
1905
+ }
1906
+
1907
+ for(++index;index<data.length;++index)
1908
+ {
1909
+ result[index]= (data[index]>data2[index]&&data[index-1]<data2[index-1])?1:0;
1910
+ }
1911
+
1912
+ return result;
1913
+ }
1914
+
1915
+ //累乘
1916
+ HQIndexFormula.MULAR=function(data,n)
1917
+ {
1918
+ var result=[];
1919
+ if(data.length<n) return result;
1920
+
1921
+ var index=n;
1922
+ for(;index<data.length;++index)
1923
+ {
1924
+ if (data[index]!=null && !isNaN(data[index]))
1925
+ {
1926
+ result[index]=data[index];
1927
+ break;
1928
+ }
1929
+ }
1930
+
1931
+ for(++index;index<data.length;++index)
1932
+ {
1933
+ result[index]=result[index-1]*data[index];
1934
+ }
1935
+
1936
+ return result;
1937
+ }
1938
+
1939
+
1940
+ HQIndexFormula.STICKLINE=function(data,price1,price2)
1941
+ {
1942
+ var result=[];
1943
+ if(data.length<=0) return result;
1944
+
1945
+ var IsNumber=typeof(price1)=="number";
1946
+ var IsNumber2=typeof(price2)=="number";
1947
+
1948
+
1949
+ for(var i in data)
1950
+ {
1951
+ result[i]=null;
1952
+ if (isNaN(data[i])) continue;
1953
+ if (!data[i]) continue;
1954
+
1955
+ if (IsNumber && IsNumber2)
1956
+ {
1957
+ result[i]={Value:price1,Value2:price2};
1958
+ }
1959
+ else if (IsNumber && !IsNumber2)
1960
+ {
1961
+ if (isNaN(price2[i])) continue;
1962
+ result[i]={Value:price1,Value2:price2[i]};
1963
+ }
1964
+ else if (!IsNumber && IsNumber2)
1965
+ {
1966
+ if (isNaN(price1[i])) continue;
1967
+ result[i]={Value:price1[i],Value2:price2};
1968
+ }
1969
+ else
1970
+ {
1971
+ if (isNaN(price1[i]) || isNaN(price2[i])) continue;
1972
+ result[i]={Value:price1[i],Value2:price2[i]};
1973
+ }
1974
+ }
1975
+
1976
+ return result;
1977
+ }
1978
+
1979
+
1980
+
1981
+ /*
1982
+ 中国地图
1983
+ */
1984
+
1985
+
1986
+ function ChartChinaMap()
1987
+ {
1988
+ this.newMethod=IChartPainting; //派生
1989
+ this.newMethod();
1990
+ delete this.newMethod;
1991
+
1992
+ this.ImageData=null;
1993
+ this.Left;
1994
+ this.Top;
1995
+ this.Width;
1996
+ this.Height;
1997
+ this.ImageWidth;
1998
+ this.ImageHeight;
1999
+
2000
+ this.DefaultColor=[217,222,239];
2001
+
2002
+ this.Color=
2003
+ [
2004
+ {Name:'海南', Color:'rgb(217,222,223)'},
2005
+ {Name:'内蒙古', Color:'rgb(217,222,225)'},
2006
+ {Name:'新疆', Color:'rgb(217,222,226)'},
2007
+ {Name:'青海', Color:'rgb(217,222,227)'},
2008
+ {Name:'西藏', Color:'rgb(217,222,228)'},
2009
+ {Name:'云南', Color:'rgb(217,222,229)'},
2010
+ {Name:'黑龙江', Color:'rgb(217,222,230)'},
2011
+ {Name:'吉林', Color:'rgb(217,222,231)'},
2012
+ {Name:'辽宁', Color:'rgb(217,222,232)'},
2013
+ {Name:'河北', Color:'rgb(217,222,233)'},
2014
+ {Name:'山东', Color:'rgb(217,222,234)'},
2015
+ {Name:'江苏', Color:'rgb(217,222,235)'},
2016
+ {Name:'浙江', Color:'rgb(217,222,236)'},
2017
+ {Name:'福建', Color:'rgb(217,222,237)'},
2018
+ {Name:'广东', Color:'rgb(217,222,238)'},
2019
+ {Name:'广西', Color:'rgb(217,222,239)'},
2020
+ {Name:'贵州', Color:'rgb(217,222,240)'},
2021
+ {Name:'湖南', Color:'rgb(217,222,241)'},
2022
+ {Name:'江西', Color:'rgb(217,222,242)'},
2023
+ {Name:'安徽', Color:'rgb(217,222,243)'},
2024
+ {Name:'湖北', Color:'rgb(217,222,244)'},
2025
+ {Name:'重庆', Color:'rgb(217,222,245)'},
2026
+ {Name:'四川', Color:'rgb(217,222,246)'},
2027
+ {Name:'甘肃', Color:'rgb(217,222,247)'},
2028
+ {Name:'陕西', Color:'rgb(217,222,248)'},
2029
+ {Name:'山西', Color:'rgb(217,222,249)'},
2030
+ {Name:'河南', Color:'rgb(217,222,250)'}
2031
+ ];
2032
+
2033
+ this.Draw=function()
2034
+ {
2035
+ let left=this.ChartBorder.GetLeft()+1;
2036
+ let right=this.ChartBorder.GetRight()-1;
2037
+ let top=this.ChartBorder.GetTop()+1;
2038
+ let bottom=this.ChartBorder.GetBottom()-1;
2039
+ let width=this.ChartBorder.GetWidth()-2;
2040
+ let height=this.ChartBorder.GetHeight()-2;
2041
+
2042
+ let imageWidth=CHINA_MAP_IMAGE.width;
2043
+ let imageHeight=CHINA_MAP_IMAGE.height;
2044
+
2045
+ let drawImageWidth=imageWidth;
2046
+ let drawImageHeight=imageHeight;
2047
+
2048
+ if (height<drawImageHeight || width<drawImageWidth)
2049
+ {
2050
+ this.ImageData=null;
2051
+ return;
2052
+ }
2053
+
2054
+ if (this.Left!=left || this.Top!=top || this.Width!=width || this.Height!=height || this.ImageWidth!=imageWidth || this.ImageHeight!=imageHeight)
2055
+ {
2056
+ this.ImageData=null;
2057
+
2058
+ this.ImageWidth=imageWidth;
2059
+ this.ImageHeight=imageHeight;
2060
+ this.Left=left;
2061
+ this.Top=top;
2062
+ this.Width=width;
2063
+ this.Height=height;
2064
+
2065
+ JSConsole.Chart.Log(imageWidth,imageHeight);
2066
+ }
2067
+
2068
+ if (this.ImageData==null)
2069
+ {
2070
+ this.Canvas.drawImage(CHINA_MAP_IMAGE,0,0,imageWidth,imageHeight,left,top,drawImageWidth,drawImageHeight);
2071
+ this.ImageData=this.Canvas.getImageData(left,top,drawImageWidth,drawImageHeight);
2072
+
2073
+ let defaultColorSet=new Set(); //默认颜色填充的色块
2074
+ let colorMap=new Map(); //定义颜色填充的色块
2075
+
2076
+ let nameMap=new Map();
2077
+ if (this.Data.length>0)
2078
+ {
2079
+ for(let i in this.Data)
2080
+ {
2081
+ let item=this.Data[i];
2082
+ nameMap.set(item.Name,item.Color)
2083
+ }
2084
+ }
2085
+
2086
+ JSConsole.Chart.Log(this.Data);
2087
+ for(let i in this.Color)
2088
+ {
2089
+ let item=this.Color[i];
2090
+ if (nameMap.has(item.Name))
2091
+ {
2092
+ colorMap.set(item.Color,nameMap.get(item.Name));
2093
+ }
2094
+ else
2095
+ {
2096
+ defaultColorSet.add(item.Color);
2097
+ }
2098
+ }
2099
+
2100
+ var color;
2101
+ for (let i=0;i<this.ImageData.data.length;i+=4)
2102
+ {
2103
+ color='rgb('+ this.ImageData.data[i] + ',' + this.ImageData.data[i+1] + ',' + this.ImageData.data[i+2] + ')';
2104
+
2105
+ if (defaultColorSet.has(color))
2106
+ {
2107
+ this.ImageData.data[i]=this.DefaultColor[0];
2108
+ this.ImageData.data[i+1]=this.DefaultColor[1];
2109
+ this.ImageData.data[i+2]=this.DefaultColor[2];
2110
+ }
2111
+ else if (colorMap.has(color))
2112
+ {
2113
+ let colorValue=colorMap.get(color);
2114
+ this.ImageData.data[i]=colorValue[0];
2115
+ this.ImageData.data[i+1]=colorValue[1];
2116
+ this.ImageData.data[i+2]=colorValue[2];
2117
+ }
2118
+ }
2119
+ this.Canvas.clearRect(left,top,drawImageWidth,drawImageHeight);
2120
+ this.Canvas.putImageData(this.ImageData,left,top,0,0,drawImageWidth,drawImageHeight);
2121
+ }
2122
+ else
2123
+ {
2124
+ this.Canvas.putImageData(this.ImageData,left,top,0,0,drawImageWidth,drawImageHeight);
2125
+ }
2126
+ }
2127
+ }
2128
+
2129
+
2130
+
2131
+ /*
2132
+ 饼图
2133
+ */
2134
+ function ChartPie()
2135
+ {
2136
+ this.newMethod=IChartPainting; //派生
2137
+ this.newMethod();
2138
+ delete this.newMethod;
2139
+
2140
+ this.Radius = 100; //半径默认值
2141
+ this.Distance = 30; //指示线超出圆饼的距离
2142
+ this.txtLine = 20; // 文本下划线
2143
+ this.paddingX = 20 / 3;// 设置文本的移动
2144
+
2145
+ // return;
2146
+ this.Draw=function()
2147
+ {
2148
+ if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0)) return this.DrawEmptyData();
2149
+
2150
+ let left=this.ChartBorder.GetLeft();
2151
+ let right=this.ChartBorder.GetRight();
2152
+ let top=this.ChartBorder.GetTop();
2153
+ let bottom=this.ChartBorder.GetBottom();
2154
+ let width=this.ChartBorder.GetWidth();
2155
+ let height=this.ChartBorder.GetHeight();
2156
+
2157
+ if(isNaN(this.Radius)){
2158
+ let str = this.Radius.replace("%","");
2159
+ str = str/100;
2160
+ if(width >= height){
2161
+ this.Radius = str*height;
2162
+ }
2163
+ if(width < height) this.Radius = str*width;
2164
+ }
2165
+
2166
+
2167
+ this.Canvas.save();
2168
+ this.Canvas.translate(width/2,height/2);
2169
+
2170
+ let totalValue=0; //求和
2171
+ for(let i in this.Data.Data)
2172
+ {
2173
+ totalValue += this.Data.Data[i].Value;
2174
+ }
2175
+ let start = 0;
2176
+ let end = 0;
2177
+ //画饼图
2178
+ for(let i in this.Data.Data)
2179
+ {
2180
+ let item =this.Data.Data[i];
2181
+ let rate=(item.Value/totalValue).toFixed(2); //占比
2182
+ //JSConsole.Chart.Log('[ChartPie::Draw]', i, rate, item);
2183
+
2184
+ // 绘制扇形
2185
+ this.Canvas.beginPath();
2186
+ this.Canvas.moveTo(0,0);
2187
+
2188
+ end += rate*2*Math.PI;//终止角度
2189
+ this.Canvas.strokeStyle = "white";
2190
+ this.Canvas.fillStyle = item.Color;
2191
+ this.Canvas.arc(0,0,this.Radius,start,end);
2192
+ this.Canvas.fill();
2193
+ this.Canvas.closePath();
2194
+ this.Canvas.stroke();
2195
+
2196
+ // 绘制直线
2197
+ this.Canvas.beginPath();
2198
+ this.Canvas.strokeStyle = item.Color;
2199
+ this.Canvas.moveTo(0,0);
2200
+ let x = (this.Radius + this.Distance)*Math.cos(end- (end-start)/2);
2201
+ let y = (this.Radius + this.Distance)*Math.sin(end - (end-start)/2);
2202
+ this.Canvas.lineTo(x,y);
2203
+ // JSConsole.Chart.Log(x,y,"xy")
2204
+
2205
+ // 绘制横线
2206
+ let txtLine = this.txtLine;
2207
+ let paddingX = this.paddingX;
2208
+ this.Canvas.textAlign = 'left';
2209
+ if( end - (end-start)/2 < 1.5*Math.PI && end - (end-start)/2 > 0.5*Math.PI ){
2210
+
2211
+ txtLine = - this.txtLine;
2212
+ paddingX = - this.paddingX;
2213
+ this.Canvas.textAlign = 'right';
2214
+ }
2215
+ this.Canvas.lineTo( x + txtLine, y );
2216
+ this.Canvas.stroke();
2217
+
2218
+ // 写文字
2219
+ if(item.Text){
2220
+ this.Canvas.fillText( item.Text, x + txtLine + paddingX, y );
2221
+ }else{
2222
+ let text = `${item.Name}:${item.Value}`;
2223
+ this.Canvas.fillText( text, x + txtLine + paddingX, y );
2224
+ }
2225
+
2226
+
2227
+ start += rate*2*Math.PI;//起始角度
2228
+ }
2229
+
2230
+ this.Canvas.restore();
2231
+ }
2232
+
2233
+ //空数据
2234
+ this.DrawEmptyData=function()
2235
+ {
2236
+ JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')
2237
+ }
2238
+ }
2239
+
2240
+
2241
+ /*
2242
+ 雷达图
2243
+ */
2244
+ function ChartRadar()
2245
+ {
2246
+ this.newMethod=IChartPainting; //派生
2247
+ this.newMethod();
2248
+ delete this.newMethod;
2249
+
2250
+ this.BorderPoint=[]; //边框点
2251
+ this.DataPoint=[]; //数据点
2252
+ this.CenterPoint={};
2253
+ this.StartAngle=0;
2254
+ this.Color='rgb(198,198,198)';
2255
+ this.AreaColor='rgba(242,154,118,0.4)'; //面积图颜色
2256
+ this.AreaLineColor='rgb(242,154,118)';
2257
+ this.TitleFont=24*GetDevicePixelRatio()+'px 微软雅黑';
2258
+ this.TitleColor='rgb(102,102,102)';
2259
+ this.BGColor = ['rgb(255,255,255)', 'rgb(224,224,224)']//背景色
2260
+
2261
+ this.DrawBorder=function() //画边框
2262
+ {
2263
+ if (this.BorderPoint.length<=0) return;
2264
+
2265
+ this.Canvas.font=this.TitleFont;
2266
+ this.Canvas.strokeStyle = this.Color;
2267
+ const aryBorder=[1,0.8,0.6,0.4,0.2];
2268
+ for (let j in aryBorder)
2269
+ {
2270
+ var rate = aryBorder[j];
2271
+ var isFirstDraw=true;
2272
+ for(let i in this.BorderPoint)
2273
+ {
2274
+ var item=this.BorderPoint[i];
2275
+ item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180) * rate;
2276
+ item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180) * rate;
2277
+ if (isFirstDraw)
2278
+ {
2279
+ this.Canvas.beginPath();
2280
+ this.Canvas.moveTo(item.X,item.Y);
2281
+ isFirstDraw=false;
2282
+ }
2283
+ else
2284
+ {
2285
+ this.Canvas.lineTo(item.X,item.Y);
2286
+ }
2287
+ }
2288
+
2289
+ this.Canvas.closePath();
2290
+ this.Canvas.stroke();
2291
+ this.Canvas.fillStyle = this.BGColor[j%2==0?0:1];
2292
+ this.Canvas.fill();
2293
+ }
2294
+
2295
+ this.Canvas.beginPath();
2296
+ for(let i in this.BorderPoint)
2297
+ {
2298
+ var item=this.BorderPoint[i];
2299
+ item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
2300
+ item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
2301
+ this.Canvas.moveTo(this.CenterPoint.X,this.CenterPoint.Y);
2302
+ this.Canvas.lineTo(item.X,item.Y);
2303
+ this.DrawText(item);
2304
+ }
2305
+ this.Canvas.stroke();
2306
+ }
2307
+
2308
+ this.DrawArea=function()
2309
+ {
2310
+ if (!this.DataPoint || this.DataPoint.length<=0) return;
2311
+
2312
+ this.Canvas.fillStyle = this.AreaColor;
2313
+ this.Canvas.strokeStyle = this.AreaLineColor;
2314
+ this.Canvas.beginPath();
2315
+ var isFirstDraw=true;
2316
+ for(let i in this.DataPoint)
2317
+ {
2318
+ var item=this.DataPoint[i];
2319
+ if (isFirstDraw)
2320
+ {
2321
+ this.Canvas.beginPath();
2322
+ this.Canvas.moveTo(item.X,item.Y);
2323
+ isFirstDraw=false;
2324
+ }
2325
+ else
2326
+ {
2327
+ this.Canvas.lineTo(item.X,item.Y);
2328
+ }
2329
+ }
2330
+
2331
+ this.Canvas.closePath();
2332
+ this.Canvas.fill();
2333
+ this.Canvas.stroke();
2334
+ }
2335
+
2336
+ this.DrawText=function(item)
2337
+ {
2338
+ if (!item.Text) return;
2339
+
2340
+ //JSConsole.Chart.Log(item.Text, item.Angle);
2341
+ this.Canvas.fillStyle = this.TitleColor;
2342
+ var xText = item.X, yText = item.Y;
2343
+
2344
+ //显示每个角度的位置
2345
+ if (item.Angle > 0 && item.Angle < 45) {
2346
+ this.Canvas.textAlign = 'left';
2347
+ this.Canvas.textBaseline = 'middle';
2348
+ xText += 2;
2349
+ }
2350
+ else if (item.Angle >= 0 && item.Angle < 90) {
2351
+ this.Canvas.textAlign = 'left';
2352
+ this.Canvas.textBaseline = 'top';
2353
+ xText += 2;
2354
+ }
2355
+ else if (item.Angle >= 90 && item.Angle < 135) {
2356
+ this.Canvas.textAlign = 'right';
2357
+ this.Canvas.textBaseline = 'top';
2358
+ xText -= 2;
2359
+ }
2360
+ else if (item.Angle >= 135 && item.Angle < 180) {
2361
+ this.Canvas.textAlign = 'right';
2362
+ this.Canvas.textBaseline = 'top';
2363
+ xText -= 2;
2364
+ }
2365
+ else if (item.Angle >= 180 && item.Angle < 225) {
2366
+ this.Canvas.textAlign = 'right';
2367
+ this.Canvas.textBaseline = 'middle';
2368
+ xText -= 2;
2369
+ }
2370
+ else if (item.Angle >= 225 && item.Angle <= 270) {
2371
+ this.Canvas.textAlign = 'center';
2372
+ this.Canvas.textBaseline = 'bottom';
2373
+ }
2374
+ else if (item.Angle > 270 && item.Angle < 315) {
2375
+ this.Canvas.textAlign = 'left';
2376
+ this.Canvas.textBaseline = 'bottom';
2377
+ xText += 2;
2378
+ }
2379
+ else {
2380
+ this.Canvas.textAlign = 'left';
2381
+ this.Canvas.textBaseline = 'middle';
2382
+ xText += 2;
2383
+ }
2384
+
2385
+ this.Canvas.fillText(item.Text, xText, yText);
2386
+ }
2387
+
2388
+ this.Draw=function()
2389
+ {
2390
+ this.BorderPoint=[];
2391
+ this.DataPoint=[];
2392
+ this.CenterPoint={};
2393
+ if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0))
2394
+ this.CalculatePoints(null);
2395
+ else
2396
+ this.CalculatePoints(this.Data.Data);
2397
+
2398
+ this.DrawBorder();
2399
+ this.DrawArea();
2400
+ }
2401
+
2402
+ this.CalculatePoints=function(data)
2403
+ {
2404
+ let left=this.ChartBorder.GetLeft();
2405
+ let right=this.ChartBorder.GetRight();
2406
+ let top=this.ChartBorder.GetTop();
2407
+ let bottom=this.ChartBorder.GetBottom();
2408
+ let width=this.ChartBorder.GetWidth();
2409
+ let height=this.ChartBorder.GetHeight();
2410
+
2411
+ let ptCenter={X:left+width/2, Y:top+height/2}; //中心点
2412
+ let radius=Math.min(width/2,height/2)-2 //半径
2413
+ let count=Math.max(5,data?data.length:0);
2414
+ let averageAngle=360/count;
2415
+ for(let i=0;i<count;++i)
2416
+ {
2417
+ let ptBorder = { Index: i, Radius: radius, Angle: i * averageAngle + this.StartAngle };
2418
+ let angle = ptBorder.Angle;
2419
+
2420
+ if (data && i<data.length)
2421
+ {
2422
+ var item=data[i];
2423
+ let ptData={Index:i,Text:item.Text};
2424
+ ptBorder.Text=item.Name;
2425
+ if (!item.Value)
2426
+ {
2427
+ ptData.X=ptCenter.X;
2428
+ ptData.Y=ptCenter.Y;
2429
+ }
2430
+ else
2431
+ {
2432
+ var value=item.Value;
2433
+ if (value>=1) value=1;
2434
+ var dataRadius=radius*value;
2435
+ ptData.X=ptCenter.X+dataRadius*Math.cos(angle*Math.PI/180);
2436
+ ptData.Y=ptCenter.Y+dataRadius*Math.sin(angle*Math.PI/180);
2437
+ }
2438
+
2439
+ this.DataPoint.push(ptData);
2440
+ }
2441
+
2442
+ this.BorderPoint.push(ptBorder);
2443
+ }
2444
+
2445
+ this.CenterPoint=ptCenter;
2446
+ }
2447
+
2448
+ //空数据
2449
+ this.DrawEmptyData=function()
2450
+ {
2451
+ JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')
2452
+ }
2453
+ }