提交 9d47902b 编写于 作者: J jones

ver 6150

上级 8f7b1afb
......@@ -7,6 +7,8 @@ import sys
import time
import datetime
from umychart_complier_help import JSComplierHelper
# 历史K线数据
class HistoryData() :
def __init__(self) :
......@@ -71,8 +73,28 @@ class HistoryData() :
return newData
class MinuteData :
def __init__(self) :
self.Close=None
self.Open=None
self.High=None
self.Low=None
self.Vol=None
self.Amount=None
self.DateTime=None
self.Increase=None
self.Risefall=None
self.AvPrice=None
# 单指标数据
class SingleData() :
def __init__(self, date=None, value=None) :
self.Date=date # 日期
self.Value=value # 数据 (可以是一个数组)
self.TestData=None # 内部测试用
class ChartData:
def __init__(self, data, dataType) :
def __init__(self, data, dataType=None) :
self.Data=data
self.Period=0 # 周期 0=日线 1=周线 2=月线 3=年线
self.Right=0 # 复权 0=不复权 1=前复权 2=后复权
......@@ -376,4 +398,277 @@ class ChartData:
return result
# 叠加数据和主数据拟合,去掉主数据没有日期的数据
def GetOverlayData(self,overlayData) :
count=len(self.Data)
overlayDataLen=len(overlayData)
result=[None]*len(self.Data)
i,j =0,0
while i<count :
date=self.Data[i].Date
if j>overlayDataLen :
result[i]=HistoryData()
result[i].Date=date
i+=1
continue
overlayDate=overlayData[j].Date
if overlayDate==date :
result[i]=HistoryData()
result[i].Date=overlayData[j].Date
result[i].YClose=overlayData[j].YClose
result[i].Open=overlayData[j].Open
result[i].High=overlayData[j].High
result[i].Low=overlayData[j].Low
result[i].Close=overlayData[j].Close
result[i].Vol=overlayData[j].Vol
result[i].Amount=overlayData[j].Amount
# 涨跌家数数据
result[i].Stop=overlayData[j].Stop
result[i].Up=overlayData[j].Up
result[i].Down=overlayData[j].Down
result[i].Unchanged=overlayData[j].Unchanged
j+=1
i+=1
elif overlayDate<date :
j+=1
else :
result[i]= HistoryData()
result[i].Date=date
i+=1
return result
# 叠加数据和主数据拟合,去掉主数据没有日期的数据 分钟K线
def GetOverlayMinuteData(self,overlayData) :
count=len(self.Data)
overlayDataLen=len(overlayData)
result=[None]*len(self.Data)
i,j =0,0
while i<count :
date=self.Data[i].Date
time=self.Data[i].Time
if j>overlayDataLen :
result[i]=HistoryData()
result[i].Date=date
result[i].Time=time
i+=1
continue
overlayDate=overlayData[j].Date
overlayTime=overlayData[j].Time
if overlayDate==date and overlayTime==time:
result[i]=HistoryData()
result[i].Date=overlayData[j].Date
result[i].Time=overlayData[j].Time
result[i].YClose=overlayData[j].YClose
result[i].Open=overlayData[j].Open
result[i].High=overlayData[j].High
result[i].Low=overlayData[j].Low
result[i].Close=overlayData[j].Close
result[i].Vol=overlayData[j].Vol
result[i].Amount=overlayData[j].Amount
# 涨跌家数数据
result[i].Stop=overlayData[j].Stop
result[i].Up=overlayData[j].Up
result[i].Down=overlayData[j].Down
result[i].Unchanged=overlayData[j].Unchanged
j+=1
i+=1
elif overlayDate<date or (overlayData==date and overlayTime<time):
j+=1
else :
result[i]= HistoryData()
result[i].Date=date
result[i].Time=time
i+=1
return result
# 把财报数据拟合到主图数据,返回 SingleData 数组
def GetFittingFinanceData(self,financeData) :
dataLen=len(self.Data)
financeLen=len(financeData)
result=JSComplierHelper.CreateArray(dataLen)
i,j = 0,0
while i<dataLen :
date=self.Data[i].Date
if j+1<financeLen :
if financeData[j].Date<date and financeData[j+1].Date<=date :
j+=1
continue
item=SingleData()
item.Date=date
if j<financeLen :
item.Value=financeData[j].Value
item.TestData=financeData[j].Date # 财务日期 调试用
else :
item.Value=None
item.TestData=None
result[i]=item
i+=1
return result
# 市值计算 financeData.Value 是股数
def GetFittingMarketValueData(self,financeData) :
dataLen=len(self.Data)
financeLen=len(financeData)
result=JSComplierHelper.CreateArray(dataLen)
i,j =0,0
while i<dataLen :
date=self.Data[i].Date
price=self.Data[i].Close
if j+1<financeLen :
if financeData[j].Date<date and financeData[j+1].Date<=date :
j+=1
continue
item=SingleData()
item.Date=date
item.Value=financeData[j].Value*price # 市值计算 收盘价*股数
item.TestDate=financeData[j].Date # 财务日期 调试用
result[i]=item
i+=1
return result
# SingleData 转成单数组
def GetValue(self) :
dataLen=len(self.Data)
result=JSComplierHelper.CreateArray(dataLen)
for i in range(dataLen) :
if self.Data[i] and self.Data[i].Value!=None :
result[i]=self.Data[i].Value
return result
# SingleData 周期合并 日线
def GetPeriodSingleData(self,period) :
result=[]
startDate ,newData =0,None
for i in range (len(self.Data)) :
isNewData=False
dayData=self.Data[i]
if dayData==None or dayData.Date==None :
continue
if period==1 : # 周线
fridayDate=ChartData.GetFirday(dayData.Date)
if fridayDate!=startDate :
isNewData=True
startDate=fridayDate
elif period==2 :# 月线
if int(dayData.Date/100)!=int(startDate/100) :
isNewData=True
startDate=dayData.Date
elif period==3: # 年线
if int(dayData.Date/10000)!=int(startDate/10000) :
isNewData=True
startDate=dayData.Date
if (isNewData) :
newData=SingleData()
newData.Date=dayData.Date
newData.Value=dayData.Value
result.append(newData)
else :
if newData==None :
continue
if dayData.Value==None :
continue
if newData.Value==None :
newData.Value=dayData.Value
return result
# 计算股息率 股息率TTM:过去4个季度现金分红总额/总市值 * 100%
def CalculateDividendYield(self,cashData, marketValue) :
if not marketValue :
return []
dataLen, cashLen = len(self.Data), len(cashData)
dividendYield=[]
j=0
for i in range(dataLen) :
day=self.Data.Data[i]
market=marketValue.MarketValue[i]
if not day or not market :
continue
item=SingleData()
item.Date=day.Date
item.Value=0
if (j+1<cashLen) :
if (cashData[j].Date<day.Date and cashData[j+1].Date<=day.Date) :
j+=1
i-=1
if (j<cashLen) :
cash=cashData[j]
endDate=cash.Date+10000 # 1年有效
if (day.Date>=cash.Date and day.Date<=endDate and JSComplierHelper.IsDivideNumber(market.Value) and JSComplierHelper.IsNumber(cash.Value)) :
item.Value=cash.Value/market.Value*100
dividendYield.append(item)
return dividendYield
# 以主图数据 拟合,返回 SingleData 数组
def GetFittingData(self, overlayData) :
dataLen=len(self.Data)
result=JSComplierHelper.CreateArray(dataLen)
i,j =0,0
while i<dataLen :
date=self.Data[i].Date
if j>=overlayData.length :
i+=1
continue
overlayDate=overlayData[j].Date
if overlayDate==date :
item=SingleData()
item.Date=overlayData[j].Date
item.Value=overlayData[j].Value
result[i]=item
j+=1
i+=1
elif overlayDate<date :
j+=1
else :
result[i]=SingleData()
result[i].Date=date
i+=1
return result
import sys
class JSComplierHelper:
# 公共帮助方法
@staticmethod
def IsNumber(value):
return isinstance(value,(int,float))
@staticmethod
def IsJsonNumber(jsData,name):
if name not in jsData.keys() :
return False
return JSComplierHelper.IsNumber(jsData[name])
@staticmethod
def IsDivideNumber(value):
return isinstance(value,(int,float)) and value!=0
@staticmethod
def IsJsonDivideNumber(jsData,name):
if name not in jsData.keys() :
return False
return JSComplierHelper.IsNumber(jsData[name]) and jsData[name]!=0
@staticmethod
def IsArray(value) :
return isinstance(value,list)
@staticmethod # 是否是一个有效素组 data!=null and data.length>0
def IsVaildArray(data) :
if not data :
return False
if not isinstance(data,list):
return False
if len(data)<=0 :
return False
return True
@staticmethod
def IsNaN(value) :
return value!=None
@staticmethod
def CreateArray(count, value=None) :
if count<=0 :
return []
else :
return [value]*count
\ No newline at end of file
......@@ -142,4 +142,32 @@ class JS_EXECUTE_JOB_ID :
class JobItem :
def __init__(self, id, symbol=None) :
self.ID=id # 任务ID
self.Symbol=symbol # 任务的代码 可以为空
\ No newline at end of file
self.Symbol=symbol # 任务的代码 可以为空
class HQ_DATA_TYPE :
KLINE_ID=0 # K线
MINUTE_ID=2 # 当日走势图
HISTORY_MINUTE_ID=3 # 历史分钟走势图
MULTIDAY_MINUTE_ID=4 # 多日走势图
class RequestOption :
def __init__(self, maxDataCount=500, maxMinuteDayCount=5) :
self.MaxDataCount= maxDataCount
self.MaxMinuteDayCount=maxMinuteDayCount
class SymbolOption :
def __init__(self, symbol='600000.sh' ,hqDataType=HQ_DATA_TYPE.KLINE_ID, right=0, period=0, reqeust=RequestOption(maxDataCount=1000,maxMinuteDayCount=5),args=[]) :
self.HQDataType=hqDataType # 数据类型
self.Symbol=symbol # 股票代码
self.Right=right # 复权
self.Period=period # 周期
self.MaxRequestDataCount=reqeust.MaxDataCount
self.MaxRequestMinuteDayCount=reqeust.MaxMinuteDayCount
self.Arguments=args # 指标参数
......@@ -3,6 +3,8 @@ from umychart_complier_scanner import Error
from umychart_complier_jsparser import JSParser, Tokenizer
from umychart_complier_jssymboldata import g_JSComplierResource
from umychart_complier_jsexecute import JSExecute
from umychart_complier_job import SymbolOption
from umychart_complier_job import HQ_DATA_TYPE
#################################################################################################
#
#
......@@ -37,7 +39,7 @@ class JSComplier:
return ast
@staticmethod #执行器
def Execute(code,option=None) :
def Execute(code,option=SymbolOption()) :
print('[JSComplier::Execute] ', code)
parser=JSParser(code)
parser.Initialize()
......
......@@ -60,7 +60,7 @@ class JSExecute :
'SETCODE':None
}
self.SymbolData=JSSymbolData(ast=ast,option=option)
self.SymbolData=JSSymbolData(ast=ast,option=option, procThrow=self.ThrowUnexpectedNode)
self.Algorithm=JSAlgorithm(errorHandler=self.ErrorHandler,symbolData=self.SymbolData)
self.Draw=JSDraw(errorHandler=self.ErrorHandler,symbolData=self.SymbolData)
......@@ -77,18 +77,15 @@ class JSExecute :
elif name == 'VOLR' : # 量比
pass
# return self.SymbolData.GetVolRateCacheData(node)
elif name in ('INDEXA','INDEXC','INDEXH','INDEXH','INDEXO','INDEXV','INDEXL','INDEXADV','INDEXDEC') : # 大盘数据
pass
# return self.SymbolData.GetIndexCacheData(name)
elif name in ('INDEXA','INDEXC','INDEXH','INDEXO','INDEXV','INDEXL','INDEXADV','INDEXDEC') : # 大盘数据
return self.SymbolData.GetIndexCacheData(name)
elif name== 'CURRBARSCOUNT':
pass
# return self.SymbolData.GetCurrBarsCount()
elif name== 'CAPITAL':
pass
# return self.SymbolData.GetFinanceCacheData(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA)
return self.SymbolData.GetFinanceCacheData(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA, node=node)
elif name== 'EXCHANGE':
pass
# return self.SymbolData.GetFinanceCacheData(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA)
return self.SymbolData.GetFinanceCacheData(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA, node=node)
elif name== 'SETCODE':
return self.SymbolData.SETCODE()
......
......@@ -231,11 +231,11 @@ class Node:
#流通股本(手)
if varName=='CAPITAL' :
if JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA in self.IsNeedFinanceData :
if JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA not in self.IsNeedFinanceData :
self.IsNeedFinanceData.add(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_CAPITAL_DATA)
if varName == 'EXCHANGE' :
if JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA in self.IsNeedFinanceData :
if JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA not in self.IsNeedFinanceData :
self.IsNeedFinanceData.add(JS_EXECUTE_JOB_ID.JOB_DOWNLOAD_EXCHANGE_DATA)
......
......@@ -309,10 +309,10 @@ class Scanner:
type=3 # Identifier
if type!=3 and start+len(id)!=self.Index :
restore=self.Index
# restore=self.Index
self.Index=start
raise Messages.InvalidEscapedReservedWord
self.Index=restore
# self.Index=restore
if id=='AND' or id=='OR' :
type=7 #Punctuator*/
......@@ -372,7 +372,7 @@ class Scanner:
quote=self.Source[self.Index]
self.Index+=1
octal=False
# octal=False
str=''
while not self.IsEOF():
ch=self.Source[self.Index]
......@@ -478,7 +478,7 @@ class Scanner:
elif Character.IsLineTerminator(ch):
self.Index+=1
if ch=='\r' and self.Source[self.Index]=='\n' :
self.Index+=1; #回车+换行
self.Index+=1 #回车+换行
self.LineNumber+=1
self.LineStart=self.Index
......@@ -496,7 +496,6 @@ class Scanner:
elif ch== '{' : #{ } 注释
self.Index += 1
comment = self.SkipMultiLineComment()
else :
break
......
import sys
from umychart_complier_jscomplier import JSComplier
from umychart_complier_jscomplier import JSComplier, SymbolOption, HQ_DATA_TYPE
class TestCase :
def __init__(self, code, option=SymbolOption()) :
self.Code=code
self.Option=option
def Run(self):
testCode=''
for item in self.Code:
testCode+=item
testCode+='\n'
result=JSComplier.Execute(testCode,self.Option)
return True if result else False
def Test_Tokenize():
code1='VARHIGH:=IF(VAR1<=REF(HH,-1),REF(H,BARSLAST(VAR1>=REF(HH,1))),DRAWNULL),COLORYELLOW;'
......@@ -47,6 +61,7 @@ def Test_MA() :
'VAR3:MA(C,10);',
'VAR4:MA(C,15);',
'VAR4:MA(C,30);',
'VAR4:MA(C,33);',
]
result=JSComplier.Execute(code[0]+code[1]+code[2]+code[3])
......@@ -93,11 +108,137 @@ def Test_SUMBARS() :
'VAR3:SUMBARS(C,O)',
'VAR2:C;',
]
result=JSComplier.Execute(code[0]+code[1])
option=SymbolOption()
option.Symbol='000001.sz'
option.HQDataType=HQ_DATA_TYPE.MINUTE_ID
result=JSComplier.Execute(code[0]+code[1],option)
return True if result else False
def Test_INDEX():
code=[
'VAR3:INDEXA;',
'VAR2:INDEXC;',
'VAR2:INDEXO;',
]
option=SymbolOption()
option.Period=5
result=JSComplier.Execute(code[0]+code[1]+code[2],option)
return True if result else False
def Test_COUNT():
code=[
'VAR3:COUNT(C,5);',
'VAR2:COUNT(O,10);',
'VAR2:COUNT(H,20);',
]
option=SymbolOption()
result=JSComplier.Execute(code[0]+code[1]+code[2],option)
return True if result else False
Test_Add()
Test_Multiply()
Test_MAX_MIN()
Test_SUMBARS()
\ No newline at end of file
def Test_HHV_HHL() :
case =TestCase(
code=[
'VAR3:HHV(C,5);',
'VAR2:HHV(O,10);',
'VAR2:HHV(H,20);',
'VAR3:LLV(H,5);',
'VAR4:LLV(H,10);',
])
result=case.Run()
return result
def Test_STD():
case =TestCase(
code=[
'VAR3:STD(C,5);',
'VAR2:STD(O,10);',
'VAR2:STD(H,20);',
'VAR3:STD(H,15);',
'VAR4:STD(H,0);',
])
result=case.Run()
return result
def Test_AVEDEV():
case =TestCase(
code=[
'VAR3:AVEDEV(C,5);',
'VAR2:AVEDEV(O,10);',
'VAR2:AVEDEV(H,20);',
'VAR3:AVEDEV(H,15);',
'VAR4:AVEDEV(H,0);',
])
result=case.Run()
return result
def Test_CROSS() :
case =TestCase(
code=[
'VAR3:CROSS(C,O);',
'VAR2:CROSS(O,10);',
'VAR2:CROSS(O,C);',
])
result=case.Run()
return result
def Test_MULAR() :
case =TestCase(
code=[
'VAR3:MULAR(C,5);',
'VAR2:MULAR(O,10);',
'VAR2:MULAR(O,30);',
])
result=case.Run()
return result
def Test_SUM() :
case =TestCase(
code=[
'VAR3:SUM(C,5);',
'VAR2:SUM(O,0);',
'VAR2:BARSCOUNT(O);',
])
result=case.Run()
return result
def Test_DEVSQ():
case =TestCase(
code=[
'VAR3:DEVSQ(C,5);',
'VAR2:DEVSQ(O,0);',
'VAR2:DEVSQ(O,5);',
])
result=case.Run()
return result
def Test_FINANCE(): # 财务数据测试
case =TestCase(
code=[
'VAR4:CAPITAL;',
'VAR3:FINANCE(32);',
'VAR2:FINANCE(1);',
'VAR2:FINANCE(33);',
])
result=case.Run()
return result
#Test_Add()
#Test_Multiply()
#Test_MAX_MIN()
Test_FINANCE()
\ No newline at end of file
......@@ -3026,7 +3026,7 @@ function JSAlgorithm(errorHandler,symbolData)
result[i]=0;
if (days==null)
{
if (!this.IsNumber(data[i])) contnue;
if (!this.IsNumber(data[i])) continue;
days=0;
}
......@@ -3127,6 +3127,8 @@ function JSAlgorithm(errorHandler,symbolData)
Const = (Ey - Ex*Slope) / num;
result[i] = Slope * num + Const;
}
return result;
}
//SLOPE 线性回归斜率
......@@ -3328,16 +3330,16 @@ function JSAlgorithm(errorHandler,symbolData)
if (typeof(data)=='number') return 0;
var latestID; //最新满足条件的数据索引
var latestID=null; //最新满足条件的数据索引
var result=[];
var value;
for(let i=0;i<data.length;++i)
{
result[i]=null;
value=data[i];
if (this.IsNumber(value) && value>0) latestID==i;
if (this.IsNumber(value) && value>0) latestID=i;
if (i-latestID<n) result[i]=1;
if (latestID!=null && i-latestID<n) result[i]=1;
else result[i]=0;
}
......@@ -5845,13 +5847,13 @@ function JSSymbolData(ast,option,jsExecute)
this.IndexData.DataType=0; /*日线数据 */
this.IndexData.Data=hisData;
var aryOverlayData=this.Data.GetOverlayData(this.IndexData.Data); //和主图数据拟合以后的数据
var aryOverlayData=this.SourceData.GetOverlayData(this.IndexData.Data); //和主图数据拟合以后的数据
this.IndexData.Data=aryOverlayData;
if (this.Period>0 && this.Period<=3) //周期数据
{
let periodData=this.IndexData.GetPeriodData(this.Period);
this.Data.Data=periodData;
this.IndexData.Data=periodData;
}
}
......@@ -7240,7 +7242,7 @@ function JSSymbolData(ast,option,jsExecute)
item.DateTime=data.stock[0].date.toString()+" 0925";
else
item.DateTime=data.stock[0].date.toString()+" "+jsData.time.toString();
item.Increate=jsData.increate;
item.Increase=jsData.increase;
item.Risefall=jsData.risefall;
item.AvPrice=jsData.avprice;
......
......@@ -3026,7 +3026,7 @@ function JSAlgorithm(errorHandler,symbolData)
result[i]=0;
if (days==null)
{
if (!this.IsNumber(data[i])) contnue;
if (!this.IsNumber(data[i])) continue;
days=0;
}
......@@ -3127,6 +3127,8 @@ function JSAlgorithm(errorHandler,symbolData)
Const = (Ey - Ex*Slope) / num;
result[i] = Slope * num + Const;
}
return result;
}
//SLOPE 线性回归斜率
......@@ -3328,16 +3330,16 @@ function JSAlgorithm(errorHandler,symbolData)
if (typeof(data)=='number') return 0;
var latestID; //最新满足条件的数据索引
var latestID=null; //最新满足条件的数据索引
var result=[];
var value;
for(let i=0;i<data.length;++i)
{
result[i]=null;
value=data[i];
if (this.IsNumber(value) && value>0) latestID==i;
if (this.IsNumber(value) && value>0) latestID=i;
if (i-latestID<n) result[i]=1;
if (latestID!=null && i-latestID<n) result[i]=1;
else result[i]=0;
}
......@@ -5845,13 +5847,13 @@ function JSSymbolData(ast,option,jsExecute)
this.IndexData.DataType=0; /*日线数据 */
this.IndexData.Data=hisData;
var aryOverlayData=this.Data.GetOverlayData(this.IndexData.Data); //和主图数据拟合以后的数据
var aryOverlayData=this.SourceData.GetOverlayData(this.IndexData.Data); //和主图数据拟合以后的数据
this.IndexData.Data=aryOverlayData;
if (this.Period>0 && this.Period<=3) //周期数据
{
let periodData=this.IndexData.GetPeriodData(this.Period);
this.Data.Data=periodData;
this.IndexData.Data=periodData;
}
}
......@@ -7240,7 +7242,7 @@ function JSSymbolData(ast,option,jsExecute)
item.DateTime=data.stock[0].date.toString()+" 0925";
else
item.DateTime=data.stock[0].date.toString()+" "+jsData.time.toString();
item.Increate=jsData.increate;
item.Increase=jsData.increase;
item.Risefall=jsData.risefall;
item.AvPrice=jsData.avprice;
......
......@@ -3026,7 +3026,7 @@ function JSAlgorithm(errorHandler,symbolData)
result[i]=0;
if (days==null)
{
if (!this.IsNumber(data[i])) contnue;
if (!this.IsNumber(data[i])) continue;
days=0;
}
......@@ -3127,6 +3127,8 @@ function JSAlgorithm(errorHandler,symbolData)
Const = (Ey - Ex*Slope) / num;
result[i] = Slope * num + Const;
}
return result;
}
//SLOPE 线性回归斜率
......@@ -3328,16 +3330,16 @@ function JSAlgorithm(errorHandler,symbolData)
if (typeof(data)=='number') return 0;
var latestID; //最新满足条件的数据索引
var latestID=null; //最新满足条件的数据索引
var result=[];
var value;
for(let i=0;i<data.length;++i)
{
result[i]=null;
value=data[i];
if (this.IsNumber(value) && value>0) latestID==i;
if (this.IsNumber(value) && value>0) latestID=i;
if (i-latestID<n) result[i]=1;
if (latestID!=null && i-latestID<n) result[i]=1;
else result[i]=0;
}
......@@ -5845,13 +5847,13 @@ function JSSymbolData(ast,option,jsExecute)
this.IndexData.DataType=0; /*日线数据 */
this.IndexData.Data=hisData;
var aryOverlayData=this.Data.GetOverlayData(this.IndexData.Data); //和主图数据拟合以后的数据
var aryOverlayData=this.SourceData.GetOverlayData(this.IndexData.Data); //和主图数据拟合以后的数据
this.IndexData.Data=aryOverlayData;
if (this.Period>0 && this.Period<=3) //周期数据
{
let periodData=this.IndexData.GetPeriodData(this.Period);
this.Data.Data=periodData;
this.IndexData.Data=periodData;
}
}
......@@ -7240,7 +7242,7 @@ function JSSymbolData(ast,option,jsExecute)
item.DateTime=data.stock[0].date.toString()+" 0925";
else
item.DateTime=data.stock[0].date.toString()+" "+jsData.time.toString();
item.Increate=jsData.increate;
item.Increase=jsData.increase;
item.Risefall=jsData.risefall;
item.AvPrice=jsData.avprice;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册