量化交易之hft篇 - alpha因子 (MacdAlpha)

#pragma once

#include "../../Includes/WTSDataDef.hpp"
USING_NS_OTP;


namespace hftalphas {

typedef unique_ptr<vector<WTSTickData>> TicksUPtr;
typedef vector<double> Differs;

class MacdAlpha {

	MacdAlpha() = default;
	~MacdAlpha() = default;

public:
	static int32_t alphaValue(
		const TicksUPtr& ticks,
		const uint32_t fastParam, 
		const uint32_t midParam,
		const uint32_t slowParam,
		const uint32_t unitValue = 1
	);


private:
	static bool __paramIsOK(const uint32_t fastParam, const uint32_t midParam, const uint32_t slowParam);

	static double __maValue(const TicksUPtr& ticks, uint32_t beginIndex, uint32_t endIndex);
};

}
#include "TQZHftMacd.h"
#include <iostream>

namespace hftalphas {

	int32_t MacdAlpha::alphaValue(
		const TicksUPtr& ticks,
		const uint32_t fastParam,
		const uint32_t midParam,
		const uint32_t slowParam,
		const uint32_t unitValue
	) {
		if (!MacdAlpha::__paramIsOK(fastParam, midParam, slowParam))
			return 0;
		if (ticks->size() < slowParam)
			return 0;

		Differs maDiffers;

		/// calculate differ.
		size_t fastBeginIndex = ticks->size() - fastParam;
		for (size_t fastIndex(fastBeginIndex); fastIndex < ticks->size(); fastIndex++)
			maDiffers.push_back(MacdAlpha::__maValue(ticks, fastIndex - midParam, fastIndex) - MacdAlpha::__maValue(ticks, fastIndex - slowParam, fastIndex));
		
		double sumValue(0);
		for (size_t index(0); index < maDiffers.size(); index++)
			sumValue += maDiffers.at(index);

		/// calculate ma(differ) & macd alpha value.
		int32_t macdAlphaValue = static_cast<int32_t>(sumValue / maDiffers.size());
		if (macdAlphaValue > 0)
			macdAlphaValue = unitValue;
		else if (macdAlphaValue < 0)
			macdAlphaValue = -1 * unitValue;
		return macdAlphaValue;
	}

	bool MacdAlpha::__paramIsOK(const uint32_t fastParam, const uint32_t midParam, const uint32_t slowParam) {
		return (slowParam > midParam) && (midParam > fastParam);
	}
	
	double MacdAlpha::__maValue(const TicksUPtr& ticks, uint32_t beginIndex, uint32_t endIndex) {
		if (!(endIndex > beginIndex && ticks->size() > endIndex))
			return 0;

		double sumValue(0);
		for (size_t index(beginIndex); index <= endIndex; index++)
			sumValue += ticks->at(index).price();

		return sumValue / (endIndex - beginIndex);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值