hqchart 1.1.13016 → 1.1.13023

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hqchart",
3
- "version": "1.1.13016",
3
+ "version": "1.1.13023",
4
4
  "description": "HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -1277,6 +1277,15 @@ function Node(ErrorHandler)
1277
1277
  return;
1278
1278
  }
1279
1279
 
1280
+ //"MA.MA1"(10,5,5)"
1281
+ if (callee.Type==Syntax.Literal)
1282
+ {
1283
+ var item={ ID:JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX, Args:args, FunctionName:callee.Value, DynamicName:callee.Value };
1284
+ if (token) item.Token={ Index:token.Start, Line:token.LineNumber };
1285
+ this.ExecuteIndex.push(item);
1286
+ return;
1287
+ }
1288
+
1280
1289
  if (callee.Name=='COVER_C' || callee.Name=='COVER_O' || callee.Name=='COVER_H' || callee.Name=='COVER_L' || callee.Name=='COVER_A' || callee.Name=='COVER_V') //跨周期函数
1281
1290
  {
1282
1291
  var periodName=args[0].Value;
@@ -15266,6 +15275,98 @@ function JSSymbolData(ast,option,jsExecute)
15266
15275
 
15267
15276
  }
15268
15277
 
15278
+ this.CallDynamicScriptIndex=function(job, varTable)
15279
+ {
15280
+ var callInfo=job.DynamicName;
15281
+ var indexInfo={ Job:job, PeriodID:this.Period , Symbol:this.Symbol };
15282
+ if (!this.ReadIndexFunctionValue(callInfo,indexInfo)) //读取指标
15283
+ {
15284
+ var token=job.Token;
15285
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() Error: '${callInfo}' ${indexInfo.Error}`);
15286
+ }
15287
+
15288
+ var systemIndex=new JSIndexScript(); //系统指标
15289
+ var systemItem=systemIndex.Get(indexInfo.Name);
15290
+ if (!systemItem)
15291
+ {
15292
+ var token=job.Token;
15293
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() Error: '${callInfo}' ${indexInfo.Name} 指标不存在`);
15294
+ }
15295
+
15296
+ indexInfo.SytemIndex=systemItem;
15297
+ if (!this.ReadDynamicIndexArgumentValue(job.Args, indexInfo, varTable))
15298
+ {
15299
+ var token=job.Token;
15300
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() ${indexInfo.Name} 指标参数错误 : ${indexInfo.Error} `);
15301
+ }
15302
+
15303
+ JSConsole.Complier.Log('[JSSymbolData::CallMemberScriptIndex] call script index', indexInfo);
15304
+
15305
+ var dateTimeRange=this.Data.GetDateRange();
15306
+
15307
+ var option=
15308
+ {
15309
+ HQDataType:this.DataType,
15310
+ Symbol:indexInfo.Symbol,
15311
+ Name:'',
15312
+ Right:this.Right, //复权
15313
+ Period:indexInfo.PeriodID, //周期
15314
+ Data:null,
15315
+ SourceData:null,
15316
+ Callback:(outVar,job, symbolData)=> {
15317
+ this.RecvDynamicScriptIndexData(outVar,job,symbolData);
15318
+ this.Execute.RunNextJob();
15319
+ },
15320
+ CallbackParam:indexInfo,
15321
+ Async:true,
15322
+ MaxRequestDataCount:this.MaxRequestDataCount+30*2,
15323
+ MaxRequestMinuteDayCount:this.MaxRequestMinuteDayCount+2,
15324
+ Arguments:indexInfo.Args,
15325
+ //Condition:this.Condition,
15326
+ IsBeforeData:this.IsBeforeData,
15327
+ NetworkFilter:this.NetworkFilter,
15328
+ IsApiPeriod:this.IsApiPeriod,
15329
+ KLineRange:dateTimeRange //K线数据范围
15330
+ };
15331
+
15332
+ //执行脚本
15333
+ var run=JSComplier.Execute(systemItem.Script,option,(error, indexInfo)=>{this.ExecuteScriptIndexError(error,indexInfo)});
15334
+ }
15335
+
15336
+ this.ReadDynamicIndexArgumentValue=function(args, result, varTable)
15337
+ {
15338
+ result.Args=[];
15339
+ for(var i =0;i<result.SytemIndex.Args.length; ++i) //复制参数
15340
+ {
15341
+ var item=result.SytemIndex.Args[i];
15342
+ result.Args.push({ Value:item.Value, Name:item.Name, IsDefault:true });
15343
+ }
15344
+
15345
+ if (!IFrameSplitOperator.IsNonEmptyArray(args)) return true;
15346
+
15347
+ for(var i=0;i<args.length;++i)
15348
+ {
15349
+ var item=args[i];
15350
+ var argItem=result.Args[i];
15351
+ if (!argItem) continue;
15352
+ if (item.Type==Syntax.Literal)
15353
+ {
15354
+ argItem.Value=item.Value;
15355
+ argItem.IsDefault=false;
15356
+ }
15357
+ else if (item.Type==Syntax.Identifier) //支持传参
15358
+ {
15359
+ if (varTable.has(item.Name))
15360
+ {
15361
+ argItem.Value=varTable.get(item.Name);
15362
+ argItem.IsDefault=false;
15363
+ }
15364
+ }
15365
+ }
15366
+
15367
+ return true;
15368
+ }
15369
+
15269
15370
  /*****************************************************************************************************************************
15270
15371
  脚本调用
15271
15372
 
@@ -15279,10 +15380,13 @@ function JSSymbolData(ast,option,jsExecute)
15279
15380
  CALCSTOCKINDEX('SH600000','KDJ',3)表示上证600000的KDJ指标第3个输出即J之值,第一个参数可在前面加SZ(深市),SH(沪市),BJ(京市),或市场_,,
15280
15381
  CALCSTOCKINDEX('47_IFL0','MACD',2)表示IFL0品种的MACD指标第2个输出值.
15281
15382
 
15383
+ "MA.MA1"(6,12,18)
15384
+
15282
15385
  *******************************************************************************************************************************/
15283
- this.CallScriptIndex=function(job)
15386
+ this.CallScriptIndex=function(job, varTable)
15284
15387
  {
15285
15388
  if (job.Member) return this.CallMemberScriptIndex(job);
15389
+ if (job.DynamicName) return this.CallDynamicScriptIndex(job, varTable);
15286
15390
 
15287
15391
  if (!job.Args || !(job.Args.length>=2))
15288
15392
  {
@@ -15395,6 +15499,42 @@ function JSSymbolData(ast,option,jsExecute)
15395
15499
  }
15396
15500
  }
15397
15501
 
15502
+ this.RecvDynamicScriptIndexData=function(outVar,indexInfo,symbolData)
15503
+ {
15504
+ JSConsole.Complier.Log('[JSSymbolData::RecvDynamicScriptIndexData] ', outVar, indexInfo, symbolData);
15505
+ var kLine=symbolData.Data.Data;
15506
+ var aryOutVar=outVar;
15507
+ var data=this.Data.FitKLineIndex(kLine,aryOutVar,this.Period,indexInfo.PeriodID);
15508
+
15509
+ var objName=indexInfo.Name;
15510
+ var memberValue={};
15511
+ if (this.Execute.VarTable.has(objName))
15512
+ memberValue=this.Execute.VarTable.get(objName);
15513
+ else
15514
+ this.Execute.VarTable.set(objName, memberValue);
15515
+
15516
+ var strValue="";
15517
+ for(var i=0; i<indexInfo.Args.length; ++i)
15518
+ {
15519
+ var item=indexInfo.Args[i];
15520
+ if (item.IsDefault===false)
15521
+ {
15522
+ if (strValue.length>0) strValue+=",";
15523
+ strValue+=`${item.Value}`;
15524
+ }
15525
+ }
15526
+ var strArgs=`(${strValue})`;
15527
+
15528
+ //保存所有的指标数据, 下面用到了就可以不用算了
15529
+ for(var i=0; i<data.length; ++i)
15530
+ {
15531
+ var key=`${outVar[i].Name}#${strArgs}`;
15532
+ if (indexInfo.Period) key+='#'+indexInfo.Period; //带周期的变量
15533
+
15534
+ memberValue[key]=data[i].Data;
15535
+ }
15536
+ }
15537
+
15398
15538
  this.RecvScriptIndexData=function(outVar,indexInfo,symbolData)
