WeQuant交易策略—EMA指标
策略名称:EMA指标策略
关键词:指数移动平均、双均线、动态止损。
方法:
1)用快慢两条指数移动平均线的交叉作为买入卖出信号;
2)快线自下而上穿过慢线,买入;自上而下穿过慢线,卖出;
3)持仓期间计算净值的回撤,当回撤大于预设值时,全仓卖出止损,等待下一次入场信号
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# 策略代码总共分为三大部分,1)PARAMS变量 2)initialize函数 3)handle_data函数
# 请根据指示阅读。或者直接点击运行回测按钮,进行测试,查看策略效果。
# 策略名称:EMA指标策略
# 关键词:指数移动平均、双均线、动态止损。
# 方法:
# 1)用快慢两条指数移动平均线的交叉作为买入卖出信号;
# 2)快线自下而上穿过慢线,买入;自上而下穿过慢线,卖出;
# 3)持仓期间计算净值的回撤,当回撤大于预设值时,全仓卖出止损,等待下一次入场信号
import talib
# 阅读1,首次阅读可跳过:
# PARAMS用于设定程序参数,回测的起始时间、结束时间、滑点误差、初始资金和持仓。
# 可以仿照格式修改,基本都能运行。如果想了解详情请参考新手学堂的API文档。
PARAMS = {
"start_time": "2017-02-01 00:00:00",
"end_time": "2017-08-01 00:00:00",
"slippage": 0.003, # 此处“slippage"包含佣金(千二)+交易滑点(千一)
"account_initial": {"huobi_cny_cash": 100000,
"huobi_cny_btc": 0},
}
# 阅读2,遇到不明白的变量可以跳过,需要的时候回来查阅:
# initialize函数是两大核心函数之一(另一个是handle_data),用于初始化策略变量。
# 策略变量包含:必填变量,以及非必填(用户自己方便使用)的变量
def initialize(context):
# 设置回测频率, 可选:'1m', '5m', '15m', '30m', '60m', '1d', '1w', '1M', '1y'
context.frequency = "15m"
# 设置回测基准, 比特币:'huobi_cny_btc', 莱特币:'huobi_cny_ltc', 以太坊:'huobi_cny_eth'
context.benchmark = "huobi_cny_btc"
# 设置回测标的, 比特币:'huobi_cny_btc', 莱特币:'huobi_cny_ltc', 以太坊:'huobi_cny_eth'
context.security = "huobi_cny_btc"
# EMA快线回看时间
context.user_data.ema_fast_window = 5
# EMA慢线回看时间
context.user_data.ema_slow_window = 20
# 设置回撤止损线 (%)。 如设置为5,则当回撤大于等于5%时,止损退出
context.user_data.stop_loss_line = 10
# 记录净值的最大值,用于计算持仓的回撤,判断是否应该止损。每次止损或者全仓卖出后,会被设置为None,重新计算
context.user_data.max_net = None
# 阅读3,策略核心逻辑:
# handle_data函数定义了策略的执行逻辑,按照frequency生成的bar依次读取并执行策略逻辑,直至程序结束。
# handle_data和bar的详细说明,请参考新手学堂的解释文档。
def handle_data(context):
# 买入信号
long_signal_triggered = False
# 卖出信号
short_signal_triggered = False
# 止损信号
stop_loss_signal_triggered = False
# 更新净值最大值
if context.user_data.max_net is None:
context.user_data.max_net = context.account.huobi_cny_net
else:
if context.user_data.max_net < context.account.huobi_cny_net:
context.user_data.max_net = context.account.huobi_cny_net
# 计算当前回撤
current_draw_down = (1 - context.account.huobi_cny_net / context.user_data.max_net) * 100
context.log.info("当前回撤为 %.2f%%, 止损线为 %.2f%%" % (current_draw_down, context.user_data.stop_loss_line))
# 当前回撤大于止损线,则产生卖出止损信号
if current_draw_down > context.user_data.stop_loss_line:
context.log.info("已经触发止损线,全仓卖出止损,等待下一次买入信号")
stop_loss_signal_triggered = True
# 获取历史数据
hist = context.data.get_price(context.security, count=context.user_data.ema_slow_window+1, frequency=context.frequency)
if len(hist.index) < context.user_data.ema_slow_window:
context.log.warn("bar的数量不足, 等待下一根bar...")
return
# 收盘价
close_prices = hist["close"].values
# 计算EMA值
ema_fast = talib.EMA(close_prices, context.user_data.ema_fast_window)
ema_slow = talib.EMA(close_prices, context.user_data.ema_slow_window)
# 当前快线EMA
current_ema_fast = ema_fast[-1]
# 当前慢线EMA
current_ema_slow = ema_slow[-1]
# 前一个bar的快线EMA
pre_ema_fast = ema_fast[-2]
# 前一个bar的慢线EMA
pre_ema_slow = ema_slow[-2]
context.log.info("当前EMA 快线 = %.2f, 慢线 = %.2f; 前一个bar EMA 快线 = %.2f, 慢线 = %.2f" % (current_ema_fast, current_ema_slow, pre_ema_fast, pre_ema_slow))
# EMA快线从下向上穿过EMA慢线时,产生买入信号
if pre_ema_fast <= pre_ema_slow and current_ema_fast > current_ema_slow:
context.log.info("EMA快线从下向上穿过EMA慢线时,产生买入信号")
long_signal_triggered = True
# EMA快线从上向下穿过EMA慢线时,产生卖出信号
elif pre_ema_fast >= pre_ema_slow and current_ema_fast < current_ema_slow:
context.log.info("EMA快线从上向下穿过EMA慢线时,产生卖出信号")
short_signal_triggered = True
# 有卖出信号,且持有仓位,则市价单全仓卖出
if short_signal_triggered or stop_loss_signal_triggered:
if context.account.huobi_cny_btc >= HUOBI_CNY_BTC_MIN_ORDER_QUANTITY:
context.user_data.max_net = None
# 卖出信号,且不是空仓,则市价单全仓清空
context.log.info("正在卖出 %s" % context.security)
context.log.info("卖出数量为 %s" % context.account.huobi_cny_btc)
context.order.sell(context.security, quantity=str(context.account.huobi_cny_btc))
else:
context.log.info("仓位不足,无法卖出")
# 有买入信号,且持有现金,则市价单全仓买入
elif long_signal_triggered:
if context.account.huobi_cny_cash >= HUOBI_CNY_BTC_MIN_ORDER_CASH_AMOUNT:
# 买入信号,且持有现金,则市价单全仓买入
context.log.info("正在买入 %s" % context.security)
context.log.info("下单金额为 %s 元" % context.account.huobi_cny_cash)
context.order.buy(context.security, cash_amount=str(context.account.huobi_cny_cash))
else:
context.log.info("现金不足,无法下单")
else:
context.log.info("无交易信号,进入下一根bar")
15m

