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
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
130107
|
+
var HQCHART_VERSION="1.1.13022";
|
|
129906
130108
|
|
|
129907
130109
|
function PrintHQChartVersion()
|
|
129908
130110
|
{
|