15399
15539
  {
15400
15540
  var key=this.GenerateScriptIndexKey(indexInfo);
@@ -16268,7 +16408,8 @@ var JS_EXECUTE_JOB_ID=
16268
16408
  //KDJ.K , KDJ.K#WEEK
16269
16409
  //STKINDI('600000.sh','MA.MA1#WEEK',5,10,20,30,60,120);
16270
16410
  //CALCSTOCKINDEX('SH600000','KDJ',3)表示上证600000的KDJ指标第3个输出即J之值,第一个参数可在前面加SZ(深市),SH(沪市),BJ(京市)
16271
- JOB_EXECUTE_INDEX:30010,
16411
+ //"MA.MA(5,5,5)" 调用动态指标
16412
+ JOB_EXECUTE_INDEX:30010,
16272
16413
 
16273
16414
  JOB_RUN_SCRIPT:10000, //执行脚本
16274
16415
 
@@ -16587,7 +16728,7 @@ function JSExecute(ast,option)
16587
16728
  case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CUSTOM_API_DATA:
16588
16729
  return this.SymbolData.DownloadCustomAPIData(jobItem);
16589
16730
  case JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX:
16590
- return this.SymbolData.CallScriptIndex(jobItem);
16731
+ return this.SymbolData.CallScriptIndex(jobItem, this.VarTable);
16591
16732
 
16592
16733
  case JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT:
16593
16734
  if (this.Debug===1 && this.DebugFilter)
@@ -16965,6 +17106,17 @@ function JSExecute(ast,option)
16965
17106
  this.OutVarTable.push({Name:varName, Data:varInfo.OutVar,Type:type, NoneName:true});
16966
17107
  }
16967
17108
  }
17109
+ else if (item.Expression.Type==Syntax.MemberExpression) //MA.MA2
17110
+ {
17111
+ var outVar=this.ReadMemberVariable(item.Expression);
17112
+ if (outVar)
17113
+ {
17114
+ var type=0;
17115
+ var varName="__temp_di_"+i+"__";
17116
+ if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);
17117
+ this.OutVarTable.push({Name:varName, Data:outVar,Type:type, NoneName:true});
17118
+ }
17119
+ }
16968
17120
  else if (item.Expression.Type==Syntax.SequenceExpression)
16969
17121
  {
16970
17122
  let varName;
@@ -17182,6 +17334,20 @@ function JSExecute(ast,option)
17182
17334
  }
17183
17335
  }
17184
17336
  }
17337
+ else if (itemExpression.Type==Syntax.MemberExpression) //"MA.MA2"(5,12,29), COLORRED;
17338
+ {
17339
+ if (j==0)
17340
+ {
17341
+ var outVar=this.ReadMemberVariable(itemExpression);
17342
+ if (outVar)
17343
+ {
17344
+ if (!Array.isArray(outVar)) varValue=this.SingleDataToArrayData(outVar);
17345
+ isNoneName=true;
17346
+ varName="__temp_di_"+i+"__";
17347
+ this.VarTable.set(varName,outVar); //把常量放到变量表里
17348
+ }
17349
+ }
17350
+ }
17185
17351
  }
17186
17352
 
17187
17353
  if (pointDot && varName) //圆点
@@ -17567,6 +17733,35 @@ function JSExecute(ast,option)
17567
17733
  args.push(value);
17568
17734
  }
17569
17735
 