30m

60m
exception?
4h

1d

WeQuant交易策略—EMA指标的更多相关文章
- WeQuant交易策略—网格交易
网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略.标的物价格越低,吸纳的头寸越多:标的物价格越高,卖出的头寸越多.网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路 ...
- WeQuant交易策略—KDJ
KDJ随机指标策略策略介绍KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具.随机指标KDJ ...
- WeQuant交易策略—MACD
MACD(指数平滑异同平均线)策略简介MACD指标应该是大家最常见的技术指标,在很多股票.比特币的软件中都是默认显示的.MACD是从双指数移动平均线发展而来的.意义和双移动平均线基本相同,即由快.慢均 ...
- WeQuant交易策略—EMV
EMV指标策略 简介 EMV(Ease of Movement Value, 简易波动指标),它是由RichardW.ArmJr.根据等量图和压缩图的原理设计而成, 目的是将价格与成交量的变化结合成一 ...
- WeQuant交易策略—ATR
ATR(真实波幅均值)策略 策略介绍 ATR(average true range,真实波幅均值),是用来衡量一段时间内价格的真实的平均波动范围,ATR不是一个领先指标,但是它测量最重要的市场参数之一 ...
- WeQuant交易策略—RSI
RSI指标策略 策略介绍 RSI(相对强弱指标),是通过一段时期内的平均收盘上涨和下跌数,计算价格上涨所产生的波动占整个波动的百分比,来分析市场买卖盘的意向和实力. 计算公式(以日为单位举例) RSI ...
- WeQuant交易策略—BOLL
BOLL(布林线指标)策略 简介 BOLL(布林线)指标是技术分析的常用工具之一,由美国股市分析家约翰•布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标.一般而言,价格的运动总是围 ...
- WeQuant交易策略—Chaikin A/D
策略名称:AD指标策略 多空双方力量浮标- AD(Chaikin A/D线)策略关键词:ChaikinA/D线.多空对比.AD指标是一种非常流行的平横交易量指标, 用于估定一段时间内该证券累积的资金流 ...
- WeQuant交易策略—NATR
策略名称:NATR策略关键词:规范真实波幅.价格突破. NATR,是对ATR指标进行了标准化.主要应用于了解价格的震荡幅度和节奏,在窄幅整理行情中用于寻找突破时机.本策略在当前价格高于之前价格一定倍数 ...
随机推荐
- 论Activity及启动模式,Fragment,Service的使用以及生命周期
Activity: 这是我总结出来的,介于Activity生命周期相对较多,我在Google官方的生命周期图上又加了几个常用的,便于大家理解 对于ACtivity,先说说启动模式(ps:复制党去死吧, ...
- 怎么去掉javascript 的Array的重复项
//完美去除法: var arr=[1,3,2,2,11,4]; var arr1=[]; var arr2=arr.sort(function(a,b){ return a-b; }); //把数组 ...
- CONSOLE_SCREEN_BUFFER_INFO 结构体
CONSOLE_SCREEN_BUFFER_INFO结构体 来源:https://msdn.microsoft.com/en-us/library/ms682093(v=vs.85).aspx 作用 ...
- (转)Sublime Text中文乱码问题
Sublime Text 2是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦.不过Sublime Package Control所以供的插件可以让Subli ...
- (转)B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...
- C语言基础 - 实现动态数组并增加内存管理
用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...
- Android APP 内部捐赠实现(支付宝&微信)
Android APP 内部捐赠实现(支付宝&微信) 目前支持 支付宝和 微信. 项目地址:https://github.com/didikee/AndroidDonate https://p ...
- Eclipse详细设置护眼背景色和字体颜色并导出
Eclipse详细设置护眼背景色和字体颜色并导出 Eclipse是一款码农们喜闻乐见的集成开发平台,但是其默认的主题和惨白的背景色实在是太刺激眼球了.下面,将给大家详细介绍如何设置成护眼主题的方法,也 ...
- YARN笔记——技术点汇总
目录 · 概况 · 原理 · 资源调度器分类 · YARN架构 · ResourceManager · NodeManager · ApplicationMaster · Container · YA ...
- 简易 HTTP Server 实现(JAVA)
该简易的J2EE WEB容器缺失很多功能,却可以提供给大家学习HTTP容器大致流程. 注:容器功能很少,只供学习. 1. 支持静态内容与Servlet,不支持JSP 2. 仅支持304/404 3. ...