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.
@@ -94741,6 +94741,15 @@ function Node(ErrorHandler)
94741
94741
  return;
94742
94742
  }
94743
94743
 
94744
+ //"MA.MA1"(10,5,5)"
94745
+ if (callee.Type==Syntax.Literal)
94746
+ {
94747
+ var item={ ID:JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX, Args:args, FunctionName:callee.Value, DynamicName:callee.Value };
94748
+ if (token) item.Token={ Index:token.Start, Line:token.LineNumber };
94749
+ this.ExecuteIndex.push(item);
94750
+ return;
94751
+ }
94752
+
94744
94753
  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') //跨周期函数
94745
94754
  {
94746
94755
  var periodName=args[0].Value;
@@ -108730,6 +108739,98 @@ function JSSymbolData(ast,option,jsExecute)
108730
108739
 
108731
108740
  }
108732
108741
 
108742
+ this.CallDynamicScriptIndex=function(job, varTable)
108743
+ {
108744
+ var callInfo=job.DynamicName;
108745
+ var indexInfo={ Job:job, PeriodID:this.Period , Symbol:this.Symbol };
108746
+ if (!this.ReadIndexFunctionValue(callInfo,indexInfo)) //读取指标
108747
+ {
108748
+ var token=job.Token;
108749
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() Error: '${callInfo}' ${indexInfo.Error}`);
108750
+ }
108751
+
108752
+ var systemIndex=new JSIndexScript(); //系统指标
108753
+ var systemItem=systemIndex.Get(indexInfo.Name);
108754
+ if (!systemItem)
108755
+ {
108756
+ var token=job.Token;
108757
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() Error: '${callInfo}' ${indexInfo.Name} 指标不存在`);
108758
+ }
108759
+
108760
+ indexInfo.SytemIndex=systemItem;
108761
+ if (!this.ReadDynamicIndexArgumentValue(job.Args, indexInfo, varTable))
108762
+ {
108763
+ var token=job.Token;
108764
+ this.Execute.ErrorHandler.ThrowError(token.Index,token.Line,0,`CallDynamicScriptIndex() ${indexInfo.Name} 指标参数错误 : ${indexInfo.Error} `);
108765
+ }
108766
+
108767
+ JSConsole.Complier.Log('[JSSymbolData::CallMemberScriptIndex] call script index', indexInfo);
108768
+
108769
+ var dateTimeRange=this.Data.GetDateRange();
108770
+
108771
+ var option=
108772
+ {
108773
+ HQDataType:this.DataType,
108774
+ Symbol:indexInfo.Symbol,
108775
+ Name:'',
108776
+ Right:this.Right, //复权
108777
+ Period:indexInfo.PeriodID, //周期
108778
+ Data:null,
108779
+ SourceData:null,
108780
+ Callback:(outVar,job, symbolData)=> {
108781
+ this.RecvDynamicScriptIndexData(outVar,job,symbolData);
108782
+ this.Execute.RunNextJob();
108783
+ },
108784
+ CallbackParam:indexInfo,
108785
+ Async:true,
108786
+ MaxRequestDataCount:this.MaxRequestDataCount+30*2,
108787
+ MaxRequestMinuteDayCount:this.MaxRequestMinuteDayCount+2,
108788
+ Arguments:indexInfo.Args,
108789
+ //Condition:this.Condition,
108790
+ IsBeforeData:this.IsBeforeData,
108791
+ NetworkFilter:this.NetworkFilter,
108792
+ IsApiPeriod:this.IsApiPeriod,
108793
+ KLineRange:dateTimeRange //K线数据范围
108794
+ };
108795
+
108796
+ //执行脚本
108797
+ var run=JSComplier.Execute(systemItem.Script,option,(error, indexInfo)=>{this.ExecuteScriptIndexError(error,indexInfo)});
108798
+ }
108799
+
108800
+ this.ReadDynamicIndexArgumentValue=function(args, result, varTable)
108801
+ {
108802
+ result.Args=[];
108803
+ for(var i =0;i<result.SytemIndex.Args.length; ++i) //复制参数
108804
+ {
108805
+ var item=result.SytemIndex.Args[i];
108806
+ result.Args.push({ Value:item.Value, Name:item.Name, IsDefault:true });
108807
+ }
108808
+
108809
+ if (!IFrameSplitOperator.IsNonEmptyArray(args)) return true;
108810
+
108811
+ for(var i=0;i<args.length;++i)
108812
+ {
108813
+ var item=args[i];
108814
+ var argItem=result.Args[i];
108815
+ if (!argItem) continue;
108816
+ if (item.Type==Syntax.Literal)
108817
+ {
108818
+ argItem.Value=item.Value;
108819
+ argItem.IsDefault=false;
108820
+ }
108821
+ else if (item.Type==Syntax.Identifier) //支持传参
108822
+ {
108823
+ if (varTable.has(item.Name))
108824
+ {
108825
+ argItem.Value=varTable.get(item.Name);
108826
+ argItem.IsDefault=false;
108827
+ }
108828
+ }
108829
+ }
108830
+
108831
+ return true;
108832
+ }
108833
+
108733
108834
  /*****************************************************************************************************************************
108734
108835
  脚本调用
108735
108836
 
@@ -108743,10 +108844,13 @@ function JSSymbolData(ast,option,jsExecute)
108743
108844
  CALCSTOCKINDEX('SH600000','KDJ',3)表示上证600000的KDJ指标第3个输出即J之值,第一个参数可在前面加SZ(深市),SH(沪市),BJ(京市),或市场_,,
108744
108845
  CALCSTOCKINDEX('47_IFL0','MACD',2)表示IFL0品种的MACD指标第2个输出值.
108745
108846
 
108847
+ "MA.MA1"(6,12,18)
108848
+
108746
108849
  *******************************************************************************************************************************/
