示例#1
0
/***
	自动设定交易费用
*/
void CSimuAddOpDlg::AutoSetRateCost( )
{
	UpdateData( );

	if( NULL == m_pStrategy )
		return;

	// Share
	if( !IsNumber( m_strShare, TRUE ) || !IsNumber( m_strSharePrice, TRUE ) || !IsNumber( m_strRateCost, TRUE ) )
	{
		AfxMessageBox( IDS_SIMUADDOP_NOTNUMBER, MB_OK|MB_ICONINFORMATION );
		return;
	}

	DWORD	dwShare		=	atol(m_strShare);
	double	dSharePrice	=	atol(m_strSharePrice);
	
	CString	strStockCode	=	m_comboStock.GetSelectedStockCode();
	CStockInfo	info;
	if( !AfxGetStockContainer().GetStockInfo( strStockCode, &info )
		|| !info.IsValidStock() )
		return;
	m_strRateCost.Format( "%.2f", dwShare*dSharePrice*m_pStrategy->GetRateParam().GetRate(info) );
	UpdateData( FALSE );
}
示例#2
0
// update CStockContainer by Report data
BOOL UpdateStockContainerByREPORT( CStockContainer &container, REPORT * pReport, BOOL bAddIfNotExist, REPORT * pReportLast )
{
	SP_ASSERT( pReport );
	if( NULL == pReport )
		return FALSE;

	REPORT	reportLast;
	memset( &reportLast, 0, sizeof(reportLast) );

	int	id = 0;
	if( container.GetStockInfo( pReport->m_szCode, NULL, &id ) )
	{
		container.Lock();

		CStockInfo	& info	=	container.ElementAt(id);
		reportLast	=	info.m_reportLatest;
		UpdateStockInfoByREPORT( info, pReport );

		container.UnLock();
	}
	else if( bAddIfNotExist && strlen(pReport->m_szCode)>0 )
	{
		CStockInfo	info;
		info.SetStockCode( pReport->m_dwMarket, pReport->m_szCode );
		if( UpdateStockInfoByREPORT( info, pReport ) )
		{
			container.Add( info );
		}
	}

	if( pReportLast )
		memcpy( pReportLast, &reportLast, sizeof(reportLast) );

	return TRUE;
}
示例#3
0
/***
	初始化操作记录列表的数据
*/
BOOL CReportListCtrl::LoadOpRecordList( COpRecordContainer & container )
{
	DeleteAllItems();

	for( int i=0; i<container.GetSize(); i++ )
	{
		OPRECORD & record = container.ElementAt(i);
		CString	strTime, strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
		strTime	=	CSPTime(record.time).Format( "%Y/%m/%d" );
		strOp	=	AfxGetStrategyOpTypeString( record.lOpType );
		CStockInfo	info;
		strStock	=	record.szCode;
		if( AfxGetStockContainer().GetStockInfo( record.szCode, &info ) )
			strStock	=	info.GetStockName();
		strShare.Format( "%u", record.dwShare );
		strSharePrice.Format( "%.2f", record.dSharePrice );
		strAmount.Format( "%.2f", record.dwShare*record.dSharePrice );
		strRateCost.Format( "%.2f", record.dRateCost );

		InsertItem( i, strStock );
		SetItemText( i, 0, strTime );
		SetItemText( i, 1, strOp );
		SetItemText( i, 2, strStock );
		SetItemText( i, 3, strShare );
		SetItemText( i, 4, strSharePrice );
		SetItemText( i, 5, strAmount );
		SetItemText( i, 6, strRateCost );
		SetItemData( i, i );
	}

	if( GetItemCount() > 0 )
		SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );

	return TRUE;
}
示例#4
0
BOOL CSetKDataDlg::DeleteKData( CString strStockCode )
{
	if( strStockCode.GetLength() <= 0 )
		return FALSE;

	UpdateData( );

	if( m_tmDate.GetTime() == -1 )
		return FALSE;

	CStockInfo info;
	CStock	stock;
	if( !info.SetStockCode( CStock::marketUnknown, strStockCode ) )
		return FALSE;
	stock.SetStockInfo( &info );
	
	int nKType = m_comboKType.GetSelect();
	AfxPrepareStockData( &AfxGetDB(), stock, nKType,  CKData::formatOriginal, CKData::mdtypeClose, FALSE, TRUE );
	CKData & kdata = stock.GetKData(nKType);

	CSPTime sptime = m_tmDate.GetTime();
	int nIndex = kdata.GetIndexByDate( sptime.ToStockTime(CKData::IsDayOrMin(kdata.GetKType())) );
	if( nIndex >= 0 && nIndex < kdata.GetSize() )
	{
		kdata.RemoveAt(nIndex);
		AfxGetDB().InstallKData( kdata, TRUE );
		return TRUE;
	}
	return FALSE;
}
示例#5
0
void CMultiSortView::SendRequestQuote( BOOL bForced )
{
	BOOL bInTrade = CSPTime::InTradeTime(CSPTime::GetCurrentTime().GetTime(),900);
	CView * pView = AfxGetStaticDoc()->GetActiveView();
	if( bForced || (bInTrade && pView == this) )
	{
		CStockInfo info;
		info.SetType( m_multisort.GetMultiSortClass( ) );
		AfxGetStkReceiver().RequestStockData( CStock::dataMultisort, &info, 1, 0, 0 );
	}
}
示例#6
0
void CSetKDataDlg::LoadKData( CString strStockCode )
{
	if( strStockCode.GetLength() <= 0 )
		return;

	UpdateData();

	m_strOpen.Empty();
	m_strHigh.Empty();
	m_strLow.Empty();
	m_strClose.Empty();
	m_dwVolume = 0;
	m_dwAmount = 0;

	if( m_tmDate.GetTime() == -1 )
	{
		UpdateData( FALSE );
		return;
	}

	CStockInfo info;
	CStock	stock;
	if( !info.SetStockCode( CStock::marketUnknown, strStockCode ) )
		return;
	stock.SetStockInfo( &info );
	
	int nKType = m_comboKType.GetSelect();
	AfxPrepareStockData( &AfxGetDB(), stock, nKType,  CKData::formatOriginal, CKData::mdtypeClose, FALSE, TRUE );
	CKData & kdata = stock.GetKData(nKType);

	// 价格小数位数格式串
	CString strPriceFmt;
	strPriceFmt.Format( "%%.%df", info.DigitBit() );

	CSPTime sptime = m_tmDate.GetTime();
	int nIndex = kdata.GetIndexByDate( sptime.ToStockTime(CKData::IsDayOrMin(kdata.GetKType())) );
	if( nIndex >= 0 && nIndex < kdata.GetSize() )
	{
		KDATA kd = kdata.ElementAt(nIndex);

		m_strOpen.Format( strPriceFmt, kd.m_fOpen );
		m_strHigh.Format( strPriceFmt, kd.m_fHigh );
		m_strLow.Format( strPriceFmt, kd.m_fLow );
		m_strClose.Format( strPriceFmt, kd.m_fClose );
		m_dwVolume	=	(DWORD)(kd.m_fVolume/100);
		m_dwAmount	=	(DWORD)(kd.m_fAmount/1000);
	}

	UpdateData( FALSE );
}
示例#7
0
void CMultiSort::SetMultiSortClass( LONG type )
{
	m_lMultiSortClass	=	type;
	if( modeDirect == m_nRefreshMode )
	{
		CStockInfo info;
		info.SetType( GetMultiSortClass( ) );
		AfxGetStkReceiver().RequestStockData( CStock::dataMultisort, &info, 1, 0, 0 );
	}
	else
	{
		RecalculateSortID( TRUE, TRUE );
	}
}
示例#8
0
BOOL CStockContainer::GetVariantSaveValue( double *pValue, UINT nVariantID, CStockInfo &info, BOOL *pNoValue )
{
	CSPMutex::Scoped	l(m_mutex);

	void * pArrayID	=	NULL;
	if( !m_map.Lookup( info.GetStockCode(), pArrayID ) )
		return FALSE;

	int	nIndex	=	(int)pArrayID;
	if( nIndex >= 0 && nIndex < m_aptrSaveValueArray.GetSize() )
	{
		CSPPtrArray * pArray = (CSPPtrArray *)m_aptrSaveValueArray.ElementAt( nIndex );
		if( pArray )
		{
			VARIANT_SAVEVALUE * pSave = NULL;
			for( int j=0; j<pArray->GetSize(); j++ )
			{
				pSave = (VARIANT_SAVEVALUE *) pArray->GetAt(j);
				if( pSave->nVariantID == nVariantID )
				{
					if( pValue )	*pValue		=	pSave->Value;
					if( pNoValue )	*pNoValue	=	pSave->bNoValue;
					return TRUE;
				}
			}
		}
	}
	
	return FALSE;
}
示例#9
0
/***
	根据换手率m_dChangeHand和终止日,计算起始日
*/
BOOL CCW::GetRange( int & nStart, int & nEnd, CStockInfo & info )
{
	if( !m_pKData || m_pKData->GetSize() <= 0 )
		return FALSE;
	if( nEnd < 0 || nEnd >= m_pKData->GetSize() )
		nEnd	=	m_pKData->GetSize()-1;
	
	BOOL	bIndex = FALSE;
	double	dShareCurrency = 0;
	if( !info.GetShareCurrency( &dShareCurrency ) || dShareCurrency < 1e+6 )
		bIndex	=	TRUE;

	if( bIndex )
		dShareCurrency	=	100 * m_dChangeHand;
	else
		dShareCurrency	*=	m_dChangeHand;

	double	dVol	=	0;
	for( int k=nEnd; k>=0; k-- )
	{
		if( bIndex )
			dVol	+=	1;
		else
			dVol	+=	m_pKData->ElementAt(k).m_fVolume;

		if( dVol > dShareCurrency )
			break;
	}
	nStart	=	k;
	if( nStart < 0 )
		nStart	=	0;
	return TRUE;
}
示例#10
0
int CStockContainer::Add( CStockInfo &newElement )
{
	CSPMutex::Scoped	l(m_mutex);

	int nIndex = CStockInfoArray::Add(newElement);
	m_map.SetAt( newElement.GetStockCode(), (void *)nIndex );
	return nIndex;
}
示例#11
0
/***
	初始化拥有股票列表的数据
*/
BOOL CReportListCtrl::LoadStockOwnList( CStockOwnContainer & stockown, double dCash, CSPTime tmCur, double dAsset, CTechStockContainer & techstocks )
{
	DeleteAllItems();

	int i;
	for( i=0; i<stockown.GetSize(); i++ )
	{
		STOCKOWN & own = stockown.ElementAt(i);

		CString	strStock, strShare, strBuyPrice, strNowPrice;
		CStockInfo	info;
		strStock	=	own.szCode;
		if( AfxGetStockContainer().GetStockInfo( own.szCode, &info ) )
			strStock	=	info.GetStockName();
		strShare.Format( "%u", own.dwShare );
		strBuyPrice.Format( "%.2f", own.dBuyPrice );
		double	dNowPrice = 0;
		if( techstocks.GetClosePrice( own.szCode, tmCur.GetTime(), &dNowPrice ) )
			strNowPrice.Format( "%.2f", dNowPrice );

		InsertItem( i, strStock );
		SetItemText( i, 0, strStock );
		SetItemText( i, 1, strShare );
		SetItemText( i, 2, strBuyPrice );
		SetItemText( i, 3, strNowPrice );
		SetItemData( i, i );
	}

	CString	strCash;
	strCash.LoadString( IDS_SIMUREPORT_CASH );
	InsertItem( i, strCash );
	strCash.Format( "%.2f", dCash );
	SetItemText( i, 1, strCash );
	i++;

	CString	strAsset;
	strAsset.LoadString( IDS_SIMUREPORT_ASSET );
	InsertItem( i, strAsset );
	strAsset.Format( "%.2f", dAsset );
	SetItemText( i, 1, strAsset );

	if( GetItemCount() > 0 )
		SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );

	return TRUE;
}
示例#12
0
BOOL CSetKDataDlg::StoreKData( CString strStockCode )
{
	if( strStockCode.GetLength() <= 0 )
		return FALSE;

	UpdateData( );

	if( m_tmDate.GetTime() == -1 )
		return FALSE;

	if( !IsNumber(m_strOpen,FALSE) || !IsNumber(m_strHigh,FALSE) || !IsNumber(m_strLow,FALSE)
		|| !IsNumber(m_strClose,FALSE) )
	{
		AfxMessageBox( IDS_SETKDATA_NOTNUMBER );
		return FALSE;
	}

	DWORD dwMarket = CStock::marketUnknown;
	CStockInfo info;
	if( info.SetStockCode(dwMarket, strStockCode) )
		dwMarket = info.GetMarket();
	
	int nKType = m_comboKType.GetSelect();

	CSPTime sptime = m_tmDate.GetTime();
	KDATA kd;
	memset( &kd, 0, sizeof(kd) );
	kd.m_dwMarket = dwMarket;
	strncpy( kd.m_szCode, strStockCode, min(sizeof(kd.m_szCode)-1,strStockCode.GetLength()) );
	kd.m_time = m_tmDate.GetTime();
	kd.m_date = sptime.ToStockTime(CKData::IsDayOrMin(nKType));
	kd.m_fOpen	=	(float)atof(m_strOpen);
	kd.m_fHigh	=	(float)atof(m_strHigh);
	kd.m_fLow		=	(float)atof(m_strLow);
	kd.m_fClose	=	(float)atof(m_strClose);
	kd.m_fVolume	=	(float)m_dwVolume*100;
	kd.m_fAmount	=	(float)m_dwAmount*1000;

	CKData kdata(nKType);
	kdata.Add( kd );
	AfxGetDB().InstallKData( kdata );

	return TRUE;
}
示例#13
0
void CSearchBox::SetCurrentWindowText( )
{
	if( !::IsWindow(m_hWnd) )
		return;

	if( !m_bShowOnSel )
		return;

	CStockInfo	info;
	if( AfxGetProfile().GetCurrentStock( &info ) )
	{
		if( CB_ERR == SelectString( 0, info.GetStockCode() ) )
			SetWindowText( info.GetStockCode() );
	}
	else
	{
		SetWindowText( NULL );
	}
}
示例#14
0
void CBaseView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	if( UPDATE_HINT_BASEVIEW != lHint )
		return;
	if( IsWindowVisible() )
		SetFocus( );

	CStockInfo	info;
	if( !AfxGetProfile().GetCurrentStock( &info ) )
		return;
	
	CString	strHeader	=	info.GetStockCode();
	strHeader	+=	"  ";
	strHeader	+=	info.GetStockName();
	strHeader	+=	"\r\n\r\n ";
	GetEditCtrl().SetWindowText( strHeader );
	GetEditCtrl().SetSel( strHeader.GetLength()-1, strHeader.GetLength()-1 );

	m_stock.Clear( );
	m_stock.SetStockInfo( &info );
	m_stock.SetDatabase( &AfxGetDB() );

	m_stock.PrepareBaseInfo( TRUE );

	char	* pText	=	m_stock.GetBaseTextPtr();
	int		nLength	=	m_stock.GetBaseTextLength();
	if( pText && nLength > 0 )
	{
		GetEditCtrl().ReplaceSel( pText );
	}
	else
	{
		CString	strNoBaseData;
		strNoBaseData.LoadString( IDS_BASEVIEW_NOBASEDATA );
		GetEditCtrl().ReplaceSel( strNoBaseData );
	}

	GetEditCtrl().SetSel( 0, 0 );

	AfxGetStkReceiver().RequestStockData( CStock::dataBasetext, &info, 1, 0, 0 );
}
示例#15
0
/***
	筹码分布图计算,计算筹码分布
*/
BOOL CCW::CalculateCW(	int nStart, int nEnd, CStockInfo & info, double dStep,
						CSPDWordArray & adwPrice, CSPDWordArray & adwVolume,
						double * pdMinVolume, double * pdMaxVolume, double * pdTotalVolume, double * pdVolPercent )
{
	STT_ASSERT_GETMINMAXINFO( m_pKData, nStart, nEnd );
	if( dStep < 1e-4 )
		return FALSE;

	float dMinPrice = 0, dMaxPrice = 0;
	if( !m_pKData->GetMinMaxInfo( nStart, nEnd, &dMinPrice, &dMaxPrice ) )
		return FALSE;

	// Calculate
	int nMaxCount = (int)((dMaxPrice-dMinPrice)/dStep) + 10;
	adwPrice.SetSize( 0, nMaxCount );
	adwVolume.SetSize( 0, nMaxCount );
	double	dMinVolume = 0, dMaxVolume = 0, dTotalVolume = 0, dVolume = 0;
	BOOL	bFirst	=	TRUE;
	for( double dPrice = dMinPrice; dPrice < dMaxPrice; dPrice += dStep )
	{
		if( CalculateCW( &dVolume, nStart, nEnd, dPrice, dStep ) )
		{
			if( bFirst || dVolume < dMinVolume )	dMinVolume	=	dVolume;
			if( bFirst || dVolume > dMaxVolume )	dMaxVolume	=	dVolume;
			adwPrice.Add( DWORD(dPrice * 1000) );
			adwVolume.Add( DWORD(dVolume) );
			dTotalVolume	+=	dVolume;
			bFirst	=	FALSE;
		}
	}

	// Return
	// Min Max
	dMinVolume	-=	fabs(dMinVolume)*0.01;
	dMaxVolume	+=	fabs(dMaxVolume)*0.01;
	if( dMaxVolume - dMinVolume < 3 )
		dMaxVolume	=	dMinVolume + 3;
	if( pdMinVolume )	*pdMinVolume	=	dMinVolume;
	if( pdMaxVolume )	*pdMaxVolume	=	dMaxVolume;
	if( pdTotalVolume )	*pdTotalVolume	=	dTotalVolume;

	// VolPercent
	double dVolPercent = 1.0;
	double	dShareCurrency = 0;
	if( (!info.GetShareCurrency( &dShareCurrency ) || dShareCurrency < 1e+6) && nEnd-nStart+1 > 0 )
		dShareCurrency	=	dTotalVolume * 100 / (nEnd-nStart+1);
	if( dShareCurrency > 1e-4 )
		dVolPercent	=	dTotalVolume / (dShareCurrency*m_dChangeHand);
	if( dVolPercent > 1.0 )		dVolPercent	=	1.0;
	if( dVolPercent < 0.0 )		dVolPercent	=	0.0;
	if( pdVolPercent )	*pdVolPercent	=	dVolPercent;

	return adwPrice.GetSize() > 0;
}
示例#16
0
BOOL CStockContainer::GetCurrentStock( CStockInfo * pInfo )
{
	CSPMutex::Scoped	l(m_mutex);

	SP_ASSERT( pInfo );
	if( m_nCurrentStock >= 0 && m_nCurrentStock < GetSize() )
	{
		CStockInfo	& info	=	ElementAt(m_nCurrentStock);
		if( pInfo )
			* pInfo	=	info;
		return TRUE;
	}
	else if( m_strCurrentStockCode.GetLength() > 0 )
	{
		CStockInfo	info;
		info.SetStockCode( CStock::marketUnknown, m_strCurrentStockCode );
		if( pInfo )
			*pInfo	=	info;
		return TRUE;
	}
	return FALSE;
}
示例#17
0
BOOL AfxReloadStock( CStock & stock )
{
	CStockInfo info = stock.GetStockInfo();

	// Reload AfxGetStockMain()
	AfxGetStockContainer().GetStockInfo( info.GetStockCode(), &info );

	stock.Clear( );
	stock.SetStockInfo( &info );
	stock.SetDatabase( &AfxGetDB() );
	stock.PrepareData( CStock::dataK, CKData::ktypeDay );
	
	// Merge New
	stock.GetKDataDay().MergeKData( &(info.m_kdata) );
	
	stock.PrepareData( CStock::dataK, CKData::ktypeWeek );
	stock.PrepareData( CStock::dataK, CKData::ktypeMonth );
	stock.PrepareData( CStock::dataK, CKData::ktypeMin5 );
	stock.PrepareData( CStock::dataK, CKData::ktypeMin15 );
	stock.PrepareData( CStock::dataK, CKData::ktypeMin30 );
	stock.PrepareData( CStock::dataK, CKData::ktypeMin60 );
	return TRUE;
}
示例#18
0
BOOL CDomainContainer::GetAllDomainInfo( CStockContainer * pContainer, DWORD dwDate )
{
	SP_ASSERT( pContainer );
	if( NULL == pContainer )
		return FALSE;

	DWORD	dwDateLatest = -1;
	AfxGetStockContainer().GetLatestTechDate( &dwDateLatest );

	for( int nDomain=0; nDomain<GetSize(); nDomain++ )
	{
		CDomain	&	domain	=	ElementAt(nDomain);
		CStockContainer	cntn;
		if( cntn.RetrieveSpecify( domain ) )
		{
			if( -1 != dwDate && dwDateLatest != dwDate )
			{
				for( int i=0; i<cntn.GetSize(); i++ )
				{
					CStockInfo	& info	=	cntn.ElementAt(i);
					info.StatBaseIndex( dwDate );
					info.StatTechIndex( dwDate );
				}
			}
			// cntn.SetMap( );
			cntn.SetAverage( );

			CStockInfo	info	=	cntn.GetAverage( );
			info.SetStockName( domain.m_strName );
			info.SetStockShortName( domain.m_strName );
			pContainer->Add( info );
		}
	}
	pContainer->SetMap();
	pContainer->SetAverage();
	return TRUE;
}
示例#19
0
void CStockContainer::SetVariantSaveValue( double Value, UINT nVariantID, CStockInfo &info, BOOL bNoValue )
{
	CSPMutex::Scoped	l(m_mutex);

	void * pArrayID	=	NULL;
	if( !m_map.Lookup( info.GetStockCode(), pArrayID ) )
		return;

	// alloc for m_aptrSaveValueArray
	if( m_aptrSaveValueArray.GetSize() == 0 )
	{
		m_aptrSaveValueArray.SetSize( GetSize() );
		for( int i=0; i<m_aptrSaveValueArray.GetSize(); i++ )
			m_aptrSaveValueArray.SetAt( i, NULL );
	}

	int	nIndex	=	(int)pArrayID;
	if( nIndex >= 0 && nIndex < m_aptrSaveValueArray.GetSize() )
	{
		CSPPtrArray * pArray = (CSPPtrArray *)m_aptrSaveValueArray.ElementAt( nIndex );
		if( NULL == pArray )
		{
			pArray	=	new	CSPPtrArray;
			m_aptrSaveValueArray.SetAt( nIndex, pArray );
		}
		
		// 如果已经存在,覆盖之
		for( int j=0; j<pArray->GetSize(); j++ )
		{
			VARIANT_SAVEVALUE * pSave = (VARIANT_SAVEVALUE *) pArray->GetAt(j);
			if( pSave->nVariantID == nVariantID )
			{
				pSave->Value	=	Value;
				pSave->bNoValue	=	bNoValue;
				return;
			}
		}
		
		// 加入新的
		VARIANT_SAVEVALUE * pSaveValue = new VARIANT_SAVEVALUE;
		pSaveValue->nVariantID	=	nVariantID;
		pSaveValue->Value		=	Value;
		pSaveValue->bNoValue	=	bNoValue;
		pArray->Add( pSaveValue );
	}
}
示例#20
0
/***
	筹码分布图计算,计算nDays天前内的筹码分布
*/
BOOL CCW::CalculatePastCW(int nEnd, int nDays, CStockInfo & info, double dStep,
						CSPDWordArray & adwPrice, CSPDWordArray & adwVolume,
						double * pdMinVolume, double * pdMaxVolume, double * pdTotalVolume, double * pdVolPercent )
{
	// Prepare
	if( !m_pKData || m_pKData->GetSize() <= 0 )
		return FALSE;
	if( nEnd < 0 || nEnd >= m_pKData->GetSize() )
		nEnd	=	m_pKData->GetSize()-1;
	int	nStart = nEnd - nDays;
	if( nStart < 0 || nStart >= m_pKData->GetSize() )
		return FALSE;

	nEnd = nStart;
	if( !GetRange( nStart, nEnd, info ) )
		return FALSE;

	BOOL bOK = CalculateCW( nStart, nEnd, info, dStep, adwPrice, adwVolume, pdMinVolume, pdMaxVolume, pdTotalVolume, pdVolPercent );

	// TotalVolumeRecent
	double dTotalVolumeRecent = 0;
	for( int k=nEnd+1; k<=nEnd+nDays && k<m_pKData->GetSize(); k ++ )
		dTotalVolumeRecent	+=	m_pKData->ElementAt(k).m_fVolume;

	// VolPercent
	double dVolPercent = 1.0;
	double	dShareCurrency = 0;
	if( (!info.GetShareCurrency( &dShareCurrency ) || dShareCurrency < 1e+6) && nDays > 0 )
		dShareCurrency	=	dTotalVolumeRecent * 100 / nDays;
	if( dShareCurrency > 1e-4 )
		dVolPercent	=	dTotalVolumeRecent / (dShareCurrency*m_dChangeHand);
	dVolPercent	=	1.0 - dVolPercent;
	if( dVolPercent > 1.0 )		dVolPercent	=	1.0;
	if( dVolPercent < 0.0 )		dVolPercent	=	0.0;
	if( pdVolPercent )	*pdVolPercent	=	dVolPercent;

	return bOK;
}
示例#21
0
void CTyDataDlg::OnStart() 
{
	UpdateData( );
	StoreProfile();

	if( m_tmBegin > m_tmEnd )
	{
		AfxMessageBox( IDS_TYDATADLG_ERRORTIME, MB_OK|MB_ICONINFORMATION );
		return;
	}

	if( 0 == access(m_strFileDest,0)
		&& IDNO == AfxMessageBox(IDS_TYDATADLG_OVERWRITE,MB_YESNO) )
		return;

	CFile	file;
	if( !file.Open( m_strFileDest, CFile::modeCreate | CFile::modeWrite ) )
	{
		AfxMessageBox( IDS_TYDATADLG_ERRORCREATEFILE, MB_OK|MB_ICONINFORMATION );
		return;
	}
	file.Close();

	m_btnStart.EnableWindow( FALSE );

	int	nFileCountTotal	=	CNetDatabase::GetFileCount( m_strPathSrcSH, FALSE )
							+ CNetDatabase::GetFileCount( m_strPathSrcSZ, FALSE );
	int	nFileCount = 0, nCount = 0, nProgress = 0;
	
	m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
	m_ctrlProgress.SetRange( 0, nFileCountTotal );
	m_ctrlProgress.SetPos( 0 );

	CFileFind finder;
	// ÉϺ£
	BOOL	bWorking	=	finder.FindFile( AfxGetFilePath( (LPCTSTR)m_strPathSrcSH, LPCTSTR("*.day") ) );
	while( bWorking )
	{
		bWorking	=	finder.FindNextFile();
		CString	sKFile	=	finder.GetFilePath();
		CString	sCode	=	AfxGetFileTitleNoExt(sKFile);
		CString	sName;
		CStockInfo	info;
		if( AfxGetStockContainer().GetStockInfo( sCode, &info ) )
			sName	=	info.GetStockName();
		
		int	nRet = CStDatabase::AppendToTyData( sCode, sName, CKData::ktypeDay, sKFile,
					m_strFileDest, m_tmBegin.GetTime(), m_tmEnd.GetTime() );
		
		nCount	+=	nRet;
		if( nRet > 0 )	nFileCount	++;

		// Progress
		m_ctrlProgress.SetPos(++nProgress);
		CString	strProgressNew;
		if( nFileCountTotal > 0 )
			strProgressNew.Format( "%d%%", 100*nProgress/nFileCountTotal );
		CString	strProgressOld;
		m_staticProgress.GetWindowText( strProgressOld );
		if( 0 != strProgressNew.Compare( strProgressOld ) )
			m_staticProgress.SetWindowText( strProgressNew );
	}
	finder.Close();

	// ÉîÛÚ
	bWorking	=	finder.FindFile( AfxGetFilePath( (LPCTSTR)m_strPathSrcSZ, LPCTSTR("*.day") ) );
	while( bWorking )
	{
		bWorking	=	finder.FindNextFile();
		CString	sKFile	=	finder.GetFilePath();
		CString	sCode	=	AfxGetFileTitleNoExt(sKFile);
		CString	sName;
		CStockInfo	info;
		if( AfxGetStockContainer().GetStockInfo( sCode, &info ) )
			sName	=	info.GetStockName();
		
		int nRet = CStDatabase::AppendToTyData( sCode, sName, CKData::ktypeDay, sKFile,
					m_strFileDest, m_tmBegin.GetTime(), m_tmEnd.GetTime() );
		
		nCount	+=	nRet;
		if( nRet > 0 )	nFileCount	++;

		// Progress
		m_ctrlProgress.SetPos(++nProgress);
		CString	strProgressNew;
		if( nFileCountTotal > 0 )
			strProgressNew.Format( "%.2f%%", 100.*nProgress/nFileCountTotal );
		CString	strProgressOld;
		m_staticProgress.GetWindowText( strProgressOld );
		if( 0 != strProgressNew.Compare( strProgressOld ) )
			m_staticProgress.SetWindowText( strProgressNew );
	}
	finder.Close();

	CString	strReportFmt, strReport;
	strReportFmt.LoadString( IDS_TYDATADLG_REPORTFMT );
	strReport.Format( strReportFmt, nFileCount, nCount );
	AfxMessageBox( strReport, MB_OK|MB_ICONINFORMATION );

	m_btnStart.EnableWindow( TRUE );
}
示例#22
0
// update CStockInfo by Report data
BOOL UpdateStockInfoByREPORT( CStockInfo & info, REPORT * pReport )
{
	SP_ASSERT( pReport );
	if( !pReport )
		return FALSE;

	// 股票市场
	if( strlen(pReport->m_szCode) > 0 )
		info.SetStockCode( pReport->m_dwMarket, pReport->m_szCode );
	if( strlen(pReport->m_szName) > 0  )
		info.SetStockName( pReport->m_szName );

	if( info.GetType() == 0 )
	{
		if( CStock::marketSHSE == pReport->m_dwMarket )
			info.SetType( CStock::typeshA );
		else if( CStock::marketSZSE == pReport->m_dwMarket )
			info.SetType( CStock::typeszA );
		else
			info.SetType( CStock::typeshA );
	}

	// 成交买卖价量信息
	if( pReport->m_fLast > 1e-4 )	info.m_fLast		=	pReport->m_fLast;
	info.m_fOpen		=	pReport->m_fOpen;
	info.m_fHigh		=	pReport->m_fHigh;
	info.m_fLow			=	pReport->m_fLow;
	info.m_fClose		=	pReport->m_fNew;
	info.m_fVolume		=	pReport->m_fVolume;
	info.m_fAmount		=	pReport->m_fAmount;

	info.m_fBuyPrice[0]		=	pReport->m_fBuyPrice[0];
	info.m_fBuyPrice[1]		=	pReport->m_fBuyPrice[1];
	info.m_fBuyPrice[2]		=	pReport->m_fBuyPrice[2];
	info.m_fBuyPrice[3]		=	pReport->m_fBuyPrice[3];
	info.m_fBuyPrice[4]		=	pReport->m_fBuyPrice[4];
	info.m_fBuyVolume[0]	=	pReport->m_fBuyVolume[0];
	info.m_fBuyVolume[1]	=	pReport->m_fBuyVolume[1];
	info.m_fBuyVolume[2]	=	pReport->m_fBuyVolume[2];
	info.m_fBuyVolume[3]	=	pReport->m_fBuyVolume[3];
	info.m_fBuyVolume[4]	=	pReport->m_fBuyVolume[4];
	info.m_fSellPrice[0]	=	pReport->m_fSellPrice[0];
	info.m_fSellPrice[1]	=	pReport->m_fSellPrice[1];
	info.m_fSellPrice[2]	=	pReport->m_fSellPrice[2];
	info.m_fSellPrice[3]	=	pReport->m_fSellPrice[3];
	info.m_fSellPrice[4]	=	pReport->m_fSellPrice[4];
	info.m_fSellVolume[0]	=	pReport->m_fSellVolume[0];
	info.m_fSellVolume[1]	=	pReport->m_fSellVolume[1];
	info.m_fSellVolume[2]	=	pReport->m_fSellVolume[2];
	info.m_fSellVolume[3]	=	pReport->m_fSellVolume[3];
	info.m_fSellVolume[4]	=	pReport->m_fSellVolume[4];

	// K线数据、日期
	KDATA	kd;
	UpdateKDATAByREPORT( kd, pReport );

	int nLen = info.m_kdata.GetSize();
	if( nLen > 0 && info.m_kdata.ElementAt(nLen-1).m_date == kd.m_date )
		info.m_kdata.SetAt( nLen-1, kd );
	else
		info.m_kdata.Add( kd );
	info.m_datetech	=	kd.m_date;

	// 保存
	memcpy( &(info.m_reportLatest), pReport, sizeof(info.m_reportLatest) );
	return TRUE;
}
示例#23
0
BOOL CSearchBox::InitStocks( CSPStringArray & astocks, BOOL bHasSTTTech, BOOL bShowOnSel, BOOL bDuplicate )
{
	ResetContent( );

	m_bShowOnSel	=	bShowOnSel;

	CStockContainer & container	=	AfxGetStockContainer();
	InitStorage( bDuplicate ? astocks.GetSize()*2 : astocks.GetSize(), 32 );
	for( int i=0; i<astocks.GetSize(); i++ )
	{
		if( astocks.ElementAt(i).GetLength() <= 0 )
			continue;

		CStockInfo	info;
		int	nAID	=	-1;
		if( !container.GetStockInfo( astocks.ElementAt(i), &info, &nAID ) )
			continue;

		CString	strTemp	=	info.GetStockCode();
		while( strTemp.GetLength() < 8 )
			strTemp	+=	' ';
		strTemp	+=	info.GetStockName();
		int	nItem	=	AddString( strTemp );
		SetItemData( nItem, nAID );

		if( bDuplicate )
		{
			strTemp	=	info.GetStockShortName();
			while( strTemp.GetLength() < 8 )
				strTemp	+=	' ';
			strTemp	+=	info.GetStockName();
			if( CB_ERR == SelectString( 0, strTemp ) )
			{
				nItem = AddString( strTemp );
				SetItemData( nItem, nAID );
			}
		}
	}
	if( bHasSTTTech )
	{
		// 技术指标项
		UINT nTechUserCount = CTechUser::GetTechUserCount();
		for( UINT i=STT_MIN; i <= STT_MAX+nTechUserCount; i ++ )
		{
			UINT	nTech	=	i;
			if( nTech > STT_MAX )
				nTech	=	i-STT_MAX-1+STT_USER_MIN;

			CString	strTemp	=	AfxGetSTTShortName( nTech );
			while( strTemp.GetLength() < 8 )
				strTemp	+=	' ';
			strTemp	+=	AfxGetSTTName( nTech );
			int	nItem	=	AddString( strTemp );
			SetItemData( nItem, nTech | SEARCHBOX_SIGNBIT_STT );
		}
		// 快捷键项
		for( UINT i = ACCE_MIN; i <= ACCE_MAX; i++ )
		{
			CString	strTemp	=	AfxGetAccelerator( i, 8 );
			SetItemData( AddString(strTemp), i | SEARCHBOX_SIGNBIT_ACCE );
		}
	}
	return TRUE;
}
示例#24
0
void CMultiSort::DrawMultiSort( CDC * pDC, MULTISORT &ms, CRect rect, UINT nSLH, int nSelectPos )
{
	DECLARE_COLOR_DEFINATION

	int	x	=	rect.left+8;
	int	x2	=	(int)( rect.left+0.56*rect.Width() );
	int	x3	=	rect.right-8;
	int	y	=	rect.top+20;
	int	yStep	=	(rect.Height()-23) / 6 ;
	if( yStep <= 0 )
		return;
	
	CFont	* pOldFont	=	AfxSelectDCFont( pDC, 14 );
	pDC->SetBkColor( clrBK );

	int size = sizeof(m_msRise.m_stocks)/sizeof(m_msRise.m_stocks[0]);
	for( int i=0; i<size; i++ )
	{
		CStockInfo	info;
		char	buf_code[sizeof(ms.m_stocks[i].m_code)+1];
		memset( buf_code, 0, sizeof(buf_code) );
		memcpy( buf_code, ms.m_stocks[i].m_code, sizeof(ms.m_stocks[i].m_code) );
		if( !AfxGetStockContainer().GetStockInfo(buf_code, &info) )
			continue;
		info.m_fClose	=	float(0.001*ms.m_stocks[i].m_data1);

		pDC->SetTextColor( clrText );
//#ifdef	CLKLAN_ENGLISH_US
//		pDC->TextOut( x, y, info.GetStockCode() );
//#else
		pDC->TextOut( x, y, info.GetStockName() );
//#endif

		UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
		pDC->SetTextColor( AfxGetVariantColor(SLH_CLOSE,info) );
		pDC->TextOut( x2, y, (LPCTSTR)AfxGetVariantDispString(SLH_CLOSE,info,NULL) );

		CString strTemp;
		if( CStock::classVolRatio == ms.m_class )
			strTemp.Format( "%.2f", 0.01*ms.m_stocks[i].m_data2 );
		else if( CStock::classAmount == ms.m_class )
			strTemp.Format( "%.0f", 0.001*ms.m_stocks[i].m_data2 );
		else
			strTemp.Format( "%.2f%%", 0.01*ms.m_stocks[i].m_data2 );
		pDC->TextOut( x3, y, strTemp );

		y	+=	yStep;
		pDC->SetTextAlign( nOldAlign );

		// 选中股票
		if( nSelectPos == i )
		{
			int	ySel = y-yStep+16;
			if( ySel > rect.top && ySel < rect.bottom )
				DrawLine( pDC, 2, clrBorder, rect.left+5, ySel, rect.right-5, ySel );
		}
	}

	// 补足股票排名
	for( i=size; i<6; i++ )
	{
		pDC->SetTextColor( clrText );
		pDC->TextOut( x, y, "-" );

		UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
		pDC->TextOut( x2, y, "-" );

		pDC->TextOut( x3, y, "-" );

		y	+=	yStep;
		pDC->SetTextAlign( nOldAlign );
	}

	pDC->SelectObject( pOldFont );
}
示例#25
0
void CStockInfo::ResolveTypeAndMarket( )
{
	CStockInfo	info;
	if( AfxGetStockContainer().GetStockInfo( m_szCode, &info )
		&& CStock::typeNone != info.GetType()
		&& CStock::marketUnknown != info.GetMarket() )
	{
		if( CStock::typeNone == m_type )
			m_type = info.GetType();
		if( CStock::marketUnknown == m_dwMarket )
			m_dwMarket = info.GetMarket();
		return;
	}

	long	type = CStock::typeNone;
	DWORD	dwMarket = CStock::marketUnknown;
	if( strlen(m_szCode) > 0 )
	{
		if( strcmp(m_szCode,"000001") >= 0 && strcmp(m_szCode,"000999") <= 0 )		// 深圳A股
		{	type = CStock::typeszA;			dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"002001") >= 0 && strcmp(m_szCode,"002999") <= 0 )	// 深圳A股(中小企业)
		{	type = CStock::typeszA;			dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"200001") >= 0 && strcmp(m_szCode,"200999") <= 0 )	// 深圳B股
		{	type = CStock::typeszB;			dwMarket = CStock::marketSZSE;	}
		else if( strncmp(m_szCode,"600",3) == 0 )	// 上海A股
		{	type = CStock::typeshA;			dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"500",3) == 0 )	// 上海基金
		{	type = CStock::typeshA;			dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"900",3) == 0 )	// 上海B股
		{	type = CStock::typeshB;			dwMarket = CStock::marketSHSE;	}

		else if( strcmp(m_szCode,"001001") >= 0 && strcmp(m_szCode,"001199") <= 0 )	// 深圳企业债券
		{	type = CStock::typeszBond;		dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"001200") >= 0 && strcmp(m_szCode,"001899") <= 0 )	// 深圳国债回购
		{	type = CStock::typeszBond;		dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"001900") >= 0 && strcmp(m_szCode,"001999") <= 0 )	// 深圳国债现货
		{	type = CStock::typeszBond;		dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"002600") >= 0 && strcmp(m_szCode,"002999") <= 0 )	// 深圳B股权证
		{	type = CStock::typeszRight;		dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"003001") >= 0 && strcmp(m_szCode,"003999") <= 0 )	// 深圳转配认购
		{	type = CStock::typeszAdmeasure;	dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"009001") >= 0 && strcmp(m_szCode,"009999") <= 0 )	// 深圳新股配售
		{	type = CStock::typeszAdmeasure;	dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"005001") >= 0 && strcmp(m_szCode,"005999") <= 0 )	// 深圳可转换债券
		{	type = CStock::typeszBond;		dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"006001") >= 0 && strcmp(m_szCode,"006999") <= 0 )	// 深圳国债期货
		{	type = CStock::typeszBond;		dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"004601") >= 0 && strcmp(m_szCode,"004699") <= 0 )	// 深圳证券投资基金
		{	type = CStock::typeszA;			dwMarket = CStock::marketSZSE;	}
		else if( strcmp(m_szCode,"008001") >= 0 && strcmp(m_szCode,"008999") <= 0 )	// 深圳配股认购
		{	type = CStock::typeszAdmeasure;	dwMarket = CStock::marketSZSE;	}


		else if( strncmp(m_szCode,"001",3) == 0 )	// 上海国债现货
		{	type = CStock::typeshBond;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"110",3) == 0 || strncmp(m_szCode,"120",3) == 0 )	// 上海企业债券
		{	type = CStock::typeshBond;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"310",3) == 0 )	// 上海国债期货
		{	type = CStock::typeshBond;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"580",3) == 0 || strncmp(m_szCode,"582",3) == 0 )	// 上海权证
		{	type = CStock::typeshRight;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"710",3) == 0 )	// 上海转配股
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"711",3) == 0 )	// 上海转配股再转配股
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"730",3) == 0 )	// 上海新股申购
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"737",3) == 0 )	// 上海新股配售
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"201",3) == 0 )	// 上海国债回购	
		{	type = CStock::typeshBond;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"129",3) == 0 || strncmp(m_szCode,"100",3) == 0 )	// 上海可转换债券
		{	type = CStock::typeshBond;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"700",3) == 0 )	// 上海配股
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"701",3) == 0 )	// 上海转配股再配股
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"720",3) == 0 )	// 上海红利
		{	type = CStock::typeshBonus;		dwMarket = CStock::marketSHSE;	}
		else if( strncmp(m_szCode,"735",3) == 0 )	// 上海新基金申购
		{	type = CStock::typeshAdmeasure;	dwMarket = CStock::marketSHSE;	}
	}

	if( CStock::typeNone == m_type )
		m_type		= type;
	if( CStock::marketUnknown == m_dwMarket )
		m_dwMarket	= dwMarket;
}