17736
+ if (node.Callee.Type==Syntax.Literal)
17737
+ {
17738
+ var dynamicName=node.Callee.Value;
17739
+ var aryValue=dynamicName.split(".");
17740
+ if (aryValue.length!=2)
17741
+ {
17742
+ this.ThrowUnexpectedNode(node,`调用指标格式'${dynamicName}'错误`);
17743
+ }
17744
+
17745
+ var name=aryValue[0];
17746
+ var outName=aryValue[1];
17747
+ var strValue="";
17748
+ for(var i=0; i<args.length; ++i)
17749
+ {
17750
+ var value=args[i];
17751
+ if (strValue.length>0) strValue+=",";
17752
+ strValue+=`${value}`;
17753
+ }
17754
+ var strArgs=`(${strValue})`;
17755
+ var key=`${outName}#${strArgs}`;
17756
+
17757
+ node.Out=[];
17758
+ if (!this.VarTable.has(name)) return node.Out;
17759
+ var indexData=this.VarTable.get(name);
17760
+ var value=indexData[key];
17761
+ if (value) node.Out=value;
17762
+ return node.Out;
17763
+ }
17764
+
17570
17765
  if (funcName==="IFC")
17571
17766
  {
17572
17767
  //IFC(X,A,B)若X不为0则执行A,否则执行B.IFC与IF函数的区别:根据X的值来选择性执行A、B表达式.
@@ -18572,6 +18767,13 @@ function JSExplainer(ast,option)
18572
18767
  args.push(value);
18573
18768
  }
18574
18769
 
18770
+ if (node.Callee.Type==Syntax.Literal)
18771
+ {
18772
+ var dynamicName=node.Callee.Value;
18773
+ node.Out=`指标引用'${dynamicName}'`;
18774
+ return node.Out;
18775
+ }
18776
+
18575
18777
  JSConsole.Complier.Log('[JSExplainer::VisitCallExpression]' , funcName, '(', args.toString() ,')');
18576
18778
 
18577
18779
  if (g_JSComplierResource.IsCustomFunction(funcName))
@@ -94697,6 +94697,15 @@ function Node(ErrorHandler)
94697
94697
  return;
94698
94698
  }
94699
94699
 
94700
+ //"MA.MA1"(10,5,5)"
94701
+ if (callee.Type==Syntax.Literal)
94702
+ {
94703
+ var item={ ID:JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX, Args:args, FunctionName:callee.Value, DynamicName:callee.Value };
94704
+ if (token) item.Token={ Index:token.Start, Line:token.LineNumber };
94705
+ this.ExecuteIndex.push(item);
94706
+ return;
94707
+ }
94708
+
94700
94709
  if (callee.Name=='COVER_C' || callee.Name=='COVER_O' || callee.Name=='COVER_H' || callee.Name=='COVER_L' || callee.Name=='COVER_A' || callee.Name=='COVER_V') //跨周期函数
94701
94710
  {
94702
94711
  var periodName=args[0].Value;
@@ -108686,6 +108695,98 @@ function JSSymbolData(ast,option,jsExecute)
108686
108695
 
108687
108696
  }
108688
108697
 
