⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commfuns.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
字号:
// strings.cpp : implementation file
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1997 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include	"StdAfx.h"
#include	"CommFuns.h"
#include	"math.h"

BOOL CalculateYieldYear( CKData & kday, double * paverage, double * pstddev, long ldays, int nDayCurrent )
{
	if( -1 != nDayCurrent && nDayCurrent >= kday.GetSize() )
		return FALSE;

	int	nDayCount		=	0;
	double	yieldSum = 0., yieldSquareSum = 0.;
	if( -1 == nDayCurrent )
		nDayCurrent	=	kday.GetSize()-1;
	int	nDayEnd = ( -1 == ldays ? 0 : nDayCurrent-ldays );
	if( nDayEnd - STKLIB_DAYS_INONEYEAR < 0 )
		return FALSE;
	for( int nDay = nDayCurrent; nDay >= nDayEnd; nDay -- )
	{
		int	nDayLast	=	nDay - STKLIB_DAYS_INONEYEAR;
		if( nDayLast < 0 )
			break;

		if( kday.MaindataAt(nDayLast) > 1e-4 )
		{
			nDayCount	++;
			double	yieldNow	=	(double( kday.MaindataAt(nDay) - kday.MaindataAt(nDayLast) )) / kday.MaindataAt(nDayLast);
			yieldSum	+=	yieldNow;
			yieldSquareSum	+=	yieldNow*yieldNow;
		}
	}
	if( nDayCount > 0 &&
		nDayCount >= (-1 == ldays ? STKLIB_DAYS_INONEYEAR : ldays-STKLIB_DAYS_INONEYEAR) )
	{
		double	average	=	yieldSum / nDayCount;
		if( kday.MaindataAt(nDayEnd) > 1e-4 )	// HERE!!!, reset average directly!!!
		{
			average	= (double)kday.MaindataAt(nDayCurrent) / kday.MaindataAt(nDayEnd);
			double dYearCount = ((double)nDayCount) / STKLIB_DAYS_INONEYEAR;
			average = pow( (double)10, (double)log10(fabs(average))/dYearCount ) - 1;
		}

		if( paverage )
			*paverage	=	average;
		if( pstddev )
		{
			*pstddev		=	yieldSquareSum / nDayCount - ((yieldSum / nDayCount)*(yieldSum / nDayCount));
			if( *pstddev > 0 )
				*pstddev	=	sqrt( *pstddev );
		}
		return TRUE;
	}

	return FALSE;
}

BOOL CalculateYieldDay( CKData & kday, double * paverage, double * pstddev, long ldays, int nDayCurrent )
{
	if( -1 != nDayCurrent && nDayCurrent >= kday.GetSize() )
		return FALSE;

	int	nDayCount		=	0;
	double	yieldSum = 0., yieldSquareSum = 0.;
	if( -1 == nDayCurrent )
		nDayCurrent	=	kday.GetSize()-1;
	int	nDayEnd = ( -1 == ldays ? 0 : nDayCurrent-ldays );
	if( nDayEnd - 1 < 0 )
		return FALSE;
	for( int nDay = nDayCurrent; nDay >= nDayEnd; nDay -- )
	{
		int	nDayLast	=	nDay - 1;
		if( nDayLast < 0 )
			break;

		if( kday.MaindataAt(nDayLast) > 1e-4 )
		{
			nDayCount	++;
			double	yieldNow	=	(double( kday.MaindataAt(nDay) - kday.MaindataAt(nDayLast) )) / kday.MaindataAt(nDayLast);
			yieldSum	+=	yieldNow;
			yieldSquareSum	+=	yieldNow*yieldNow;
		}
	}
	if( nDayCount > 0 &&
		nDayCount >= (-1 == ldays ? STKLIB_DAYS_INONEYEAR : ldays) )
	{
		double	average	=	yieldSum / nDayCount;
		if( kday.MaindataAt(nDayEnd) > 1e-4 )	// HERE!!!, reset average directly!!!
		{
			average	= (double)kday.MaindataAt(nDayCurrent) / kday.MaindataAt(nDayEnd);
			average = pow( (double)10, (double)log10(fabs(average))/nDayCount ) - 1;
		}

		if( paverage )
			*paverage	=	average;
		if( pstddev )
		{
			*pstddev		=	yieldSquareSum / nDayCount - ((yieldSum / nDayCount)*(yieldSum / nDayCount));
			if( *pstddev > 0 )
				*pstddev	=	sqrt( *pstddev );
		}
		return TRUE;
	}

	return FALSE;
}

