You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4239 lines
152 KiB

  1. /*
  2. copyright (c) 2018 jones
  3. http://www.apache.org/licenses/LICENSE-2.0
  4. 开源项目 https://github.com/jones2000/HQChart
  5. jones_2000@163.com
  6. 指标基类及定制指标
  7. */
  8. import {
  9. g_JSChartResource,
  10. } from './umychart.resource.wechat.js'
  11. import { JSCommonComplier } from "./umychart.complier.wechat.js"; //通达信编译器
  12. //日志
  13. import { JSConsole } from "./umychart.console.wechat.js"
  14. import {
  15. ChartData, HistoryData,
  16. SingleData, MinuteData,
  17. JSCHART_EVENT_ID,
  18. } from "./umychart.data.wechat.js";
  19. //图形库
  20. import {
  21. IChartPainting,
  22. ChartSingleText,
  23. ChartDrawIcon,
  24. ChartDrawText,
  25. ChartDrawNumber,
  26. ChartKLine,
  27. ChartColorKline,
  28. ChartLine,
  29. ChartArea,
  30. ChartSubLine,
  31. ChartPointDot,
  32. ChartStick,
  33. ChartLineStick,
  34. ChartStickLine,
  35. ChartOverlayKLine,
  36. ChartMinuteInfo,
  37. ChartRectangle,
  38. ChartMultiText,
  39. ChartMultiLine,
  40. ChartMultiPoint,
  41. ChartMultiBar,
  42. ChartPie,
  43. ChartCircle,
  44. ChartChinaMap,
  45. ChartRadar,
  46. ChartCorssCursor,
  47. ChartBuySell,
  48. ChartMACD,
  49. ChartSplashPaint,
  50. ChartBackground,
  51. ChartMinuteVolumBar,
  52. ChartMultiHtmlDom,
  53. ChartLock,
  54. ChartVolStick,
  55. ChartBand,
  56. ChartLineMultiData,
  57. ChartStraightLine,
  58. ChartStackedBar,
  59. ChartStepLine,
  60. ChartBackgroundDiv,
  61. ChartSingleLine,
  62. } from "./umychart.chartpaint.wechat.js";
  63. import
  64. {
  65. CoordinateInfo,
  66. IFrameSplitOperator,
  67. FrameSplitKLinePriceY,
  68. FrameSplitY,
  69. FrameSplitKLineX,
  70. FrameSplitMinutePriceY,
  71. FrameSplitMinuteX,
  72. FrameSplitXData,
  73. SplitData,
  74. PriceSplitData,
  75. } from './umychart.framesplit.wechat.js'
  76. import
  77. {
  78. IChartTitlePainting,
  79. DynamicKLineTitlePainting,
  80. DynamicMinuteTitlePainting,
  81. DynamicChartTitlePainting,
  82. DynamicTitleData,
  83. STRING_FORMAT_TYPE,
  84. } from './umychart.charttitle.wechat.js'
  85. import { HQIndexFormula } from "./umychart.hqIndexformula.wechat.js"; //通达信编译器
  86. //////////////////////////////////////////////////////////
  87. //
  88. // 指标信息
  89. //
  90. function IndexInfo(name, param)
  91. {
  92. this.Name = name; //名字
  93. this.Param = param; //参数
  94. this.LineColor; //线段颜色
  95. this.ReqeustData = null; //数据请求
  96. }
  97. function BaseIndex(name)
  98. {
  99. this.Index; //指标阐述
  100. this.Name = name; //指标名字
  101. this.UpdateUICallback; //数据到达回调
  102. //默认创建都是线段
  103. this.Create = function (hqChart, windowIndex)
  104. {
  105. for (var i in this.Index)
  106. {
  107. if (!this.Index[i].Name) continue;
  108. var maLine = new ChartLine();
  109. maLine.Canvas = hqChart.Canvas;
  110. maLine.Name = this.Name + '-' + i.toString();
  111. maLine.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  112. maLine.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  113. maLine.Color = this.Index[i].LineColor;
  114. hqChart.ChartPaint.push(maLine);
  115. }
  116. }
  117. //指标不支持 周期/复权/股票等
  118. this.NotSupport = function (hqChart, windowIndex, message)
  119. {
  120. var paint = hqChart.GetChartPaint(windowIndex);
  121. for (var i in paint)
  122. {
  123. paint[i].Data.Data = []; //清空数据
  124. if (i == 0) paint[i].NotSupportMessage = message;
  125. }
  126. }
  127. //格式化指标名字+参数
  128. //格式:指标名(参数1,参数2,参数3,...)
  129. this.FormatIndexTitle = function ()
  130. {
  131. var title = this.Name;
  132. var param = null;
  133. for (var i in this.Index)
  134. {
  135. var item = this.Index[i];
  136. if (item.Param == null) continue;
  137. if (param) param += ',' + item.Param.toString();
  138. else param = item.Param.toString();
  139. }
  140. if (param) title += '(' + param + ')';
  141. return title;
  142. }
  143. this.InvokeUpdateUICallback = function (paint)
  144. {
  145. if (typeof (this.UpdateUICallback) != 'function') return;
  146. let indexData = new Array();
  147. for (let i in paint)
  148. {
  149. indexData.push({ Name: this.Index[i].Name, Data: paint[i].Data });
  150. }
  151. this.UpdateUICallback(indexData);
  152. }
  153. }
  154. // 图形指标名字
  155. var SCRIPT_CHART_NAME=
  156. {
  157. OVERLAY_BARS:"OVERLAY_BARS" //叠加柱子图
  158. }
  159. //脚本指标
  160. //name=指标名字 args=参数名字 参数值
  161. function ScriptIndex(name, script, args, option)
  162. {
  163. this.newMethod = BaseIndex; //派生
  164. this.newMethod(name);
  165. delete this.newMethod;
  166. this.Script = script;
  167. this.Arguments = [];
  168. this.OutVar = [];
  169. this.ID; //指标ID
  170. this.FloatPrecision = 2; //小数位数
  171. this.StringFormat;
  172. this.IsShowIndexTitle=true; //是否显示指标标题
  173. this.KLineType = null; //K线显示类型
  174. this.InstructionType; //五彩K线, 交易指标
  175. this.YSpecificMaxMin = null; //最大最小值
  176. this.YSplitScale = null; //固定刻度
  177. this.OutName=null; //动态输出指标名字
  178. this.YSplitType;
  179. //指标上锁配置信息
  180. this.IsLocked = false; //是否锁住指标
  181. this.LockCallback = null;
  182. this.LockID = null;
  183. this.LockBG = null; //锁背景色
  184. this.LockTextColor = null;
  185. this.LockText = null;
  186. this.LockFont = null;
  187. this.LockCount = 10;
  188. this.TitleFont=g_JSChartResource.DynamicTitleFont; //标题字体
  189. this.IsShortTitle=false; //是否显示指标参数
  190. this.IsUsePageData=false; //是否使用了K线界面数据
  191. this.IsShow=true; //是否显示图形
  192. this.YAxis=null; //Y轴刻度设置 { FloatPrecision, StringFormat, EnableRemoveZero }
  193. if (option)
  194. {
  195. if (option.FloatPrecision >= 0) this.FloatPrecision = option.FloatPrecision;
  196. if (option.StringFormat > 0) this.StringFormat = option.StringFormat;
  197. if (IFrameSplitOperator.IsBool(option.IsShowIndexTitle)) this.IsShowIndexTitle=option.IsShowIndexTitle;
  198. if (option.ID) this.ID = option.ID;
  199. if (option.KLineType) this.KLineType = option.KLineType;
  200. if (option.InstructionType) this.InstructionType = option.InstructionType;
  201. if (option.YSpecificMaxMin) this.YSpecificMaxMin = option.YSpecificMaxMin;
  202. if (option.YSplitScale) this.YSplitScale = option.YSplitScale;
  203. if (option.TitleFont) this.TitleFont=option.TitleFont;
  204. if (IFrameSplitOperator.IsNumber(option.IsShortTitle)) this.IsShortTitle=option.IsShortTitle;
  205. if (option.OutName) this.OutName=option.OutName;
  206. if (IFrameSplitOperator.IsNumber(option.YSplitType)) this.YSplitType=option.YSplitType;
  207. }
  208. if (option && option.Lock)
  209. {
  210. if (option.Lock.IsLocked == true) this.IsLocked = true; //指标上锁
  211. if (option.Lock.Callback) this.LockCallback = option.Lock.Callback; //锁回调
  212. if (option.Lock.ID) this.LockID = option.Lock.ID; //锁ID
  213. if (option.Lock.BG) this.LockBG = option.Lock.BG;
  214. if (option.Lock.TextColor) this.LockTextColor = option.Lock.TextColor;
  215. if (option.Lock.Text) this.LockText = option.Lock.Text;
  216. if (option.Lock.Font) this.LockFont = option.Lock.Font;
  217. if (option.Lock.Count) this.LockCount = option.Lock.Count;
  218. }
  219. if (option && option.YAxis)
  220. {
  221. this.YAxis={ };
  222. if (IFrameSplitOperator.IsNumber(option.YAxis.FloatPrecision)) this.YAxis.FloatPrecision=option.YAxis.FloatPrecision;
  223. if (IFrameSplitOperator.IsNumber(option.YAxis.StringFormat)) this.YAxis.StringFormat=option.YAxis.StringFormat;
  224. if (IFrameSplitOperator.IsBool(option.YAxis.EnableRemoveZero)) this.YAxis.EnableRemoveZero=option.YAxis.EnableRemoveZero;
  225. }
  226. if (args) this.Arguments = args;
  227. this.SetLock = function (lockData) {
  228. if (lockData.IsLocked == true) {
  229. this.IsLocked = true; //指标上锁
  230. if (lockData.Callback) this.LockCallback = lockData.Callback; //锁回调
  231. if (lockData.ID) this.LockID = lockData.ID; //锁ID
  232. if (lockData.BG) this.LockBG = lockData.BG;
  233. if (lockData.TextColor) this.LockTextColor = lockData.TextColor;
  234. if (lockData.Text) this.LockText = lockData.Text;
  235. if (lockData.Font) this.LockFont = lockData.Font;
  236. if (lockData.Count) this.LockCount = lockData.Count;
  237. }
  238. else { //清空锁配置信息
  239. this.IsLocked = false; //是否锁住指标
  240. this.LockCallback = null;
  241. this.LockID = null;
  242. this.LockBG = null; //锁背景色
  243. this.LockTextColor = null;
  244. this.LockText = null;
  245. this.LockFont = null;
  246. this.LockCount = 10;
  247. }
  248. }
  249. this.ExecuteScript = function (hqChart, windowIndex, hisData)
  250. {
  251. this.OutVar = [];
  252. let self = this;
  253. let param =
  254. {
  255. HQChart: hqChart,
  256. WindowIndex: windowIndex,
  257. HistoryData: hisData,
  258. Self: this
  259. };
  260. let hqDataType = 0; //默认K线
  261. if (hqChart.ClassName === 'MinuteChartContainer' || hqChart.ClassName==='MinuteChartHScreenContainer')
  262. {
  263. if (hqChart.DayCount>1) hqDataType=HQ_DATA_TYPE.MULTIDAY_MINUTE_ID; //多日分钟
  264. else hqDataType=HQ_DATA_TYPE.MINUTE_ID;
  265. }
  266. else if (hqChart.ClassName==='HistoryMinuteChartContainer')
  267. {
  268. hqDataType=HQ_DATA_TYPE.HISTORY_MINUTE_ID; //历史分钟
  269. }
  270. let option =
  271. {
  272. HQDataType: hqDataType,
  273. Symbol: hqChart.Symbol,
  274. Data: hisData,
  275. SourceData: hqChart.SourceData, //原始数据
  276. Callback: this.RecvResultData, CallbackParam: param,
  277. Async: true,
  278. MaxRequestDataCount: hqChart.MaxRequestDataCount,
  279. MaxRequestMinuteDayCount: hqChart.MaxRequestMinuteDayCount,
  280. Arguments: this.Arguments,
  281. IsApiPeriod:hqChart.IsApiPeriod,
  282. };
  283. if (hqChart) //当前屏K线信息
  284. {
  285. if (hqChart.ChartPaint[0])
  286. {
  287. var item=hqChart.ChartPaint[0];
  288. if (item && item.DrawKRange) option.DrawInfo={Start:item.DrawKRange.Start, End:item.DrawKRange.End };
  289. }
  290. }
  291. if (hqDataType===HQ_DATA_TYPE.HISTORY_MINUTE_ID) option.TrateDate=hqChart.TradeDate;
  292. if (hqDataType===HQ_DATA_TYPE.MULTIDAY_MINUTE_ID) option.DayCount=hqChart.DayCount;
  293. if (hqChart.NetworkFilter) option.NetworkFilter = hqChart.NetworkFilter;
  294. let code = this.Script;
  295. let run = JSCommonComplier.JSComplier.Execute(code, option, hqChart.ScriptErrorCallback);
  296. }
  297. this.RecvResultData = function (outVar, param)
  298. {
  299. let hqChart = param.HQChart;
  300. let windowIndex = param.WindowIndex;
  301. let hisData = param.HistoryData;
  302. param.Self.OutVar = outVar;
  303. param.Self.BindData(hqChart, windowIndex, hisData);
  304. if (param.Self.IsLocked == false) //不上锁
  305. {
  306. param.HQChart.Frame.SubFrame[windowIndex].Frame.SetLock(null);
  307. }
  308. else //上锁
  309. {
  310. let lockData =
  311. {
  312. IsLocked: true, Callback: param.Self.LockCallback, IndexName: param.Self.Name, ID: param.Self.LockID,
  313. BG: param.Self.LockBG, Text: param.Self.LockText, TextColor: param.Self.LockTextColor, Font: param.Self.LockFont,
  314. Count: param.Self.LockCount
  315. };
  316. param.HQChart.Frame.SubFrame[windowIndex].Frame.SetLock(lockData);
  317. }
  318. param.HQChart.UpdataDataoffset(); //更新数据偏移
  319. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  320. param.HQChart.Draw();
  321. var event = hqChart.GetIndexEvent(); //指标计算完成回调
  322. if (event)
  323. {
  324. var self = param.Self;
  325. var data = {
  326. OutVar: self.OutVar, WindowIndex: windowIndex, Name: self.Name, Arguments: self.Arguments, HistoryData: hisData,
  327. Stock: { Symbol: hqChart.Symbol, Name: hqChart.Name }
  328. };
  329. event.Callback(event, data, self);
  330. }
  331. }
  332. //给图形设置指标名字
  333. this.SetChartIndexName=function(chart)
  334. {
  335. if (this.Name) chart.IndexName=this.Name;
  336. else if (this.ID) chart.IndexName==this.ID;
  337. if (this.ID) chart.IndexID=this.ID;
  338. chart.Script=this; //指标内容绑定上去
  339. }
  340. //设置标题数据
  341. this.SetTitleData=function(titleData, chart)
  342. {
  343. titleData.ChartClassName=chart.ClassName;
  344. titleData.IsVisible=chart.IsVisible;
  345. }
  346. //自定义图形配色
  347. this.ReloadChartResource=function(hqChart, windowIndex, chart)
  348. {
  349. var event=hqChart.GetEventCallback(JSCHART_EVENT_ID.ON_RELOAD_INDEX_CHART_RESOURCE); //指标计算完成回调
  350. if (!event || !event.Callback) return;
  351. var sendData={ Chart:chart, IndexName:this.Name,IndexID:this.ID, HQChart:hqChart, WindowIndex:windowIndex };
  352. event.Callback(event,sendData,this);
  353. }
  354. this.CreateLine = function (hqChart, windowIndex, varItem, id, lineType)
  355. {
  356. if (lineType==7) var line=new ChartStepLine();
  357. else var line = new ChartLine();
  358. line.Canvas = hqChart.Canvas;
  359. line.DrawType = 1; //无效数不画
  360. line.Name = varItem.Name;
  361. line.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  362. line.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  363. if (varItem.Color) line.Color = this.GetColor(varItem.Color);
  364. else line.Color = this.GetDefaultColor(id);
  365. if (varItem.IsShow==false) line.IsShow=false;
  366. if (varItem.LineWidth)
  367. {
  368. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  369. if (!isNaN(width) && width > 0) line.LineWidth = width;
  370. }
  371. if (varItem.IsDotLine)
  372. {
  373. line.IsDotLine = true; //虚线
  374. line.LineDash=g_JSChartResource.DOTLINE.LineDash.slice();
  375. }
  376. //虚线设置
  377. if (IFrameSplitOperator.IsNonEmptyArray(varItem.LineDash)) line.LineDash=varItem.LineDash;
  378. if (varItem.IsShow == false) line.IsShow = false;
  379. let titleIndex = windowIndex + 1;
  380. line.Data.Data = varItem.Data;
  381. this.ReloadChartResource(hqChart,windowIndex,line);
  382. if (varItem.IsShowTitle===false) //NOTEXT 不绘制标题
  383. {
  384. }
  385. else if (IFrameSplitOperator.IsString(varItem.Name) && varItem.Name.indexOf("NOTEXT")==0) //标题中包含NOTEXT不绘制标题
  386. {
  387. }
  388. else
  389. {
  390. var titleData=new DynamicTitleData(line.Data, (varItem.NoneName==true? null: varItem.Name) , line.Color);
  391. hqChart.TitlePaint[titleIndex].Data[id] = titleData;
  392. this.SetTitleData(titleData,line);
  393. }
  394. this.SetChartIndexName(line);
  395. hqChart.ChartPaint.push(line);
  396. }
  397. this.CreateArea=function(hqChart, windowIndex, varItem, id)
  398. {
  399. var line=new ChartArea();
  400. line.Canvas=hqChart.Canvas;
  401. line.DrawType=1;
  402. line.Name=varItem.Name;
  403. line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  404. line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  405. line.Identify=this.Guid;
  406. if (varItem.Color) line.Color=this.GetColor(varItem.Color);
  407. else line.Color=this.GetDefaultColor(id);
  408. if (varItem.DownColor)
  409. {
  410. line.AreaColor=varItem.DownColor;
  411. }
  412. else if (varItem.UpColor)
  413. {
  414. line.AreaColor=varItem.UpColor;
  415. line.AreaDirection=1;
  416. }
  417. if (varItem.LineWidth)
  418. {
  419. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  420. if (!isNaN(width) && width>0) line.LineWidth=width;
  421. }
  422. if (IFrameSplitOperator.IsNonEmptyArray(varItem.LineDash)) line.LineDash=varItem.LineDash; //虚线
  423. if (varItem.IsShow==false) line.IsShow=false;
  424. let titleIndex=windowIndex+1;
  425. line.Data.Data=varItem.Data;
  426. if (varItem.IsShowTitle===false) //NOTEXT 不绘制标题
  427. {
  428. }
  429. else if (IFrameSplitOperator.IsString(varItem.Name) && varItem.Name.indexOf("NOTEXT")==0) //标题中包含NOTEXT不绘制标题
  430. {
  431. }
  432. else
  433. {
  434. if (varItem.NoneName)
  435. hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,null,line.Color);
  436. else
  437. hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);
  438. hqChart.TitlePaint[titleIndex].Data[id].ChartClassName=line.ClassName;
  439. }
  440. this.SetChartIndexName(line);
  441. hqChart.ChartPaint.push(line);
  442. }
  443. this.CreateOverlayLine = function (hqChart, windowIndex, varItem, id)
  444. {
  445. let line = new ChartSubLine();
  446. line.Canvas = hqChart.Canvas;
  447. line.DrawType = 1; //无效数不画
  448. line.Name = varItem.Name;
  449. line.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  450. line.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  451. if (varItem.Color) line.Color = this.GetColor(varItem.Color);
  452. else line.Color = this.GetDefaultColor(id);
  453. if (varItem.LineWidth) {
  454. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  455. if (!isNaN(width) && width > 0) line.LineWidth = width;
  456. }
  457. if (varItem.IsDotLine) line.IsDotLine = true; //虚线
  458. if (varItem.IsShow == false) line.IsShow = false;
  459. let titleIndex = windowIndex + 1;
  460. line.Data.Data = varItem.Data;
  461. hqChart.TitlePaint[titleIndex].Data[id] = new DynamicTitleData(line.Data, varItem.Name, line.Color);
  462. hqChart.ChartPaint.push(line);
  463. }
  464. this.CreateSingleLine=function(hqChart,windowIndex,varItem,id,lineType)
  465. {
  466. var line=new ChartSingleLine();
  467. line.Canvas=hqChart.Canvas;
  468. line.DrawType=1;
  469. line.Name=varItem.Name;
  470. line.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  471. line.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  472. if (varItem.Color) line.Color=this.GetColor(varItem.Color);
  473. else line.Color=this.GetDefaultColor(id);
  474. if (varItem.LineWidth)
  475. {
  476. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  477. if (!isNaN(width) && width>0) line.LineWidth=width;
  478. }
  479. if (varItem.IsDotLine) line.IsDotLine=true; //虚线
  480. if (varItem.IsShow==false) line.IsShow=false;
  481. let titleIndex=windowIndex+1;
  482. line.Data.Data=varItem.Data;
  483. this.ReloadChartResource(hqChart,windowIndex,line);
  484. if (varItem.IsShowTitle===false) //NOTEXT 不绘制标题
  485. {
  486. }
  487. else if (IFrameSplitOperator.IsString(varItem.Name) && varItem.Name.indexOf("NOTEXT")==0) //标题中包含NOTEXT不绘制标题
  488. {
  489. }
  490. else
  491. {
  492. if (varItem.NoneName)
  493. hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,null,line.Color);
  494. else
  495. hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);
  496. this.SetTitleData(hqChart.TitlePaint[titleIndex].Data[id],line);
  497. }
  498. this.SetChartIndexName(line);
  499. hqChart.ChartPaint.push(line);
  500. }
  501. //创建柱子
  502. this.CreateBar = function (hqChart, windowIndex, varItem, id)
  503. {
  504. let bar = new ChartStickLine();
  505. bar.Canvas = hqChart.Canvas;
  506. if (varItem.Draw.Width > 0) bar.Width = varItem.Draw.Width;
  507. else bar.Width=0;
  508. bar.Name = varItem.Name;
  509. bar.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  510. bar.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  511. if (varItem.Color) bar.Color = this.GetColor(varItem.Color);
  512. else bar.Color = this.GetDefaultColor(id);
  513. let titleIndex = windowIndex + 1;
  514. bar.Data.Data = varItem.Draw.DrawData;
  515. bar.BarType = varItem.Draw.Type;
  516. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  517. hqChart.ChartPaint.push(bar);
  518. }
  519. //DRAWTEXT
  520. this.CreateDrawTextV2=function(hqChart, windowIndex, varItem, id)
  521. {
  522. var chartText = new ChartDrawText();
  523. chartText.Canvas = hqChart.Canvas;
  524. chartText.TextAlign='left';
  525. chartText.Name = varItem.Name;
  526. chartText.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  527. chartText.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  528. chartText.ReloadResource();
  529. if (varItem.Color) chartText.Color = this.GetColor(varItem.Color);
  530. else chartText.Color = this.GetDefaultColor(id);
  531. if (varItem.Draw.DrawData) chartText.Data.Data = varItem.Draw.DrawData;
  532. chartText.Text = varItem.Draw.Text;
  533. if (varItem.Draw.YOffset > 0) chartText.YOffset = varItem.Draw.YOffset;
  534. if (varItem.Draw.TextAlign) chartText.TextAlign = varItem.Draw.TextAlign;
  535. //指定输出位置
  536. if (varItem.Draw.FixedPosition==="TOP") chartText.FixedPosition=1;
  537. else if (varItem.Draw.FixedPosition==="BOTTOM") chartText.FixedPosition=2;
  538. if (varItem.DrawVAlign>=0)
  539. {
  540. if (varItem.DrawVAlign==0) chartText.TextBaseline='top';
  541. else if (varItem.DrawVAlign==1) chartText.TextBaseline='middle';
  542. else if (varItem.DrawVAlign==2) chartText.TextBaseline='bottom';
  543. }
  544. if (varItem.DrawAlign>=0)
  545. {
  546. if (varItem.DrawAlign==0) chartText.TextAlign="left";
  547. else if (varItem.DrawAlign==1) chartText.TextAlign="center";
  548. else if (varItem.DrawAlign==2) chartText.TextAlign='right';
  549. }
  550. if (varItem.DrawFontSize>0) chartText.FixedFontSize=varItem.DrawFontSize;
  551. if (varItem.Background) chartText.TextBG=varItem.Background;
  552. if (varItem.VerticalLine) chartText.VerticalLine=varItem.VerticalLine;
  553. if (IFrameSplitOperator.IsNumber(varItem.YOffset)) chartText.ShowOffset.Y=varItem.YOffset;
  554. if (IFrameSplitOperator.IsNumber(varItem.XOffset)) chartText.ShowOffset.X=varItem.XOffset;
  555. //var titleIndex = windowIndex + 1;
  556. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  557. hqChart.ChartPaint.push(chartText);
  558. }
  559. //DRAWNUMBER
  560. this.CreateDrawNumber=function(hqChart,windowIndex,varItem,id)
  561. {
  562. var chartText=new ChartDrawNumber();
  563. chartText.Canvas=hqChart.Canvas;
  564. chartText.Name=varItem.Name;
  565. chartText.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  566. chartText.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  567. chartText.ReloadResource();
  568. if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);
  569. else chartText.Color=this.GetDefaultColor(id);
  570. if (varItem.IsDrawCenter===true) chartText.TextAlign='center';
  571. if (varItem.IsDrawAbove===true) chartText.TextBaseline='bottom'
  572. if (varItem.IsDrawBelow===true) chartText.TextBaseline='top';
  573. chartText.Data.Data=varItem.Draw.DrawData.Value;
  574. chartText.Text=varItem.Draw.DrawData.Text;
  575. if (varItem.Draw.Direction>0) chartText.Direction=varItem.Draw.Direction;
  576. if (varItem.Draw.YOffset>0) chartText.YOffset=varItem.Draw.YOffset;
  577. if (varItem.Draw.TextAlign) chartText.TextAlign=varItem.Draw.TextAlign;
  578. //指定输出位置
  579. if (varItem.Draw.FixedPosition==="TOP") chartText.FixedPosition=1;
  580. else if (varItem.Draw.FixedPosition==="BOTTOM") chartText.FixedPosition=2;
  581. if (varItem.DrawVAlign>=0)
  582. {
  583. if (varItem.DrawVAlign==0) chartText.TextBaseline='top';
  584. else if (varItem.DrawVAlign==1) chartText.TextBaseline='middle';
  585. else if (varItem.DrawVAlign==2) chartText.TextBaseline='bottom';
  586. }
  587. if (varItem.DrawAlign>=0)
  588. {
  589. if (varItem.DrawAlign==0) chartText.TextAlign="left";
  590. else if (varItem.DrawAlign==1) chartText.TextAlign="center";
  591. else if (varItem.DrawAlign==2) chartText.TextAlign='right';
  592. }
  593. if (varItem.DrawFontSize>0) chartText.FixedFontSize=varItem.DrawFontSize;
  594. if (varItem.Background) chartText.TextBG=varItem.Background;
  595. if (varItem.VerticalLine) chartText.VerticalLine=varItem.VerticalLine;
  596. //let titleIndex=windowIndex+1;
  597. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  598. hqChart.ChartPaint.push(chartText);
  599. }
  600. //创建文本
  601. this.CreateText = function (hqChart, windowIndex, varItem, id)
  602. {
  603. let chartText = new ChartSingleText();
  604. chartText.Canvas = hqChart.Canvas;
  605. chartText.TextAlign='left';
  606. chartText.Name = varItem.Name;
  607. chartText.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  608. chartText.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  609. chartText.ReloadResource();
  610. if (varItem.Color) chartText.Color = this.GetColor(varItem.Color);
  611. else chartText.Color = this.GetDefaultColor(id);
  612. let titleIndex = windowIndex + 1;
  613. if (varItem.Draw.Position) chartText.Position=varItem.Draw.Position; //赋值坐标
  614. if (varItem.Draw.DrawData) chartText.Data.Data = varItem.Draw.DrawData;
  615. chartText.Text = varItem.Draw.Text;
  616. if (varItem.Draw.Direction > 0) chartText.Direction = varItem.Draw.Direction;
  617. if (varItem.Draw.YOffset > 0) chartText.YOffset = varItem.Draw.YOffset;
  618. if (varItem.Draw.TextAlign) chartText.TextAlign = varItem.Draw.TextAlign;
  619. if (varItem.DrawVAlign>=0)
  620. {
  621. if (varItem.DrawVAlign==0) chartText.Direction=1;
  622. else if (varItem.DrawVAlign==1) chartText.Direction=0;
  623. else if (varItem.DrawVAlign==2) chartText.Direction=2;
  624. }
  625. if (varItem.DrawAlign>=0)
  626. {
  627. if (varItem.DrawAlign==0) chartText.TextAlign="left";
  628. else if (varItem.DrawAlign==1) chartText.TextAlign="center";
  629. else if (varItem.DrawAlign==2) chartText.TextAlign='right';
  630. }
  631. if (varItem.DrawFontSize>0) chartText.FixedFontSize=varItem.DrawFontSize;
  632. if (varItem.Background) chartText.TextBG=varItem.Background;
  633. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  634. hqChart.ChartPaint.push(chartText);
  635. }
  636. //COLORSTICK
  637. this.CreateMACD = function (hqChart, windowIndex, varItem, id)
  638. {
  639. let chartMACD = new ChartMACD();
  640. chartMACD.Canvas = hqChart.Canvas;
  641. chartMACD.Name = varItem.Name;
  642. chartMACD.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  643. chartMACD.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  644. if (varItem.LineWidth)
  645. {
  646. var width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  647. if (!isNaN(width) && width>0) chartMACD.LineWidth=width;
  648. }
  649. let titleIndex = windowIndex + 1;
  650. chartMACD.Data.Data = varItem.Data;
  651. var clrTitle=this.GetDefaultColor(id);
  652. if (varItem.Color) clrTitle= this.GetColor(varItem.Color);
  653. if (varItem.UpColor) chartMACD.UpColor=varItem.UpColor;
  654. if (varItem.DownColor) chartMACD.DownColor=varItem.DownColor;
  655. this.ReloadChartResource(hqChart,windowIndex,chartMACD);
  656. hqChart.TitlePaint[titleIndex].Data[id] = new DynamicTitleData(chartMACD.Data, varItem.Name, clrTitle);
  657. this.SetChartIndexName(chartMACD);
  658. hqChart.ChartPaint.push(chartMACD);
  659. }
  660. this.CreatePointDot = function (hqChart, windowIndex, varItem, id, hisData)
  661. {
  662. let pointDot = new ChartPointDot();
  663. pointDot.Canvas = hqChart.Canvas;
  664. pointDot.Name = varItem.Name;
  665. pointDot.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  666. pointDot.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  667. if (varItem.Color) pointDot.Color = this.GetColor(varItem.Color);
  668. else pointDot.Color = this.GetDefaultColor(id);
  669. if (varItem.Radius) pointDot.Radius = varItem.Radius;
  670. if (varItem.LineWidth)
  671. {
  672. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  673. if (!isNaN(width) && width > 0) pointDot.Radius = width;
  674. }
  675. if (IFrameSplitOperator.IsBool(varItem.UpDownDot))
  676. {
  677. pointDot.EnableUpDownColor=varItem.UpDownDot;
  678. pointDot.HistoryData=hisData;
  679. }
  680. let titleIndex = windowIndex + 1;
  681. pointDot.Data.Data = varItem.Data;
  682. hqChart.TitlePaint[titleIndex].Data[id] = new DynamicTitleData(pointDot.Data, varItem.Name, pointDot.Color);
  683. hqChart.ChartPaint.push(pointDot);
  684. }
  685. this.CreateStick = function (hqChart, windowIndex, varItem, id)
  686. {
  687. let chart = new ChartStick();
  688. chart.Canvas = hqChart.Canvas;
  689. chart.Name = varItem.Name;
  690. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  691. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  692. if (varItem.Color) chart.Color = this.GetColor(varItem.Color);
  693. else chart.Color = this.GetDefaultColor(id);
  694. if (varItem.LineWidth)
  695. {
  696. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  697. if (!isNaN(width) && width > 0) chart.LineWidth = width;
  698. }
  699. let titleIndex = windowIndex + 1;
  700. chart.Data.Data = varItem.Data;
  701. this.ReloadChartResource(hqChart,windowIndex,chart);
  702. hqChart.TitlePaint[titleIndex].Data[id] = new DynamicTitleData(chart.Data, varItem.Name, chart.Color);
  703. this.SetChartIndexName(chart);
  704. hqChart.ChartPaint.push(chart);
  705. }
  706. this.CreateLineStick = function (hqChart, windowIndex, varItem, id) {
  707. let chart = new ChartLineStick();
  708. chart.Canvas = hqChart.Canvas;
  709. chart.Name = varItem.Name;
  710. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  711. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  712. if (varItem.Color) chart.Color = this.GetColor(varItem.Color);
  713. else chart.Color = this.GetDefaultColor(id);
  714. if (varItem.LineWidth) {
  715. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  716. if (!isNaN(width) && width > 0) chart.LineWidth = width;
  717. }
  718. let titleIndex = windowIndex + 1;
  719. chart.Data.Data = varItem.Data;
  720. hqChart.TitlePaint[titleIndex].Data[id] = new DynamicTitleData(chart.Data, varItem.Name, chart.Color);
  721. hqChart.ChartPaint.push(chart);
  722. }
  723. this.CreateStraightLine = function (hqChart, windowIndex, varItem, id) {
  724. let line = new ChartLine();
  725. line.DrawType = 1;
  726. line.Canvas = hqChart.Canvas;
  727. line.Name = varItem.Name;
  728. line.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  729. line.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  730. if (varItem.Color) line.Color = this.GetColor(varItem.Color);
  731. else line.Color = this.GetDefaultColor(id);
  732. if (varItem.LineWidth) {
  733. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  734. if (!isNaN(width) && width > 0) line.LineWidth = width;
  735. }
  736. let titleIndex = windowIndex + 1;
  737. line.Data.Data = varItem.Draw.DrawData;
  738. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);
  739. hqChart.ChartPaint.push(line);
  740. }
  741. this.CreateVolStick = function (hqChart, windowIndex, varItem, id, hisData)
  742. {
  743. let chart = new ChartVolStick();
  744. chart.Canvas = hqChart.Canvas;
  745. chart.Name = varItem.Name;
  746. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  747. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  748. chart.KLineDrawType = hqChart.KLineDrawType; //设置K线显示类型
  749. if (varItem.Color) chart.Color = this.GetColor(varItem.Color);
  750. else chart.Color = this.GetDefaultColor(id);
  751. if (varItem.UpColor) chart.UpColor=varItem.UpColor;
  752. if (varItem.DownColor) chart.DownColor=varItem.DownColor;
  753. if (IFrameSplitOperator.IsNumber(varItem.StickType)) chart.BarType=varItem.StickType;
  754. let titleIndex = windowIndex + 1;
  755. chart.Data.Data = varItem.Data;
  756. chart.HistoryData = hisData;
  757. this.ReloadChartResource(hqChart,windowIndex,chart);
  758. var titleData=new DynamicTitleData(chart.Data, varItem.Name, chart.Color);
  759. hqChart.TitlePaint[titleIndex].Data[id] = titleData;
  760. this.SetTitleData(titleData,chart);
  761. this.SetChartIndexName(chart);
  762. hqChart.ChartPaint.push(chart);
  763. }
  764. this.CreateBand = function (hqChart, windowIndex, varItem, id) {
  765. let chart = new ChartBand();
  766. chart.Canvas = hqChart.Canvas;
  767. chart.Name = varItem.Name;
  768. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  769. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  770. chart.FirstColor = varItem.Draw.Color[0];
  771. chart.SecondColor = varItem.Draw.Color[1];
  772. chart.Data.Data = varItem.Draw.DrawData;
  773. hqChart.ChartPaint.push(chart);
  774. }
  775. this.CreatePolyLine = function (hqChart, windowIndex, varItem, id) {
  776. let line = new ChartLine();
  777. line.Canvas = hqChart.Canvas;
  778. line.Name = varItem.Name;
  779. line.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  780. line.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  781. if (varItem.Color) line.Color = this.GetColor(varItem.Color);
  782. else line.Color = this.GetDefaultColor(id);
  783. if (varItem.LineWidth) {
  784. let width = parseInt(varItem.LineWidth.replace("LINETHICK", ""));
  785. if (!isNaN(width) && width > 0) line.LineWidth = width;
  786. }
  787. let titleIndex = windowIndex + 1;
  788. line.Data.Data = varItem.Draw.DrawData;
  789. //hqChart.TitlePaint[titleIndex].Data[id] = new DynamicTitleData(line.Data, ' ', line.Color); //给一个空的标题
  790. hqChart.ChartPaint.push(line);
  791. }
  792. //创建K线图
  793. this.CreateKLine = function (hqChart, windowIndex, varItem, id)
  794. {
  795. let chart = new ChartKLine();
  796. chart.Canvas = hqChart.Canvas;
  797. chart.Name = varItem.Name;
  798. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  799. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  800. chart.Data.Data = varItem.Draw.DrawData;
  801. chart.IsShowMaxMinPrice = false;
  802. if (varItem.Color) //如果设置了颜色,使用外面设置的颜色
  803. chart.UnchagneColor = chart.DownColor = chart.UpColor = this.GetColor(varItem.Color);
  804. hqChart.ChartPaint.push(chart);
  805. }
  806. this.CreateDrawColorKLine=function(hqChart,windowIndex,varItem,i)
  807. {
  808. let chart=new ChartColorKline();
  809. chart.Canvas=hqChart.Canvas;
  810. chart.Name=varItem.Name;
  811. chart.DrawName="DRAWCOLORKLINE";
  812. chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  813. chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  814. chart.Data.Data=varItem.Draw.DrawData;
  815. if (IFrameSplitOperator.IsBool(varItem.Draw.IsEmptyBar)) chart.IsEmptyBar=varItem.Draw.IsEmptyBar;
  816. if (varItem.Draw.Color) chart.Color=varItem.Draw.Color;
  817. hqChart.ChartPaint.push(chart);
  818. }
  819. this.CreateNumberText = function (hqChart, windowIndex, varItem, id) {
  820. let chartText = new ChartSingleText();
  821. chartText.Canvas = hqChart.Canvas;
  822. chartText.Name = varItem.Name;
  823. chartText.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  824. chartText.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  825. chartText.ReloadResource();
  826. chartText.TextAlign="center";
  827. if (varItem.Color) chartText.Color = this.GetColor(varItem.Color);
  828. else chartText.Color = this.GetDefaultColor(id);
  829. if (varItem.IsDrawAbove) chartText.Direction=1;
  830. else chartText.Direction=2;
  831. let titleIndex = windowIndex + 1;
  832. chartText.Data.Data = varItem.Draw.DrawData.Value;
  833. chartText.Text = varItem.Draw.DrawData.Text;
  834. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  835. hqChart.ChartPaint.push(chartText);
  836. }
  837. this.CreateDrawIcon=function(hqChart, windowIndex, varItem, id, drawCallback)
  838. {
  839. var chart = new ChartDrawIcon();
  840. chart.Canvas = hqChart.Canvas;
  841. chart.TextAlign = 'center';
  842. chart.Identify=id;
  843. chart.DrawCallback=drawCallback;
  844. chart.Name = varItem.Name;
  845. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  846. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  847. chart.Data.Data = varItem.Draw.DrawData;
  848. chart.IconID=varItem.Draw.IconID;
  849. if (varItem.Color) chart.Color = this.GetColor(varItem.Color);
  850. else chart.Color = 'rgb(0,0,0)';
  851. if (varItem.Draw.MarkID) chart.MarkID=varItem.Draw.MarkID; //外部指定ID
  852. if (varItem.DrawVAlign>=0)
  853. {
  854. if (varItem.DrawVAlign==0) chart.TextBaseline="top";
  855. else if (varItem.DrawVAlign==1) chart.TextBaseline="middle";
  856. else if (varItem.DrawVAlign==2) chart.TextBaseline="bottom";
  857. }
  858. if (varItem.DrawAlign>=0)
  859. {
  860. if (varItem.DrawAlign==0) chart.TextAlign="left";
  861. else if (varItem.DrawAlign==1) chart.TextAlign="center";
  862. else if (varItem.DrawAlign==2) chart.TextAlign='right';
  863. }
  864. if (varItem.DrawFontSize>0) chart.FixedIconSize=varItem.DrawFontSize;
  865. hqChart.ChartPaint.push(chart);
  866. }
  867. //创建图标
  868. this.CreateIcon = function (hqChart, windowIndex, varItem, id)
  869. {
  870. var event=hqChart.GetEventCallback(JSCHART_EVENT_ID.ON_BIND_DRAWICON);
  871. if (event && event.Callback)
  872. {
  873. var sendData={ FrameID:windowIndex, ID:id, Data:varItem, Callback:null };
  874. if (varItem.Draw.MarkID) sendData.MarkID=varItem.Draw.MarkID; //外部指定ID
  875. event.Callback(event, sendData,this);
  876. if (sendData.Callback)
  877. {
  878. this.CreateDrawIcon(hqChart, windowIndex, varItem, id, sendData.Callback);
  879. return;
  880. }
  881. }
  882. let chartText = new ChartSingleText();
  883. chartText.Canvas = hqChart.Canvas;
  884. chartText.TextAlign = 'center';
  885. chartText.Name = varItem.Name;
  886. chartText.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  887. chartText.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  888. let titleIndex = windowIndex + 1;
  889. chartText.Data.Data = varItem.Draw.DrawData;
  890. chartText.Text = varItem.Draw.Icon.Symbol;
  891. if (varItem.Color) chartText.Color = this.GetColor(varItem.Color);
  892. else if (varItem.Draw.Icon.Color) chartText.Color = varItem.Draw.Icon.Color;
  893. else chartText.Color = 'rgb(0,0,0)';
  894. if (varItem.DrawVAlign>=0)
  895. {
  896. if (varItem.DrawVAlign==0) chartText.Direction=1;
  897. else if (varItem.DrawVAlign==1) chartText.Direction=0;
  898. else if (varItem.DrawVAlign==2) chartText.Direction=2;
  899. }
  900. if (varItem.DrawAlign>=0)
  901. {
  902. if (varItem.DrawAlign==0) chartText.TextAlign="left";
  903. else if (varItem.DrawAlign==1) chartText.TextAlign="center";
  904. else if (varItem.DrawAlign==2) chartText.TextAlign='right';
  905. }
  906. if (varItem.DrawFontSize>0) chartText.FixedFontSize=varItem.DrawFontSize;
  907. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  908. hqChart.ChartPaint.push(chartText);
  909. }
  910. this.CreateRectangle = function (hqChart, windowIndex, varItem, i)
  911. {
  912. let chart = new ChartRectangle();
  913. chart.Canvas = hqChart.Canvas;
  914. chart.Name = varItem.Name;
  915. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  916. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  917. chart.Color = [varItem.Draw.DrawData.Color];
  918. chart.Rect = varItem.Draw.DrawData.Rect;
  919. if (varItem.Color) chart.BorderColor = this.GetColor(varItem.Color);
  920. hqChart.ChartPaint.push(chart);
  921. }
  922. this.CreateDrawText=function(hqChart,windowIndex,varItem,id)
  923. {
  924. let chartText=new ChartSingleText();
  925. chartText.Canvas=hqChart.Canvas;
  926. chartText.Name=varItem.Name;
  927. chartText.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  928. chartText.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  929. chartText.ReloadResource();
  930. if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);
  931. else chartText.Color=this.GetDefaultColor(id);
  932. if (varItem.IsDrawAbove) chartText.Direction=1;
  933. else chartText.Direction=0;
  934. if (varItem.DrawFontSize>0) chartText.TextFont=`${varItem.DrawFontSize}px 微软雅黑`; //临时用下吧
  935. let titleIndex=windowIndex+1;
  936. chartText.DrawData=varItem.Draw.DrawData;
  937. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  938. hqChart.ChartPaint.push(chartText);
  939. }
  940. this.CreateBackgroud=function(hqChart,windowIndex,varItem,id)
  941. {
  942. let chart=new ChartBackground();
  943. chart.Canvas=hqChart.Canvas;
  944. chart.Name=varItem.Name;
  945. chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  946. chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  947. if (varItem.Draw && varItem.Draw.DrawData)
  948. {
  949. var drawData=varItem.Draw.DrawData;
  950. chart.Color=drawData.Color;
  951. chart.ColorAngle=drawData.Angle;
  952. if (drawData.Data) chart.Data.Data=drawData.Data;
  953. }
  954. hqChart.ChartPaint.push(chart);
  955. }
  956. this.CreateBackgroundDiv=function(hqChart,windowIndex,varItem,id)
  957. {
  958. var chart=new ChartBackgroundDiv();
  959. chart.Canvas=hqChart.Canvas;
  960. chart.Name=varItem.Name;
  961. chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  962. chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  963. if (varItem.Draw && varItem.Draw.DrawData)
  964. {
  965. var drawData=varItem.Draw.DrawData;
  966. chart.AryColor=drawData.AryColor;
  967. chart.ColorType=drawData.ColorType;
  968. if (drawData.Data) chart.Data.Data=drawData.Data;
  969. }
  970. hqChart.ChartPaint.push(chart);
  971. }
  972. this.CreateMultiText = function (hqChart, windowIndex, varItem, i)
  973. {
  974. let chart = new ChartMultiText();
  975. chart.Canvas = hqChart.Canvas;
  976. chart.Name = varItem.Name;
  977. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  978. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  979. chart.Data = hqChart.ChartPaint[0].Data;//绑定K线
  980. chart.Texts = varItem.Draw.DrawData;
  981. hqChart.ChartPaint.push(chart);
  982. }
  983. this.CreateMulitHtmlDom=function(hqChart,windowIndex,varItem,i)
  984. {
  985. let chart=new ChartMultiHtmlDom();
  986. chart.Canvas=hqChart.Canvas;
  987. chart.Name=varItem.Name;
  988. chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  989. chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  990. chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
  991. chart.Texts=varItem.Draw.DrawData;
  992. chart.DrawCallback= varItem.Draw.Callback;
  993. hqChart.ChartPaint.push(chart);
  994. }
  995. this.CreateStackedBar=function(hqChart,windowIndex,varItem,i)
  996. {
  997. var chart=new ChartStackedBar();
  998. chart.Canvas=hqChart.Canvas;
  999. chart.Name=varItem.Name;
  1000. chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  1001. chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
  1002. chart.HQChart=hqChart;
  1003. chart.Data.Data=varItem.Draw.DrawData;
  1004. if (IFrameSplitOperator.IsNonEmptyArray(varItem.Draw.BarColor)) chart.BarColor=varItem.Draw.BarColor;
  1005. if (IFrameSplitOperator.IsNonEmptyArray(varItem.Draw.BarName)) chart.BarName=varItem.Draw.BarName;
  1006. if (IFrameSplitOperator.IsNumber(varItem.Draw.LineWidth)) chart.LineWidth=varItem.Draw.LineWidth;
  1007. if (IFrameSplitOperator.IsNumber(varItem.Draw.BarType)) chart.BarType=varItem.Draw.BarType;
  1008. hqChart.ChartPaint.push(chart);
  1009. var titleIndex=windowIndex+1;
  1010. var titleData=new DynamicTitleData(chart.Data,chart.BarName,chart.BarColor);
  1011. titleData.DataType="ChartStackedBar";
  1012. hqChart.TitlePaint[titleIndex].Data[i]=titleData;
  1013. }
  1014. this.CreateMultiLine = function (hqChart, windowIndex, varItem, i)
  1015. {
  1016. let chart = new ChartMultiLine();
  1017. chart.Canvas = hqChart.Canvas;
  1018. chart.Name = varItem.Name;
  1019. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  1020. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  1021. chart.Data = hqChart.ChartPaint[0].Data;//绑定K线
  1022. chart.Lines = varItem.Draw.DrawData;
  1023. if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
  1024. if (varItem.Draw.LineDash) chart.LineDash=varItem.Draw.LineDash;
  1025. if (IFrameSplitOperator.IsNumber(varItem.Draw.LineWidth)) chart.LineWidth=varItem.Draw.LineWidth;
  1026. if(varItem.Draw.Arrow) //箭头配置
  1027. {
  1028. var item=varItem.Draw.Arrow;
  1029. if (item.Start==true) chart.Arrow.Start=true;
  1030. if (item.End==true) chart.Arrow.End=true;
  1031. if (IFrameSplitOperator.IsNumber(item.Angle)) chart.ArrawAngle=item.Angle;
  1032. if (IFrameSplitOperator.IsNumber(item.Length)) chart.ArrawLength=item.Length;
  1033. if (IFrameSplitOperator.IsNumber(item.LineWidth)) chart.ArrawLineWidth=item.LineWidth;
  1034. }
  1035. hqChart.ChartPaint.push(chart);
  1036. }
  1037. this.CreateMultiPoint = function (hqChart, windowIndex, varItem, i)
  1038. {
  1039. let chart = new ChartMultiPoint();
  1040. chart.Canvas = hqChart.Canvas;
  1041. chart.Name = varItem.Name;
  1042. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  1043. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  1044. chart.Data = hqChart.ChartPaint[0].Data;//绑定K线
  1045. chart.PointGroup = varItem.Draw.DrawData;
  1046. if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
  1047. hqChart.ChartPaint.push(chart);
  1048. }
  1049. this.CreateMultiBar = function (hqChart, windowIndex, varItem, i)
  1050. {
  1051. let chart = new ChartMultiBar();
  1052. chart.Canvas = hqChart.Canvas;
  1053. chart.Name = varItem.Name;
  1054. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  1055. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  1056. chart.Data = hqChart.ChartPaint[0].Data;//绑定K线
  1057. chart.Bars = varItem.Draw.DrawData;
  1058. hqChart.ChartPaint.push(chart);
  1059. }
  1060. //创建K线背景
  1061. this.CreateSelfKLine = function (hqChart, windowIndex, hisData)
  1062. {
  1063. let chart = new ChartKLine();
  1064. chart.Canvas = hqChart.Canvas;
  1065. chart.Name = "Self Kline"
  1066. chart.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  1067. chart.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  1068. chart.Data = hisData
  1069. chart.IsShowMaxMinPrice = false;
  1070. chart.IsShowKTooltip = false;
  1071. chart.DrawType = this.KLineType;
  1072. hqChart.ChartPaint.push(chart);
  1073. }
  1074. this.BindInstructionData = function (hqChart, windowIndex, hisData) //绑定指示指标
  1075. {
  1076. if (this.OutVar == null || this.OutVar.length < 0) return;
  1077. if (this.InstructionType == 2)
  1078. {
  1079. let varItem = this.OutVar[this.OutVar.length - 1]; //取最后一组数据作为指示数据
  1080. hqChart.SetInstructionData(this.InstructionType, { Data: varItem.Data }); //设置指示数据
  1081. return true;
  1082. }
  1083. else if (this.InstructionType == 1) //交易系统
  1084. {
  1085. var buyData, sellData;
  1086. for (var i in this.OutVar)
  1087. {
  1088. let item = this.OutVar[i];
  1089. if (item.Name == 'ENTERLONG') buyData = item.Data;
  1090. else if (item.Name == 'EXITLONG') sellData = item.Data;
  1091. }
  1092. hqChart.SetInstructionData(this.InstructionType, { Buy: buyData, Sell: sellData }); //设置指示数据
  1093. return true;
  1094. }
  1095. }
  1096. this.BindData = function (hqChart, windowIndex, hisData)
  1097. {
  1098. if (windowIndex == 0 && this.InstructionType)
  1099. {
  1100. this.BindInstructionData(hqChart, windowIndex, hisData);
  1101. return;
  1102. }
  1103. //清空指标图形
  1104. hqChart.DeleteIndexPaint(windowIndex);
  1105. if (windowIndex == 0) hqChart.ShowKLine(true);
  1106. if (this.OutVar == null || this.OutVar.length < 0) return;
  1107. //叠加一个K线背景
  1108. if (this.KLineType != null)
  1109. {
  1110. if (this.KLineType === 0 || this.KLineType === 1 || this.KLineType === 2) this.CreateSelfKLine(hqChart, windowIndex, hisData);
  1111. else if (this.KLineType === -1 && windowIndex == 0) hqChart.ShowKLine(false);
  1112. }
  1113. if (windowIndex >= 1 && hqChart.Frame)
  1114. {
  1115. var ySpliter=hqChart.Frame.SubFrame[windowIndex].Frame.YSplitOperator;
  1116. if (ySpliter)
  1117. {
  1118. ySpliter.Reset();
  1119. ySpliter.FloatPrecision = this.FloatPrecision;
  1120. if (this.YAxis) ySpliter.SetOption(this.YAxis);
  1121. }
  1122. if (this.YSpecificMaxMin) hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = this.YSpecificMaxMin; //最大最小值
  1123. if (this.YSplitScale) hqChart.Frame.SubFrame[windowIndex].Frame.YSplitScale = this.YSplitScale; //固定刻度
  1124. }
  1125. if (IFrameSplitOperator.IsNumber(this.YSplitType)) hqChart.Frame.SubFrame[windowIndex].Frame.YSplitOperator.SplitType=this.YSplitType;
  1126. for (var i=0 ;i<this.OutVar.length;++i )
  1127. {
  1128. let item = this.OutVar[i];
  1129. if (item.IsExData === true) continue; //扩展数据不显示图形
  1130. if (item.Type==1000 || item.Type==1001) continue; //数据集合, 字符串
  1131. if (item.Type == 0)
  1132. {
  1133. if (item.IsOverlayLine) this.CreateOverlayLine(hqChart, windowIndex, item, i);
  1134. else if (item.IsSingleLine) this.CreateSingleLine(hqChart,windowIndex,item,i,item.Type);
  1135. else this.CreateLine(hqChart, windowIndex, item, i);
  1136. }
  1137. else if (item.Type == 1)
  1138. {
  1139. switch (item.Draw.DrawType)
  1140. {
  1141. case 'STICKLINE':
  1142. this.CreateBar(hqChart, windowIndex, item, i);
  1143. break;
  1144. case 'DRAWTEXT':
  1145. this.CreateDrawTextV2(hqChart, windowIndex, item, i);
  1146. break;
  1147. case 'SUPERDRAWTEXT':
  1148. case 'DRAWTEXT_FIX':
  1149. this.CreateText(hqChart, windowIndex, item, i);
  1150. break;
  1151. case 'DRAWLINE':
  1152. this.CreateStraightLine(hqChart, windowIndex, item, i);
  1153. break;
  1154. case 'DRAWBAND':
  1155. this.CreateBand(hqChart, windowIndex, item, i);
  1156. break;
  1157. case 'DRAWKLINE':
  1158. case "DRAWKLINE1":
  1159. this.CreateKLine(hqChart, windowIndex, item, i);
  1160. break;
  1161. case "DRAWCOLORKLINE":
  1162. this.CreateDrawColorKLine(hqChart,windowIndex,item,i);
  1163. break;
  1164. case 'DRAWKLINE_IF':
  1165. this.CreateKLine(hqChart, windowIndex, item, i);
  1166. break;
  1167. case 'POLYLINE':
  1168. this.CreatePolyLine(hqChart, windowIndex, item, i);
  1169. break;
  1170. case 'DRAWNUMBER':
  1171. this.CreateDrawNumber(hqChart, windowIndex, item, i);
  1172. break;
  1173. case 'DRAWICON':
  1174. this.CreateIcon(hqChart, windowIndex, item, i);
  1175. break;
  1176. case "ICON":
  1177. this.CreateIcon(hqChart,windowIndex,item,i);
  1178. break;
  1179. case 'DRAWRECTREL':
  1180. this.CreateRectangle(hqChart, windowIndex, item, i);
  1181. break;
  1182. case "DRAWTEXTABS":
  1183. case "DRAWTEXTREL":
  1184. this.CreateDrawText(hqChart,windowIndex,item,i);
  1185. break;
  1186. case 'DRAWGBK':
  1187. case "DRAWGBK2":
  1188. this.CreateBackgroud(hqChart,windowIndex,item,i);
  1189. break;
  1190. case "DRAWGBK_DIV":
  1191. this.CreateBackgroundDiv(hqChart,windowIndex,item,i);
  1192. break;
  1193. //第3方指标定制
  1194. case 'MULTI_TEXT':
  1195. this.CreateMultiText(hqChart, windowIndex, item, i);
  1196. break;
  1197. case "MULTI_HTMLDOM":
  1198. this.CreateMulitHtmlDom(hqChart,windowIndex,item,i);
  1199. break;
  1200. case 'MULTI_LINE':
  1201. this.CreateMultiLine(hqChart, windowIndex, item, i);
  1202. break;
  1203. case "MULTI_POINT":
  1204. this.CreateMultiPoint(hqChart,windowIndex,item,i);
  1205. break;
  1206. case 'MULTI_BAR':
  1207. this.CreateMultiBar(hqChart, windowIndex, item, i);
  1208. break;
  1209. case "KLINE_BG":
  1210. this.CreateBackgroud(hqChart,windowIndex,item,i);
  1211. break;
  1212. case SCRIPT_CHART_NAME.OVERLAY_BARS:
  1213. this.CreateStackedBar(hqChart,windowIndex,item,i);
  1214. break;
  1215. }
  1216. }
  1217. else if (item.Type == 2)
  1218. {
  1219. this.CreateMACD(hqChart, windowIndex, item, i);
  1220. }
  1221. else if (item.Type == 3)
  1222. {
  1223. this.CreatePointDot(hqChart, windowIndex, item, i, hisData);
  1224. }
  1225. else if (item.Type == 4)
  1226. {
  1227. this.CreateLineStick(hqChart, windowIndex, item, i);
  1228. }
  1229. else if (item.Type == 5)
  1230. {
  1231. this.CreateStick(hqChart, windowIndex, item, i);
  1232. }
  1233. else if (item.Type == 6)
  1234. {
  1235. this.CreateVolStick(hqChart, windowIndex, item, i, hisData);
  1236. }
  1237. else if (item.Type==7)
  1238. {
  1239. this.CreateLine(hqChart, windowIndex, item, i, 7);
  1240. }
  1241. else if (item.Type==9)
  1242. {
  1243. this.CreateArea(hqChart,windowIndex,item,i);
  1244. }
  1245. var titlePaint = hqChart.TitlePaint[windowIndex + 1];
  1246. if (titlePaint && titlePaint.Data && i < titlePaint.Data.length) //设置标题数值 小数位数和格式
  1247. {
  1248. if (this.StringFormat > 0) titlePaint.Data[i].StringFormat = this.StringFormat;
  1249. if (this.FloatPrecision >= 0) titlePaint.Data[i].FloatPrecision = this.FloatPrecision;
  1250. if (this.OutName && this.OutName.length>0 && this.Arguments && this.Arguments.length>0)
  1251. {
  1252. titlePaint.SetDynamicTitle(this.OutName,this.Arguments);
  1253. }
  1254. }
  1255. }
  1256. let titleIndex = windowIndex + 1;
  1257. var titlePaint=hqChart.TitlePaint[titleIndex];
  1258. titlePaint.Title = this.Name;
  1259. titlePaint.ArgumentsText = null;
  1260. titlePaint.Identify=this.Guid; //指标ID
  1261. titlePaint.Script=this;
  1262. titlePaint.IsShowMainIndexTitle=this.IsShowIndexTitle;
  1263. if (!this.IsShortTitle)
  1264. {
  1265. let indexParam = '';
  1266. for (let i=0; i<this.Arguments.length; ++i)
  1267. {
  1268. let item = this.Arguments[i];
  1269. if (indexParam.length > 0) indexParam += ',';
  1270. indexParam += item.Value.toString();
  1271. }
  1272. if (indexParam.length > 0) titlePaint.ArgumentsText =`(${indexParam})`;
  1273. }
  1274. if (this.TitleFont) titlePaint.Font=this.TitleFont;
  1275. if (hqChart.UpdateUICallback) hqChart.UpdateUICallback('ScriptIndex', this.OutVar,
  1276. { WindowIndex: windowIndex, Name: this.Name, Arguments: this.Arguments, HistoryData: hisData }); //通知上层回调
  1277. return true;
  1278. }
  1279. this.GetDefaultColor = function (id) //给一个默认的颜色
  1280. {
  1281. let COLOR_ARRAY = g_JSChartResource.ColorArray;
  1282. let number = parseInt(id);
  1283. return COLOR_ARRAY[number % (COLOR_ARRAY.length - 1)];
  1284. }
  1285. this.GetColor = function (colorName) //获取颜色
  1286. {
  1287. if (colorName.indexOf("RGB(")==0) return colorName.toLowerCase();
  1288. if (colorName.indexOf('rgb(')==0)return colorName;
  1289. if (colorName.indexOf("RGBA(")==0) return colorName.toLowerCase();
  1290. if (colorName.indexOf("rgba(")==0) return colorName;
  1291. var color=JSCommonComplier.JSComplier.ColorVarToRGB(colorName);
  1292. if (color) return color;
  1293. return 'rgb(30,144,255)';
  1294. /*
  1295. let COLOR_MAP = new Map([
  1296. ['COLORBLACK', 'rgb(0,0,0)'],
  1297. ['COLORBLUE', 'rgb(18,95,216)'],
  1298. ['COLORGREEN', 'rgb(25,158,0)'],
  1299. ['COLORCYAN', 'rgb(0,255,198)'],
  1300. ['COLORRED', 'rgb(238,21,21)'],
  1301. ['COLORMAGENTA', 'rgb(255,0,222)'],
  1302. ['COLORBROWN', 'rgb(149,94,15)'],
  1303. ['COLORLIGRAY', 'rgb(218,218,218)'], //画淡灰色
  1304. ['COLORGRAY', 'rgb(133,133,133)'], //画深灰色
  1305. ['COLORLIBLUE', 'rgb(94,204,255)'], //淡蓝色
  1306. ['COLORLIGREEN', 'rgb(183,255,190)'], //淡绿色
  1307. ['COLORLICYAN', 'rgb(154,255,242)'], //淡青色
  1308. ['COLORLIRED', 'rgb(255,172,172)'], //淡红色
  1309. ['COLORLIMAGENTA', 'rgb(255,145,241)'], //淡洋红色
  1310. ['COLORWHITE', 'rgb(255,255,255)'], //白色
  1311. ['COLORYELLOW', 'rgb(255,198,0)']
  1312. ]);
  1313. if (COLOR_MAP.has(colorName)) return COLOR_MAP.get(colorName);
  1314. //COLOR 自定义色
  1315. //格式为COLOR+“RRGGBB”:RR、GG、BB表示红色、绿色和蓝色的分量,每种颜色的取值范围是00-FF,采用了16进制。
  1316. //例如:MA5:MA(CLOSE,5),COLOR00FFFF 表示纯红色与纯绿色的混合色:COLOR808000表示淡蓝色和淡绿色的混合色。
  1317. if (colorName.indexOf('COLOR') == 0) return '#' + colorName.substr(5);
  1318. return 'rgb(30,144,255)';
  1319. */
  1320. }
  1321. //给图形设置指标名字
  1322. this.SetChartIndexName=function(chart)
  1323. {
  1324. if (this.Name) chart.IndexName=this.Name;
  1325. else if (this.ID) chart.IndexName==this.ID;
  1326. if (this.ID) chart.IndexID=this.ID;
  1327. chart.Script=this; //指标内容绑定上去
  1328. }
  1329. }
  1330. var HQ_DATA_TYPE =
  1331. {
  1332. KLINE_ID: 0, //K线
  1333. MINUTE_ID: 2, //当日走势图
  1334. HISTORY_MINUTE_ID: 3,//历史分钟走势图
  1335. MULTIDAY_MINUTE_ID: 4,//多日走势图
  1336. };
  1337. function OverlayScriptIndex(name,script,args,option)
  1338. {
  1339. this.newMethod=ScriptIndex; //派生
  1340. this.newMethod(name,script,args,option);
  1341. delete this.newMethod;
  1342. this.ClassName="OverlayScriptIndex";
  1343. //叠加指标
  1344. this.OverlayIndex=null; // { IsOverlay:true, Identify:overlayFrame.Identify, WindowIndex:windowIndex, Frame:overlayFrame }
  1345. //显示指标不符合条件
  1346. this.ShowConditionError=function(param,msg)
  1347. {
  1348. var hqChart=param.HQChart;
  1349. var windowIndex=param.WindowIndex;
  1350. var message='指标不支持当前品种或周期';
  1351. if (msg) message=msg;
  1352. var overlayIndex=this.OverlayIndex;
  1353. var frame=overlayIndex.Frame;
  1354. frame.ChartPaint=[];
  1355. var chart=new ChartLine();
  1356. chart.Canvas=hqChart.Canvas;
  1357. chart.ChartBorder=frame.Frame.ChartBorder;
  1358. chart.ChartFrame=frame.Frame;
  1359. chart.Identify=overlayIndex.Identify;
  1360. chart.NotSupportMessage=message;
  1361. frame.ChartPaint.push(chart);
  1362. hqChart.Draw();
  1363. }
  1364. this.BindData=function(hqChart,windowIndex,hisData)
  1365. {
  1366. if (!this.OverlayIndex || this.OverlayIndex.IsOverlay!=true) return;
  1367. this.OverlayIndex.Frame.ChartPaint=[];
  1368. if (!IFrameSplitOperator.IsNonEmptyArray(this.OutVar)) return;
  1369. //修改Y轴分割方式
  1370. if (IFrameSplitOperator.IsNumber(this.YSplitType)) this.OverlayIndex.Frame.Frame.YSplitOperator.SplitType=this.YSplitType;
  1371. //指标名字
  1372. var titleInfo={ Data:[], Title:this.Name, Frame:this.OverlayIndex.Frame.Frame, Script:this, IsShowIndexTitle:this.IsShowIndexTitle };
  1373. let indexParam='';
  1374. for(var i in this.Arguments)
  1375. {
  1376. let item=this.Arguments[i];
  1377. if (indexParam.length>0) indexParam+=',';
  1378. indexParam+=item.Value.toString();
  1379. }
  1380. if (indexParam.length>0) titleInfo.Title=this.Name+'('+indexParam+')';
  1381. var titleIndex=windowIndex+1;
  1382. var titlePaint=hqChart.TitlePaint[titleIndex];
  1383. titlePaint.OverlayIndex.set(this.OverlayIndex.Identify,titleInfo);
  1384. this.OverlayIndex.Frame.Frame.Title=titleInfo.Title; //给子框架设置标题
  1385. if (this.OutName && this.OutName.length>0 && this.Arguments && this.Arguments.length>0)
  1386. {
  1387. titlePaint.SetDynamicTitle(this.OutName,this.Arguments, this.OverlayIndex.Identify);
  1388. }
  1389. for(var i=0; i<this.OutVar.length; ++i)
  1390. {
  1391. let item=this.OutVar[i];
  1392. if (item.IsExData===true) continue; //扩展数据不显示图形
  1393. if (item.Type==0)
  1394. {
  1395. this.CreateLine(hqChart,windowIndex,item,i,item.Type);
  1396. }
  1397. else if (item.Type==1)
  1398. {
  1399. switch(item.Draw.DrawType)
  1400. {
  1401. case 'STICKLINE':
  1402. this.CreateBar(hqChart,windowIndex,item,i);
  1403. break;
  1404. case 'DRAWTEXT':
  1405. this.CreateDrawTextV2(hqChart,windowIndex,item,i);
  1406. break;
  1407. case 'SUPERDRAWTEXT':
  1408. this.CreateText(hqChart,windowIndex,item,i);
  1409. break;
  1410. case 'DRAWLINE':
  1411. this.CreateStraightLine(hqChart,windowIndex,item,i);
  1412. break;
  1413. case 'DRAWBAND':
  1414. this.CreateBand(hqChart,windowIndex,item,i);
  1415. break;
  1416. case 'DRAWKLINE':
  1417. this.CreateKLine(hqChart,windowIndex,item,i);
  1418. break;
  1419. case 'DRAWKLINE_IF':
  1420. this.CreateKLine(hqChart,windowIndex,item,i);
  1421. break;
  1422. case 'POLYLINE':
  1423. this.CreatePolyLine(hqChart,windowIndex,item,i);
  1424. break;
  1425. case 'DRAWNUMBER':
  1426. case "DRAWNUMBER_FIX":
  1427. case 'DRAWTEXT_FIX':
  1428. this.CreateNumberText(hqChart,windowIndex,item,i);
  1429. break;
  1430. case 'DRAWICON':
  1431. this.CreateIcon(hqChart,windowIndex,item,i);
  1432. break;
  1433. case 'DRAWCHANNEL':
  1434. this.CreateChannel(hqChart,windowIndex,item,i);
  1435. break;
  1436. case 'DRAWTEXT_LINE':
  1437. this.CreateTextLine(hqChart,windowIndex,item,i);
  1438. break;
  1439. case "VERTLINE":
  1440. this.CreateChartVericaltLine(hqChart,windowIndex,item,i);
  1441. break;
  1442. case "HORLINE":
  1443. this.CreateChartHorizontalLine(hqChart,windowIndex,item,i);
  1444. break;
  1445. case 'MULTI_LINE':
  1446. this.CreateMultiLine(hqChart,windowIndex,item,i);
  1447. break;
  1448. case "MULTI_POINT":
  1449. this.CreateMultiPoint(hqChart,windowIndex,item,i);
  1450. break;
  1451. case 'MULTI_BAR':
  1452. this.CreateMultiBar(hqChart,windowIndex,item,i);
  1453. break;
  1454. case 'MULTI_TEXT':
  1455. this.CreateMultiText(hqChart,windowIndex,item,i);
  1456. break;
  1457. case 'MULTI_SVGICON':
  1458. this.CreateMultiSVGIcon(hqChart,windowIndex,item,i);
  1459. break;
  1460. case "DRAWSVG":
  1461. this.CreateChartDrawSVG(hqChart,windowIndex,item,i);
  1462. break;
  1463. case "MULTI_HTMLDOM":
  1464. this.CreateMulitHtmlDom(hqChart,windowIndex,item,i);
  1465. break;
  1466. case "KLINE_BG":
  1467. this.CreateBackgroud(hqChart,windowIndex,item,i);
  1468. break;
  1469. case 'PARTLINE':
  1470. this.CreatePartLine(hqChart,windowIndex,item,i);
  1471. break;
  1472. case "DRAWTEXTABS":
  1473. case "DRAWTEXTREL":
  1474. this.CreateDrawText(hqChart,windowIndex,item,i);
  1475. break;
  1476. case "DRAWCOLORKLINE":
  1477. this.CreateDrawColorKLine(hqChart,windowIndex,item,i);
  1478. break;
  1479. case SCRIPT_CHART_NAME.OVERLAY_BARS:
  1480. this.CreateStackedBar(hqChart,windowIndex,item,i);
  1481. break;
  1482. default:
  1483. {
  1484. var find=g_ScriptIndexChartFactory.Get(item.Draw.DrawType); //外部挂接
  1485. if (find && find.CreateChartCallback)
  1486. find.CreateChartCallback(hqChart,windowIndex,item,i, this);
  1487. }
  1488. break;
  1489. }
  1490. }
  1491. else if (item.Type==2)
  1492. {
  1493. this.CreateMACD(hqChart,windowIndex,item,i);
  1494. }
  1495. else if (item.Type==3)
  1496. {
  1497. this.CreatePointDot(hqChart,windowIndex,item,i, hisData);
  1498. }
  1499. else if (item.Type==4)
  1500. {
  1501. this.CreateLineStick(hqChart,windowIndex,item,i);
  1502. }
  1503. else if (item.Type==5)
  1504. {
  1505. this.CreateStick(hqChart,windowIndex,item,i);
  1506. }
  1507. else if (item.Type==6)
  1508. {
  1509. this.CreateVolStick(hqChart,windowIndex,item,i,hisData);
  1510. }
  1511. else if (item.Type==7)
  1512. {
  1513. this.CreateLine(hqChart,windowIndex,item,i,item.Type);
  1514. }
  1515. else if (item.Type==8)
  1516. {
  1517. this.CreateLine(hqChart,windowIndex,item,i, item.Type);
  1518. }
  1519. else if (item.Type==9)
  1520. {
  1521. this.CreateArea(hqChart,windowIndex,item,i);
  1522. }
  1523. var titleData=titleInfo.Data[i];
  1524. if (titleData)
  1525. {
  1526. if (this.FloatPrecision>=0) titleData.FloatPrecision=this.FloatPrecision;
  1527. if (IFrameSplitOperator.IsNumber(this.StringFormat)) titleData.StringFormat=this.StringFormat;
  1528. }
  1529. }
  1530. return true;
  1531. }
  1532. //指标执行完成
  1533. this.RecvResultData=function(outVar,param)
  1534. {
  1535. let hqChart=param.HQChart;
  1536. let windowIndex=param.WindowIndex;
  1537. let hisData=param.HistoryData;
  1538. param.Self.OutVar=outVar;
  1539. param.Self.BindData(hqChart,windowIndex,hisData);
  1540. param.HQChart.UpdataDataoffset(); //更新数据偏移
  1541. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  1542. param.HQChart.Draw();
  1543. var event=hqChart.GetOverlayIndexEvent(); //指标计算完成回调
  1544. if (event)
  1545. {
  1546. var self=param.Self;
  1547. var data={ OutVar:self.OutVar, WindowIndex: windowIndex, Name: self.Name, Arguments: self.Arguments, HistoryData: hisData,
  1548. Identify:self.OverlayIndex.Identify,
  1549. Stock: {Symbol:hqChart.Symbol,Name:hqChart.Name} };
  1550. event.Callback(event,data,self);
  1551. }
  1552. }
  1553. //自定义图形配色
  1554. this.ReloadChartResource=function(hqChart, windowIndex, chart)
  1555. {
  1556. var event=hqChart.GetEventCallback(JSCHART_EVENT_ID.ON_RELOAD_OVERLAY_INDEX_CHART_RESOURCE); //指标计算完成回调
  1557. if (!event || !event.Callback) return;
  1558. var overlayIndex=this.OverlayIndex;
  1559. var frame=overlayIndex.Frame;
  1560. var script=frame.Script;
  1561. var sendData={ Chart:chart, IndexName:script.Name,IndexID:script.ID, HQChart:hqChart, WindowIndex:windowIndex, Guid:overlayIndex.Identify };
  1562. event.Callback(event,sendData,this);
  1563. }
  1564. //////////////////////////////////////////////////////////////////////////////////////
  1565. // 图形创建
  1566. /////////////////////////////////////////////////////////////////////////////////////
  1567. this.CreateLine=function(hqChart,windowIndex,varItem,id,lineType)
  1568. {
  1569. var overlayIndex=this.OverlayIndex;
  1570. var frame=overlayIndex.Frame;
  1571. if (lineType==7) var chart=new ChartStepLine();
  1572. else var chart=new ChartLine();
  1573. chart.Canvas=hqChart.Canvas;
  1574. chart.DrawType=1;
  1575. chart.Name=varItem.Name;
  1576. chart.ChartBorder=frame.Frame.ChartBorder;
  1577. chart.ChartFrame=frame.Frame;
  1578. chart.Identify=overlayIndex.Identify;
  1579. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1580. else chart.Color=this.GetDefaultColor(id);
  1581. if (lineType==8)
  1582. {
  1583. chart.DrawType=2;
  1584. chart.BreakPoint=varItem.BreakPoint;
  1585. }
  1586. if (varItem.LineWidth)
  1587. {
  1588. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  1589. if (!isNaN(width) && width>0) chart.LineWidth=width;
  1590. }
  1591. if (varItem.IsShow==false) chart.IsShow=false;
  1592. chart.Data.Data=varItem.Data;
  1593. this.ReloadChartResource(hqChart, windowIndex, chart);
  1594. let titleIndex=windowIndex+1;
  1595. var titlePaint=hqChart.TitlePaint[titleIndex];
  1596. var titleData=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);
  1597. this.SetTitleData(titleData,chart);
  1598. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
  1599. this.SetChartIndexName(chart);
  1600. frame.ChartPaint.push(chart);
  1601. }
  1602. //创建柱子
  1603. this.CreateBar=function(hqChart,windowIndex,varItem,id)
  1604. {
  1605. var overlayIndex=this.OverlayIndex;
  1606. var frame=overlayIndex.Frame;
  1607. let chart=new ChartStickLine();
  1608. chart.Canvas=hqChart.Canvas;
  1609. if (varItem.Draw.Width>0) chart.Width=varItem.Draw.Width;
  1610. else chart.Width=1;
  1611. chart.Name=varItem.Name;
  1612. chart.ChartBorder=frame.Frame.ChartBorder;
  1613. chart.ChartFrame=frame.Frame;
  1614. chart.Identify=overlayIndex.Identify;
  1615. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1616. else chart.Color=this.GetDefaultColor(id);
  1617. chart.Data.Data=varItem.Draw.DrawData;
  1618. this.SetChartIndexName(chart);
  1619. frame.ChartPaint.push(chart);
  1620. }
  1621. this.CreateDrawText=function(hqChart,windowIndex,varItem,id)
  1622. {
  1623. var overlayIndex=this.OverlayIndex;
  1624. var frame=overlayIndex.Frame;
  1625. var chart=new ChartSingleText();
  1626. chart.Canvas=hqChart.Canvas;
  1627. chart.Name=varItem.Name;
  1628. chart.ChartBorder=frame.Frame.ChartBorder;
  1629. chart.ChartFrame=frame.Frame;
  1630. chart.Identify=overlayIndex.Identify;
  1631. chart.ReloadResource();
  1632. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1633. else chart.Color=this.GetDefaultColor(id);
  1634. if (varItem.IsDrawAbove) chart.Direction=1;
  1635. else chart.Direction=0;
  1636. chart.DrawData=varItem.Draw.DrawData;
  1637. if (varItem.DrawFontSize>0) chart.TextFont=`${varItem.DrawFontSize*GetDevicePixelRatio()}px 微软雅黑`; //临时用下吧
  1638. frame.ChartPaint.push(chart);
  1639. }
  1640. //DRAWTEXT
  1641. this.CreateDrawTextV2=function(hqChart,windowIndex,varItem,id)
  1642. {
  1643. var overlayIndex=this.OverlayIndex;
  1644. var frame=overlayIndex.Frame;
  1645. var chartText=new ChartDrawText();
  1646. chartText.Canvas=hqChart.Canvas;
  1647. chartText.Name=varItem.Name;
  1648. chartText.ChartBorder=frame.Frame.ChartBorder;
  1649. chartText.ChartFrame=frame.Frame;
  1650. chartText.Identify=overlayIndex.Identify;
  1651. chartText.ReloadResource();
  1652. if (varItem.Color) chartText.Color=this.GetColor(varItem.Color);
  1653. else chartText.Color=this.GetDefaultColor(id);
  1654. if (varItem.IsDrawCenter===true) chartText.TextAlign='center';
  1655. if (varItem.IsDrawAbove===true) chartText.TextBaseline='bottom'
  1656. if (varItem.IsDrawBelow===true) chartText.TextBaseline='top';
  1657. if (varItem.Draw.DrawData) chartText.Data.Data=varItem.Draw.DrawData;
  1658. chartText.Text=varItem.Draw.Text;
  1659. if (varItem.Draw.Direction>0) chartText.Direction=varItem.Draw.Direction;
  1660. if (varItem.Draw.YOffset>0) chartText.YOffset=varItem.Draw.YOffset;
  1661. if (varItem.Draw.TextAlign) chartText.TextAlign=varItem.Draw.TextAlign;
  1662. //指定输出位置
  1663. if (varItem.Draw.FixedPosition==="TOP") chartText.FixedPosition=1;
  1664. else if (varItem.Draw.FixedPosition==="BOTTOM") chartText.FixedPosition=2;
  1665. if (varItem.DrawVAlign>=0)
  1666. {
  1667. if (varItem.DrawVAlign==0) chartText.TextBaseline='top';
  1668. else if (varItem.DrawVAlign==1) chartText.TextBaseline='middle';
  1669. else if (varItem.DrawVAlign==2) chartText.TextBaseline='bottom';
  1670. }
  1671. if (varItem.DrawAlign>=0)
  1672. {
  1673. if (varItem.DrawAlign==0) chartText.TextAlign="left";
  1674. else if (varItem.DrawAlign==1) chartText.TextAlign="center";
  1675. else if (varItem.DrawAlign==2) chartText.TextAlign='right';
  1676. }
  1677. if (varItem.DrawFontSize>0) chartText.FixedFontSize=varItem.DrawFontSize;
  1678. if (varItem.Background) chartText.TextBG=varItem.Background;
  1679. if (varItem.VerticalLine) chartText.VerticalLine=varItem.VerticalLine;
  1680. if (IFrameSplitOperator.IsNumber(varItem.XOffset)) chartText.ShowOffset.X=varItem.XOffset;
  1681. if (IFrameSplitOperator.IsNumber(varItem.YOffset)) chartText.ShowOffset.Y=varItem.YOffset;
  1682. //let titleIndex=windowIndex+1;
  1683. frame.ChartPaint.push(chartText);
  1684. }
  1685. //创建文本
  1686. this.CreateText=function(hqChart,windowIndex,varItem,id, drawName)
  1687. {
  1688. var overlayIndex=this.OverlayIndex;
  1689. var frame=overlayIndex.Frame;
  1690. let chart=new ChartSingleText();
  1691. chart.Canvas=hqChart.Canvas;
  1692. chart.Name=varItem.Name;
  1693. chart.ChartBorder=frame.Frame.ChartBorder;
  1694. chart.ChartFrame=frame.Frame;
  1695. chart.Identify=overlayIndex.Identify;
  1696. chart.ReloadResource();
  1697. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1698. else chart.Color=this.GetDefaultColor(id);
  1699. let titleIndex=windowIndex+1;
  1700. if (varItem.Draw.Position) chart.Position=varItem.Draw.Position; //赋值坐标
  1701. if (varItem.Draw.DrawData) chart.Data.Data=varItem.Draw.DrawData;
  1702. chart.Text=varItem.Draw.Text;
  1703. if (varItem.Draw.Direction>0) chart.Direction=varItem.Draw.Direction;
  1704. if (varItem.Draw.YOffset>0) chart.YOffset=varItem.Draw.YOffset;
  1705. if (varItem.Draw.TextAlign) chart.TextAlign=varItem.Draw.TextAlign;
  1706. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  1707. frame.ChartPaint.push(chart);
  1708. }
  1709. this.CreateDrawColorKLine=function(hqChart,windowIndex,varItem,id)
  1710. {
  1711. var overlayIndex=this.OverlayIndex;
  1712. var frame=overlayIndex.Frame;
  1713. let chart=new ChartColorKline();
  1714. chart.Canvas=hqChart.Canvas;
  1715. chart.Name=varItem.Name;
  1716. chart.DrawName="DRAWCOLORKLINE";
  1717. chart.ChartBorder=frame.Frame.ChartBorder;
  1718. chart.ChartFrame=frame.Frame;
  1719. chart.Identify=overlayIndex.Identify;
  1720. chart.Data.Data=varItem.Draw.DrawData;
  1721. if (IFrameSplitOperator.IsBool(varItem.Draw.IsEmptyBar)) chart.IsEmptyBar=varItem.Draw.IsEmptyBar;
  1722. if (varItem.Draw.Color) chart.Color=varItem.Draw.Color;
  1723. frame.ChartPaint.push(chart);
  1724. }
  1725. //COLORSTICK
  1726. this.CreateMACD=function(hqChart,windowIndex,varItem,id)
  1727. {
  1728. var overlayIndex=this.OverlayIndex;
  1729. var frame=overlayIndex.Frame;
  1730. let chart=new ChartMACD();
  1731. chart.Canvas=hqChart.Canvas;
  1732. chart.Name=varItem.Name;
  1733. chart.ChartBorder=frame.Frame.ChartBorder;
  1734. chart.ChartFrame=frame.Frame;
  1735. chart.Identify=overlayIndex.Identify;
  1736. let titleIndex=windowIndex+1;
  1737. chart.Data.Data=varItem.Data;
  1738. var titlePaint=hqChart.TitlePaint[titleIndex];
  1739. var clrTitle=this.GetDefaultColor(id);
  1740. if (varItem.Color) clrTitle=this.GetColor(varItem.Color);
  1741. if (varItem.UpColor) chart.UpColor=varItem.UpColor;
  1742. if (varItem.DownColor) chart.DownColor=varItem.DownColor;
  1743. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,clrTitle);
  1744. frame.ChartPaint.push(chart);
  1745. }
  1746. this.CreatePointDot=function(hqChart,windowIndex,varItem,id,hisData)
  1747. {
  1748. var overlayIndex=this.OverlayIndex;
  1749. var frame=overlayIndex.Frame;
  1750. let chart=new ChartPointDot();
  1751. chart.Canvas=hqChart.Canvas;
  1752. chart.Name=varItem.Name;
  1753. chart.ChartBorder=frame.Frame.ChartBorder;
  1754. chart.ChartFrame=frame.Frame;
  1755. chart.Identify=overlayIndex.Identify;
  1756. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1757. else chart.Color=this.GetDefaultColor(id);
  1758. if (varItem.Radius) chart.Radius=varItem.Radius;
  1759. if (varItem.LineWidth)
  1760. {
  1761. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  1762. if (!isNaN(width) && width>0) chart.Radius=width;
  1763. }
  1764. if (IFrameSplitOperator.IsBool(varItem.UpDownDot))
  1765. {
  1766. chart.EnableUpDownColor=varItem.UpDownDot;
  1767. chart.HistoryData=hisData;
  1768. }
  1769. let titleIndex=windowIndex+1;
  1770. chart.Data.Data=varItem.Data;
  1771. var titlePaint=hqChart.TitlePaint[titleIndex];
  1772. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);
  1773. frame.ChartPaint.push(chart);
  1774. }
  1775. this.CreateStick=function(hqChart,windowIndex,varItem,id)
  1776. {
  1777. var overlayIndex=this.OverlayIndex;
  1778. var frame=overlayIndex.Frame;
  1779. let chart=new ChartStick();
  1780. chart.Canvas=hqChart.Canvas;
  1781. chart.Name=varItem.Name;
  1782. chart.ChartBorder=frame.Frame.ChartBorder;
  1783. chart.ChartFrame=frame.Frame;
  1784. chart.Identify=overlayIndex.Identify;
  1785. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1786. else chart.Color=this.GetDefaultColor(id);
  1787. if (varItem.LineWidth)
  1788. {
  1789. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  1790. if (!isNaN(width) && width>0) chart.LineWidth=width;
  1791. }
  1792. let titleIndex=windowIndex+1;
  1793. chart.Data.Data=varItem.Data;
  1794. var titlePaint=hqChart.TitlePaint[titleIndex];
  1795. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);
  1796. frame.ChartPaint.push(chart);
  1797. }
  1798. this.CreateLineStick=function(hqChart,windowIndex,varItem,id)
  1799. {
  1800. var overlayIndex=this.OverlayIndex;
  1801. var frame=overlayIndex.Frame;
  1802. let chart=new ChartLineStick();
  1803. chart.Canvas=hqChart.Canvas;
  1804. chart.Name=varItem.Name;
  1805. chart.ChartBorder=frame.Frame.ChartBorder;
  1806. chart.ChartFrame=frame.Frame;
  1807. chart.Identify=overlayIndex.Identify;
  1808. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1809. else chart.Color=this.GetDefaultColor(id);
  1810. if (varItem.LineWidth)
  1811. {
  1812. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  1813. if (!isNaN(width) && width>0) chart.LineWidth=width;
  1814. }
  1815. let titleIndex=windowIndex+1;
  1816. chart.Data.Data=varItem.Data;
  1817. var titlePaint=hqChart.TitlePaint[titleIndex];
  1818. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);
  1819. frame.ChartPaint.push(chart);
  1820. }
  1821. this.CreateStraightLine=function(hqChart,windowIndex,varItem,id)
  1822. {
  1823. var overlayIndex=this.OverlayIndex;
  1824. var frame=overlayIndex.Frame;
  1825. let chart=new ChartLine();
  1826. chart.DrawType=1;
  1827. chart.Canvas=hqChart.Canvas;
  1828. chart.Name=varItem.Name;
  1829. chart.ChartBorder=frame.Frame.ChartBorder;
  1830. chart.ChartFrame=frame.Frame;
  1831. chart.Identify=overlayIndex.Identify;
  1832. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1833. else chart.Color=this.GetDefaultColor(id);
  1834. if (varItem.LineWidth)
  1835. {
  1836. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  1837. if (!isNaN(width) && width>0) chart.LineWidth=width;
  1838. }
  1839. let titleIndex=windowIndex+1;
  1840. chart.Data.Data=varItem.Draw.DrawData;
  1841. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(line.Data,varItem.Name,line.Color);
  1842. frame.ChartPaint.push(chart);
  1843. }
  1844. this.CreateVolStick=function(hqChart,windowIndex,varItem,id,hisData)
  1845. {
  1846. var overlayIndex=this.OverlayIndex;
  1847. var frame=overlayIndex.Frame;
  1848. let chart=new ChartVolStick();
  1849. chart.Canvas=hqChart.Canvas;
  1850. chart.Name=varItem.Name;
  1851. chart.ChartBorder=frame.Frame.ChartBorder;
  1852. chart.ChartFrame=frame.Frame;
  1853. chart.Identify=overlayIndex.Identify;
  1854. chart.KLineDrawType=hqChart.KLineDrawType; //设置K线显示类型
  1855. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1856. else chart.Color=this.GetDefaultColor(id);
  1857. if (varItem.UpColor) chart.UpColor=varItem.UpColor;
  1858. if (varItem.DownColor) chart.DownColor=varItem.DownColor;
  1859. if (IFrameSplitOperator.IsNumber(varItem.StickType)) chart.BarType=varItem.StickType;
  1860. let titleIndex=windowIndex+1;
  1861. chart.Data.Data=varItem.Data;
  1862. chart.HistoryData=hisData;
  1863. var titlePaint=hqChart.TitlePaint[titleIndex];
  1864. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);
  1865. this.SetChartIndexName(chart);
  1866. frame.ChartPaint.push(chart);
  1867. }
  1868. this.CreateBand=function(hqChart,windowIndex,varItem,id)
  1869. {
  1870. var overlayIndex=this.OverlayIndex;
  1871. var frame=overlayIndex.Frame;
  1872. let chart=new ChartBand();
  1873. chart.Canvas=hqChart.Canvas;
  1874. chart.Name=varItem.Name;
  1875. chart.ChartBorder=frame.Frame.ChartBorder;
  1876. chart.ChartFrame=frame.Frame;
  1877. chart.Identify=overlayIndex.Identify;
  1878. chart.FirstColor = varItem.Draw.Color[0];
  1879. chart.SecondColor = varItem.Draw.Color[1];
  1880. chart.Data.Data=varItem.Draw.DrawData;
  1881. frame.ChartPaint.push(chart);
  1882. }
  1883. //创建K线图
  1884. this.CreateKLine=function(hqChart,windowIndex,varItem,id)
  1885. {
  1886. var overlayIndex=this.OverlayIndex;
  1887. var frame=overlayIndex.Frame;
  1888. let chart=new ChartKLine();
  1889. chart.Canvas=hqChart.Canvas;
  1890. chart.Name=varItem.Name;
  1891. chart.ChartBorder=frame.Frame.ChartBorder;
  1892. chart.ChartFrame=frame.Frame;
  1893. chart.Identify=overlayIndex.Identify;
  1894. chart.Data.Data=varItem.Draw.DrawData;
  1895. chart.IsShowMaxMinPrice=false;
  1896. chart.IsShowKTooltip=false;
  1897. if (varItem.Color) //如果设置了颜色,使用外面设置的颜色
  1898. chart.UnchagneColor=chart.DownColor=chart.UpColor=this.GetColor(varItem.Color);
  1899. frame.ChartPaint.push(chart);
  1900. }
  1901. this.CreatePolyLine=function(hqChart,windowIndex,varItem,id)
  1902. {
  1903. var overlayIndex=this.OverlayIndex;
  1904. var frame=overlayIndex.Frame;
  1905. let chart=new ChartLine();
  1906. chart.Canvas=hqChart.Canvas;
  1907. chart.Name=varItem.Name;
  1908. chart.ChartBorder=frame.Frame.ChartBorder;
  1909. chart.ChartFrame=frame.Frame;
  1910. chart.Identify=overlayIndex.Identify;
  1911. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1912. else chart.Color=this.GetDefaultColor(id);
  1913. if (varItem.LineWidth)
  1914. {
  1915. let width=parseInt(varItem.LineWidth.replace("LINETHICK",""));
  1916. if (!isNaN(width) && width>0) chart.LineWidth=width;
  1917. }
  1918. let titleIndex=windowIndex+1;
  1919. chart.Data.Data=varItem.Draw.DrawData;
  1920. var titlePaint=hqChart.TitlePaint[titleIndex];
  1921. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(line.Data,' ',line.Color); //给一个空的标题
  1922. frame.ChartPaint.push(chart);
  1923. }
  1924. this.CreateNumberText=function(hqChart,windowIndex,varItem,id)
  1925. {
  1926. var overlayIndex=this.OverlayIndex;
  1927. var frame=overlayIndex.Frame;
  1928. let chart=new ChartSingleText();
  1929. chart.Canvas=hqChart.Canvas;
  1930. chart.Name=varItem.Name;
  1931. chart.ChartBorder=frame.Frame.ChartBorder;
  1932. chart.ChartFrame=frame.Frame;
  1933. chart.Identify=overlayIndex.Identify;
  1934. chart.ReloadResource();
  1935. chart.TextAlign="center";
  1936. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  1937. else chart.Color=this.GetDefaultColor(id);
  1938. if (varItem.IsDrawAbove) chart.Direction=1;
  1939. else chart.Direction=2;
  1940. if (varItem.Draw.Position) chart.Position=varItem.Draw.Position; //赋值坐标
  1941. let titleIndex=windowIndex+1;
  1942. chart.Data.Data=varItem.Draw.DrawData.Value;
  1943. chart.Text=varItem.Draw.DrawData.Text;
  1944. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  1945. frame.ChartPaint.push(chart);
  1946. }
  1947. this.CreateTextLine=function(hqChart,windowIndex,varItem,id)
  1948. {
  1949. var overlayIndex=this.OverlayIndex;
  1950. var frame=overlayIndex.Frame;
  1951. let chart=new ChartTextLine();
  1952. chart.Canvas=hqChart.Canvas;
  1953. chart.Name=varItem.Name;
  1954. chart.ChartBorder=frame.Frame.ChartBorder;
  1955. chart.ChartFrame=frame.Frame;
  1956. if (varItem.Draw && varItem.Draw.DrawData)
  1957. {
  1958. var drawData=varItem.Draw.DrawData;
  1959. chart.Text=drawData.Text;
  1960. chart.Line=drawData.Line;
  1961. chart.Price=drawData.Price;
  1962. }
  1963. frame.ChartPaint.push(chart);
  1964. }
  1965. this.CreateStackedBar=function(hqChart,windowIndex,varItem,id)
  1966. {
  1967. var overlayIndex=this.OverlayIndex;
  1968. var frame=overlayIndex.Frame;
  1969. let chart=new ChartStackedBar();
  1970. chart.Canvas=hqChart.Canvas;
  1971. chart.Name=varItem.Name;
  1972. chart.ChartBorder=frame.Frame.ChartBorder;
  1973. chart.ChartFrame=frame.Frame;
  1974. chart.Identify=overlayIndex.Identify;
  1975. if (IFrameSplitOperator.IsNonEmptyArray(varItem.Draw.BarColor)) chart.BarColor=varItem.Draw.BarColor;
  1976. if (IFrameSplitOperator.IsNonEmptyArray(varItem.Draw.BarName)) chart.BarName=varItem.Draw.BarName;
  1977. if (IFrameSplitOperator.IsNumber(varItem.Draw.LineWidth)) chart.LineWidth=varItem.Draw.LineWidth;
  1978. if (IFrameSplitOperator.IsNumber(varItem.Draw.BarType)) chart.BarType=varItem.Draw.BarType;
  1979. chart.Data.Data=varItem.Draw.DrawData;
  1980. var titleIndex=windowIndex+1;
  1981. var titlePaint=hqChart.TitlePaint[titleIndex];
  1982. var titleData=new DynamicTitleData(chart.Data,chart.BarName,chart.BarColor);
  1983. titleData.DataType="ChartStackedBar";
  1984. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
  1985. frame.ChartPaint.push(chart);
  1986. }
  1987. //创建图标
  1988. this.CreateIcon=function(hqChart,windowIndex,varItem,id)
  1989. {
  1990. var overlayIndex=this.OverlayIndex;
  1991. var frame=overlayIndex.Frame;
  1992. let chart=new ChartSingleText();
  1993. chart.Canvas=hqChart.Canvas;
  1994. chart.TextAlign='center';
  1995. chart.Name=varItem.Name;
  1996. chart.ChartBorder=frame.Frame.ChartBorder;
  1997. chart.ChartFrame=frame.Frame;
  1998. chart.Identify=overlayIndex.Identify;
  1999. if (varItem.DrawVAlign>=0)
  2000. {
  2001. if (varItem.DrawVAlign==0) chart.Direction=1;
  2002. else if (varItem.DrawVAlign==1) chart.Direction=0;
  2003. else if (varItem.DrawVAlign==2) chart.Direction=2;
  2004. }
  2005. if (varItem.DrawAlign>=0)
  2006. {
  2007. if (varItem.DrawAlign==0) chart.TextAlign="left";
  2008. else if (varItem.DrawAlign==1) chart.TextAlign="center";
  2009. else if (varItem.DrawAlign==2) chart.TextAlign='right';
  2010. }
  2011. if (IFrameSplitOperator.IsNumber(varItem.XOffset)) chart.ShowOffset.X=varItem.XOffset;
  2012. if (IFrameSplitOperator.IsNumber(varItem.YOffset)) chart.ShowOffset.Y=varItem.YOffset;
  2013. chart.Data.Data=varItem.Draw.DrawData;
  2014. var icon=varItem.Draw.Icon;
  2015. if (icon.IconFont==true)
  2016. {
  2017. chart.IconFont={ Family:icon.Family, Text:icon.Symbol, Color:icon.Color };
  2018. }
  2019. else
  2020. {
  2021. chart.Text=icon.Symbol;
  2022. if (varItem.Color) chart.Color=this.GetColor(varItem.Color);
  2023. else if (icon.Color) chart.Color=icon.Color;
  2024. else chart.Color='rgb(0,0,0)';
  2025. }
  2026. //var titleIndex=windowIndex+1;
  2027. //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
  2028. frame.ChartPaint.push(chart);
  2029. }
  2030. this.CreateMultiLine=function(hqChart,windowIndex,varItem,i)
  2031. {
  2032. var overlayIndex=this.OverlayIndex;
  2033. var frame=overlayIndex.Frame;
  2034. let chart=new ChartMultiLine();
  2035. chart.Canvas=hqChart.Canvas;
  2036. chart.Name=varItem.Name;
  2037. chart.ChartBorder=frame.Frame.ChartBorder;
  2038. chart.ChartFrame=frame.Frame;
  2039. chart.Identify=overlayIndex.Identify;
  2040. chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
  2041. chart.Lines=varItem.Draw.DrawData;
  2042. if (varItem.Draw.LineDash) chart.LineDash=varItem.Draw.LineDash;
  2043. if (IFrameSplitOperator.IsNumber(varItem.Draw.LineWidth)) chart.LineWidth=varItem.Draw.LineWidth;
  2044. if(varItem.Draw.Arrow) //箭头配置
  2045. {
  2046. var item=varItem.Draw.Arrow;
  2047. if (item.Start==true) chart.Arrow.Start=true;
  2048. if (item.End==true) chart.Arrow.End=true;
  2049. if (IFrameSplitOperator.IsNumber(item.Angle)) chart.ArrawAngle=item.Angle;
  2050. if (IFrameSplitOperator.IsNumber(item.Length)) chart.ArrawLength=item.Length;
  2051. if (IFrameSplitOperator.IsNumber(item.LineWidth)) chart.ArrawLineWidth=item.LineWidth;
  2052. }
  2053. frame.ChartPaint.push(chart);
  2054. }
  2055. this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
  2056. {
  2057. var overlayIndex=this.OverlayIndex;
  2058. var frame=overlayIndex.Frame;
  2059. let chart=new ChartMultiLine();
  2060. chart.Canvas=hqChart.Canvas;
  2061. chart.Name=varItem.Name;
  2062. chart.ChartBorder=frame.Frame.ChartBorder;
  2063. chart.ChartFrame=frame.Frame;
  2064. chart.Identify=overlayIndex.Identify;
  2065. chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
  2066. chart.PointGroup=varItem.Draw.DrawData;
  2067. frame.ChartPaint.push(chart);
  2068. }
  2069. this.CreateBackgroud=function(hqChart,windowIndex,varItem,i)
  2070. {
  2071. var overlayIndex=this.OverlayIndex;
  2072. var frame=overlayIndex.Frame;
  2073. let chart=new ChartBackground();
  2074. chart.Canvas=hqChart.Canvas;
  2075. chart.Name=varItem.Name;
  2076. chart.ChartBorder=frame.Frame.ChartBorder;
  2077. chart.ChartFrame=frame.Frame;
  2078. chart.Identify=overlayIndex.Identify;
  2079. if (varItem.Draw && varItem.Draw.DrawData)
  2080. {
  2081. var drawData=varItem.Draw.DrawData;
  2082. chart.Color=drawData.Color;
  2083. chart.ColorAngle=drawData.Angle;
  2084. if (drawData.Data) chart.Data.Data=drawData.Data;
  2085. }
  2086. frame.ChartPaint.push(chart);
  2087. }
  2088. this.CreateMultiBar=function(hqChart,windowIndex,varItem,id)
  2089. {
  2090. var overlayIndex=this.OverlayIndex;
  2091. var frame=overlayIndex.Frame;
  2092. let chart=new ChartMultiBar();
  2093. chart.Canvas=hqChart.Canvas;
  2094. chart.Name=varItem.Name;
  2095. chart.ChartBorder=frame.Frame.ChartBorder;
  2096. chart.ChartFrame=frame.Frame;
  2097. chart.Identify=overlayIndex.Identify;
  2098. chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
  2099. chart.Bars=varItem.Draw.DrawData;
  2100. var titleIndex=windowIndex+1;
  2101. var titlePaint=hqChart.TitlePaint[titleIndex];
  2102. var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
  2103. titleData.IsShow=false;
  2104. titleData.DataType="MULTI_BAR";
  2105. titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
  2106. frame.ChartPaint.push(chart);
  2107. }
  2108. this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
  2109. {
  2110. var overlayIndex=this.OverlayIndex;
  2111. var frame=overlayIndex.Frame;
  2112. let chart=new ChartMultiText();
  2113. chart.Canvas=hqChart.Canvas;
  2114. chart.Name=varItem.Name;
  2115. chart.ChartBorder=frame.Frame.ChartBorder;
  2116. chart.ChartFrame=frame.Frame;
  2117. chart.Identify=overlayIndex.Identify;
  2118. chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
  2119. chart.Texts=varItem.Draw.DrawData;
  2120. frame.ChartPaint.push(chart);
  2121. }
  2122. this.CreateMulitHtmlDom=function(hqChart,windowIndex,varItem,i)
  2123. {
  2124. var overlayIndex=this.OverlayIndex;
  2125. var frame=overlayIndex.Frame;
  2126. let chart=new ChartMultiHtmlDom();
  2127. chart.Canvas=hqChart.Canvas;
  2128. chart.Name=varItem.Name;
  2129. chart.ChartBorder=frame.Frame.ChartBorder;
  2130. chart.ChartFrame=frame.Frame;
  2131. chart.Identify=overlayIndex.Identify;
  2132. chart.HQChart=hqChart;
  2133. chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
  2134. chart.Texts=varItem.Draw.DrawData;
  2135. chart.DrawCallback= varItem.Draw.Callback;
  2136. frame.ChartPaint.push(chart);
  2137. }
  2138. //给一个默认的颜色
  2139. this.GetDefaultColor=function(id)
  2140. {
  2141. let COLOR_ARRAY=
  2142. [
  2143. "rgb(24,71,178)",
  2144. "rgb(42,230,215)",
  2145. "rgb(252,96,154)",
  2146. "rgb(0,128,255)",
  2147. "rgb(229,0,79)",
  2148. "rgb(68,114,196)",
  2149. "rgb(255,174,0)",
  2150. "rgb(25,199,255)",
  2151. "rgb(175,95,162)",
  2152. "rgb(236,105,65)",
  2153. ];
  2154. let number=parseInt(id);
  2155. return COLOR_ARRAY[number%(COLOR_ARRAY.length-1)];
  2156. }
  2157. }
  2158. function APIScriptIndex(name, script, args, option, isOverlay) //后台执行指标
  2159. {
  2160. if (isOverlay) this.newMethod=OverlayScriptIndex;
  2161. else this.newMethod = ScriptIndex; //派生
  2162. this.newMethod(name, script, args, option);
  2163. delete this.newMethod;
  2164. this.ApiUrl; //指标执行api地址
  2165. this.HQDataType;
  2166. if (option.API)
  2167. {
  2168. if (option.API.Url) this.ApiUrl = option.API.Url;
  2169. if (option.API.Name) this.Name = this.ID = option.API.Name;
  2170. if (option.API.ID) this.ID = option.API.ID;
  2171. if (option.API.IsUsePageData===true) this.IsUsePageData=option.API.IsUsePageData;
  2172. }
  2173. //接收到订阅指标数据
  2174. this.RecvSubscribeData=function(data, hqChart, windowIndex, hisData)
  2175. {
  2176. this.RecvAPIData(data,hqChart,windowIndex,hisData);
  2177. }
  2178. this.ExecuteScript = function (hqChart, windowIndex, hisData)
  2179. {
  2180. JSConsole.Chart.Log('[APIScriptIndex::ExecuteScript] name, Arguments ', this.Name, this.Arguments);
  2181. //数据类型
  2182. let hqDataType = HQ_DATA_TYPE.KLINE_ID; //默认K线
  2183. var dateRange=null;
  2184. if (hqChart.ClassName === 'MinuteChartContainer' || hqChart.ClassName === 'MinuteChartHScreenContainer')
  2185. {
  2186. if (hqChart.DayCount > 1) hqDataType = HQ_DATA_TYPE.MULTIDAY_MINUTE_ID; //多日分钟
  2187. else hqDataType = HQ_DATA_TYPE.MINUTE_ID; //分钟数据
  2188. dateRange=hisData.GetDateRange();
  2189. }
  2190. else if (hqChart.ClassName === 'HistoryMinuteChartContainer')
  2191. {
  2192. hqDataType = HQ_DATA_TYPE.HISTORY_MINUTE_ID; //历史分钟
  2193. }
  2194. else
  2195. {
  2196. dateRange=hisData.GetDateRange();
  2197. }
  2198. var args = [];
  2199. if (this.Arguments)
  2200. {
  2201. for (var i in this.Arguments)
  2202. {
  2203. var item = this.Arguments[i];
  2204. args.push({ name: item.Name, value: item.Value });
  2205. }
  2206. }
  2207. var requestCount;
  2208. if (hqChart.GetRequestDataCount) requestCount= hqChart.GetRequestDataCount();
  2209. var self = this;
  2210. var postData =
  2211. {
  2212. indexname: this.ID, symbol: hqChart.Symbol, script: this.Script, args: args,
  2213. period: hqChart.Period, right: hqChart.Right, hqdatatype: hqDataType
  2214. };
  2215. if (dateRange) postData.DateRange=dateRange;
  2216. if (requestCount)
  2217. {
  2218. postData.maxdatacount=requestCount.MaxRequestDataCount;
  2219. postData.maxminutedaycount=requestCount.MaxRequestMinuteDayCount;
  2220. }
  2221. if (hqDataType == HQ_DATA_TYPE.MULTIDAY_MINUTE_ID || hqDataType == HQ_DATA_TYPE.MINUTE_ID) postData.daycount = hqChart.DayCount;
  2222. this.HQDataType = hqDataType;
  2223. if (hqChart.NetworkFilter)
  2224. {
  2225. var obj =
  2226. {
  2227. Name: 'APIScriptIndex::ExecuteScript', //类名::
  2228. Explain: '指标计算',
  2229. Request: { Url: self.ApiUrl, Type: 'POST', Data: postData },
  2230. Self: this,
  2231. HQChart: hqChart,
  2232. PreventDefault: false
  2233. };
  2234. hqChart.NetworkFilter(obj, function (data)
  2235. {
  2236. self.RecvAPIData(data, hqChart, windowIndex, hisData);
  2237. });
  2238. if (obj.PreventDefault == true) return; //已被上层替换,不调用默认的网络请求
  2239. }
  2240. wx.request({
  2241. url: self.ApiUrl,
  2242. data: postData,
  2243. method: 'POST',
  2244. dataType: "json",
  2245. async: true,
  2246. success: function (recvData)
  2247. {
  2248. self.RecvAPIData(recvData, hqChart, windowIndex, hisData);
  2249. },
  2250. error: function (request)
  2251. {
  2252. self.RecvError(request);
  2253. }
  2254. });
  2255. }
  2256. this.RecvAPIData = function (recvData, hqChart, windowIndex, hisData)
  2257. {
  2258. var data=recvData.data;
  2259. JSConsole.Chart.Log('[APIScriptIndex::RecvAPIData] recv data ', this.Name, data);
  2260. if (data.code != 0) return;
  2261. if (data.outdata && data.outdata.name) this.Name = data.outdata.name;
  2262. if (data.outdata.args) //外部修改显示参数
  2263. {
  2264. this.Arguments = [];
  2265. for (var i in data.outdata.args)
  2266. {
  2267. var item = data.outdata.args[i];
  2268. this.Arguments.push({ Name: item.name, Value: item.value });
  2269. }
  2270. }
  2271. if (this.HQDataType == HQ_DATA_TYPE.KLINE_ID)
  2272. {
  2273. this.OutVar = this.FittingData(data.outdata, hqChart);
  2274. JSConsole.Chart.Log('[APIScriptIndex::RecvAPIData] conver to OutVar ', this.OutVar);
  2275. }
  2276. else
  2277. {
  2278. this.OutVar = this.FittingMinuteData(data.outdata, hqChart); //走势图数据
  2279. }
  2280. this.BindData(hqChart, windowIndex, hisData);
  2281. if (this.IsLocked == false) //不上锁
  2282. {
  2283. hqChart.Frame.SubFrame[windowIndex].Frame.SetLock(null);
  2284. }
  2285. else //上锁
  2286. {
  2287. let lockData =
  2288. {
  2289. IsLocked: true, Callback: this.LockCallback, IndexName: this.Name, ID: this.LockID,
  2290. BG: this.LockBG, Text: this.LockText, TextColor: this.LockTextColor, Font: this.LockFont, Count: this.LockCount, MinWidth: this.LockMinWidth
  2291. };
  2292. hqChart.Frame.SubFrame[windowIndex].Frame.SetLock(lockData);
  2293. }
  2294. hqChart.UpdataDataoffset(); //更新数据偏移
  2295. hqChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  2296. hqChart.Draw();
  2297. if (hqChart.GetIndexEvent)
  2298. {
  2299. var event = hqChart.GetIndexEvent(); //指标计算完成回调
  2300. if (event)
  2301. {
  2302. var data =
  2303. {
  2304. OutVar: this.OutVar, WindowIndex: windowIndex, Name: this.Name, Arguments: this.Arguments, HistoryData: hisData,
  2305. Stock: { Symbol: hqChart.Symbol, Name: hqChart.Name }
  2306. };
  2307. event.Callback(event, data, this);
  2308. }
  2309. }
  2310. }
  2311. this.FittingData = function (jsonData, hqChart)
  2312. {
  2313. var outVar = jsonData.outvar;
  2314. var date = jsonData.date;
  2315. var time = jsonData.time;
  2316. var kdata = hqChart.ChartPaint[0].Data;
  2317. //把数据拟合到kdata上
  2318. var result = [];
  2319. for (var i=0; i<outVar.length; ++i)
  2320. {
  2321. var item = outVar[i];
  2322. var indexData = [];
  2323. var outVarItem = { Name: item.name, Type: item.type };
  2324. if (item.color) outVarItem.Color = item.color;
  2325. if (IFrameSplitOperator.IsBool(item.IsShowTitle)) outVarItem.IsShowTitle = item.IsShowTitle; //是否显示指标标题
  2326. if (item.data)
  2327. {
  2328. outVarItem.Data = this.FittingArray(item.data, date, time, hqChart);
  2329. if (item.color) outVarItem.Color = item.color;
  2330. if (item.linewidth >= 1) outVarItem.LineWidth = item.linewidth;
  2331. if (IFrameSplitOperator.IsBool(item.isshow)) outVarItem.IsShow = item.isshow;
  2332. if (item.isexdata == true) outVarItem.IsExData = true;
  2333. if (item.BreakPoint) outVarItem.BreakPoint=item.BreakPoint;
  2334. if (item.UpColor) outVarItem.UpColor=item.UpColor;
  2335. if (item.DownColor) outVarItem.DownColor=item.DownColor;
  2336. if (IFrameSplitOperator.IsBool(item.isDotLine)) outVarItem.IsDotLine = item.isDotLine;
  2337. if (IFrameSplitOperator.IsNonEmptyArray(item.lineDash)) outVarItem.LineDash=item.lineDash;
  2338. if (IFrameSplitOperator.IsBool(item.isSingleLine)) outVarItem.IsSingleLine=item.isSingleLine;
  2339. result.push(outVarItem);
  2340. }
  2341. else if (item.Draw)
  2342. {
  2343. var draw = item.Draw;
  2344. var drawItem = {};
  2345. if (draw.DrawType == 'DRAWICON') //图标
  2346. {
  2347. drawItem.Icon = draw.Icon;
  2348. //小程序不支持svg, 只能转文字
  2349. if (IFrameSplitOperator.IsNumber(draw.IconType))
  2350. drawItem.Icon=JSCommonComplier.g_JSComplierResource.GetDrawTextIcon(draw.IconType);
  2351. drawItem.Name = draw.Name;
  2352. drawItem.DrawType = draw.DrawType;
  2353. drawItem.DrawData = this.FittingArray(draw.DrawData, date, time, hqChart);
  2354. outVarItem.Draw = drawItem;
  2355. result.push(outVarItem);
  2356. }
  2357. else if (draw.DrawType == 'DRAWTEXT') //文本
  2358. {
  2359. drawItem.Text = draw.Text;
  2360. drawItem.Name = draw.Name;
  2361. drawItem.DrawType = draw.DrawType;
  2362. drawItem.DrawData = this.FittingArray(draw.DrawData, date, time, hqChart);
  2363. outVarItem.Draw = drawItem;
  2364. result.push(outVarItem);
  2365. }
  2366. else if (draw.DrawType == 'STICKLINE') //柱子
  2367. {
  2368. drawItem.Name = draw.Name;
  2369. drawItem.Type = draw.Type;
  2370. drawItem.Width = draw.Width;
  2371. drawItem.DrawType = draw.DrawType;
  2372. drawItem.DrawData = this.FittingArray(draw.DrawData, date, time, hqChart, 1);
  2373. outVarItem.Draw = drawItem;
  2374. result.push(outVarItem);
  2375. }
  2376. else if (draw.DrawType=="DRAWBAND")
  2377. {
  2378. drawItem.Name=draw.Name;
  2379. drawItem.Type=draw.Type;
  2380. drawItem.DrawType=draw.DrawType;
  2381. drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart,1);
  2382. drawItem.Color=draw.Color;
  2383. outVarItem.Draw=drawItem;
  2384. result.push(outVarItem);
  2385. }
  2386. else if (draw.DrawType == 'MULTI_LINE')
  2387. {
  2388. drawItem.Text = draw.Text;
  2389. drawItem.Name = draw.Name;
  2390. drawItem.DrawType = draw.DrawType;
  2391. drawItem.DrawData = this.FittingMultiLine(draw.DrawData, date, time, hqChart);
  2392. outVarItem.Draw = drawItem;
  2393. if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
  2394. {
  2395. for(var k=0; k<drawItem.DrawData.length; ++k)
  2396. {
  2397. this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
  2398. }
  2399. }
  2400. if (draw.LineDash) drawItem.LineDash=draw.LineDash;
  2401. if (draw.Arrow) drawItem.Arrow=draw.Arrow;
  2402. if (IFrameSplitOperator.IsNumber(draw.LineWidth)) drawItem.LineWidth=draw.LineWidth;
  2403. result.push(outVarItem);
  2404. }
  2405. else if (draw.DrawType == 'MULTI_POINT')
  2406. {
  2407. drawItem.Text = draw.Text;
  2408. drawItem.Name = draw.Name;
  2409. drawItem.DrawType = draw.DrawType;
  2410. drawItem.DrawData = this.FittingMultiLine(draw.DrawData, date, time, hqChart);
  2411. outVarItem.Draw = drawItem;
  2412. if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
  2413. {
  2414. for(var k=0; k<drawItem.DrawData.length; ++k)
  2415. {
  2416. this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
  2417. }
  2418. }
  2419. result.push(outVarItem);
  2420. }
  2421. else if (draw.DrawType == 'MULTI_BAR')
  2422. {
  2423. drawItem.Text = draw.Text;
  2424. drawItem.Name = draw.Name;
  2425. drawItem.DrawType = draw.DrawType;
  2426. drawItem.DrawData = this.FittingMultiLine(draw.DrawData, date, time, hqChart);
  2427. outVarItem.Draw = drawItem;
  2428. result.push(outVarItem);
  2429. }
  2430. else if (draw.DrawType==SCRIPT_CHART_NAME.OVERLAY_BARS)
  2431. {
  2432. drawItem.Name=draw.Name;
  2433. drawItem.Type=draw.Type;
  2434. drawItem.DrawType=draw.DrawType;
  2435. drawItem.BarName=draw.BarName;
  2436. drawItem.BarColor=draw.BarColor;
  2437. drawItem.LineWidth=draw.LineWidth;
  2438. drawItem.BarType=draw.BarType;
  2439. drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart,1);
  2440. outVarItem.Draw=drawItem;
  2441. result.push(outVarItem);
  2442. }
  2443. else if (draw.DrawType == 'MULTI_TEXT')
  2444. {
  2445. drawItem.Text = draw.Text;
  2446. drawItem.Name = draw.Name;
  2447. drawItem.DrawType = draw.DrawType;
  2448. drawItem.DrawData = this.FittingMultiText(draw.DrawData, date, time, hqChart);
  2449. this.GetKLineData(drawItem.DrawData, hqChart);
  2450. outVarItem.Draw = drawItem;
  2451. result.push(outVarItem);
  2452. }
  2453. else if (draw.DrawType=="MULTI_HTMLDOM") //外部自己创建dom
  2454. {
  2455. drawItem.Text=draw.Text;
  2456. drawItem.Name=draw.Name;
  2457. drawItem.DrawType=draw.DrawType;
  2458. drawItem.Callback=draw.Callback;
  2459. drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
  2460. this.GetKLineData(drawItem.DrawData, hqChart);
  2461. outVarItem.Draw=drawItem;
  2462. result.push(outVarItem);
  2463. }
  2464. else if (draw.DrawType=="KLINE_BG")
  2465. {
  2466. drawItem.Name=draw.Name;
  2467. drawItem.DrawType=draw.DrawType;
  2468. drawItem.DrawData={ Color:draw.Color, Angle:draw.Angle };
  2469. drawItem.DrawData.Data=this.FittingKLineBG(draw.DrawData, hqChart);
  2470. outVarItem.Draw=drawItem;
  2471. outVarItem.Name=draw.DrawType;
  2472. result.push(outVarItem);
  2473. }
  2474. else if (draw.DrawType=="PARTLINE")
  2475. {
  2476. drawItem.Name=draw.Name;
  2477. drawItem.Type=draw.Type;
  2478. drawItem.DrawType=draw.DrawType;
  2479. drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart,1);
  2480. outVarItem.Draw=drawItem;
  2481. if (draw.LineWidth) outVarItem.LineWidth=draw.LineWidth;
  2482. result.push(outVarItem);
  2483. }
  2484. else if (draw.DrawType=="DRAWCOLORKLINE")
  2485. {
  2486. drawItem.Name=draw.Name;
  2487. drawItem.Type=draw.Type;
  2488. drawItem.DrawType=draw.DrawType;
  2489. drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart,1);
  2490. outVarItem.Draw=drawItem;
  2491. if (draw.Color) drawItem.Color=draw.Color;
  2492. if (IFrameSplitOperator.IsBool(draw.IsEmptyBar)) drawItem.IsEmptyBar=draw.IsEmptyBar;
  2493. result.push(outVarItem);
  2494. }
  2495. }
  2496. }
  2497. return result;
  2498. }
  2499. // h, high, low l.
  2500. this.GetKLineData=function(data,hqChart)
  2501. {
  2502. if (!data) return;
  2503. if (!Array.isArray(data)) return;
  2504. var kData=hqChart.ChartPaint[0].Data; //K线
  2505. for(var i in data)
  2506. {
  2507. var item=data[i];
  2508. if (!IFrameSplitOperator.IsString(item.Value)) continue;
  2509. if(!IFrameSplitOperator.IsNumber(item.Index)) continue;
  2510. if (item.Index<0 || item.Index>=kData.Data.length) continue;
  2511. var valueName=item.Value.toUpperCase();
  2512. var kItem=kData.Data[item.Index];
  2513. switch(valueName)
  2514. {
  2515. case "HIGH":
  2516. case "H":
  2517. item.Value=kItem.High;
  2518. break;
  2519. case "L":
  2520. case "LOW":
  2521. item.Value=kItem.Low;
  2522. break;
  2523. }
  2524. }
  2525. }
  2526. this.FittingKLineBG=function(data, hqChart)
  2527. {
  2528. var kData=hqChart.ChartPaint[0].Data; //K线
  2529. var result=[];
  2530. if (ChartData.IsDayPeriod(hqChart.Period,true)) //日线
  2531. {
  2532. var bFill=false;
  2533. for(var i=0,j=0;i<kData.Data.length;)
  2534. {
  2535. result[i]=0;
  2536. var kItem=kData.Data[i];
  2537. if (j>=data.length)
  2538. {
  2539. ++i;
  2540. continue;
  2541. }
  2542. var dataItem=data[j];
  2543. if (dataItem.Date<kItem.Date)
  2544. {
  2545. ++j;
  2546. }
  2547. else if (dataItem.Date>kItem.Date)
  2548. {
  2549. ++i;
  2550. }
  2551. else
  2552. {
  2553. bFill=true;
  2554. result[i]=1;
  2555. ++j;
  2556. ++i;
  2557. }
  2558. }
  2559. if (bFill) return result;
  2560. }
  2561. else if (ChartData.IsMinutePeriod(hqChart.Period,true)) //分钟线
  2562. {
  2563. var bFill=false;
  2564. for(var i=0,j=0;i<kData.Data.length;)
  2565. {
  2566. result[i]=0;
  2567. var kItem=kData.Data[i];
  2568. if (j>=data.length)
  2569. {
  2570. ++i;
  2571. continue;
  2572. }
  2573. var dataItem=data[j];
  2574. if (dataItem.Date<kItem.Date || (dataItem.Date==kItem.Date && dataItem.Time<kItem.Time))
  2575. {
  2576. ++j;
  2577. }
  2578. else if (dataItem.Date>kItem.Date || (dataItem.Date==kItem.Date && dataItem.Time>kItem.Time))
  2579. {
  2580. ++i;
  2581. }
  2582. else
  2583. {
  2584. bFill=true;
  2585. result[i]=1;
  2586. ++j;
  2587. ++i;
  2588. }
  2589. }
  2590. if (bFill) return result;
  2591. }
  2592. return null;
  2593. }
  2594. this.FittingArray = function (sourceData, date, time, hqChart, arrayType) //arrayType 0=单值数组 1=结构体
  2595. {
  2596. var kdata = hqChart.ChartPaint[0].Data; //K线
  2597. var arySingleData = [];
  2598. for (var i in sourceData)
  2599. {
  2600. var value = sourceData[i];
  2601. var indexItem = new SingleData(); //单列指标数据
  2602. indexItem.Date = date[i];
  2603. if (time && i < time.length) indexItem.Time = time[i];
  2604. indexItem.Value = value;
  2605. arySingleData.push(indexItem);
  2606. }
  2607. var aryFittingData;
  2608. if (ChartData.IsDayPeriod(hqChart.Period,true))
  2609. aryFittingData = kdata.GetFittingData(arySingleData); //数据和主图K线拟合
  2610. else
  2611. aryFittingData = kdata.GetMinuteFittingData(arySingleData); //数据和主图K线拟合
  2612. var bindData = new ChartData();
  2613. bindData.Data = aryFittingData;
  2614. var result;
  2615. if (arrayType == 1) result = bindData.GetObject();
  2616. else result = bindData.GetValue();
  2617. return result;
  2618. }
  2619. this.FittingMultiLine = function (sourceData, date, time, hqChart)
  2620. {
  2621. var kdata = hqChart.ChartPaint[0].Data; //K线
  2622. if (ChartData.IsDayPeriod(hqChart.Period, true)) //日线
  2623. {
  2624. var aryPoint = [];
  2625. for (var i in sourceData)
  2626. {
  2627. var item = sourceData[i];
  2628. for (var j in item.Point)
  2629. {
  2630. var point = item.Point[j];
  2631. aryPoint.push(point);
  2632. }
  2633. }
  2634. aryPoint.sort(function (a, b) { return a.Date - b.Date; });
  2635. kdata.GetDateIndex(aryPoint);
  2636. return sourceData;
  2637. }
  2638. else if (ChartData.IsMinutePeriod(hqChart.Period, true)) //分钟线
  2639. {
  2640. var aryPoint = [];
  2641. for (var i in sourceData)
  2642. {
  2643. var item = sourceData[i];
  2644. for (var j in item.Point)
  2645. {
  2646. var point = item.Point[j];
  2647. aryPoint.push(point);
  2648. }
  2649. }
  2650. aryPoint.sort(function (a, b) {
  2651. if (a.Date == b.Date) return a.Time - b.Time;
  2652. return a.Date - b.Date;
  2653. });
  2654. kdata.GetDateTimeIndex(aryPoint);
  2655. return sourceData;
  2656. }
  2657. return null;
  2658. }
  2659. this.FittingMultiText = function (sourceData, date, time, hqChart)
  2660. {
  2661. var kdata = hqChart.ChartPaint[0].Data; //K线
  2662. if (ChartData.IsDayPeriod(hqChart.Period, true)) //日线
  2663. {
  2664. sourceData.sort(function (a, b) { return a.Date - b.Date; });
  2665. kdata.GetDateIndex(sourceData);
  2666. return sourceData;
  2667. }
  2668. else if (ChartData.IsMinutePeriod(hqChart.Period, true)) //分钟线
  2669. {
  2670. sourceData.sort(function (a, b) {
  2671. if (a.Date == b.Date) return a.Time - b.Time;
  2672. return a.Date - b.Date;
  2673. }
  2674. );
  2675. kdata.GetDateTimeIndex(sourceData);
  2676. return sourceData;
  2677. }
  2678. return null;
  2679. }
  2680. this.FittingMinuteData=function(jsonData, hqChart)
  2681. {
  2682. var outVar=jsonData.outvar;
  2683. var date=jsonData.date;
  2684. var time=jsonData.time;
  2685. var result=[];
  2686. for(var i in outVar)
  2687. {
  2688. var item=outVar[i];
  2689. var outVarItem={Name:item.name,Type:item.type}
  2690. if (item.data)
  2691. {
  2692. outVarItem.Data=this.FittingMinuteArray(item.data,date,time,hqChart);
  2693. if (item.color) outVarItem.Color=item.color;
  2694. if (item.linewidth>=1) outVarItem.LineWidth=item.linewidth;
  2695. if (item.isshow==false) outVarItem.IsShow = false;
  2696. if (item.isexdata==true) outVarItem.IsExData = true;
  2697. result.push(outVarItem);
  2698. }
  2699. else if (item.Draw)
  2700. {
  2701. var draw=item.Draw;
  2702. var drawItem={};
  2703. if (draw.DrawType=='DRAWICON') //图标
  2704. {
  2705. drawItem.Icon=draw.Icon;
  2706. drawItem.Name=draw.Name;
  2707. drawItem.DrawType=draw.DrawType;
  2708. drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart);
  2709. outVarItem.Draw=drawItem;
  2710. result.push(outVarItem);
  2711. }
  2712. else if (draw.DrawType=='DRAWTEXT') //文本
  2713. {
  2714. drawItem.Text=draw.Text;
  2715. drawItem.Name=draw.Name;
  2716. drawItem.DrawType=draw.DrawType;
  2717. drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart);
  2718. outVarItem.Draw=drawItem;
  2719. result.push(outVarItem);
  2720. }
  2721. else if (draw.DrawType=='STICKLINE') //柱子
  2722. {
  2723. drawItem.Name=draw.Name;
  2724. drawItem.Type=draw.Type;
  2725. drawItem.Width=draw.Width;
  2726. drawItem.DrawType=draw.DrawType;
  2727. drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart,1);
  2728. outVarItem.Draw=drawItem;
  2729. result.push(outVarItem);
  2730. }
  2731. else if (draw.DrawType==SCRIPT_CHART_NAME.OVERLAY_BARS)
  2732. {
  2733. drawItem.Name=draw.Name;
  2734. drawItem.Type=draw.Type;
  2735. drawItem.DrawType=draw.DrawType;
  2736. drawItem.BarName=draw.BarName;
  2737. drawItem.BarColor=draw.BarColor;
  2738. drawItem.LineWidth=draw.LineWidth;
  2739. drawItem.DrawData=this.FittingMinuteArray(draw.DrawData,date,time,hqChart,1);
  2740. outVarItem.Draw=drawItem;
  2741. result.push(outVarItem);
  2742. }
  2743. else if (draw.DrawType=='MULTI_LINE')
  2744. {
  2745. drawItem.Text=draw.Text;
  2746. drawItem.Name=draw.Name;
  2747. drawItem.DrawType=draw.DrawType;
  2748. drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
  2749. for(var k in drawItem.DrawData)
  2750. {
  2751. this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
  2752. }
  2753. outVarItem.Draw=drawItem;
  2754. if (draw.LineDash) drawItem.LineDash=draw.LineDash;
  2755. if (draw.Arrow) drawItem.Arrow=draw.Arrow;
  2756. if (IFrameSplitOperator.IsNumber(draw.LineWidth)) drawItem.LineWidth=draw.LineWidth;
  2757. result.push(outVarItem);
  2758. }
  2759. else if (draw.DrawType=='MULTI_POINT')
  2760. {
  2761. drawItem.Text=draw.Text;
  2762. drawItem.Name=draw.Name;
  2763. drawItem.DrawType=draw.DrawType;
  2764. drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
  2765. for(var k in drawItem.DrawData)
  2766. {
  2767. this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
  2768. }
  2769. outVarItem.Draw=drawItem;
  2770. result.push(outVarItem);
  2771. }
  2772. else if (draw.DrawType=='MULTI_TEXT')
  2773. {
  2774. drawItem.Text=draw.Text;
  2775. drawItem.Name=draw.Name;
  2776. drawItem.DrawType=draw.DrawType;
  2777. drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
  2778. this.GetKLineData(drawItem.DrawData, hqChart);
  2779. outVarItem.Draw=drawItem;
  2780. result.push(outVarItem);
  2781. }
  2782. else if (draw.DrawType=='MULTI_SVGICON')
  2783. {
  2784. drawItem.Text=draw.Text;
  2785. drawItem.Name=draw.Name;
  2786. drawItem.DrawType=draw.DrawType;
  2787. drawItem.DrawData={ Icon:this.FittingMultiText(draw.DrawData.Icon,date,time,hqChart), Family:draw.DrawData.Family };
  2788. this.GetKLineData(drawItem.DrawData.Icon, hqChart);
  2789. outVarItem.Draw=drawItem;
  2790. result.push(outVarItem);
  2791. }
  2792. else if (draw.DrawType=="MULTI_HTMLDOM") //外部自己创建dom
  2793. {
  2794. drawItem.Text=draw.Text;
  2795. drawItem.Name=draw.Name;
  2796. drawItem.DrawType=draw.DrawType;
  2797. drawItem.Callback=draw.Callback;
  2798. drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
  2799. this.GetKLineData(drawItem.DrawData, hqChart);
  2800. outVarItem.Draw=drawItem;
  2801. result.push(outVarItem);
  2802. }
  2803. else if (draw.DrawType=="DRAWCOLORKLINE")
  2804. {
  2805. drawItem.Name=draw.Name;
  2806. drawItem.Type=draw.Type;
  2807. drawItem.DrawType=draw.DrawType;
  2808. drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart,1);
  2809. outVarItem.Draw=drawItem;
  2810. if (draw.Color) drawItem.Color=draw.Color;
  2811. if (IFrameSplitOperator.IsBool(draw.IsEmptyBar)) drawItem.IsEmptyBar=draw.IsEmptyBar;
  2812. result.push(outVarItem);
  2813. }
  2814. }
  2815. }
  2816. return result;
  2817. }
  2818. this.FittingMinuteArray=function(sourceData,date,time,hqChart)
  2819. {
  2820. var minutedata=hqChart.SourceData;; //分钟线
  2821. var arySingleData=[];
  2822. for(var i in sourceData)
  2823. {
  2824. var value=sourceData[i];
  2825. var indexItem=new SingleData(); //单列指标数据
  2826. indexItem.Date=date[i];
  2827. if (time && i<time.length) indexItem.Time=time[i];
  2828. indexItem.Value=value;
  2829. arySingleData.push(indexItem);
  2830. }
  2831. var aryFittingData=minutedata.GetMinuteFittingData(arySingleData); //数据和主图K线拟合
  2832. var bindData=new ChartData();
  2833. bindData.Data=aryFittingData;
  2834. var result=bindData.GetValue();
  2835. return result;
  2836. }
  2837. }
  2838. //市场多空
  2839. function MarketLongShortIndex()
  2840. {
  2841. this.newMethod = BaseIndex; //派生
  2842. this.newMethod('市场多空');
  2843. delete this.newMethod;
  2844. this.Index = new Array(
  2845. new IndexInfo("多空指标", null),
  2846. new IndexInfo("多头区域", null),
  2847. new IndexInfo("空头区域", null)
  2848. );
  2849. this.Index[0].LineColor = g_JSChartResource.Index.LineColor[0];
  2850. this.Index[1].LineColor = g_JSChartResource.UpBarColor;
  2851. this.Index[2].LineColor = g_JSChartResource.DownBarColor;
  2852. this.LongShortData; //多空数据
  2853. this.Create = function (hqChart, windowIndex) {
  2854. for (var i in this.Index) {
  2855. var paint = null;
  2856. if (i == 0)
  2857. paint = new ChartLine();
  2858. else
  2859. paint = new ChartStraightLine();
  2860. paint.Color = this.Index[i].LineColor;
  2861. paint.Canvas = hqChart.Canvas;
  2862. paint.Name = this.Name + "-" + i.toString();
  2863. paint.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  2864. paint.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  2865. hqChart.ChartPaint.push(paint);
  2866. }
  2867. }
  2868. //请求数据
  2869. this.RequestData = function (hqChart, windowIndex, hisData) {
  2870. var self = this;
  2871. var param =
  2872. {
  2873. HQChart: hqChart,
  2874. WindowIndex: windowIndex,
  2875. HistoryData: hisData
  2876. };
  2877. this.LongShortData = [];
  2878. if (param.HQChart.Period > 0) //周期数据
  2879. {
  2880. this.NotSupport(param.HQChart, param.WindowIndex, "不支持周期切换");
  2881. param.HQChart.Draw();
  2882. return false;
  2883. }
  2884. //请求数据
  2885. wx.request({
  2886. url: g_JSChartResource.Index.MarketLongShortApiUrl,
  2887. data:
  2888. {
  2889. },
  2890. method: 'POST',
  2891. dataType: "json",
  2892. async: true,
  2893. success: function (recvData) {
  2894. self.RecvData(recvData, param);
  2895. }
  2896. });
  2897. return true;
  2898. }
  2899. this.RecvData = function (recvData, param) {
  2900. if (recvData.data.data.length <= 0) return;
  2901. var aryData = new Array();
  2902. for (var i in recvData.data.data) {
  2903. var item = recvData.data.data[i];
  2904. var indexData = new SingleData();
  2905. indexData.Date = item[0];
  2906. indexData.Value = item[1];
  2907. aryData.push(indexData);
  2908. }
  2909. var aryFittingData = param.HistoryData.GetFittingData(aryData);
  2910. var bindData = new ChartData();
  2911. bindData.Data = aryFittingData;
  2912. bindData.Period = param.HQChart.Period; //周期
  2913. bindData.Right = param.HQChart.Right; //复权
  2914. this.LongShortData = bindData.GetValue();
  2915. this.BindData(param.HQChart, param.WindowIndex, param.HistoryData);
  2916. param.HQChart.UpdataDataoffset(); //更新数据偏移
  2917. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  2918. param.HQChart.Draw();
  2919. }
  2920. this.BindData = function (hqChart, windowIndex, hisData) {
  2921. var paint = hqChart.GetChartPaint(windowIndex);
  2922. if (paint.length != this.Index.length) return false;
  2923. //paint[0].Data.Data=SWLData;
  2924. paint[0].Data.Data = this.LongShortData;
  2925. paint[0].NotSupportMessage = null;
  2926. paint[1].Data.Data[0] = 8;
  2927. paint[2].Data.Data[0] = 1;
  2928. //指定[0,9]
  2929. hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 9, Min: 0, Count: 3 };
  2930. var titleIndex = windowIndex + 1;
  2931. for (var i in paint) {
  2932. hqChart.TitlePaint[titleIndex].Data[i] = new DynamicTitleData(paint[i].Data, this.Index[i].Name, this.Index[i].LineColor);
  2933. if (i > 0) hqChart.TitlePaint[titleIndex].Data[i].DataType = "StraightLine";
  2934. }
  2935. hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();
  2936. if (hqChart.UpdateUICallback) hqChart.UpdateUICallback('MarketLongShortIndex', paint, { WindowIndex: windowIndex, HistoryData: hisData }); //通知上层回调
  2937. return true;
  2938. }
  2939. }
  2940. //市场择时
  2941. function MarketTimingIndex()
  2942. {
  2943. this.newMethod = BaseIndex; //派生
  2944. this.newMethod('市场择时');
  2945. delete this.newMethod;
  2946. this.Index = new Array(
  2947. new IndexInfo("因子择时", null)
  2948. );
  2949. this.TimingData; //择时数据
  2950. this.TitleColor = g_JSChartResource.FrameSplitTextColor
  2951. this.Create = function (hqChart, windowIndex)
  2952. {
  2953. for (var i in this.Index) {
  2954. var paint = new ChartMACD();
  2955. paint.Canvas = hqChart.Canvas;
  2956. paint.Name = this.Name + "-" + i.toString();
  2957. paint.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  2958. paint.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  2959. hqChart.ChartPaint.push(paint);
  2960. }
  2961. }
  2962. //请求数据
  2963. this.RequestData = function (hqChart, windowIndex, hisData)
  2964. {
  2965. var self = this;
  2966. var param =
  2967. {
  2968. HQChart: hqChart,
  2969. WindowIndex: windowIndex,
  2970. HistoryData: hisData
  2971. };
  2972. this.LongShortData = [];
  2973. if (param.HQChart.Period > 0) //周期数据
  2974. {
  2975. this.NotSupport(param.HQChart, param.WindowIndex, "不支持周期切换");
  2976. param.HQChart.Draw();
  2977. return false;
  2978. }
  2979. //请求数据
  2980. JSNetwork.HttpRequest({
  2981. url: g_JSChartResource.Index.MarketLongShortApiUrl,
  2982. data:
  2983. {
  2984. },
  2985. method: 'POST',
  2986. dataType: "json",
  2987. async: true,
  2988. success: function (recvData) {
  2989. self.RecvData(recvData, param);
  2990. }
  2991. });
  2992. return true;
  2993. }
  2994. this.RecvData = function (recvData, param)
  2995. {
  2996. if (recvData.data.data.length <= 0) return;
  2997. var aryData = new Array();
  2998. for (var i in recvData.data.data)
  2999. {
  3000. var item = recvData.data.data[i];
  3001. var indexData = new SingleData();
  3002. indexData.Date = item[0];
  3003. indexData.Value = item[2];
  3004. aryData.push(indexData);
  3005. }
  3006. var aryFittingData = param.HistoryData.GetFittingData(aryData);
  3007. var bindData = new ChartData();
  3008. bindData.Data = aryFittingData;
  3009. bindData.Period = param.HQChart.Period; //周期
  3010. bindData.Right = param.HQChart.Right; //复权
  3011. this.TimingData = bindData.GetValue();
  3012. this.BindData(param.HQChart, param.WindowIndex, param.HistoryData);
  3013. param.HQChart.UpdataDataoffset(); //更新数据偏移
  3014. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  3015. param.HQChart.Draw();
  3016. }
  3017. this.BindData = function (hqChart, windowIndex, hisData)
  3018. {
  3019. var paint = hqChart.GetChartPaint(windowIndex);
  3020. if (paint.length != this.Index.length) return false;
  3021. //paint[0].Data.Data=SWLData;
  3022. paint[0].Data.Data = this.TimingData;
  3023. paint[0].NotSupportMessage = null;
  3024. var titleIndex = windowIndex + 1;
  3025. for (var i in paint)
  3026. {
  3027. hqChart.TitlePaint[titleIndex].Data[i] = new DynamicTitleData(paint[i].Data, this.Index[i].Name, this.TitleColor);
  3028. hqChart.TitlePaint[titleIndex].Data[i].StringFormat = STRING_FORMAT_TYPE.THOUSANDS;
  3029. hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision = 0;
  3030. }
  3031. hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();
  3032. if (hqChart.UpdateUICallback) hqChart.UpdateUICallback('MarketTimingIndex', paint, { WindowIndex: windowIndex, HistoryData: hisData }); //通知上层回调
  3033. return true;
  3034. }
  3035. }
  3036. //市场关注度
  3037. function MarketAttentionIndex()
  3038. {
  3039. this.newMethod = BaseIndex; //派生
  3040. this.newMethod('市场关注度');
  3041. delete this.newMethod;
  3042. this.Index = new Array(
  3043. new IndexInfo("市场关注度指数", null)
  3044. );
  3045. this.Data; //关注度数据
  3046. this.TitleColor = g_JSChartResource.FrameSplitTextColor;
  3047. this.ApiUrl = g_JSChartResource.Index.MarketAttentionApiUrl;
  3048. this.Create = function (hqChart, windowIndex)
  3049. {
  3050. for (var i in this.Index)
  3051. {
  3052. var paint = new ChartBar(); //柱子
  3053. paint.Canvas = hqChart.Canvas;
  3054. paint.Name = this.Name + "-" + i.toString();
  3055. paint.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  3056. paint.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  3057. paint.UpBarColor = paint.DownBarColor = 'rgb(243,152,0)';
  3058. hqChart.ChartPaint.push(paint);
  3059. }
  3060. }
  3061. //调整框架
  3062. this.SetFrame = function (hqChart, windowIndex, hisData)
  3063. {
  3064. hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 6, Min: 0, Count: 3 };
  3065. }
  3066. //请求数据
  3067. this.RequestData = function (hqChart, windowIndex, hisData)
  3068. {
  3069. var self = this;
  3070. var param =
  3071. {
  3072. HQChart: hqChart,
  3073. WindowIndex: windowIndex,
  3074. HistoryData: hisData
  3075. };
  3076. this.Data = [];
  3077. if (param.HQChart.Period > 0) //周期数据
  3078. {
  3079. this.NotSupport(param.HQChart, param.WindowIndex, "不支持周期切换");
  3080. param.HQChart.Draw();
  3081. return false;
  3082. }
  3083. //请求数据
  3084. JSNetwork.HttpRequest({
  3085. url: this.ApiUrl,
  3086. data:
  3087. {
  3088. "symbol": param.HQChart.Symbol,
  3089. "startdate": 20100101,
  3090. },
  3091. method: 'POST',
  3092. dataType: "json",
  3093. success: function (recvData) {
  3094. self.RecvData(recvData.data, param);
  3095. }
  3096. });
  3097. return true;
  3098. }
  3099. this.RecvData = function (recvData, param)
  3100. {
  3101. if (recvData.date.length < 0) return;
  3102. var aryData = new Array();
  3103. for (var i in recvData.date)
  3104. {
  3105. var indexData = new SingleData();
  3106. indexData.Date = recvData.date[i];
  3107. indexData.Value = recvData.value[i];
  3108. aryData.push(indexData);
  3109. }
  3110. var aryFittingData = param.HistoryData.GetFittingData(aryData);
  3111. var bindData = new ChartData();
  3112. bindData.Data = aryFittingData;
  3113. bindData.Period = param.HQChart.Period; //周期
  3114. bindData.Right = param.HQChart.Right; //复权
  3115. this.Data = bindData.GetValue();
  3116. this.BindData(param.HQChart, param.WindowIndex, param.HistoryData);
  3117. this.SetFrame(param.HQChart, param.WindowIndex, param.HistoryData);
  3118. param.HQChart.UpdataDataoffset(); //更新数据偏移
  3119. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  3120. param.HQChart.Draw();
  3121. // if (typeof (this.UpdateUICallback) == 'function') this.UpdateUICallback('RecvHistoryData', this);
  3122. }
  3123. this.BindData = function (hqChart, windowIndex, hisData)
  3124. {
  3125. var paint = hqChart.GetChartPaint(windowIndex);
  3126. if (paint.length != this.Index.length) return false;
  3127. //paint[0].Data.Data=SWLData;
  3128. paint[0].Data.Data = this.Data;
  3129. paint[0].NotSupportMessage = null;
  3130. var titleIndex = windowIndex + 1;
  3131. for (var i in paint) {
  3132. hqChart.TitlePaint[titleIndex].Data[i] = new DynamicTitleData(paint[i].Data, this.Index[i].Name, this.TitleColor);
  3133. hqChart.TitlePaint[titleIndex].Data[i].StringFormat = STRING_FORMAT_TYPE.THOUSANDS;
  3134. hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision = 0;
  3135. }
  3136. hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();
  3137. return true;
  3138. }
  3139. }
  3140. /*
  3141. 行业,指数热度
  3142. */
  3143. function MarketHeatIndex()
  3144. {
  3145. this.newMethod = BaseIndex; //派生
  3146. this.newMethod('指数/行业热度');
  3147. delete this.newMethod;
  3148. this.Index = new Array(
  3149. new IndexInfo("热度指数", 5),
  3150. new IndexInfo('MA', 10),
  3151. new IndexInfo('MA', null)
  3152. );
  3153. this.Data; //关注度数据
  3154. this.ApiUrl = g_JSChartResource.Index.MarketHeatApiUrl;
  3155. this.Index[0].LineColor = g_JSChartResource.FrameSplitTextColor;
  3156. this.Index[1].LineColor = g_JSChartResource.Index.LineColor[0];
  3157. this.Index[2].LineColor = g_JSChartResource.Index.LineColor[1];
  3158. this.Create = function (hqChart, windowIndex)
  3159. {
  3160. for (var i in this.Index)
  3161. {
  3162. var paint = null;
  3163. if (i == 0)
  3164. {
  3165. paint = new ChartMACD(); //柱子
  3166. }
  3167. else
  3168. {
  3169. paint = new ChartLine();
  3170. paint.Color = this.Index[i].LineColor;
  3171. }
  3172. paint.Canvas = hqChart.Canvas;
  3173. paint.Name = this.Name + "-" + i.toString();
  3174. paint.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  3175. paint.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  3176. hqChart.ChartPaint.push(paint);
  3177. }
  3178. }
  3179. //请求数据
  3180. this.RequestData = function (hqChart, windowIndex, hisData)
  3181. {
  3182. var self = this;
  3183. var param =
  3184. {
  3185. HQChart: hqChart,
  3186. WindowIndex: windowIndex,
  3187. HistoryData: hisData
  3188. };
  3189. this.Data = [];
  3190. if (param.HQChart.Period > 0) //周期数据
  3191. {
  3192. this.NotSupport(param.HQChart, param.WindowIndex, "不支持周期切换");
  3193. param.HQChart.Draw();
  3194. return false;
  3195. }
  3196. //请求数据
  3197. JSNetwork.HttpRequest({
  3198. url: this.ApiUrl,
  3199. data:
  3200. {
  3201. "symbol": param.HQChart.Symbol,
  3202. "startdate": 20100101,
  3203. },
  3204. method: 'POST',
  3205. dataType: "json",
  3206. success: function (recvData) {
  3207. self.RecvData(recvData.data, param);
  3208. }
  3209. });
  3210. return true;
  3211. }
  3212. this.RecvData = function (recvData, param)
  3213. {
  3214. if (recvData.date.length < 0) return;
  3215. var aryData = new Array();
  3216. for (var i in recvData.date)
  3217. {
  3218. var indexData = new SingleData();
  3219. indexData.Date = recvData.date[i];
  3220. indexData.Value = recvData.value[i];
  3221. aryData.push(indexData);
  3222. }
  3223. var aryFittingData = param.HistoryData.GetFittingData(aryData);
  3224. var bindData = new ChartData();
  3225. bindData.Data = aryFittingData;
  3226. bindData.Period = param.HQChart.Period; //周期
  3227. bindData.Right = param.HQChart.Right; //复权
  3228. this.Data = bindData.GetValue();
  3229. this.BindData(param.HQChart, param.WindowIndex, param.HistoryData);
  3230. param.HQChart.UpdataDataoffset(); //更新数据偏移
  3231. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  3232. param.HQChart.Draw();
  3233. }
  3234. this.BindData = function (hqChart, windowIndex, hisData)
  3235. {
  3236. var paint = hqChart.GetChartPaint(windowIndex);
  3237. if (paint.length != this.Index.length) return false;
  3238. paint[0].Data.Data = this.Data;
  3239. paint[0].NotSupportMessage = null;
  3240. var MA = HQIndexFormula.MA(this.Data, this.Index[0].Param);
  3241. paint[1].Data.Data = MA;
  3242. var MA2 = HQIndexFormula.MA(this.Data, this.Index[1].Param);
  3243. paint[2].Data.Data = MA2;
  3244. var titleIndex = windowIndex + 1;
  3245. for (var i in paint)
  3246. {
  3247. var name = ""; //显示的名字特殊处理
  3248. if (i == 0)
  3249. name = hqChart.Name + this.Index[i].Name;
  3250. else
  3251. name = "MA" + this.Index[i - 1].Param;
  3252. hqChart.TitlePaint[titleIndex].Data[i] = new DynamicTitleData(paint[i].Data, name, this.Index[i].LineColor);
  3253. hqChart.TitlePaint[titleIndex].Data[i].StringFormat = STRING_FORMAT_TYPE.DEFAULT;
  3254. hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision = 2;
  3255. }
  3256. hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();
  3257. return true;
  3258. }
  3259. }
  3260. //自定义指数热度
  3261. function CustonIndexHeatIndex()
  3262. {
  3263. this.newMethod = BaseIndex; //派生
  3264. this.newMethod('Market-Heat');
  3265. delete this.newMethod;
  3266. this.Index = new Array(
  3267. new IndexInfo('区域', 3),
  3268. new IndexInfo("热度指数", 10),
  3269. new IndexInfo('MA', 5),
  3270. new IndexInfo('MA', 10)
  3271. );
  3272. this.Data; //热度数据
  3273. this.ApiUrl = g_JSChartResource.Index.CustomIndexHeatApiUrl;
  3274. this.Index[1].LineColor = g_JSChartResource.Index.LineColor[1];
  3275. this.Index[2].LineColor = g_JSChartResource.Index.LineColor[2];
  3276. this.Index[3].LineColor = g_JSChartResource.Index.LineColor[3];
  3277. this.Create = function (hqChart, windowIndex)
  3278. {
  3279. for (var i in this.Index)
  3280. {
  3281. var paint = null;
  3282. if (i == 0)
  3283. {
  3284. paint = new ChartStraightArea();
  3285. }
  3286. else
  3287. {
  3288. paint = new ChartLine();
  3289. paint.Color = this.Index[i].LineColor;
  3290. }
  3291. paint.Canvas = hqChart.Canvas;
  3292. paint.Name = this.Name + "-" + i.toString();
  3293. paint.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  3294. paint.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  3295. hqChart.ChartPaint.push(paint);
  3296. }
  3297. }
  3298. //请求数据
  3299. this.RequestData = function (hqChart, windowIndex, hisData)
  3300. {
  3301. var self = this;
  3302. var param =
  3303. {
  3304. HQChart: hqChart,
  3305. WindowIndex: windowIndex,
  3306. HistoryData: hisData
  3307. };
  3308. this.Data = [];
  3309. if (param.HQChart.Period > 0) //周期数据
  3310. {
  3311. this.NotSupport(param.HQChart, param.WindowIndex, "不支持周期切换");
  3312. param.HQChart.Draw();
  3313. return false;
  3314. }
  3315. //请求数据
  3316. JSNetwork.HttpRequest({
  3317. url: this.ApiUrl,
  3318. data:
  3319. {
  3320. "stock": param.HQChart.CustomStock,
  3321. "date": { "startdate": param.HQChart.QueryDate.Start, "enddate": param.HQChart.QueryDate.End },
  3322. "day": [this.Index[0].Param, this.Index[1].Param],
  3323. },
  3324. method: 'POST',
  3325. dataType: "json",
  3326. success: function (recvData) {
  3327. self.RecvData(recvData, param);
  3328. }
  3329. });
  3330. return true;
  3331. }
  3332. this.RecvData = function (recvData, param)
  3333. {
  3334. let data = recvData.data;
  3335. if (data.data == null || data.data.length < 0) return;
  3336. //JSConsole.Chart.Log(recvData.data);
  3337. let aryData = new Array();
  3338. for (let i in data.data)
  3339. {
  3340. let item = data.data[i];
  3341. let indexData = new SingleData();
  3342. indexData.Date = item[0];
  3343. indexData.Value = item[1];
  3344. aryData.push(indexData);
  3345. }
  3346. var aryFittingData = param.HistoryData.GetFittingData(aryData);
  3347. var bindData = new ChartData();
  3348. bindData.Data = aryFittingData;
  3349. bindData.Period = param.HQChart.Period; //周期
  3350. bindData.Right = param.HQChart.Right; //复权
  3351. this.Data = bindData.GetValue();
  3352. this.BindData(param.HQChart, param.WindowIndex, param.HistoryData);
  3353. param.HQChart.UpdataDataoffset(); //更新数据偏移
  3354. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  3355. param.HQChart.Draw();
  3356. }
  3357. this.BindData = function (hqChart, windowIndex, hisData)
  3358. {
  3359. let paint = hqChart.GetChartPaint(windowIndex);
  3360. if (paint.length != this.Index.length) return false;
  3361. paint[0].NotSupportMessage = null;
  3362. paint[0].Data.Data =
  3363. [
  3364. { Value: 0, Value2: 0.2, Color: 'rgb(46,139,87)', Title: '较差区', TitleColor: 'rgb(245,255 ,250)' },
  3365. { Value: 0.19, Value2: 0.4, Color: 'rgb(255,140,0)', Title: '变热区', TitleColor: 'rgb(245,255 ,250)' },
  3366. { Value: 0.39, Value2: 0.8, Color: 'rgb(255,106,106)', Title: '较好区', TitleColor: 'rgb(245,255 ,250)' },
  3367. { Value: 0.79, Value2: 1, Color: 'rgb(255,69,0)', Title: '过热区', TitleColor: 'rgb(245,255 ,250)' }
  3368. ];
  3369. paint[1].Data.Data = this.Data;
  3370. let MA = HQIndexFormula.MA(this.Data, this.Index[2].Param);
  3371. paint[2].Data.Data = MA;
  3372. let MA2 = HQIndexFormula.MA(this.Data, this.Index[3].Param);
  3373. paint[3].Data.Data = MA2;
  3374. //指定框架最大最小[0,1]
  3375. hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 1, Min: 0, Count: 3 };
  3376. let titleIndex = windowIndex + 1;
  3377. for (let i = 1; i < paint.length; ++i)
  3378. {
  3379. let name = this.Index[i].Name; //显示的名字特殊处理
  3380. if (name == 'MA') name = "MA" + this.Index[i].Param;
  3381. hqChart.TitlePaint[titleIndex].Data[i] = new DynamicTitleData(paint[i].Data, name, this.Index[i].LineColor);
  3382. hqChart.TitlePaint[titleIndex].Data[i].StringFormat = STRING_FORMAT_TYPE.DEFAULT;
  3383. hqChart.TitlePaint[titleIndex].Data[i].FloatPrecision = 2;
  3384. }
  3385. hqChart.TitlePaint[titleIndex].Title = '热度' + '(' + this.Index[0].Param + ',' + this.Index[1].Param + ',' + this.Index[2].Param + ',' + this.Index[3].Param + ')';
  3386. return true;
  3387. }
  3388. }
  3389. /*
  3390. 本福特系数(财务粉饰)
  3391. */
  3392. function BenfordIndex()
  3393. {
  3394. this.newMethod = BaseIndex; //派生
  3395. this.newMethod('财务风险');
  3396. delete this.newMethod;
  3397. this.Index = new Array(
  3398. new IndexInfo('区域', null),
  3399. new IndexInfo("系数", null),
  3400. );
  3401. this.Data; //财务数据
  3402. this.ApiUrl = g_JSChartResource.Index.StockHistoryDayApiUrl;
  3403. this.Index[0].LineColor = g_JSChartResource.Index.LineColor[0];
  3404. this.Index[1].LineColor = 'rgb(105,105,105)';
  3405. this.Create = function (hqChart, windowIndex)
  3406. {
  3407. for (var i in this.Index)
  3408. {
  3409. var paint = null;
  3410. if (i == 0)
  3411. paint = new ChartStraightArea();
  3412. else if (i == 1)
  3413. paint = new ChartLineMultiData();
  3414. if (paint)
  3415. {
  3416. paint.Color = this.Index[i].LineColor;
  3417. paint.Canvas = hqChart.Canvas;
  3418. paint.Name = this.Name + "-" + i.toString();
  3419. paint.ChartBorder = hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
  3420. paint.ChartFrame = hqChart.Frame.SubFrame[windowIndex].Frame;
  3421. hqChart.ChartPaint.push(paint);
  3422. }
  3423. }
  3424. }
  3425. //请求数据
  3426. this.RequestData = function (hqChart, windowIndex, hisData)
  3427. {
  3428. var self = this;
  3429. var param =
  3430. {
  3431. HQChart: hqChart,
  3432. WindowIndex: windowIndex,
  3433. HistoryData: hisData
  3434. };
  3435. this.Data = [];
  3436. if (param.HQChart.Period != 2) //周期数据
  3437. {
  3438. this.NotSupport(param.HQChart, param.WindowIndex, "只支持月线");
  3439. param.HQChart.Draw();
  3440. return false;
  3441. }
  3442. var aryField = ["finance.benford", "announcement2.quarter", "announcement1.quarter", "announcement3.quarter", "announcement4.quarter"];
  3443. var aryCondition =
  3444. [
  3445. { item: ["date", "int32", "gte", "20130101"] },
  3446. {
  3447. item: ["announcement1.year", "int32", "gte", 0,
  3448. "announcement2.year", "int32", "gte", 0,
  3449. "announcement3.year", "int32", "gte", 0,
  3450. "announcement4.year", "int32", "gte", 0,
  3451. "or"]
  3452. }
  3453. ];
  3454. //请求数据
  3455. JSNetwork.HttpRequest({
  3456. url: this.ApiUrl,
  3457. data:
  3458. {
  3459. "symbol": [param.HQChart.Symbol],
  3460. "field": aryField,
  3461. "condition": aryCondition
  3462. },
  3463. method: 'POST',
  3464. dataType: "json",
  3465. success: function (recvData) {
  3466. self.RecvData(recvData, param);
  3467. }
  3468. });
  3469. return true;
  3470. }
  3471. this.JsonDataToMapSingleData = function (recvData)
  3472. {
  3473. var stockData = recvData.stock[0].stockday;
  3474. var mapData = new Map();
  3475. for (var i in stockData)
  3476. {
  3477. var item = stockData[i];
  3478. var indexData = new SingleData();
  3479. indexData.Date = item.date;
  3480. indexData.Value = new Array();
  3481. if (item.finance1 != null && item.announcement1 != null)
  3482. {
  3483. let year = item.announcement1.year;
  3484. let quarter = item.announcement1.quarter;
  3485. let value = item.finance1.benford;
  3486. indexData.Value.push({ Year: year, Quarter: quarter, Value: value });
  3487. }
  3488. if (item.finance2 != null && item.announcement2 != null)
  3489. {
  3490. let year = item.announcement2.year;
  3491. let quarter = item.announcement2.quarter;
  3492. let value = item.finance2.benford;
  3493. indexData.Value.push({ Year: year, Quarter: quarter, Value: value });
  3494. }
  3495. if (item.finance3 != null && item.announcement3 != null)
  3496. {
  3497. let year = item.announcement3.year;
  3498. let quarter = item.announcement3.quarter;
  3499. let value = item.finance3.benford;
  3500. indexData.Value.push({ Year: year, Quarter: quarter, Value: value });
  3501. }
  3502. if (item.finance4 != null && item.announcement4 != null)
  3503. {
  3504. let year = item.announcement4.year;
  3505. let quarter = item.announcement4.quarter;
  3506. let value = item.finance4.benford;
  3507. indexData.Value.push({ Year: year, Quarter: quarter, Value: value });
  3508. }
  3509. mapData.set(indexData.Date, indexData);
  3510. }
  3511. var aryData = new Array();
  3512. for (var item of mapData)
  3513. {
  3514. aryData.push(item[1]);
  3515. }
  3516. return aryData;
  3517. }
  3518. this.RecvData = function (recvData, param)
  3519. {
  3520. JSConsole.Chart.Log(recvData);
  3521. if (recvData.data.stock == null || recvData.data.stock.length <= 0) return;
  3522. var aryData = this.JsonDataToMapSingleData(recvData.data);
  3523. var aryFittingData = param.HistoryData.GetFittingMonthData(aryData);
  3524. var bindData = new ChartData();
  3525. bindData.Data = aryFittingData;
  3526. bindData.Period = param.HQChart.Period; //周期
  3527. bindData.Right = param.HQChart.Right; //复权
  3528. this.Data = bindData.GetValue();
  3529. this.BindData(param.HQChart, param.WindowIndex, param.HistoryData);
  3530. param.HQChart.UpdataDataoffset(); //更新数据偏移
  3531. param.HQChart.UpdateFrameMaxMin(); //调整坐标最大 最小值
  3532. param.HQChart.Draw();
  3533. }
  3534. this.BindData = function (hqChart, windowIndex, hisData)
  3535. {
  3536. var paint = hqChart.GetChartPaint(windowIndex);
  3537. if (paint.length != this.Index.length) return false;
  3538. paint[0].NotSupportMessage = null;
  3539. paint[0].Data.Data =
  3540. [
  3541. // { Value: 0, Value2: 0.2, Color: 'rgb(50,205,50)', Title: '安全区', TitleColor: 'rgb(245,255 ,250)' },
  3542. // { Value: 0.2, Value2: 0.4, Color: 'rgb(255,140,0)', Title: '预警区', TitleColor: 'rgb(245,255 ,250)' },
  3543. // { Value: 0.4, Value2: 1, Color: 'rgb(255,106,106)', Title: '警示区', TitleColor: 'rgb(245,255 ,250)' }
  3544. { Value: 0, Value2: 0.2, Color: 'rgb(219,255,193)', Title: '安全区', TitleColor: 'rgb(66,192,99)' },
  3545. { Value: 0.2, Value2: 0.4, Color: 'rgb(255,228,170)', Title: '预警区', TitleColor: 'rgb(255,124,3)' },
  3546. { Value: 0.4, Value2: 1, Color: 'rgb(254,219,212)', Title: '警示区', TitleColor: 'rgb(255,0,0)' }
  3547. ];
  3548. paint[1].Data.Data = this.Data;
  3549. //指定框架最大最小[0,1]
  3550. hqChart.Frame.SubFrame[windowIndex].Frame.YSpecificMaxMin = { Max: 1, Min: 0, Count: 3 };
  3551. hqChart.Frame.SubFrame[windowIndex].Frame.YSplitScale = [0.2,0.4];
  3552. var titleIndex = windowIndex + 1;
  3553. hqChart.TitlePaint[titleIndex].Data[1] = new DynamicTitleData(paint[1].Data, this.Index[1].Name, this.Index[1].LineColor);
  3554. hqChart.TitlePaint[titleIndex].Data[1].DataType = "MultiReport";
  3555. hqChart.TitlePaint[titleIndex].Title = this.FormatIndexTitle();
  3556. return true;
  3557. }
  3558. }
  3559. export
  3560. {
  3561. IndexInfo,
  3562. BaseIndex,
  3563. ScriptIndex,
  3564. APIScriptIndex,
  3565. OverlayScriptIndex,
  3566. MarketLongShortIndex,
  3567. MarketTimingIndex,
  3568. MarketAttentionIndex,
  3569. MarketHeatIndex,
  3570. CustonIndexHeatIndex,
  3571. BenfordIndex,
  3572. }
  3573. /*
  3574. module.exports =
  3575. {
  3576. JSCommonIndex:
  3577. {
  3578. IndexInfo: IndexInfo,
  3579. BaseIndex: BaseIndex,
  3580. ScriptIndex:ScriptIndex,
  3581. APIScriptIndex:APIScriptIndex,
  3582. },
  3583. //单个类导出
  3584. JSCommonIndex_IndexInfo: IndexInfo,
  3585. JSCommonIndex_BaseIndex: BaseIndex,
  3586. JSCommonIndex_ScriptIndex:ScriptIndex,
  3587. JSCommonIndex_APIScriptIndex:APIScriptIndex,
  3588. };
  3589. */