108698
+ this.CallDynamicScriptIndex=function(job, varTable)
108699
+ {
108700
+ var callInfo=job.DynamicName;
108701
+ var indexInfo={ Job:job, PeriodID:this.Period , Symbol:this.Symbol };
108702
+ if (!this.ReadIndexFunctionValue(callInfo,indexInfo)) //读取指标
108703
+ {
108704
+ var token=job.Token;
108705
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() Error: '${callInfo}' ${indexInfo.Error}`);
108706
+ }
108707
+
108708
+ var systemIndex=new JSIndexScript(); //系统指标
108709
+ var systemItem=systemIndex.Get(indexInfo.Name);
108710
+ if (!systemItem)
108711
+ {
108712
+ var token=job.Token;
108713
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() Error: '${callInfo}' ${indexInfo.Name} 指标不存在`);
108714
+ }
108715
+
108716
+ indexInfo.SytemIndex=systemItem;
108717
+ if (!this.ReadDynamicIndexArgumentValue(job.Args, indexInfo, varTable))
108718
+ {
108719
+ var token=job.Token;
108720
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() ${indexInfo.Name} 指标参数错误 : ${indexInfo.Error} `);
108721
+ }
108722
+
108723
+ JSConsole.Complier.Log('[JSSymbolData::CallMemberScriptIndex] call script index', indexInfo);
108724
+
108725
+ var dateTimeRange=this.Data.GetDateRange();
108726
+
108727
+ var option=
108728
+ {
108729
+ HQDataType:this.DataType,
108730
+ Symbol:indexInfo.Symbol,
108731
+ Name:'',
108732
+ Right:this.Right, //复权
108733
+ Period:indexInfo.PeriodID, //周期
108734
+ Data:null,
108735
+ SourceData:null,
108736
+ Callback:(outVar,job, symbolData)=> {
108737
+ this.RecvDynamicScriptIndexData(outVar,job,symbolData);
108738
+ this.Execute.RunNextJob();
108739
+ },
108740
+ CallbackParam:indexInfo,
108741
+ Async:true,
108742
+ MaxRequestDataCount:this.MaxRequestDataCount+30*2,
108743
+ MaxRequestMinuteDayCount:this.MaxRequestMinuteDayCount+2,
108744
+ Arguments:indexInfo.Args,
108745
+ //Condition:this.Condition,
108746
+ IsBeforeData:this.IsBeforeData,
108747
+ NetworkFilter:this.NetworkFilter,
108748
+ IsApiPeriod:this.IsApiPeriod,
108749
+ KLineRange:dateTimeRange //K线数据范围
108750
+ };
108751
+
108752
+ //执行脚本
108753
+ var run=JSComplier.Execute(systemItem.Script,option,(error, indexInfo)=>{this.ExecuteScriptIndexError(error,indexInfo)});
108754
+ }
108755
+
108756
+ this.ReadDynamicIndexArgumentValue=function(args, result, varTable)
108757
+ {
108758
+ result.Args=[];
108759
+ for(var i =0;i<result.SytemIndex.Args.length; ++i) //复制参数
108760
+ {
108761
+ var item=result.SytemIndex.Args[i];
108762
+ result.Args.push({ Value:item.Value, Name:item.Name, IsDefault:true });
108763
+ }
108764
+
108765
+ if (!IFrameSplitOperator.IsNonEmptyArray(args)) return true;
108766
+
108767
+ for(var i=0;i<args.length;++i)
108768
+ {
108769
+ var item=args[i];
108770
+ var argItem=result.Args[i];
108771
+ if (!argItem) continue;
108772
+ if (item.Type==Syntax.Literal)
108773
+ {
108774
+ argItem.Value=item.Value;
108775
+ argItem.IsDefault=false;
108776
+ }
108777
+ else if (item.Type==Syntax.Identifier) //支持传参
108778
+ {
108779
+ if (varTable.has(item.Name))
108780
+ {
108781
+ argItem.Value=varTable.get(item.Name);
108782
+ argItem.IsDefault=false;
108783
+ }
108784
+ }
108785
+ }
108786
+
108787
+ return true;
108788
+ }
108789
+
108689
108790
  /*****************************************************************************************************************************
108690
108791
  脚本调用
108691
108792
 
@@ -108699,10 +108800,13 @@ function JSSymbolData(ast,option,jsExecute)
108699
108800
  CALCSTOCKINDEX('SH600000','KDJ',3)表示上证600000的KDJ指标第3个输出即J之值,第一个参数可在前面加SZ(深市),SH(沪市),BJ(京市),或市场_,,
108700
108801
  CALCSTOCKINDEX('47_IFL0','MACD',2)表示IFL0品种的MACD指标第2个输出值.
108701
108802
 
108803
+ "MA.MA1"(6,12,18)
108804
+
108702
108805
  *******************************************************************************************************************************/
108703
- this.CallScriptIndex=function(job)
108806
+ this.CallScriptIndex=function(job, varTable)
108704
108807
  {
108705
108808
  if (job.Member) return this.CallMemberScriptIndex(job);
108809
+ if (job.DynamicName) return this.CallDynamicScriptIndex(job, varTable);
108706
108810
 
108707
108811
  if (!job.Args || !(job.Args.length>=2))
108708
108812
  {
@@ -108815,6 +108919,42 @@ function JSSymbolData(ast,option,jsExecute)
108815
108919
  }
108816
108920
  }
108817
108921
 
108922
+ this.RecvDynamicScriptIndexData=function(outVar,indexInfo,symbolData)
108923
+ {
108924
+ JSConsole.Complier.Log('[JSSymbolData::RecvDynamicScriptIndexData] ', outVar, indexInfo, symbolData);
108925
+ var kLine=symbolData.Data.Data;
108926
+ var aryOutVar=outVar;
108927
+ var data=this.Data.FitKLineIndex(kLine,aryOutVar,this.Period,indexInfo.PeriodID);
108928
+
108929
+ var objName=indexInfo.Name;
108930
+ var memberValue={};
108931
+ if (this.Execute.VarTable.has(objName))
108932
+ memberValue=this.Execute.VarTable.get(objName);
108933
+ else
108934
+ this.Execute.VarTable.set(objName, memberValue);
108935
+
108936
+ var strValue="";
108937
+ for(var i=0; i<indexInfo.Args.length; ++i)
108938
+ {
108939
+ var item=indexInfo.Args[i];
108940
+ if (item.IsDefault===false)
108941
+ {
108942
+ if (strValue.length>0) strValue+=",";
108943
+ strValue+=`${item.Value}`;
108944
+ }
108945
+ }
108946
+ var strArgs=`(${strValue})`;
108947
+
108948
+ //保存所有的指标数据, 下面用到了就可以不用算了
108949
+ for(var i=0; i<data.length; ++i)
108950
+ {
108951
+ var key=`${outVar[i].Name}#${strArgs}`;
108952
+ if (indexInfo.Period) key+='#'+indexInfo.Period; //带周期的变量
108953
+
108954
+ memberValue[key]=data[i].Data;
108955
+ }
108956
+ }
108957
+
108818
108958
  this.RecvScriptIndexData=function(outVar,indexInfo,symbolData)
