📄 express.cpp
字号:
/*
Cross Platform Core Code.
Copyright(R) 2001-2002 Balang Software.
All rights reserved.
Using:
class CExpress;
class CIndex;
class CIndexContainer;
*/
#include "stdafx.h"
#include "Express.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
SLH_DATA slh_data_array[SLH_MAX+1] = {
{ SLH_NONE, "", 100, "" },
{ SLH_CODE, "", 100, "" },
{ SLH_NAME, "", 110, "" },
// 技术数据
{ SLH_DATE, "", 110, "" },
{ SLH_LASTCLOSE, "", 100, "lastclose" },
{ SLH_OPEN, "", 100, "open" },
{ SLH_CLOSE, "", 100, "close" },
{ SLH_HIGH, "", 100, "high" },
{ SLH_LOW, "", 100, "low" },
{ SLH_AVERAGE, "", 100, "average" },
{ SLH_DIFF, "", 100, "diff" },
{ SLH_DIFFPERCENT, "", 100, "diffpercent" },
{ SLH_SCOPE, "", 100, "scope" },
{ SLH_VOLUME, "", 140, "volume" },
{ SLH_AMOUNT, "", 140, "amount" },
{ SLH_VOLUP, "", 100, "volup" },
{ SLH_VOLDOWN, "", 100, "voldown" },
{ SLH_DIFFPERCENT_MIN5, "", 100, "diffpercent_min5" },
{ SLH_SELLBUYRATIO, "", 100, "sellbuyratio" },
{ SLH_SELLBUYDIFF, "", 100, "sellbuydiff" },
{ SLH_BUYPRICE3, "", 100, "buyprice3" },
{ SLH_BUYPRICE2, "", 100, "buyprice2" },
{ SLH_BUYPRICE1, "", 100, "buyprice1" },
{ SLH_SELLPRICE1, "", 100, "sellprice1" },
{ SLH_SELLPRICE2, "", 100, "sellprice2" },
{ SLH_SELLPRICE3, "", 100, "sellprice3" },
{ SLH_BUYVOLUME3, "", 100, "buyvolume3" },
{ SLH_BUYVOLUME2, "", 100, "buyvolume2" },
{ SLH_BUYVOLUME1, "", 100, "buyvolume1" },
{ SLH_SELLVOLUME1, "", 100, "sellvolume1" },
{ SLH_SELLVOLUME2, "", 100, "sellvolume2" },
{ SLH_SELLVOLUME3, "", 100, "sellvolume3" },
// 主要基本指标
{ SLH_REPORTTYPE, "", 100, "" },
{ SLH_PE, "", 100, "pe" },
{ SLH_PNETASSET, "", 100, "pnetasset" },
{ SLH_PMAININCOME, "", 100, "pmainincome" },
{ SLH_RATIO_PCASH, "", 100, "ratio_pcash" },
{ SLH_RATIO_CURRENCY, "", 100, "ratio_currency" },
{ SLH_RATIO_CHANGEHAND, "", 100, "ratio_changehand" },
{ SLH_RATIO_VOLUME, "", 100, "ratio_volume" },
{ SLH_RS, "", 100, "rs" },
{ SLH_MARKETVALUE, "", 170, "marketvalue" },
{ SLH_MARKETVALUEA, "", 170, "marketvaluea" },
{ SLH_MARKETVALUEB, "", 170, "marketvalueb" },
// ★偿债能力
{ SLH_RATIO_LIQUIDITY, "", 140, "ratio_liquidity" },
{ SLH_RATIO_QUICK, "", 140, "ratio_quick" },
{ SLH_VELOCITY_RECEIVABLES, "", 170, "velocity_receivables" },
// ★经营能力
{ SLH_VELOCITY_MERCHANDISE, "", 150, "velocity_merchandise" },
{ SLH_MAIN_INCOME, "", 160, "main_income" },
{ SLH_CASH_PS, "", 170, "cash_ps" },
// ★盈利能力
{ SLH_PROFIT_MARGIN, "", 170, "profit_margin" },
{ SLH_NETASSET_YIELD, "", 190, "netasset_yield" },
// ★资本结构
{ SLH_DATE_BEGIN, "", 160, "" },
{ SLH_SHARE_COUNT_TOTAL, "", 160, "share_count_total" },
{ SLH_SHARE_COUNT_A, "", 140, "share_count_a" },
{ SLH_SHARE_COUNT_B, "", 140, "share_count_b" },
{ SLH_SHARE_COUNT_H, "", 140, "share_count_h" },
{ SLH_SHARE_COUNT_NATIONAL, "", 140, "share_count_national" },
{ SLH_SHARE_COUNT_CORP, "", 140, "share_count_corp" },
{ SLH_PROFIT_PSUD, "", 170, "profit_psud" },
{ SLH_ASSET, "", 140, "asset" },
{ SLH_RATIO_HOLDERRIGHT, "", 170, "ratio_holderright" },
{ SLH_RATIO_LONGDEBT, "", 170, "ratio_longdebt" },
{ SLH_RATIO_DEBT, "", 170, "ration_debt" },
// ★投资收益能力
{ SLH_NETASSET_PS, "", 150, "netasset_ps" },
{ SLH_NETASSET_PS_REGULATE, "", 200, "netasset_ps_regulate" },
{ SLH_EPS, "", 140, "eps" },
{ SLH_EPS_DEDUCT, "", 170, "eps_deduct" },
{ SLH_NET_PROFIT, "", 140, "net_profit" },
{ SLH_MAIN_PROFIT, "", 140, "main_profit" },
{ SLH_TOTAL_PROFIT, "", 140, "total_profit" },
{ SLH_PROFIT_INC, "", 170, "profit_inc" },
{ SLH_INCOME_INC, "", 170, "income_inc" },
{ SLH_ASSET_INC, "", 190, "asset_inc" },
{ SLH_ANNGAINS_AVERAGE, "", 170, "anngains_average" },
{ SLH_ANNGAINS_STDDEV, "", 170, "anngains_stddev" },
{ SLH_BETA, "", 100, "beta" },
{ SLH_SHARP, "", 100, "sharp" },
{ SLH_TRADE, "", 100, "" },
{ SLH_PROVINCE, "", 100, "" },
};
CSPString AfxGetVariantName( UINT nVariantID, BOOL bWithParameter )
{
if( nVariantID >= SLH_USERDEFINE_BEGIN )
{
CIndexContainer & aindex = AfxGetProfile().GetSListColumnsUser();
CIndex index = aindex.GetIndex( nVariantID );
return index.m_strName;
}
if( nVariantID < SLH_MIN || nVariantID > SLH_MAX )
return "";
CSPString strResult;
if( strResult.IsEmpty() )
strResult = slh_data_array[nVariantID].string;
if( strResult.IsEmpty() )
{
SP_ASSERT( nVariantID == slh_data_array[nVariantID].slh_id );
strResult = AfxGetSLHTitle( nVariantID );
int size = sizeof(slh_data_array[nVariantID].string);
strncpy( slh_data_array[nVariantID].string, strResult, size-1 );
slh_data_array[nVariantID].string[size-1] = 0;
}
if( bWithParameter )
{
if( SLH_DIFF == nVariantID || SLH_DIFFPERCENT == nVariantID || SLH_SCOPE == nVariantID
|| SLH_RATIO_CHANGEHAND == nVariantID || SLH_RATIO_VOLUME == nVariantID
|| SLH_RS == nVariantID || SLH_ANNGAINS_AVERAGE == nVariantID )
{
CSPString strSuf, strTemp;
strSuf = slh_hdrday;
if( SLH_DIFF == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetDiffDays(), (LPCTSTR)strSuf );
else if( SLH_DIFFPERCENT == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetDiffPercentDays(), (LPCTSTR)strSuf );
else if( SLH_SCOPE == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetScopeDays(), (LPCTSTR)strSuf );
else if( SLH_RATIO_CHANGEHAND == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetRatioChangeHandDays(), (LPCTSTR)strSuf );
else if( SLH_RATIO_VOLUME == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetRatioVolumeDays(), (LPCTSTR)strSuf );
else if( SLH_RS == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetRSDays(), (LPCTSTR)strSuf );
else if( SLH_ANNGAINS_AVERAGE == nVariantID )
strTemp.Format( "%s-%d%s", (LPCTSTR)strResult, AfxGetProfile().GetYieldAverageDays(), (LPCTSTR)strSuf );
else
SP_ASSERT( FALSE );
strResult = strTemp;
}
}
return strResult;
}
BOOL AfxGetVariantNameArray( CSPStringArray & astr, BOOL bWithParameter )
{
astr.SetSize( 0, SLH_MAX+SLH_MIN+1 );
for( int nVariantID = min(0,SLH_MIN); nVariantID <= SLH_MAX; nVariantID ++ )
{
if( strlen(slh_data_array[nVariantID].varname) > 0 )
{
CSPString strTemp = AfxGetVariantName( nVariantID, bWithParameter );
astr.Add( strTemp );
}
else
{
astr.Add( "" );
}
}
return TRUE;
}
UINT AfxGetVariantID( CSPString strName, BOOL bWithParameter )
{
for( int nVariantID = SLH_MIN; nVariantID <= SLH_MAX; nVariantID ++ )
{
CSPString strTemp = AfxGetVariantName( nVariantID, bWithParameter );
if( 0 == strTemp.CompareNoCase( strName ) )
return nVariantID;
}
CIndexContainer & aindex = AfxGetProfile().GetSListColumnsUser();
CIndex index = aindex.GetIndex( strName );
if( !index.IsInvalidID() )
return index.m_nID;
return SLH_INVALID;
}
CSPString AfxGetVariantVarName( int nVariantID )
{
if( nVariantID >= SLH_MIN && nVariantID <= SLH_MAX )
return slh_data_array[nVariantID].varname;
else
return "";
}
CSPString AfxGetVariantVarName( CSPString strName, BOOL bWithParameter )
{
UINT nVariantID = AfxGetVariantID( strName, bWithParameter );
return AfxGetVariantVarName( nVariantID );
}
/* 计算股票列表视图中某一列的值,其数值单位与股票列表视图中相同 */
BOOL AfxGetVariantValue(UINT nVariantID, CStockInfo &info, double * pValue,
CStockContainer *pContainer )
{
if( NULL == pValue )
{
SP_ASSERT( FALSE );
return FALSE;
}
double factor = 1; // CStock::GetReportFactor( info.m_reporttype );
if( nVariantID >= SLH_MIN && nVariantID <= SLH_MAX )
{
switch( nVariantID )
{
case SLH_LASTCLOSE: // 昨收
*pValue = info.m_fLast;
return ( info.m_fLast > 1e-4 );
case SLH_OPEN: // 今开
*pValue = info.m_fOpen;
return ( info.m_fOpen > 1e-4 );
case SLH_CLOSE: // 收盘价
*pValue = info.m_fClose;
return ( info.m_fClose > 1e-4 );
case SLH_HIGH: // 最高价
*pValue = info.m_fHigh;
return ( info.m_fHigh > 1e-4 );
case SLH_LOW: // 最低价
*pValue = info.m_fLow;
return ( info.m_fLow > 1e-4 );
case SLH_AVERAGE: // 均价
return info.GetAverage( pValue );
case SLH_DIFF: // 涨跌
return info.GetDiff( pValue, info.m_datetech, AfxGetProfile().GetDiffDays() );
case SLH_DIFFPERCENT: // 涨幅
return info.GetDiffPercent( pValue, info.m_datetech, AfxGetProfile().GetDiffPercentDays() );
case SLH_SCOPE: // 震幅
return info.GetScope( pValue, info.m_datetech, AfxGetProfile().GetScopeDays() );
case SLH_VOLUME: // 成交量
*pValue = info.m_fVolume*0.01;
return ( info.m_fVolume > 1e-4 );
case SLH_AMOUNT: // 成交额
*pValue = info.m_fAmount*0.001;
return ( info.m_fAmount > 1e-4 );
case SLH_VOLUP: // 外盘
if( info.m_minute.StatVolumeInfo( NULL, pValue, NULL ) )
{
*pValue = (*pValue) * 0.01;
return TRUE;
}
break;
case SLH_VOLDOWN: // 内盘
if( info.m_minute.StatVolumeInfo( NULL, NULL, pValue ) )
{
*pValue = (*pValue) * 0.01;
return TRUE;
}
break;
case SLH_DIFFPERCENT_MIN5: // 五分钟涨幅%
return info.GetDiffPercentMin5( pValue );
case SLH_SELLBUYRATIO: // 委比%
return info.GetSellBuyRatio( pValue, NULL );
case SLH_SELLBUYDIFF: // 委量差
if( info.GetSellBuyRatio( NULL, pValue ) )
{
*pValue = (*pValue) * 0.01;
return TRUE;
}
break;
case SLH_BUYPRICE3: // 买价三
*pValue = info.m_fBuyPrice[2];
return ( info.m_fBuyPrice[2] > 1e-4 );
case SLH_BUYPRICE2: // 买价二
*pValue = info.m_fBuyPrice[1];
return ( info.m_fBuyPrice[1] > 1e-4 );
case SLH_BUYPRICE1: // 买价一
*pValue = info.m_fBuyPrice[0];
return ( info.m_fBuyPrice[0] > 1e-4 );
case SLH_SELLPRICE1: // 卖价一
*pValue = info.m_fSellPrice[0];
return ( info.m_fSellPrice[0] > 1e-4 );
case SLH_SELLPRICE2: // 卖价二
*pValue = info.m_fSellPrice[1];
return ( info.m_fSellPrice[1] > 1e-4 );
case SLH_SELLPRICE3: // 卖价三
*pValue = info.m_fSellPrice[2];
return ( info.m_fSellPrice[2] > 1e-4 );
case SLH_BUYVOLUME3: // 买量三
*pValue = info.m_fBuyVolume[2] * 0.01;
return ( info.m_fBuyVolume[2] > 1e-4 );
case SLH_BUYVOLUME2: // 买量二
*pValue = info.m_fBuyVolume[1] * 0.01;
return ( info.m_fBuyVolume[1] > 1e-4 );
case SLH_BUYVOLUME1: // 买量一
*pValue = info.m_fBuyVolume[0] * 0.01;
return ( info.m_fBuyVolume[0] > 1e-4 );
case SLH_SELLVOLUME1: // 卖量一
*pValue = info.m_fSellVolume[0] * 0.01;
return ( info.m_fSellVolume[0] > 1e-4 );
case SLH_SELLVOLUME2: // 卖量二
*pValue = info.m_fSellVolume[1] * 0.01;
return ( info.m_fSellVolume[1] > 1e-4 );
case SLH_SELLVOLUME3: // 卖量三
*pValue = info.m_fSellVolume[2] * 0.01;
return ( info.m_fSellVolume[2] > 1e-4 );
// 主要基本指标
case SLH_PE: // 市盈率
return info.GetPE( pValue );
case SLH_PNETASSET: // 市净率
return info.GetPNetAsset( pValue );
case SLH_PMAININCOME: // 市销率
return info.GetPMainIncome( pValue );
case SLH_RATIO_PCASH: // 价格净现金比
return info.GetRatioPCash( pValue );
case SLH_RATIO_CURRENCY: // 流通率
return info.GetRatioCurrency( pValue );
case SLH_RATIO_CHANGEHAND: // 换手率
return info.GetRatioChangeHand( pValue, info.m_datetech, AfxGetProfile().GetRatioChangeHandDays() );
case SLH_RATIO_VOLUME: // 量比
return info.GetRatioVolume( pValue, info.m_datetech, AfxGetProfile().GetRatioVolumeDays() );
case SLH_RS: // 相对强度
return info.GetRS( pValue, info.m_datetech, AfxGetProfile().GetRSDays() );
case SLH_MARKETVALUE: // 总市值
if( info.GetMarketValue( pValue ) )
{
*pValue = (*pValue) * 0.0001;
return TRUE;
}
break;
case SLH_MARKETVALUEA: // A股市值
if( info.GetMarketValueA( pValue ) )
{
*pValue = (*pValue) * 0.0001;
return TRUE;
}
break;
case SLH_MARKETVALUEB: // B股市值
if( info.GetMarketValueB( pValue ) )
{
*pValue = (*pValue) * 0.0001;
return TRUE;
}
break;
// ★偿债能力
case SLH_RATIO_LIQUIDITY: // 流动比率
*pValue = info.m_fRatio_liquidity;
return ( fabs(info.m_fRatio_liquidity) > 1e-4 );
case SLH_RATIO_QUICK: // 速动比率
*pValue = info.m_fRatio_quick;
return ( fabs(info.m_fRatio_quick) > 1e-4 );
case SLH_VELOCITY_RECEIVABLES: // 应收帐款周率
*pValue = info.m_fVelocity_receivables;
return ( fabs(info.m_fVelocity_receivables) > 1e-4 );
// ★经营能力
case SLH_VELOCITY_MERCHANDISE: // 存货周转率
*pValue = info.m_fVelocity_merchandise;
return ( fabs(info.m_fVelocity_merchandise) > 1e-4 );
case SLH_MAIN_INCOME: // 主营业务收入
*pValue = factor * info.m_fMain_income * 0.0001;
return ( fabs(info.m_fMain_income) > 1e-4 );
case SLH_CASH_PS: // 每股净现金流量
*pValue = factor * info.m_fCash_ps;
return ( fabs(info.m_fCash_ps) > 1e-4 );
// ★盈利能力
case SLH_PROFIT_MARGIN: // 主营业务利润率
*pValue = info.m_fProfit_margin;
return ( fabs(info.m_fProfit_margin) > 1e-4 );
case SLH_NETASSET_YIELD: // 净资产收益率
*pValue = factor * info.m_fNetasset_yield;
return ( fabs(info.m_fNetasset_yield) > 1e-4 );
// ★资本结构
case SLH_SHARE_COUNT_TOTAL: // 总股本
*pValue = info.m_fShare_count_total * 0.0001;
return ( info.m_fShare_count_total > 1e-4 );
case SLH_SHARE_COUNT_A: // 流通A股
*pValue = info.m_fShare_count_a * 0.0001;
return TRUE;
case SLH_SHARE_COUNT_B: // 流通B股
*pValue = info.m_fShare_count_b * 0.0001;
return TRUE;
case SLH_SHARE_COUNT_H: // 流通H股
*pValue = info.m_fShare_count_h * 0.0001;
return TRUE;
case SLH_SHARE_COUNT_NATIONAL: // 国有股
*pValue = info.m_fShare_count_national * 0.0001;
return TRUE;
case SLH_SHARE_COUNT_CORP: // 法人股
*pValue = info.m_fShare_count_corp * 0.0001;
return TRUE;
case SLH_PROFIT_PSUD: // 每股未分配利润
*pValue = info.m_fProfit_psud;
return TRUE;
case SLH_ASSET: // 总资产
*pValue = info.m_fAsset * 0.0001;
return ( fabs(info.m_fAsset) > 1e-4 );
case SLH_RATIO_HOLDERRIGHT: // 股东权益比率
*pValue = info.m_fRatio_holderright;
return ( fabs(info.m_fRatio_holderright) > 1e-4 );
case SLH_RATIO_LONGDEBT: // 长期负债率
*pValue = info.m_fRatio_longdebt;
return TRUE;
case SLH_RATIO_DEBT: // 资产负债率
*pValue = info.m_fRatio_debt;
return ( fabs(info.m_fRatio_debt) > 1e-4 );
// ★投资收益能力
case SLH_NETASSET_PS: // 每股净资产
*pValue = info.m_fNetasset_ps;
return ( fabs(info.m_fNetasset_ps) > 1e-4 );
case SLH_NETASSET_PS_REGULATE: // 调整每股净资产
*pValue = info.m_fNetasset_ps_regulate;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -