从本质上说,交易机器人是一种软件程序,它直接与金融交易所进行交互,并根据市场数据的解释发出买卖订单。这些机器人通过监测市场价格走势,并根据一套预先设定和编程的规则做出反应,从而做出这些决定。合约量化交易系统开发:I80-2857-8624一个交易机器人会分析市场行为,例如交易量、订单、价格和时间,它们通常可以根据您自己的喜好进行编程。
Blockchainisadistributedsharedledgeranddatabase,whichisdecentralized,tamperproof,traceable,collectivemaintenance,openandtransparent.Thesecharacteristicsensurethe"honesty"and"transparency"oftheblockchainandlaythefoundationforthecreationoftrustintheblockchain."Specifically,blockchainisafusionandinnovativeapplicationmodeofdistributeddatastorage,point-to-pointtransmission,consensusmechanism,encryptionalgorithmandothercomputertechnologiesintheInternetera.
量化交易是在交易阶段由计算机自动进行的一种投资模式,它是对人类的投资理念进行规范化、变量化、模型化,形成一整套可量化的操作理念,并用历史数据进行分析和验证。
系统化交易指用户将交易思路量化为交易系统,根据系统指标进行交易;
算法交易是利用电子平台,输入涉及算法的交易指令,以执行预先设定好的交易策略,指令中包含变量,包括时间,价格,交易量等,广泛应用于大宗交易;
程序化交易就是将用户复杂的交易思路转变为能简单操作的智能交易系统,便于用户的严格执行。
专业量化交易软件提供专业的k线功能,用户可以自行编写个性化的技术指标,实时输出到k线进行技术分析。
专用的交易脚本语言,语法简单,无需编程基础快速上手。内置大量交易函数,简单快速地将自己的交易系统转化为代码。
可对接市面上任意交易平台,可以操作数字货币交易所上的交易品种,都可以进行自动交易,全自动操作,无需值守,全自动入场出场,可自由设置,操作简单,一键启动,机器人中的交易参数都可以自由设置,灵活度非常高。交易所平台运用量化机器人可实现量化交易,提升交易所交易深度,市值管理,画K线等交易所目标。
量化交易软件不需要对接交易平台,交易策略不需要考虑平台的接口,策略针对选择的标的运行,使用通用的下单函数就可以下单,查看信息、不成交撤单重发、意外情况造成持仓和策略不匹配等,全部由软件搞定。
交易策略专用语言
为了方便投资者使用,我们专门开发了专用的策略脚本语言,极大的降低了量化交易的难度。
专注核心问题
量化交易系统,用户不需要考虑各种技术细节,只需要专注于交易逻辑,找出能盈利的方法并写成交易策略,就可以完全由软件24小时来运行。
策略代码
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
import numpy as np
import pandas as pd
from gm.api import *
"""
以短期为例:20日线
第一步:获取历史数据,计算唐奇安通道和ATR
第二步:当突破唐奇安通道时,开仓。
第三步:计算加仓和止损信号。
"""
def init(context):
# 设置计算唐奇安通道的参数
context.n = 20
# 设置合约标的
context.symbol = "DCE.i2012"
# 设置交易最大资金比率
context.ratio = 0.8
# 订阅数据
subscribe(symbols=context.symbol, frequency="60s", count=2)
# 获取当前时间
time = context.now.strftime("%H:%M:%S")
# 如果策略执行时间点是交易时间段,则直接执行algo定义atr等参数,以防直接进入on_bar()导致atr等未定义
if "09:00:00" < time < "15:00:00" or "21:00:00" < time < "23:00:00":
algo(context)
# 如果是交易时间段,等到开盘时间确保进入algo()
schedule(schedule_func=algo, date_rule="1d", time_rule="09:00:00")
schedule(schedule_func=algo, date_rule="1d", time_rule="21:00:00")
def algo(context):
# 计算通道的数据:当日最低、最高、上一交易日收盘
# 注:由于talib库计算ATR的结果与公式求得的结果不符,所以这里利用公式计算ATR
# 如果是回测模式,当天的数据直接用history取到
if context.mode == 2:
data = history_n(symbol=context.symbol, frequency="1d", count=context.n+1, end_time=context.now, fields="close,high,low,bob", df=True) # 计算ATR
tr_list = []
for i in range(0, len(data)-1):
tr = max((data["high"].iloc[i] - data["low"].iloc[i]), data["close"].shift(-1).iloc[i] - data["high"].iloc[i],
data["close"].shift(-1).iloc[i] - data["low"].iloc[i])
tr_list.append(tr)
context.atr = int(np.floor(np.mean(tr_list)))
context.atr_half = int(np.floor(0.5 * context.atr))
# 计算唐奇安通道
context.don_open = np.max(data["high"].values[-context.n:])
context.don_close = np.min(data["low"].values[-context.n:])
# 如果是实时模式,当天的数据需要用current取到
if context.mode == 1:
data = history_n(symbol=context.symbol, frequency="1d", count=context.n, end_time=context.now, fields="close,high,low",
df=True) # 计算ATR
current_data = current(symbols=context.symbol) # 最新一个交易日的最高、最低
tr_list = []
for i in range(1, len(data)):
tr = max((data["high"].iloc[i] - data["low"].iloc[i]),
data["close"].shift(-1).iloc[i] - data["high"].iloc[i],
data["close"].shift(-1).iloc[i] - data["low"].iloc[i])
tr_list.append(tr)
# 把最新一期tr加入列表中
tr_new = max((current_data[0]["high"] - current_data[0]["low"]),
data["close"].iloc[-1] - current_data[0]["high"],
data["close"].iloc[-1] - current_data[0]["low"])
tr_list.append(tr_new)
context.atr = int(np.floor(np.mean(tr_list)))
context.atr_half = int(np.floor(0.5 * context.atr))
# 计算唐奇安通道
context.don_open = np.max(data["high"].values[-context.n:])
context.don_close = np.min(data["low"].values[-context.n:])
# 计算加仓点和止损点
context.long_add_point = context.don_open + context.atr_half
context.long_stop_loss = context.don_open - context.atr_half
context.short_add_point = context.don_close - context.atr_half
context.short_stop_loss = context.don_close + context.atr_half
def on_bar(context, bars):
# 提取数据
symbol = bars[0]["symbol"]
recent_data = context.data(symbol=context.symbol, frequency="60s", count=2, fields="close,high,low")
close = recent_data["close"].values[-1]
# 账户仓位情况
position_long = context.account().position(symbol=symbol, side=PositionSide_Long)
position_short = context.account().position(symbol=symbol, side=PositionSide_Short)
# 当无持仓时
if not position_long and not position_short:
# 如果向上突破唐奇安通道,则开多
if close > context.don_open:
order_volume(symbol=symbol, side=OrderSide_Buy, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open)
print("开多仓atr")
# 如果向下突破唐奇安通道,则开空
if close < context.don_close:
order_volume(symbol=symbol, side=OrderSide_Sell, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open)
print("开空仓atr")
# 有持仓时
# 持多仓,继续突破(加仓)
if position_long:
# 当突破1/2atr时加仓
if close > context.long_add_point:
order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Open)
print("继续加仓0.5atr")
context.long_add_point += context.atr_half
context.long_stop_loss += context.atr_half
# 持多仓,止损位计算
if close < context.long_stop_loss:
volume_hold = position_long["volume"]
if volume_hold >= context.atr_half:
order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close)
else:
order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Sell, order_type=OrderType_Market,position_effect=PositionEffect_Close)
print("平多仓0.5atr")
context.long_add_point -= context.atr_half
context.long_stop_loss -= context.atr_half
# 持空仓,继续突破(加仓)
if position_short:
# 当跌破加仓点时加仓
if close < context.short_add_point:
order_volume(symbol = symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open)
print("继续加仓0.5atr")
context.short_add_point -= context.atr_half
context.short_stop_loss -= context.atr_half
# 持多仓,止损位计算
if close > context.short_stop_loss:
volume_hold = position_short["volume"]
if volume_hold >= context.atr_half:
order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Close)
else:
order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Close)
print("平空仓0.5atr")
context.short_add_point += context.atr_half
context.short_stop_loss += context.atr_half
if __name__ == "__main__":
"""
strategy_id策略ID,由系统生成
filename文件名,请与本文件名保持一致
mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
token绑定计算机的ID,可在系统设置-密钥管理中生成
backtest_start_time回测开始时间
backtest_end_time回测结束时间
backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
backtest_initial_cash回测初始资金
backtest_commission_ratio回测佣金比例
backtest_slippage_ratio回测滑点比例
"""
run(strategy_id="strategy_id",
filename="main.py",
mode=MODE_BACKTEST,
token="token",
backtest_start_time="2020-02-15 09:15:00",
backtest_end_time="2020-09-01 15:00:00",
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=1000000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001)
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点