量化交易之HFT篇 - long beach - SigMACD.cc

// .cc

#include "SigMACD.h"
#include <boost/assign/list_of.hpp>
#include <longbeach/signals/SignalBuilder.h>
#include <longbeach/signals/SignalsPriority.h>
#include <longbeach/clientcore/PriceProviderBuilder.h>

namespace longbeach {
namespace signals {

SigMACDSpec::SigMACDSpec()
{
    initMembers();
}

void SigMACDSpec::initMembers()
{
    if( !MemberList::m_bInitialized ) {
        MemberList::className("SigMACD");
        MemberList::add( "description",   &SigMACDSpec::m_description );
        MemberList::add( "short_window",  &SigMACDSpec::short_window );
        MemberList::add( "long_window",   &SigMACDSpec::long_window );
        MemberList::add( "mid_window",    &SigMACDSpec::mid_window );
        MemberList::add( "refPxP",        &SigMACDSpec::m_refPxP );
        MemberList::m_bInitialized = true;
    }
}

bool SigMACDSpec::registerScripting(lua_State &state)
{
    initMembers();
    LONGBEACH_REGISTER_SCRIPTING_ONCE( state, "longbeach::signals::SigMACDSpec" );
    // each Spec class must be added to registerScripting in Signals_Scripting.cc
    luabind::module( &state )
    [
        luabind::class_<SigMACDSpec, SignalSpec, ISignalSpecPtr>("SigMACDSpec")
            .def( luabind::constructor<>() )
            .def_readwrite("short_window",  &SigMACDSpec::short_window)
            .def_readwrite("long_window",   &SigMACDSpec::long_window)
            .def_readwrite("mid_window",    &SigMACDSpec::mid_window)
            .def_readwrite("refPxP",        &SigMACDSpec::m_refPxP)
    ];
    luaL_dostring( &state, (MemberList::className() + "=SigMACDSpec").c_str() );
    return true;
}

void SigMACDSpec::getDataRequirements(IDataRequirements *rqs) const
{
    SignalSpec::getDataRequirements(rqs);
}

void SigMACDSpec::checkValid() const
{
    SignalSpec::checkValid();
}

ISignalPtr SigMACDSpec::build( SignalBuilder* builder ) const
{
    IPriceProviderPtr ref_pxp = builder->getPxPBuilder()->buildPxProvider(m_refPxP);
    return ISignalPtr(new SigMACD( builder->getClientContext(), ref_pxp, short_window, long_window, mid_window, getDescription(), builder->getVerboseLevel()));
}

/************************************************************************************************/
// SigMACD
/************************************************************************************************/

SigMACD::SigMACD( const ClientContextPtr& cc, const IPriceProviderPtr& ref, int32_t s, int32_t l, int32_t m, const std::string& desc, bool vbose)
    : SignalSmonImpl( ref->getInstrument(), desc, cc->getClockMonitor(), vbose )
    , m_ref_pxp(ref)
    , m_macd( s, l, m )
{
    using namespace boost::assign;
    initSignalStates( list_of("macd")("dea")("diff") );

    m_ref_pxp->addPriceListener( m_sub, boost::bind( &SigMACD::onInputChange, this, _1 ) );
}

void SigMACD::onInputChange( const IPriceProvider& pxp )
{
    if(pxp.isPriceOK()) {
        double px = pxp.getRefPrice();

        m_macd.update( px );

        setDirty(true);
        setOK(true);
        notifySignalListeners();
    }
}

void SigMACD::recomputeState() const
{
    if(isOK() && m_macd.get_dea()) {
        setSignalState( 0, m_macd.get_osc().get() );
        setSignalState( 1, m_macd.get_dea().get() );
        setSignalState( 2, m_macd.get_diff().get() );
        setDirty(false);
    } else {
        setSignalState( 0, 0 );
        setSignalState( 1, 0 );
        setSignalState( 2, 0 );
        setDirty(false);
    }
}

} // namespace signals
} // namespace longbeach

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值