BOOL CalculateBeiteYear( CKData & kday, CKData &kdayMain,
					double market_yield_average, double market_yield_d,
					double	* pbeite, long ldays, int nDayCurrent )
{
	if( -1 != nDayCurrent && nDayCurrent >= kday.GetSize() )
		return FALSE;
	if( kday.GetSize() == 0 || kdayMain.GetSize() == 0 )
		return FALSE;

	double	yield_average = 0., yield_d = 0.;
	if( !CalculateYieldYear( kday, &yield_average, &yield_d, ldays, nDayCurrent ) )
		return FALSE;

	int	nDayCount		=	0;
	double	sum	=	0.;

	// kday Index
	if( -1 == nDayCurrent )
		nDayCurrent	=	kday.GetSize()-1;
	int	nDayEnd = ( -1 == ldays ? 0 : nDayCurrent-ldays );
	if( nDayEnd - STKLIB_DAYS_INONEYEAR < 0 )
		return FALSE;

	// kdayMain Index
	int	nDayCurrentMain	=	kdayMain.GetSize()-(kday.GetSize()-nDayCurrent);
	if( nDayCurrentMain < 0 || nDayCurrentMain >= kdayMain.GetSize() )
		return FALSE;
	if( kday.ElementAt(nDayCurrent).m_date != kdayMain.ElementAt(nDayCurrentMain).m_date )
	{
		int k;
		for( k=kdayMain.GetSize()-1; k>=0 ; k-- )
		{
			if( kday.ElementAt(nDayCurrent).m_date == kdayMain.ElementAt(k).m_date )
			{
				nDayCurrentMain	=	k;
				break;
			}
		}
		if( k < 0 )
			return FALSE;
	}
	int	nDayEndMain = ( -1 == ldays ? 0 : nDayCurrentMain-ldays );
	if( nDayEndMain < 0 )
		return FALSE;

	// Begin Calculate
	int	nCountAdjust	=	0;
	for( int nDay = nDayCurrent; nDay >= nDayEnd ; nDay -- )
	{
		int	nDayLast	=	nDay - STKLIB_DAYS_INONEYEAR;
		int	nDayMain	=	nDayCurrentMain-(nDayCurrent-nDay);
		int nDayMainLast	= nDayMain - STKLIB_DAYS_INONEYEAR;
		if( nDayMainLast < 0 || nDayMain >= kdayMain.GetSize() || nDayLast < 0 || nDay >= kday.GetSize() )
			break;

		// SP_ASSERT( kday.ElementAt(nDay).m_date == kdayMain.ElementAt(nDayMain).m_date );
		if( kday.ElementAt(nDay).m_date < kdayMain.ElementAt(nDayMain).m_date )
		{
			nCountAdjust	++;
			if( nCountAdjust >= 5 )
				break;
			nDayCurrentMain --;
			continue;
		}
		if( kday.ElementAt(nDay).m_date > kdayMain.ElementAt(nDayMain).m_date )
		{
			nCountAdjust	++;
			if( nCountAdjust >= 5 )
				break;
			nDayCurrentMain ++;
			continue;
		}

		if( kday.MaindataAt(nDayLast) > 1e-4 && kdayMain.MaindataAt(nDayMainLast) > 1e-4 )
		{
			nDayCount	++;
			double	yieldNow	=	(double( kday.MaindataAt(nDay) - kday.MaindataAt(nDayLast) )) / kday.MaindataAt(nDayLast);
			double	yieldNowMain=	(double( kdayMain.MaindataAt(nDayMain) - kdayMain.MaindataAt(nDayMainLast) )) / kdayMain.MaindataAt(nDayMainLast);
			sum	+=	(yieldNow-yield_average) * (yieldNowMain-market_yield_average);
		}
	}
	if( nDayCount > 0 &&
		nDayCount+nCountAdjust >= (-1 == ldays ? STKLIB_DAYS_INONEYEAR : ldays-STKLIB_DAYS_INONEYEAR) )
	{
		if( pbeite )
			*pbeite	=	( sum / nDayCount) / (market_yield_d*market_yield_d);
		return TRUE;
	}

	return	FALSE;
}