108819
108959
  {
108820
108960
  var key=this.GenerateScriptIndexKey(indexInfo);
@@ -109688,7 +109828,8 @@ var JS_EXECUTE_JOB_ID=
109688
109828
  //KDJ.K , KDJ.K#WEEK
109689
109829
  //STKINDI('600000.sh','MA.MA1#WEEK',5,10,20,30,60,120);
109690
109830
  //CALCSTOCKINDEX('SH600000','KDJ',3)表示上证600000的KDJ指标第3个输出即J之值,第一个参数可在前面加SZ(深市),SH(沪市),BJ(京市)
109691
- JOB_EXECUTE_INDEX:30010,
109831
+ //"MA.MA(5,5,5)" 调用动态指标
109832
+ JOB_EXECUTE_INDEX:30010,
109692
109833
 
109693
109834
  JOB_RUN_SCRIPT:10000, //执行脚本
109694
109835
 
@@ -110007,7 +110148,7 @@ function JSExecute(ast,option)
110007
110148
  case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CUSTOM_API_DATA:
110008
110149
  return this.SymbolData.DownloadCustomAPIData(jobItem);
110009
110150
  case JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX:
110010
- return this.SymbolData.CallScriptIndex(jobItem);
110151
+ return this.SymbolData.CallScriptIndex(jobItem, this.VarTable);
110011
110152
 
110012
110153
  case JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT:
110013
110154
  if (this.Debug===1 && this.DebugFilter)
@@ -110385,6 +110526,17 @@ function JSExecute(ast,option)
110385
110526
  this.OutVarTable.push({Name:varName, Data:varInfo.OutVar,Type:type, NoneName:true});
110386
110527
  }
110387
110528
  }
