This commit is contained in:
fasiondog 2016-04-20 01:29:19 +08:00
parent 55b2c46d6b
commit d5a76659cb
17 changed files with 203 additions and 50 deletions

View File

@ -4,4 +4,4 @@
# Edit this path to point at the tools/build/v2 subdirectory of your
# Boost installation. Absolute paths work, too.
boost-build d:\\src\\boost\\tools\\build\\v2 ;
boost-build d:\\src\\boost\\tools\\build\\src ;

View File

@ -27,8 +27,10 @@
#include <boost/serialization/export.hpp>
#include "imp/FixedCountMoneyManager.h"
#include "imp/PercentRiskMoneyManager.h"
BOOST_CLASS_EXPORT(hku::FixedCountMoneyManager)
BOOST_CLASS_EXPORT(hku::PercentRiskMoneyManager)
#endif /* HKU_SUPPORT_SERIALIZATION */

View File

@ -11,7 +11,7 @@
namespace hku {
SignalPtr HKU_API SG_Flex(const Operand& op, int slow_n, const string& kpart) {
SignalPtr sg = SG_Cross(op, OP(EMA(slow_n)), kpart);
SignalPtr sg = SG_Cross(op, OP(OP(EMA(slow_n)), op), kpart);
sg->name("SG_Flex");
return sg;
}

View File

@ -59,8 +59,7 @@ void CrossSignal::_calculate() {
SignalPtr HKU_API SG_Cross(const Operand& fast,
const Operand& slow, const string& kpart) {
CrossSignal *p = new CrossSignal(fast, slow, kpart);
return SignalPtr(p);
return SignalPtr(new CrossSignal(fast, slow, kpart));
}
} /* namespace hku */

View File

@ -39,12 +39,18 @@ public:
/** 设置名称 */
void name(const string& name);
/** 设置账户 */
/** 设置交易管理实例 */
void setTM(const TradeManagerPtr& tm);
/** 获取交易管理实例 */
TradeManagerPtr getTM() const;
/** 设置交易对象 */
void setTO(const KData& kdata);
/** 获取交易对象 */
KData getTO() const;
/** 复位操作 */
void reset();
@ -55,8 +61,8 @@ public:
/**
* 0
*
* @param datetime
* @param price
* @param datetime
* @param price
* @note /getPrice可以传入计划交易的
* 30%price参数
* price为0.0使使price参数使
@ -171,10 +177,18 @@ inline void StoplossBase::name(const string& name) {
m_name = name;
}
inline TradeManagerPtr StoplossBase::getTM() const {
return m_tm;
}
inline void StoplossBase::setTM(const TradeManagerPtr& tm) {
m_tm = tm;
}
inline KData StoplossBase::getTO() const {
return m_kdata;
}
inline void StoplossBase::reset() {
_reset();
}

View File

@ -9,7 +9,7 @@
#define STOPLOSS_BUILD_IN_H_
#include "crt/ST_FixedPercent.h"
#include "crt/ST_Indicator.h"
#include "crt/ST_Saftyloss.h"
#endif /* STOPLOSS_BUILD_IN_H_ */

View File

@ -17,7 +17,7 @@ namespace hku {
* @param p (0,1]
* @ingroup Stoploss
*/
StoplossPtr HKU_API ST_FixedPercent(double p);
StoplossPtr HKU_API ST_FixedPercent(double p = 0.03);
} /* namespace */

View File

@ -0,0 +1,20 @@
/*
* ST_Indicator.h
*
* Created on: 2016419
* Author: Administrator
*/
#ifndef TRADE_SYS_STOPLOSS_CRT_ST_INDICATOR_H_
#define TRADE_SYS_STOPLOSS_CRT_ST_INDICATOR_H_
#include "../../../indicator/Operand.h"
#include "../StoplossBase.h"
namespace hku {
StoplossPtr HKU_API ST_Indicator(const Operand& op, const string& kpart = "CLOSE");
} /* namespace hku */
#endif /* TRADE_SYS_STOPLOSS_CRT_ST_INDICATOR_H_ */

View File

@ -11,8 +11,8 @@
namespace hku {
StoplossPtr HKU_API ST_Saftyloss(int n1, int n2, double p) {
Indicator ind = SAFTYLOSS(n1, n2, p);
IndicatorStoploss *result = new IndicatorStoploss(ind, "CLOSE");
Operand op = OP(SAFTYLOSS(n1, n2, p));
IndicatorStoploss *result = new IndicatorStoploss(op, "CLOSE");
result->name("Saftyloss_ST");
return StoplossPtr(result);
}

View File

@ -11,14 +11,14 @@
namespace hku {
IndicatorStoploss::IndicatorStoploss(): StoplossBase("IndicatorStoploss") {
setParam<string>("kpart", "CLOSE");
}
IndicatorStoploss::
IndicatorStoploss(const Indicator& ind,
IndicatorStoploss(const Operand& op,
const string& kdata_part)
: StoplossBase("IndicatorStoploss"), m_ind(ind), m_kdata_part(kdata_part) {
: StoplossBase("IndicatorStoploss"), m_op(op) {
setParam<string>("kpart", "CLOSE");
}
IndicatorStoploss::~IndicatorStoploss() {
@ -34,17 +34,21 @@ void IndicatorStoploss::_reset() {
}
StoplossPtr IndicatorStoploss::_clone() {
IndicatorStoploss *p = new IndicatorStoploss(m_ind, m_kdata_part);
IndicatorStoploss *p = new IndicatorStoploss(m_op, getParam<string>("kpart"));
p->m_result = m_result;
return StoplossPtr(p);
}
void IndicatorStoploss::_calculate() {
Indicator ind = m_ind(KDATA_PART(m_kdata, m_kdata_part));
Indicator ind = m_op(KDATA_PART(m_kdata, getParam<string>("kpart")));
size_t total = ind.size();
for (size_t i = ind.discard(); i < total; ++i) {
m_result[m_kdata[i].datetime] = ind[i];
}
}
StoplossPtr HKU_API ST_Indicator(const Operand& op, const string& kpart) {
return StoplossPtr(new IndicatorStoploss(op, kpart));
}
} /* namespace hku */

View File

@ -8,7 +8,7 @@
#ifndef INDICATORSTOPLOSS_H_
#define INDICATORSTOPLOSS_H_
#include "../../../indicator/Indicator.h"
#include "../../../indicator/Operand.h"
#include "../StoplossBase.h"
namespace hku {
@ -16,7 +16,7 @@ namespace hku {
class IndicatorStoploss: public StoplossBase {
public:
IndicatorStoploss(); //仅用于序列化默认构造函数
IndicatorStoploss(const Indicator& ind,
IndicatorStoploss(const Operand& op,
const string& kdata_part);
virtual ~IndicatorStoploss();
@ -26,8 +26,7 @@ public:
virtual void _calculate();
private:
Indicator m_ind;
string m_kdata_part;
Operand m_op;
map<Datetime, price_t> m_result;
//========================================
@ -39,8 +38,7 @@ private:
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(StoplossBase);
ar & BOOST_SERIALIZATION_NVP(m_ind);
ar & BOOST_SERIALIZATION_NVP(m_kdata_part);
ar & BOOST_SERIALIZATION_NVP(m_op);
//m_result 每次系统运行时都要重新计算,不保存
//ar & BOOST_SERIALIZATION_NVP(m_result);
}

View File

@ -55,8 +55,6 @@ public:
}
};
BOOST_PYTHON_FUNCTION_OVERLOADS(SAFETYLOSS_ST_overload, ST_Saftyloss, 0, 3);
string (StoplossBase::*get_name)() const = &StoplossBase::name;
void (StoplossBase::*set_name)(const string&) = &StoplossBase::name;
@ -68,7 +66,9 @@ void export_Stoploss() {
.def("getParam", &StoplossBase::getParam<boost::any>)
.def("setParam", &StoplossBase::setParam<object>)
.def("setTM", &StoplossBase::setTM)
.def("getTM", &StoplossBase::getTM)
.def("setTO", &StoplossBase::setTO)
.def("getTO", &StoplossBase::getTO)
.def("getPrice", pure_virtual(&StoplossBase::getPrice))
.def("getShortPrice", &StoplossBase::getShortPrice,
&StoplossWrap::default_getShortPrice)
@ -84,8 +84,10 @@ void export_Stoploss() {
register_ptr_to_python<StoplossPtr>();
def("ST_FixedPercent", ST_FixedPercent);
def("ST_Saftyloss", ST_Saftyloss, SAFETYLOSS_ST_overload());
def("ST_FixedPercent", ST_FixedPercent, (arg("p") = 0.03));
def("ST_Indicator", ST_Indicator, (arg("op"), arg("kpart") = "CLOSE"));
def("ST_Saftyloss", ST_Saftyloss,
(arg("n1") = 10, arg("n2") = 3, arg("p") = 2.0));
}

View File

@ -74,6 +74,7 @@
<File name="tools\hikyuu\docs\source\trade_sys\signal.rst" />
<File name="tools\hikyuu\docs\source\trade_sys\trade_sys.rst" />
<File name="tools\hikyuu\docs\source\trade_sys\stoploss.rst" />
<File name="tools\hikyuu\docs\source\trade_sys\money_manager.rst" />
</Folder>
</Project>
</NotepadPlus>

View File

@ -0,0 +1,5 @@
.. py:currentmodule:: trade_sys
.. highlightlang:: python
资金管理策略
============

View File

@ -21,13 +21,14 @@
SG_Cross(OP(MA(n=10)), OP(MA(n=30)))
:param OP fast: 快线
:param OP slow: 慢线
:param Operand fast: 快线
:param Operand slow: 慢线
:param string kpart: OPEN|HIGH|LOW|CLOSE|AMO|VOL|KDATA
:return: 信号指示器
单线拐点信号指示器
^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^
.. py:function:: SG_Single(ind[, filter_n = 10, filter_p = 0.1, kpart='CLOSE'])
@ -39,11 +40,11 @@
or Buy When AMA - AMA[2] > filter
or Buy When AMA - AMA[3] > filter
:param Indicator ind:
:param Operand ind:
:param int filer_n: N日周期
:param double filter_p: 过滤器百分比
:param float filter_p: 过滤器百分比
:param string kpart: KDATA|OPEN|HIGH|LOW|CLOSE|AMO|VOL
:return: 信号指示器
.. py:function:: SG_Single2(ind[, filter_n = 10, filter_p = 0.1, kpart='CLOSE'])
@ -54,11 +55,11 @@
Buy When AMA - @lowest(AMA,n) > filter
Sell When @highest(AMA, n) - AMA > filter
:param Indicator ind:
:param Operand ind:
:param int filer_n: N日周期
:param double filter_p: 过滤器百分比
:param float filter_p: 过滤器百分比
:param string kpart: KDATA|OPEN|HIGH|LOW|CLOSE|AMO|VOL
:return: 信号指示器
自交叉单线拐点指示器
^^^^^^^^^^^^^^^^^^^^
@ -67,15 +68,15 @@
使用自身的EMA(slow_n)作为慢线,自身作为快线,快线向上穿越慢线买入,快线向下穿越慢线卖出。
:param Indicator ind:
:param Operand ind:
:param int slow_n: 慢线EMA周期
:param string kpart: KDATA|OPEN|HIGH|LOW|CLOSE|AMO|VOL
:return: 信号指示器
自定义信号指示器
----------------
自定义信号指示器,必须实现 :py:meth:`SignalBase._clone`:py:meth:`SignalBase_calculate` 方法如示例1。如果含有私有属性还需实现 :py:meth:`SignalBase._reset` 方法如示例2
自定义信号指示器,必须实现 :py:meth:`SignalBase._clone`:py:meth:`SignalBase._calculate` 方法如示例1。如果含有私有属性还需实现 :py:meth:`SignalBase._reset` 方法如示例2
示例1不含私有变量海龟交易策略:
@ -115,7 +116,7 @@
.. py:attribute:: name
信号指示器名称
名称
.. py:method:: getParam(name)
@ -131,7 +132,7 @@
:param str name: 参数名称
:param value: 参数值
:type value: int | bool | double | string
:type value: int | bool | float | string
:raises logic_error: Unsupported type! 不支持的参数类型
.. py:method:: setTO(k)
@ -142,7 +143,7 @@
:return: 交易对象
:rtype: KData
.. py:method:: shouldBuy(datetime)
指定时刻是否可以买入
@ -187,19 +188,19 @@
.. py:method:: reset()
复位内部私有变量
复位操作
.. py:method:: clone()
克隆生成一个新的信号指示器
克隆操作
.. py:method:: _calculate()
子类计算接口在setTO中调用
子类计算接口
.. py:method:: _reset()
子类复位接口
子类复位接口,复位内部私有变量
.. py:method:: _clone()

View File

@ -1,8 +1,113 @@
.. py:currentmodule:: trade_sys
.. highlightlang:: python
止损策略
========
止损/止赢策略
=============
止损策略基类
------------
常用止损/止赢策略
-----------------
止损是指买入后,价格的走势和预期相反,当价格低于某一水平时卖出,防止进一步的损失。
止赢是在买入后,价格符合预期走势,当价格回落至某一水平时卖出,获得足够的收益。
进行交易时即可使用相同的止损和止赢策略也可使用不同的止损和止赢策略如使用固定百分比3%作为止损,使用吊灯安全线作为止赢。
固定百分比止损
^^^^^^^^^^^^^^
.. py:function:: ST_FixedPercent([p = 0.03])
固定百分比止损策略,即当价格低于买入价格的某一百分比时止损
:param float p: 百分比(0,1]
:return: 止损/止赢策略实例
技术指标止损
^^^^^^^^^^^^
.. py:function:: ST_Indicator(op[, kpart = "CLOSE"])
使用技术指标作为止损价。如使用10日EMA作为止损::
ST_Indicator(OP(EMA(n=10)))
:param Operand op:
:param string kpart: KDATA|OPEN|HIGH|LOW|CLOSE|AMO|VOL
自定义止损/止赢策略
-------------------
自定义止损/止赢策略,必须实现 :py:meth:`StoplossBase._clone`:py:meth:`StoplossBase._calculate`:py:meth:`StoplossBase.getPrice` 方法如示例1。如果含有私有属性还需实现 :py:meth:`StoplossBase._reset` 方法如示例2
止损/止赢策略基类
-----------------
.. py:class:: StoplossBase([name])
止损/止赢算法基类
.. py:attribute:: name
名称
.. py:method:: getParam(name)
获取指定的参数
:param str name: 参数名称
:return: 参数值
:raises out_of_range: 无此参数
.. py:method:: setParam(name, value)
设置参数
:param str name: 参数名称
:param value: 参数值
:type value: int | bool | float | string
:raises logic_error: Unsupported type! 不支持的参数类型
.. py:method:: setTM(tm)
设置交易管理实例
:param TradeManager tm: 交易管理实例
.. py:method:: setTO(k)
:param KData k: 设置交易对象
.. py:method:: getTO()
:return: 交易对象
:rtype: KData
.. py:method:: getPrice(datetime, price)
获取本次预期交易买入时的计划止损价格如果不存在止损价则返回0。用于系统在交易执行前向止损策略模块查询本次交易的计划止损价。
.. note::
一般情况下,止损/止赢的算法可以互换但止损的getPrice可以传入计划交易的价格比如以买入价格的30%做为止损。而止赢则不考虑传入的price参数即认为price为0.0。实际上即使止损也不建议使用price参数如可以使用前日最低价的30%作为止损则不需要考虑price参数。
:param Datetime datetime: 交易时间
:param float price: 计划买入的价格
.. py:method:: reset()
复位操作
.. py:method:: clone()
克隆操作
.. py:method:: _calculate()
子类计算接口
.. py:method:: _reset()
子类复位接口,复位内部私有变量
.. py:method:: _clone()
子类克隆接口

View File

@ -7,3 +7,5 @@
.. toctree::
signal
stoploss
money_manager