108747
- this.CallScriptIndex=function(job)
108850
+ this.CallScriptIndex=function(job, varTable)
108748
108851
  {
108749
108852
  if (job.Member) return this.CallMemberScriptIndex(job);
108853
+ if (job.DynamicName) return this.CallDynamicScriptIndex(job, varTable);
108750
108854
 
108751
108855
  if (!job.Args || !(job.Args.length>=2))
108752
108856
  {
@@ -108859,6 +108963,42 @@ function JSSymbolData(ast,option,jsExecute)
108859
108963
  }
108860
108964
  }
108861
108965
 
108966
+ this.RecvDynamicScriptIndexData=function(outVar,indexInfo,symbolData)
108967
+ {
108968
+ JSConsole.Complier.Log('[JSSymbolData::RecvDynamicScriptIndexData] ', outVar, indexInfo, symbolData);
108969
+ var kLine=symbolData.Data.Data;
108970
+ var aryOutVar=outVar;
108971
+ var data=this.Data.FitKLineIndex(kLine,aryOutVar,this.Period,indexInfo.PeriodID);
108972
+
108973
+ var objName=indexInfo.Name;
108974
+ var memberValue={};
108975
+ if (this.Execute.VarTable.has(objName))
108976
+ memberValue=this.Execute.VarTable.get(objName);
108977
+ else
108978
+ this.Execute.VarTable.set(objName, memberValue);
108979
+
108980
+ var strValue="";
108981
+ for(var i=0; i<indexInfo.Args.length; ++i)
108982
+ {
108983
+ var item=indexInfo.Args[i];
108984
+ if (item.IsDefault===false)
108985
+ {
108986
+ if (strValue.length>0) strValue+=",";
108987
+ strValue+=`${item.Value}`;
108988
+ }
108989
+ }
108990
+ var strArgs=`(${strValue})`;
108991
+
108992
+ //保存所有的指标数据, 下面用到了就可以不用算了
108993
+ for(var i=0; i<data.length; ++i)
108994
+ {
108995
+ var key=`${outVar[i].Name}#${strArgs}`;
108996
+ if (indexInfo.Period) key+='#'+indexInfo.Period; //带周期的变量
108997
+
108998
+ memberValue[key]=data[i].Data;
108999
+ }
109000
+ }
109001
+
108862
109002
  this.RecvScriptIndexData=function(outVar,indexInfo,symbolData)
108863
109003
  {
108864
109004
  var key=this.GenerateScriptIndexKey(indexInfo);
@@ -109732,7 +109872,8 @@ var JS_EXECUTE_JOB_ID=
109732
109872
  //KDJ.K , KDJ.K#WEEK
109733
109873
  //STKINDI('600000.sh','MA.MA1#WEEK',5,10,20,30,60,120);
109734
109874
  //CALCSTOCKINDEX('SH600000','KDJ',3)表示上证600000的KDJ指标第3个输出即J之值,第一个参数可在前面加SZ(深市),SH(沪市),BJ(京市)
109735
- JOB_EXECUTE_INDEX:30010,
109875
+ //"MA.MA(5,5,5)" 调用动态指标
109876
+ JOB_EXECUTE_INDEX:30010,
109736
109877
 
109737
109878
  JOB_RUN_SCRIPT:10000, //执行脚本
109738
109879
 
@@ -110051,7 +110192,7 @@ function JSExecute(ast,option)
110051
110192
  case JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CUSTOM_API_DATA:
110052
110193
  return this.SymbolData.DownloadCustomAPIData(jobItem);
110053
110194
  case JS_EXECUTE_JOB_ID.JOB_EXECUTE_INDEX:
110054
- return this.SymbolData.CallScriptIndex(jobItem);
110195
+ return this.SymbolData.CallScriptIndex(jobItem, this.VarTable);
110055
110196
 
110056
110197
  case JS_EXECUTE_JOB_ID.JOB_RUN_SCRIPT:
110057
110198
  if (this.Debug===1 && this.DebugFilter)
@@ -110429,6 +110570,17 @@ function JSExecute(ast,option)
110429
110570
  this.OutVarTable.push({Name:varName, Data:varInfo.OutVar,Type:type, NoneName:true});
110430
110571
  }
110431
110572
  }
110573
+ else if (item.Expression.Type==Syntax.MemberExpression) //MA.MA2
110574
+ {
110575
+ var outVar=this.ReadMemberVariable(item.Expression);
110576
+ if (outVar)
110577
+ {
110578
+ var type=0;
110579
+ var varName="__temp_di_"+i+"__";
110580
+ if (!Array.isArray(outVar)) outVar=this.SingleDataToArrayData(outVar);
110581
+ this.OutVarTable.push({Name:varName, Data:outVar,Type:type, NoneName:true});
110582
+ }
110583
+ }
110432
110584
  else if (item.Expression.Type==Syntax.SequenceExpression)
110433
110585
  {
110434
110586
  let varName;
@@ -110646,6 +110798,20 @@ function JSExecute(ast,option)
110646
110798
  }
110647
110799
  }
110648
110800
  }
110801
+ else if (itemExpression.Type==Syntax.MemberExpression) //"MA.MA2"(5,12,29), COLORRED;
110802
+ {
110803
+ if (j==0)
110804
+ {
110805
+ var outVar=this.ReadMemberVariable(itemExpression);
110806
+ if (outVar)
110807
+ {
110808
+ if (!Array.isArray(outVar)) varValue=this.SingleDataToArrayData(outVar);
110809
+ isNoneName=true;
110810
+ varName="__temp_di_"+i+"__";
110811
+ this.VarTable.set(varName,outVar); //把常量放到变量表里
110812
+ }
110813
+ }
110814
+ }
110649
110815
  }
110650
110816
 
110651
110817
  if (pointDot && varName) //圆点
@@ -111031,6 +111197,35 @@ function JSExecute(ast,option)
111031
111197
  args.push(value);
111032
111198
  }
111033
111199
 
111200
+ if (node.Callee.Type==Syntax.Literal)
111201
+ {
111202
+ var dynamicName=node.Callee.Value;
111203
+ var aryValue=dynamicName.split(".");
111204
+ if (aryValue.length!=2)
111205
+ {
111206
+ this.ThrowUnexpectedNode(node,`调用指标格式'${dynamicName}'错误`);
111207
+ }
111208
+
111209
+ var name=aryValue[0];
111210
+ var outName=aryValue[1];
111211
+ var strValue="";
111212
+ for(var i=0; i<args.length; ++i)
111213
+ {
111214
+ var value=args[i];
111215
+ if (strValue.length>0) strValue+=",";
111216
+ strValue+=`${value}`;
111217
+ }
111218
+ var strArgs=`(${strValue})`;
111219
+ var key=`${outName}#${strArgs}`;
111220
+
111221
+ node.Out=[];
111222
+ if (!this.VarTable.has(name)) return node.Out;
111223
+ var indexData=this.VarTable.get(name);
111224
+ var value=indexData[key];
111225
+ if (value) node.Out=value;
111226
+ return node.Out;
111227
+ }
111228
+
111034
111229
  if (funcName==="IFC")
111035
111230
  {
111036
111231
  //IFC(X,A,B)若X不为0则执行A,否则执行B.IFC与IF函数的区别:根据X的值来选择性执行A、B表达式.
@@ -112036,6 +112231,13 @@ function JSExplainer(ast,option)
112036
112231
  args.push(value);
112037
112232
  }
112038
112233
 
112234
+ if (node.Callee.Type==Syntax.Literal)
112235
+ {
112236
+ var dynamicName=node.Callee.Value;
112237
+ node.Out=`指标引用'${dynamicName}'`;
112238
+ return node.Out;
112239
+ }
112240
+
112039
112241
  JSConsole.Complier.Log('[JSExplainer::VisitCallExpression]' , funcName, '(', args.toString() ,')');
112040
112242
 
112041
112243
  if (g_JSComplierResource.IsCustomFunction(funcName))
@@ -130060,7 +130262,7 @@ function HQChartScriptWorker()
130060
130262
 
130061
130263
 
130062
130264
 
130063
- var HQCHART_VERSION="1.1.13015";
130265
+ var HQCHART_VERSION="1.1.13022";
130064
130266
 
130065
130267
  function PrintHQChartVersion()
130066
130268
  {