📄 stock.cpp
字号:
BOOL CStockInfo::StatTechIndex( DWORD dwDate )
{
SP_ASSERT( 0 != dwDate );
if( m_kdata.GetSize() == 0 )
return FALSE;
int nIndex = -1;
if( -1 == dwDate )
nIndex = m_kdata.GetSize() - 1;
else
nIndex = m_kdata.GetIndexByDate( dwDate );
if( -1 == nIndex )
{
m_datetech = 0;
m_fLast = 0;
m_fOpen = 0;
m_fHigh = 0;
m_fLow = 0;
m_fClose = 0;
m_fAmount = 0;
m_fVolume = 0;
m_dwAdvance = 0;
m_dwDecline = 0;
return FALSE;
}
else
{
KDATA & kd = m_kdata.ElementAt( nIndex );
m_datetech = kd.m_date;
if( nIndex > 0 )
m_fLast = m_kdata.ElementAt(nIndex-1).m_fClose;
else
m_fLast = kd.m_fOpen;
m_fOpen = kd.m_fOpen;
m_fHigh = kd.m_fHigh;
m_fLow = kd.m_fLow;
m_fClose = kd.m_fClose;
m_fAmount = kd.m_fAmount;
m_fVolume = kd.m_fVolume;
m_dwAdvance = kd.m_dwAdvance;
m_dwDecline = kd.m_dwDecline;
return TRUE;
}
}
BOOL CStockInfo::StatBaseIndex( DWORD dwDate )
{
SP_ASSERT( 0 != dwDate );
if( m_basedata.GetSize() == 0 )
return FALSE;
int nIndex = m_basedata.GetSize()-1;
for( int i=m_basedata.GetSize()-1; i>=0; i-- )
{
if( m_basedata.ElementAt(i).m_date <= dwDate )
{
nIndex = i;
break;
}
}
BASEDATA & block = m_basedata.ElementAt(nIndex);
strncpy( m_szDomain, block.m_szDomain, min(sizeof(m_szDomain),sizeof(block.m_szDomain)) );
strncpy( m_szProvince, block.m_szProvince, min(sizeof(m_szProvince),sizeof(block.m_szProvince)) );
m_datebase = block.m_date;
m_reporttype = block.m_reporttype;
if( block.m_fErate_dollar > 1e-6 )
m_fErate_dollar = block.m_fErate_dollar;
if( block.m_fErate_hkdollar > 1e-6 )
m_fErate_hkdollar = block.m_fErate_hkdollar;
m_fRatio_liquidity = block.m_fRatio_liquidity;
m_fRatio_quick = block.m_fRatio_quick;
m_fVelocity_receivables = block.m_fVelocity_receivables;
m_fVelocity_merchandise = block.m_fVelocity_merchandise;
m_fMain_income = block.m_fMain_income;
m_fCash_ps = block.m_fCash_ps;
m_fProfit_margin = block.m_fProfit_margin;
m_fNetasset_yield = block.m_fNetasset_yield;
m_datebegin = block.m_datebegin;
m_fShare_count_total = block.m_fShare_count_total;
m_fShare_count_a = block.m_fShare_count_a;
m_fShare_count_b = block.m_fShare_count_b;
m_fShare_count_h = block.m_fShare_count_h;
m_fShare_count_national = block.m_fShare_count_national;
m_fShare_count_corp = block.m_fShare_count_corp;
m_fProfit_psud = block.m_fProfit_psud;
m_fAsset = block.m_fAsset;
m_fRatio_holderright = block.m_fRatio_holderright;
m_fRatio_longdebt = block.m_fRatio_longdebt;
m_fRatio_debt = block.m_fRatio_debt;
m_fNetasset_ps = block.m_fNetasset_ps;
m_fNetasset_ps_regulate = block.m_fNetasset_ps_regulate;
m_fEps = block.m_fEps;
m_fEps_deduct = block.m_fEps_deduct;
m_fNet_profit = block.m_fNet_profit;
m_fMain_profit = block.m_fMain_profit;
m_fTotal_profit = block.m_fTotal_profit;
m_fProfit_inc = block.m_fProfit_inc;
m_fIncome_inc = block.m_fIncome_inc;
m_fAsset_inc = block.m_fAsset_inc;
/* 以下统计值永远只取最近一期数值
// ★技术数据统计值
LONG m_fYield_average; // 平均收益率% 0.001
LONG m_fYield_stddev; // 收益标准差% 0.001
LONG m_fBeite; // β值 0.001
*/
BASEDATA & blkLatest = m_basedata.ElementAt(m_basedata.GetSize()-1);
m_fYield_average = blkLatest.m_fYield_average;
m_fYield_stddev = blkLatest.m_fYield_stddev;
m_fBeite = blkLatest.m_fBeite;
/*** stat
m_fProfit_inc = 0;
m_fIncome_inc = 0;
LONG nProfitCount = 0;
LONG nIncomeCount = 0;
float fProfitLast = 0, fProfitSum = 0;
float fIncomeLast = 0, fIncomeSum = 0;
for( int i=0; i<m_basedata.GetSize(); i++ )
{
BASEDATA & base = m_basedata.ElementAt(i);
if( fabs(fProfitLast) > 1e-4 )
{
nProfitCount ++;
fProfitSum += (float) ( (base.m_fNet_profit)/nProfitLast - 1 );
}
if( fabs(fIncomeLast) > 1e-4 )
{
nIncomeCount ++;
fIncomeSum += (float)( (base.m_fMain_income)/nIncomeLast - 1 );
}
fProfitLast = base.m_fNet_profit;
fIncomeLast = base.m_fMain_income;
}
if( nProfitCount > 0 )
m_fProfit_inc = (float)(((double)fProfitSum)/nProfitCount);
if( nIncomeCount > 0 )
m_fIncome_inc = (float)(((double)fIncomeSum)/nIncomeCount);
*/
return TRUE;
}
BOOL CStockInfo::IsValidStock( )
{
return (strlen(m_szCode) > 0);
}
BOOL CStockInfo::IsShangHai( )
{
if( CStock::marketSHSE == m_dwMarket )
return TRUE;
return (m_type & CStock::markShanghai);
}
BOOL CStockInfo::IsShenZhen( )
{
if( CStock::marketSZSE == m_dwMarket )
return TRUE;
return (m_type & CStock::markShenzhen);
}
BOOL CStockInfo::IsIndex( )
{
return ( CStock::typeshIndex == m_type || CStock::typeszIndex == m_type );
}
BOOL CStockInfo::IsBond( )
{
if( CStock::typeshBond == m_type || CStock::typeszBond == m_type )
return TRUE;
return ( 0 == strncmp( m_szName, sz_stockname_bond, min(sizeof(m_szName),strlen(sz_stockname_bond)) ) );
}
BOOL CStockInfo::IsBondIndex( )
{
return ( 0 == strncmp( m_szName, sz_stockname_bondindex, min(sizeof(m_szName),strlen(sz_stockname_bondindex)) )
|| 0 == strncmp( m_szName, sz_stockname_bondindexcorp, min(sizeof(m_szName),strlen(sz_stockname_bondindexcorp)) ) );
}
BOOL CStockInfo::IsFund( )
{
return ( 0 == strncmp( m_szName, sz_stockname_fund, min(sizeof(m_szName),strlen(sz_stockname_fund)) ) );
}
BOOL CStockInfo::IsRight( )
{
return ( CStock::typeshRight == m_type || CStock::typeszRight == m_type );
}
int CStockInfo::DigitBit( )
{
if( IsFund() || IsRight() || CStock::typeshB == m_type)
return 3;
return 2;
}
BOOL CStockInfo::GetAverage( double *pValue )
{
if( CStock::typeshIndex == m_type || CStock::typeszIndex == m_type )
return FALSE;
if( m_fVolume > 1e-4 )
{
int nCount = 0;
double average = ((double)(m_fAmount)) / m_fVolume;
while( average < m_fLow && nCount < 10 ) { average *= 10; nCount ++; }
while( average > m_fHigh && nCount < 20 ) { average /= 10; nCount ++; }
if( average < m_fLow ) // 说明是指数
average = (m_fOpen+m_fHigh+m_fLow+m_fClose)/4;
if( pValue )
*pValue = average;
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetDiff( double *pValue, DWORD dateCur, int nDays )
{
if( 1 == nDays && m_datetech == dateCur )
{
if( m_fLast <= 1e-4 || m_fClose < 1e-4 )
return FALSE;
if( pValue )
*pValue = m_fClose - m_fLast;
return TRUE;
}
return m_kdata.GetDiff( pValue, dateCur, nDays );
}
BOOL CStockInfo::GetDiffPercent( double *pValue, DWORD dateCur, int nDays )
{
if( 1 == nDays && m_datetech == dateCur )
{
if( m_fLast <= 1e-4 || m_fClose < 1e-4 )
return FALSE;
if( pValue )
*pValue = 100. * m_fClose / m_fLast - 100;
return TRUE;
}
return m_kdata.GetDiffPercent( pValue, dateCur, nDays );
}
BOOL CStockInfo::GetScope( double *pValue, DWORD dateCur, int nDays )
{
if( 1 == nDays && m_datetech == dateCur )
{
if( m_fLast <= 1e-4 || m_fHigh <= 1e-4 || m_fLow <= 1e-4 )
return FALSE;
if( pValue )
*pValue = 100. * (m_fHigh-m_fLow)/m_fLast;
return TRUE;
}
return m_kdata.GetScope( pValue, dateCur, nDays );
}
BOOL CStockInfo::GetDiffPercentMin5( double *pValue )
{
return m_minute.GetDiffPercentMin5( pValue );
}
BOOL CStockInfo::GetPE( double * pValue )
{
double factor = CStock::GetReportFactor( m_reporttype );
if( fabs(m_fEps) > 1e-4 && m_fClose > 1e-4 )
{
double close_price_rmb = m_fClose;
if( CStock::typeshB == m_type )
close_price_rmb = /*m_fErate_dollar * */m_fClose; // 备注,从通达信得到的基本资料数据是经过汇率换算的.
else if( CStock::typeszB == m_type )
close_price_rmb = /*m_fErate_hkdollar * */m_fClose;
if( pValue )
*pValue = close_price_rmb / (m_fEps * factor);
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetPNetAsset( double *pValue )
{
if( fabs(m_fNetasset_ps) > 1e-4 && m_fClose > 1e-4 )
{
double close_price_rmb = m_fClose;
if( CStock::typeshB == m_type )
close_price_rmb = /*m_fErate_dollar * */m_fClose; // 备注,从通达信得到的基本资料数据是经过汇率换算的.
else if( CStock::typeszB == m_type )
close_price_rmb = /*m_fErate_hkdollar * */m_fClose;
if( pValue )
*pValue = close_price_rmb / m_fNetasset_ps;
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetPMainIncome( double * pValue )
{
double factor = CStock::GetReportFactor( m_reporttype );
if( fabs(m_fMain_income) > 1e-4 && m_fClose > 1e-4 )
{
double close_price_rmb = m_fClose;
if( CStock::typeshB == m_type )
close_price_rmb = /*m_fErate_dollar * */m_fClose; // 备注,从通达信得到的基本资料数据是经过汇率换算的.
else if( CStock::typeszB == m_type )
close_price_rmb = /*m_fErate_hkdollar * */m_fClose;
if( pValue )
*pValue = close_price_rmb * m_fShare_count_total / (m_fMain_income*factor);
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetRatioPCash( double * pValue )
{
if( CStock::typeshA != m_type && CStock::typeszA != m_type
&& CStock::typeshB != m_type && CStock::typeszB != m_type )
return FALSE;
double factor = CStock::GetReportFactor( m_reporttype );
if( fabs(m_fCash_ps) > 1e-4 && m_fClose > 1e-4 )
{
double close_price_rmb = m_fClose;
if( CStock::typeshB == m_type )
close_price_rmb = /*m_fErate_dollar * */m_fClose; // 备注,从通达信得到的基本资料数据是经过汇率换算的.
else if( CStock::typeszB == m_type )
close_price_rmb = /*m_fErate_hkdollar * */m_fClose;
if( pValue )
*pValue = close_price_rmb / (m_fCash_ps*factor);
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetShareCurrency( double * pValue )
{
if( CStock::typeshA != m_type && CStock::typeszA != m_type
&& CStock::typeshB != m_type && CStock::typeszB != m_type )
return FALSE;
if( CStock::typeshA == m_type || CStock::typeszA == m_type )
{
*pValue = (double)m_fShare_count_a;
return TRUE;
}
if( CStock::typeshB == m_type || CStock::typeszB == m_type )
{
*pValue = (double)m_fShare_count_b;
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetRatioCurrency( double * pValue )
{
if( CStock::typeshA != m_type && CStock::typeszA != m_type
&& CStock::typeshB != m_type && CStock::typeszB != m_type )
return FALSE;
if( m_fShare_count_total > 1e-4 )
{
if( CStock::typeshA == m_type || CStock::typeszA == m_type )
{
*pValue = (100. * (double)m_fShare_count_a) / m_fShare_count_total;
return TRUE;
}
if( CStock::typeshB == m_type || CStock::typeszB == m_type )
{
*pValue = (100. * (double)m_fShare_count_b) / m_fShare_count_total;
return TRUE;
}
}
return FALSE;
}
BOOL CStockInfo::GetRatioChangeHand( double * pValue, double dVolume )
{
if( CStock::typeshA != m_type && CStock::typeszA != m_type
&& CStock::typeshB != m_type && CStock::typeszB != m_type )
return FALSE;
// get share currency
double dShareCurrency = 0.;
if( !GetShareCurrency( &dShareCurrency ) )
return FALSE;
if( fabs(dShareCurrency) < 1e-4 )
return FALSE;
if( pValue )
*pValue = 100. * dVolume / dShareCurrency;
return TRUE;
}
BOOL CStockInfo::GetRatioChangeHand( CKData &kdata, double * pValue, DWORD dateCur, int nDays )
{
double dVolume = 0;
if( !kdata.GetVolumeSum( &dVolume, dateCur, nDays ) )
return FALSE;
return GetRatioChangeHand( pValue, dVolume );
}
BOOL CStockInfo::GetRatioChangeHand( double * pValue, DWORD dateCur, int nDays )
{
return GetRatioChangeHand( m_kdata, pValue, dateCur, nDays );
}
BOOL CStockInfo::GetRatioVolume( double * pValue, DWORD dateCur, int nDays )
{
return m_kdata.GetRatioVolume( pValue, dateCur, nDays );
}
BOOL CStockInfo::GetRS( double * pValue, DWORD dateCur, int nDays )
{
return m_kdata.GetRS( pValue, dateCur, nDays );
}
BOOL CStockInfo::GetSellBuyRatio( double *pdRatio, double *pdDiff )
{
double dBuyVolume = m_fBuyVolume[0];
dBuyVolume += m_fBuyVolume[1];
dBuyVolume += m_fBuyVolume[2];
dBuyVolume += m_fBuyVolume[3];
double dSellVolume = m_fSellVolume[0];
dSellVolume += m_fSellVolume[1];
dSellVolume += m_fSellVolume[2];
dSellVolume += m_fSellVolume[3];
double dRatio = 0;
if( dBuyVolume + dSellVolume > 1e-4 )
dRatio = 200*dBuyVolume/(dBuyVolume+dSellVolume)-100;
double dDiff = dBuyVolume - dSellVolume;
if( pdRatio )
*pdRatio = dRatio;
if( pdDiff )
*pdDiff = dDiff;
return TRUE;
}
BOOL CStockInfo::GetMarketValue( double * pValue )
{
if( CStock::typeshA != m_type && CStock::typeszA != m_type
&& CStock::typeshB != m_type && CStock::typeszB != m_type )
return FALSE;
if( m_fClose > 1e-4 && m_fShare_count_total > 1e-4 )
{
if( pValue )
*pValue = m_fClose * m_fShare_count_total;
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetMarketValueA( double * pValue )
{
if( m_fClose > 1e-4 && m_fShare_count_a > 1e-4
&& (CStock::typeshA == m_type || CStock::typeszA == m_type) )
{
if( pValue )
*pValue = m_fClose * m_fShare_count_a;
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetMarketValueB( double * pValue )
{
if( m_fClose > 1e-4 && m_fShare_count_b > 1e-4
&& (CStock::typeshB == m_type || CStock::typeszB == m_type) )
{
if( pValue )
*pValue = m_fClose * m_fShare_count_b;
return TRUE;
}
return FALSE;
}
BOOL CStockInfo::GetXiapu( double * pValue )
{
if( fabs(STKLIB_DATA_INVALID - m_fYield_average) > 1e-4
&& fabs(STKLIB_DATA_INVALID - m_fYield_stddev) > 1e-4 && fabs(m_fYield_stddev) > 1e-4 )
{
if( pValue )
*pValue = 100. * (m_fYield_average-3) / m_fYield_stddev;
// ^^^^ 市场无风险利率3%
return TRUE;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////
// class CStock
double CStock::GetReportFactor( int nReportType )
{
double factor = 1;
if( CStock::reportQuarter == nReportType )
factor = 4;
else if( CStock::reportMid == nReportType )
factor = 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -