hqchart 1.1.13016 → 1.1.13019

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)
@@ -111031,6 +111172,35 @@ function JSExecute(ast,option)
111031
111172
  args.push(value);
111032
111173
  }
111033
111174
 
111175
+ if (node.Callee.Type==Syntax.Literal)
111176
+ {
111177
+ var dynamicName=node.Callee.Value;
111178
+ var aryValue=dynamicName.split(".");
111179
+ if (aryValue.length!=2)
111180
+ {
111181
+ this.ThrowUnexpectedNode(node,`调用指标格式'${dynamicName}'错误`);
111182
+ }
111183
+
111184
+ var name=aryValue[0];
111185
+ var outName=aryValue[1];
111186
+ var strValue="";
111187
+ for(var i=0; i<args.length; ++i)
111188
+ {
111189
+ var value=args[i];
111190
+ if (strValue.length>0) strValue+=",";
111191
+ strValue+=`${value}`;
111192
+ }
111193
+ var strArgs=`(${strValue})`;
111194
+ var key=`${outName}#${strArgs}`;
111195
+
111196
+ node.Out=[];
111197
+ if (!this.VarTable.has(name)) return node.Out;
111198
+ var indexData=this.VarTable.get(name);
111199
+ var value=indexData[key];
111200
+ if (value) node.Out=value;
111201
+ return node.Out;
111202
+ }
111203
+
111034
111204
  if (funcName==="IFC")
111035
111205
  {
111036
111206
  //IFC(X,A,B)若X不为0则执行A,否则执行B.IFC与IF函数的区别:根据X的值来选择性执行A、B表达式.
@@ -112036,6 +112206,13 @@ function JSExplainer(ast,option)
112036
112206
  args.push(value);
112037
112207
  }
112038
112208
 
112209
+ if (node.Callee.Type==Syntax.Literal)
112210
+ {
112211
+ var dynamicName=node.Callee.Value;
112212
+ node.Out=`指标引用'${dynamicName}'`;
112213
+ return node.Out;
112214
+ }
112215
+
112039
112216
  JSConsole.Complier.Log('[JSExplainer::VisitCallExpression]' , funcName, '(', args.toString() ,')');
112040
112217
 
112041
112218
  if (g_JSComplierResource.IsCustomFunction(funcName))
@@ -130060,7 +130237,7 @@ function HQChartScriptWorker()
130060
130237
 
130061
130238
 
130062
130239
 
130063
- var HQCHART_VERSION="1.1.13015";
130240
+ var HQCHART_VERSION="1.1.13018";
130064
130241
 
130065
130242
  function PrintHQChartVersion()
130066
130243
  {