110529
+ else if (item.Expression.Type==Syntax.MemberExpression) //MA.MA2
110530
+ {
110531
+ var outVar=this.ReadMemberVariable(item.Expression);
110532
+ if (outVar)
110533
+ {
110534
+ var type=0;
110535
+ var varName="__temp_di_"+i+"__";
110536
+ if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);
110537
+ this.OutVarTable.push({Name:varName, Data:outVar,Type:type, NoneName:true});
110538
+ }
110539
+ }
110388
110540
  else if (item.Expression.Type==Syntax.SequenceExpression)
110389
110541
  {
110390
110542
  let varName;
@@ -110602,6 +110754,20 @@ function JSExecute(ast,option)
110602
110754
  }
110603
110755
  }
110604
110756
  }
110757
+ else if (itemExpression.Type==Syntax.MemberExpression) //"MA.MA2"(5,12,29), COLORRED;
110758
+ {
110759
+ if (j==0)
110760
+ {
110761
+ var outVar=this.ReadMemberVariable(itemExpression);
110762
+ if (outVar)
110763
+ {
110764
+ if (!Array.isArray(outVar)) varValue=this.SingleDataToArrayData(outVar);
110765
+ isNoneName=true;
110766
+ varName="__temp_di_"+i+"__";
110767
+ this.VarTable.set(varName,outVar); //把常量放到变量表里
110768
+ }
110769
+ }
110770
+ }
110605
110771
  }
110606
110772
 
110607
110773
  if (pointDot && varName) //圆点
@@ -110987,6 +111153,35 @@ function JSExecute(ast,option)
110987
111153
  args.push(value);
110988
111154
  }
110989
111155
 
111156
+ if (node.Callee.Type==Syntax.Literal)
111157
+ {
111158
+ var dynamicName=node.Callee.Value;
111159
+ var aryValue=dynamicName.split(".");
111160
+ if (aryValue.length!=2)
111161
+ {
111162
+ this.ThrowUnexpectedNode(node,`调用指标格式'${dynamicName}'错误`);
111163
+ }
111164
+
111165
+ var name=aryValue[0];
111166
+ var outName=aryValue[1];
111167
+ var strValue="";
111168
+ for(var i=0; i<args.length; ++i)
111169
+ {
111170
+ var value=args[i];
111171
+ if (strValue.length>0) strValue+=",";
111172
+ strValue+=`${value}`;
111173
+ }
111174
+ var strArgs=`(${strValue})`;
111175
+ var key=`${outName}#${strArgs}`;
111176
+
111177
+ node.Out=[];
111178
+ if (!this.VarTable.has(name)) return node.Out;
111179
+ var indexData=this.VarTable.get(name);
111180
+ var value=indexData[key];
111181
+ if (value) node.Out=value;
111182
+ return node.Out;
111183
+ }
111184
+
110990
111185
  if (funcName==="IFC")
110991
111186
  {
110992
111187
  //IFC(X,A,B)若X不为0则执行A,否则执行B.IFC与IF函数的区别:根据X的值来选择性执行A、B表达式.
@@ -111992,6 +112187,13 @@ function JSExplainer(ast,option)
111992
112187
  args.push(value);
111993
112188
  }
111994
112189
 
112190
+ if (node.Callee.Type==Syntax.Literal)
112191
+ {
112192
+ var dynamicName=node.Callee.Value;
112193
+ node.Out=`指标引用'${dynamicName}'`;
112194
+ return node.Out;
112195
+ }
112196
+
111995
112197
  JSConsole.Complier.Log('[JSExplainer::VisitCallExpression]' , funcName, '(', args.toString() ,')');
111996
112198
 
111997
112199
  if (g_JSComplierResource.IsCustomFunction(funcName))
@@ -129902,7 +130104,7 @@ function ScrollBarBGChart()
129902
130104
 
129903
130105
 
129904
130106
 
129905
- var HQCHART_VERSION="1.1.13015";
130107
+ var HQCHART_VERSION="1.1.13022";
129906
130108
 
129907
130109
  function PrintHQChartVersion()
129908
130110
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.13015";
8
+ var HQCHART_VERSION="1.1.13022";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {