yutiansut / QUANTAXIS

QUANTAXIS 支持任务调度 分布式部署的 股票/期货/期权 数据/回测/模拟/交易/可视化/多账户 纯本地量化解决方案
https://yutiansut.github.io/QUANTAXIS/
MIT License
8.1k stars 2.95k forks source link

QUANTAXIS 第二次直播 STU02 直播相关视频和代码 #1275

Open yutiansut opened 5 years ago

yutiansut commented 5 years ago

哔哩哔哩 传送门

QUANTAXIS STU02 DOCKE_期货模拟盘_流计算

docker拉起教程

1. 先安装docker

ubuntu 一键脚本

wget https://raw.githubusercontent.com/QUANTAXIS/QUANTAXIS/master/config/install_docker.sh
sudo bash install_docker.sh

win/mac 安装 一般是 19.03.2 版本的docker 可以去官网下载docker-ce

https://www.docker.com/products/docker-desktop

image

文件较大, 我在群文件也共享了

ps: quantaxis强烈推荐不要使用win10以下的系统...(好吧忽略我)

2. 创建两个docker Volume [此步骤只需要执行一次]

docker volume create qamg
docker volume create qacode

3. 下载docker_compose.yaml 或者 cd QUANTAXIS/docker/qa-service

docker-compose.yaml 地址 :

https://github.com/QUANTAXIS/QUANTAXIS/blob/master/docker/qa-service/docker-compose.yaml

4. 在有docker_compose.yaml的目录 输入 docker-compose up

相关项目

数据存储/数据分析/回测

WEB相关, http/websocket/开放数据接口

分布式相关, 任务异步执行, 跨进程分布式消息订阅分发

接口相关: 交易账户/ 期货接口封装/ Trader实例

行情相关: 主推行情实现/ 基于OU过程的模拟行情

yutiansut commented 5 years ago

部分代码: 模拟盘下单

import QUANTAXIS as QA
from QAPUBSUB.producer import publisher, publisher_routing

import datetime
from QAPUBSUB import producer
import json
p = producer.publisher_routing(
    user='admin', password='admin',exchange='QAORDER_ROUTER')

for acc in ['99999999','100010']:
    p.pub(json.dumps({
        'topic': 'sendorder',
        'account_cookie': acc,
        'strategy_id': 'test',
        'code': 'rb2001',
        'price': 3400,
        'order_direction': 'SELL',
        'order_offset': 'CLOSETODAY',
        'volume': 3,
        'order_time': str(datetime.datetime.now()),
        'exchange_id': 'SHFE'
    }), routing_key=acc)

模拟盘撤单

p.pub(json.dumps({
    'topic': 'cancel_order',
    'order_id': 'QAOTG_BIn7hPtG',
    'account_cookie': '100010'
}), routing_key='100010')

查看模拟盘账户

import pymongo
import os
db =pymongo.MongoClient(host=os.getenv('MONGODB')).QAREALTIME
simacc = db.account.find_one({'account_cookie':'100010'})
simacc['positions']
{'SHFE_rb2001': {'user_id': '100010',
  'exchange_id': 'SHFE',
  'instrument_id': 'rb2001',
  'volume_long_today': 1,
  'volume_long_his': 0,
  'volume_long': 1,
  'volume_long_frozen_today': 0,
  'volume_long_frozen_his': 0,
  'volume_long_frozen': 0,
  'volume_short_today': 1,
  'volume_short_his': 0,
  'volume_short': 1,
  'volume_short_frozen_today': 0,
  'volume_short_frozen_his': 0,
  'volume_short_frozen': 0,
  'volume_long_yd': 0,
  'volume_short_yd': 0,
  'pos_long_his': 0,
  'pos_long_today': 1,
  'pos_short_his': 0,
  'pos_short_today': 1,
  'open_price_long': 3434.0,
  'open_price_short': 3426.0,
  'open_cost_long': 34340.0,
  'open_cost_short': 34260.0,
  'position_price_long': 3434.0,
  'position_price_short': 3426.0,
  'position_cost_long': 34340.0,
  'position_cost_short': 34260.0,
  'last_price': 3438.0,
  'float_profit_long': 40.0,
  'float_profit_short': -120.0,
  'float_profit': -80.0,
  'position_profit_long': 40.0,
  'position_profit_short': -120.0,
  'position_profit': -80.0,
  'margin_long': 2736.0,
  'margin_short': 2736.0,
  'margin': 5472.0}}
yutiansut commented 5 years ago

流计算概念/ 实时模拟盘策略/ papertrading

import QAPUBSUB
import QUANTAXIS as QA
from QAPUBSUB.producer import publisher, publisher_routing
from QAPUBSUB.consumer import subscriber, subscriber_routing
user = QA.QA_User(username ='admin', password = 'admin')
port = user.new_portfolio('x1')
acc = port.new_account('test_realtime', market_type=QA.MARKET_TYPE.FUTURE_CN, init_cash=100000)

from QAPUBSUB import producer
import json
p = producer.publisher_routing(
    user='admin', password='admin',exchange='QAORDER_ROUTER')

def buy_open(acc, code, price, towards):
    p.pub(json.dumps({
        'topic': 'sendorder',
        'account_cookie': acc,
        'strategy_id': 'test',
        'code': 'rb2001',
        'price': 3400,
        'order_direction': 'SELL',
        'order_offset': 'CLOSETODAY',
        'volume':1,
        'order_time': str(datetime.datetime.now()),
        'exchange_id': 'SHFE'
    }), routing_key=acc)

sub = subscriber(exchange='realtime_5min_rb2001')
import threading

market_data = []

import json
import pandas as pd
def on_data(a,b,c,data):
    '修改订阅者的回调函数'

    print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!on callback data')
    lastest_data = json.loads(str(data, encoding='utf-8'))
    print(lastest_data['datetime'][0:16])
    dt = None
    if dt != lastest_data['datetime'][0:16] or len(market_data) < 1:
        dt = lastest_data['datetime'][0:16]
        print('append')
        market_data.append(lastest_data)
    else:
        market_data[-1] = lastest_data

    bar =lastest_data
    market_data.append(bar)
    #print(market_data)
    print('receive data')
    x1 =pd.DataFrame(market_data)

    ind = QA.QA_indicator_MA(x1, 2,4)

    #print(ind)
    try:
        if ind.iloc[-1]['MA2']> ind.iloc[-1]['MA4']:
            print('signal ==> buy')

            if acc.hold_available.get('RB2001',0) ==0:
                #acc.send_order()
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price = bar['close'],
                    trade_amount =1 ,
                    trade_towards=QA.ORDER_DIRECTION.BUY_OPEN,
                    trade_time=bar['datetime'])
                acc.save()

            elif acc.hold_available.get('RB2001',0)>0:
                #acc.send_order()
                print('alread buyopen')
            elif acc.hold_available.get('RB2001',0) <0:
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price = bar['close'],
                    trade_amount =1 ,
                    trade_towards=QA.ORDER_DIRECTION.BUY_CLOSE,
                    trade_time=bar['datetime'])
                acc.save()

        if ind.iloc[-1]['MA2']< ind.iloc[-1]['MA4']:
            print('signal ==> sell')

            if acc.hold_available.get('RB2001',0) ==0:
                #acc.send_order()
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price = bar['close'],
                    trade_amount =1 ,
                    trade_towards=QA.ORDER_DIRECTION.SELL_OPEN,
                    trade_time=bar['datetime'])
                acc.save()

            elif acc.hold_available.get('RB2001',0)>0:
                #acc.send_order()
                acc.receive_simpledeal(
                    code=bar['code'],
                    trade_price = bar['close'],
                    trade_amount =1 ,
                    trade_towards=QA.ORDER_DIRECTION.SELL_CLOSE,
                    trade_time=bar['datetime'])
                acc.save()
            elif acc.hold_available.get('RB2001',0) <0:
                print('alread sellopen')
    except:
        pass
sub.callback = on_data

threading.Thread(target=sub.start).start()
yutiansut commented 5 years ago

更新一个群友的安装心得:

我部署docker版的心得:

1确保主板开启虚拟化支持(vt),开启CPU虚拟化,打开任务管理器查看性能,是否显示处理器项,有虚拟化 

2下载docker,群文件就有,无脑安装,启动docker  

3显示docker is runing,说明docker已经跑起来了 

4.下载quantaxis/docker/qa-service下的docker配置脚本文件(docker-compose.yaml),不会下载就github上打开那个文件,复制张贴到记事本里保存,改名成一样的 

5到命令行下cmd窗口,输入docker volume create qamg  回车   再输入docker volume create qacode 回车  再输入docker-compose up -d 回车 (发现已经搞定了,docker ps查看容器是否跑起) 

6浏览器输入,localhost:81,出现web前端界面

---一柱擎天xinan