mirror of
https://gitee.com/fasiondog/hikyuu.git
synced 2024-11-30 10:59:43 +08:00
update
This commit is contained in:
parent
55b2c46d6b
commit
d5a76659cb
@ -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 ;
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
@ -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 */
|
||||
|
||||
|
20
libs/hikyuu/trade_sys/stoploss/crt/ST_Indicator.h
Normal file
20
libs/hikyuu/trade_sys/stoploss/crt/ST_Indicator.h
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* ST_Indicator.h
|
||||
*
|
||||
* Created on: 2016年4月19日
|
||||
* 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_ */
|
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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>
|
||||
|
5
tools/hikyuu/docs/source/trade_sys/money_manager.rst
Normal file
5
tools/hikyuu/docs/source/trade_sys/money_manager.rst
Normal file
@ -0,0 +1,5 @@
|
||||
.. py:currentmodule:: trade_sys
|
||||
.. highlightlang:: python
|
||||
|
||||
资金管理策略
|
||||
============
|
@ -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()
|
||||
|
||||
|
@ -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()
|
||||
|
||||
子类克隆接口
|
@ -7,3 +7,5 @@
|
||||
.. toctree::
|
||||
|
||||
signal
|
||||
stoploss
|
||||
money_manager
|
||||
|
Loading…
Reference in New Issue
Block a user