BOOL CalculateBeiteDay( CKData & kday, CKData &kdayMain,
					double market_yield_average, double market_yield_d,
					double	* pbeite, long ldays, int nDayCurrent )
{
	if( -1 != nDayCurrent && nDayCurrent >= kday.GetSize() )
		return FALSE;
	if( kday.GetSize() == 0 || kdayMain.GetSize() == 0 )
		return FALSE;

	double	yield_average = 0., yield_d = 0.;
	if( !CalculateYieldDay( kday, &yield_average, &yield_d, ldays, nDayCurrent ) )
		return FALSE;

	int	nDayCount	=	0;
	double	sum	=	0.;

	// kday Index
	if( -1 == nDayCurrent )
		nDayCurrent	=	kday.GetSize()-1;
	int	nDayEnd = ( -1 == ldays ? 0 : nDayCurrent-ldays );
	if( nDayEnd -1 < 0 )
		return FALSE;

	// kdayMain Index
	int	nDayCurrentMain	=	kdayMain.GetSize()-(kday.GetSize()-nDayCurrent);
	if( nDayCurrentMain < 0 || nDayCurrentMain >= kdayMain.GetSize() )
		return FALSE;
	if( kday.ElementAt(nDayCurrent).m_date != kdayMain.ElementAt(nDayCurrentMain).m_date )
	{
		int k;
		for( k=kdayMain.GetSize()-1; k>=0 ; k-- )
		{
			if( kday.ElementAt(nDayCurrent).m_date == kdayMain.ElementAt(k).m_date )
			{
				nDayCurrentMain	=	k;
				break;
			}
		}
		if( k < 0 )
			return FALSE;
	}
	int	nDayEndMain = ( -1 == ldays ? 0 : nDayCurrentMain-ldays );
	if( nDayEndMain < 0 )
		return FALSE;

	// Begin Calculate
	int	nCountAdjust	=	0;
	for( int nDay = nDayCurrent; nDay >= nDayEnd; nDay -- )
	{
		int	nDayLast	=	nDay - 1;
		int	nDayMain	=	nDayCurrentMain-(nDayCurrent-nDay);
		int nDayMainLast	= nDayMain-1;
		if( nDayMainLast < 0 || nDayMain >= kdayMain.GetSize() || nDayLast < 0 || nDay >= kday.GetSize() )
			break;

		// SP_ASSERT( kday.ElementAt(nDay).m_date == kdayMain.ElementAt(nDayMain).m_date );
		if( kday.ElementAt(nDay).m_date < kdayMain.ElementAt(nDayMain).m_date )
		{
			nCountAdjust	++;
			if( nCountAdjust >= 5 )
				break;
			nDayCurrentMain --;
			continue;
		}
		if( kday.ElementAt(nDay).m_date > kdayMain.ElementAt(nDayMain).m_date )
		{
			nCountAdjust	++;
			if( nCountAdjust >= 5 )
				break;
			nDayCurrentMain ++;
			continue;
		}

		if( kday.MaindataAt(nDayLast) > 1e-4 && kdayMain.MaindataAt(nDayMainLast) > 1e-4 )
		{
			nDayCount	++;
			double	yieldNow	=	(double( kday.MaindataAt(nDay) - kday.MaindataAt(nDayLast) )) / kday.MaindataAt(nDayLast);
			double	yieldNowMain=	(double( kdayMain.MaindataAt(nDayMain) - kdayMain.MaindataAt(nDayMainLast) )) / kdayMain.MaindataAt(nDayMainLast);
			sum	+=	(yieldNow-yield_average) * (yieldNowMain-market_yield_average);
		}
	}
	if( nDayCount > 0 &&
		nDayCount+nCountAdjust >= (-1 == ldays ? STKLIB_DAYS_INONEYEAR : ldays) )
	{
		if( pbeite )
			*pbeite	=	( sum / nDayCount) / (market_yield_d*market_yield_d);
		return TRUE;
	}

	return	FALSE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -