├── .ipynb_checkpoints ├── Untitled-checkpoint.ipynb ├── midclass教程-下-Copy1-checkpoint.ipynb ├── midclass教程-下-checkpoint.ipynb ├── 做市策略入门-checkpoint.ipynb ├── 做市策略入门(2)-checkpoint.ipynb ├── 做市策略入门(3)-checkpoint.ipynb ├── 做市策略入门(备份)-checkpoint.ipynb ├── 写一个均仓策略- 下-checkpoint.ipynb ├── 写一个均仓策略-checkpoint.ipynb ├── 开始写策略量化教程-checkpoint.ipynb ├── 教程-checkpoint.ipynb ├── 趋势类策略入门- 4-checkpoint.ipynb ├── 趋势类策略入门-2-checkpoint.ipynb ├── 趋势类策略入门-3-checkpoint.ipynb └── 趋势类策略入门-checkpoint.ipynb ├── README.md ├── Untitled.ipynb ├── mid_class_example.py ├── midclass教程-下-Copy1.ipynb ├── midclass教程-下.ipynb ├── midclass教程.ipynb ├── 做市策略入门.ipynb ├── 做市策略入门(2).ipynb ├── 做市策略入门(3).ipynb ├── 做市策略入门(备份).ipynb ├── 写一个均仓策略- 下.ipynb ├── 写一个均仓策略.ipynb ├── 开始写策略量化教程.ipynb ├── 教程.ipynb ├── 趋势类策略入门- 4.ipynb ├── 趋势类策略入门-2.ipynb ├── 趋势类策略入门-3.ipynb └── 趋势类策略入门.ipynb /.ipynb_checkpoints/Untitled-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/midclass教程-下-Copy1-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 1.我们需要获取数据,但不需要一直获取数据\n", 8 | "## 2.我们需要做容错\n", 9 | "## 3.一些数据的处理不需要放在逻辑层里" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def _init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | } 177 | ], 178 | "metadata": { 179 | "kernelspec": { 180 | "display_name": "Python [conda env:py37]", 181 | "language": "python", 182 | "name": "conda-env-py37-py" 183 | }, 184 | "language_info": { 185 | "codemirror_mode": { 186 | "name": "ipython", 187 | "version": 3 188 | }, 189 | "file_extension": ".py", 190 | "mimetype": "text/x-python", 191 | "name": "python", 192 | "nbconvert_exporter": "python", 193 | "pygments_lexer": "ipython3", 194 | "version": "3.5.4" 195 | } 196 | }, 197 | "nbformat": 4, 198 | "nbformat_minor": 2 199 | } 200 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/midclass教程-下-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 1.我们需要获取数据,但不需要一直获取数据\n", 8 | "## 2.我们需要做容错\n", 9 | "## 3.一些数据的处理不需要放在逻辑层里" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def _init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | } 177 | ], 178 | "metadata": { 179 | "kernelspec": { 180 | "display_name": "Python [conda env:py37]", 181 | "language": "python", 182 | "name": "conda-env-py37-py" 183 | }, 184 | "language_info": { 185 | "codemirror_mode": { 186 | "name": "ipython", 187 | "version": 3 188 | }, 189 | "file_extension": ".py", 190 | "mimetype": "text/x-python", 191 | "name": "python", 192 | "nbconvert_exporter": "python", 193 | "pygments_lexer": "ipython3", 194 | "version": "3.5.4" 195 | } 196 | }, 197 | "nbformat": 4, 198 | "nbformat_minor": 2 199 | } 200 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/做市策略入门-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 做市策略\n", 8 | "### 1、对敲做量\n", 9 | "### 2、盘口高频吃利润\n", 10 | "### 3、缓步先买后卖抬高品种价格\n", 11 | "### 4、缓步先卖后买拉低品种价格" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "ename": "NameError", 21 | "evalue": "name 'PERIOD_M5' is not defined", 22 | "output_type": "error", 23 | "traceback": [ 24 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 25 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 26 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m '''\n\u001b[0;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 27 | "\u001b[1;32m\u001b[0m in \u001b[0;36mmid_class\u001b[1;34m()\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 87\u001b[1;33m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 88\u001b[0m '''\n\u001b[0;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 28 | "\u001b[1;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "class mid_class():\n", 34 | " def __init__(self, this_exchange):\n", 35 | " '''\n", 36 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 37 | " 设定好密钥……\n", 38 | " \n", 39 | " Args:\n", 40 | " this_exchange: FMZ的交易所结构\n", 41 | " \n", 42 | " '''\n", 43 | " self.init_timestamp = time.time()\n", 44 | " self.exchange = this_exchange\n", 45 | " self.name = self.exchange.GetName()\n", 46 | " self.jyd = self.exchange.GetCurrency() \n", 47 | " \n", 48 | " def get_account(self):\n", 49 | " '''\n", 50 | " 获取账户信息\n", 51 | " \n", 52 | " Returns:\n", 53 | " 获取信息成功返回True,获取信息失败返回False\n", 54 | " '''\n", 55 | " self.Balance = '---'\n", 56 | " self.Amount = '---'\n", 57 | " self.FrozenBalance = '---'\n", 58 | " self.FrozenStocks = '---'\n", 59 | " \n", 60 | " try:\n", 61 | " self.account = self.exchange.GetAccount()\n", 62 | "\n", 63 | " self.Balance = self.account['Balance']\n", 64 | " self.Amount = self.account['Stocks']\n", 65 | " self.FrozenBalance = self.account['FrozenBalance']\n", 66 | " self.FrozenStocks = self.account['FrozenStocks']\n", 67 | " return True\n", 68 | " except:\n", 69 | " return False\n", 70 | " \n", 71 | " def get_ticker(self):\n", 72 | " '''\n", 73 | " 获取市价信息\n", 74 | " \n", 75 | " Returns:\n", 76 | " 获取信息成功返回True,获取信息失败返回False\n", 77 | " '''\n", 78 | " self.high = '---'\n", 79 | " self.low = '---'\n", 80 | " self.Sell = '---'\n", 81 | " self.Buy = '---'\n", 82 | " self.last = '---'\n", 83 | " self.Volume = '---'\n", 84 | " \n", 85 | " try:\n", 86 | " self.ticker = self.exchange.GetTicker()\n", 87 | " \n", 88 | " self.high = self.ticker['High']\n", 89 | " self.low = self.ticker['Low']\n", 90 | " self.Sell = self.ticker['Sell']\n", 91 | " self.Buy = self.ticker['Buy']\n", 92 | " self.last = self.ticker['Last']\n", 93 | " self.Volume = self.ticker['Volume']\n", 94 | " return True\n", 95 | " except:\n", 96 | " return False\n", 97 | " \n", 98 | " \n", 99 | " def get_depth(self):\n", 100 | " '''\n", 101 | " 获取深度信息\n", 102 | " \n", 103 | " Returns:\n", 104 | " 获取信息成功返回True,获取信息失败返回False\n", 105 | " '''\n", 106 | " self.Ask = '---'\n", 107 | " self.Bids = '---'\n", 108 | " \n", 109 | " try:\n", 110 | " self.Depth = self.exchange.GetDepth()\n", 111 | " self.Ask = self.Depth['Asks']\n", 112 | " self.Bids = self.Depth ['Bids']\n", 113 | " return True\n", 114 | " except:\n", 115 | " return False\n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 120 | " '''\n", 121 | " 获取K线信息\n", 122 | " \n", 123 | " Args:\n", 124 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 125 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 126 | " '''\n", 127 | " self.ohlc_data = exchange.GetRecords(period)\n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " def create_order(self, order_type, price, amount):\n", 132 | " '''\n", 133 | " post一个挂单信息\n", 134 | " \n", 135 | " Args:\n", 136 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 137 | " price:挂单价格\n", 138 | " amount:挂单数量\n", 139 | " \n", 140 | " Returns:\n", 141 | " 挂单Id号,可用以取消挂单\n", 142 | " '''\n", 143 | " if order_type == 'buy':\n", 144 | " try:\n", 145 | " order_id = self.exchange.Buy( price, amount)\n", 146 | " except:\n", 147 | " return False\n", 148 | " \n", 149 | " elif order_type == 'sell':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Sell( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " return order_id\n", 156 | " \n", 157 | " def get_orders(self):\n", 158 | " self.undo_ordes = self.exchange.GetOrders()\n", 159 | " return self.undo_ordes\n", 160 | " \n", 161 | " def cancel_order(self, order_id):\n", 162 | " '''\n", 163 | " 取消一个挂单信息\n", 164 | " \n", 165 | " Args:\n", 166 | " order_id:希望取消的挂单ID号\n", 167 | " \n", 168 | " Returns:\n", 169 | " 取消挂单成功返回True,取消挂单失败返回False\n", 170 | " '''\n", 171 | " return self.exchange.CancelOrder(order_id)\n", 172 | " \n", 173 | " def refreash_data(self):\n", 174 | " '''\n", 175 | " 刷新信息\n", 176 | " \n", 177 | " Returns:\n", 178 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 179 | " '''\n", 180 | "\n", 181 | " if not self.get_account():\n", 182 | " return 'false_get_account'\n", 183 | " \n", 184 | " if not self.get_ticker():\n", 185 | " return 'false_get_ticker'\n", 186 | " if not self.get_depth():\n", 187 | " return 'false_get_depth'\n", 188 | " try:\n", 189 | " self.get_ohlc_data()\n", 190 | " except:\n", 191 | " return 'false_get_K_line_info'\n", 192 | " \n", 193 | " return 'refreash_data_finish!'\n" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 5, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "class zuoshi():\n", 203 | " def __init__(self, mid_class, amount_N, price_N):\n", 204 | " self.jys = mid_class\n", 205 | " self.done_amount = 0\n", 206 | " self.init_time = time.time()\n", 207 | " self.last_time = time.time()\n", 208 | " self.amount_N = amount_N\n", 209 | " self.price_N = price_N\n", 210 | " \n", 211 | " def trade_duiqiao(self, trade_dict):\n", 212 | " \n", 213 | " self.jys.create_order( 'buy', trade_dict['price'] , trade_dict['amount'] ) \n", 214 | " self.jys.create_order( 'sell',trade_dict['price'] , trade_dict['amount'] ) \n", 215 | " self.done_amount += trade_dict['amount']\n", 216 | " self.last_time = time.time()\n", 217 | " \n", 218 | " def make_duiqiao_trade_dict(self, set_amount, every_time_amount):\n", 219 | " self.jys.refreash_data()\n", 220 | " \n", 221 | " trade_price = ( self.jys.Sell + self.jys.Buy )/2\n", 222 | " trade_price = round(trade_price, self.price_N)\n", 223 | " if trade_price > self.jys.Buy and trade_price< self.jys.Sell: \n", 224 | " self.B = self.jys.Amount\n", 225 | " self.money = self.jys.Balance\n", 226 | " self.can_buy_B = self.money/ trade_price\n", 227 | " do_trade = self.B > every_time_amount\n", 228 | " do_trade = do_trade and self.can_buy_B > every_time_amount\n", 229 | " trade_dict = {'do_trade':do_trade,\n", 230 | " 'price': trade_price,\n", 231 | " 'amount':every_time_amount }\n", 232 | " return trade_dict\n", 233 | " \n", 234 | " def deal_with_frozen(self):\n", 235 | " undo_orders = self.jys.get_orders()\n", 236 | " if len( undo_orders) > 0:\n", 237 | " for i in undo_orders:\n", 238 | " self.jys.cancel_order(i['Id'])\n" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [ 247 | "def main():\n", 248 | " Set_amount_N = 4\n", 249 | " Set_price_N = 4\n", 250 | " set_amount = 10\n", 251 | " every_time_amount = 0.1\n", 252 | " \n", 253 | " test_mid = mid_class(exchange)\n", 254 | " Log(test_mid.refreash_data())\n", 255 | " test_duiqiao = zuoshi(test_mid, Set_amount_N, Set_price_N)\n", 256 | " \n", 257 | " while(test_duiqiao.done_amount < set_amount):\n", 258 | " test_duiqiao.deal_with_frozen()\n", 259 | " Sleep(1000)\n", 260 | " trade_dict = test_duiqiao.make_duiqiao_trade_dict(set_amount, every_time_amount)\n", 261 | " if trade_dict['do_trade']:\n", 262 | " test_duiqiao.trade_duiqiao( trade_dict )\n", 263 | " \n", 264 | " Log(test_duiqiao.done_amount)\n", 265 | " Log(test_duiqiao.B)" 266 | ] 267 | } 268 | ], 269 | "metadata": { 270 | "kernelspec": { 271 | "display_name": "Python [conda env:py37]", 272 | "language": "python", 273 | "name": "conda-env-py37-py" 274 | }, 275 | "language_info": { 276 | "codemirror_mode": { 277 | "name": "ipython", 278 | "version": 3 279 | }, 280 | "file_extension": ".py", 281 | "mimetype": "text/x-python", 282 | "name": "python", 283 | "nbconvert_exporter": "python", 284 | "pygments_lexer": "ipython3", 285 | "version": "3.5.4" 286 | } 287 | }, 288 | "nbformat": 4, 289 | "nbformat_minor": 2 290 | } 291 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/做市策略入门(2)-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 1、写盘口高频策略\n", 8 | "### 2、把对敲与盘口高频整合到一起" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "### 盘口高频为何能有盈利空间\n", 16 | "- 1、市场上有人急着买,有人急着卖,急着买的买的和急着卖的差价就可以被你吃到\n", 17 | "- 2、市场存在微小的价格波动,类似于网格吃波动可以吃到利润" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "ename": "NameError", 27 | "evalue": "name 'PERIOD_M5' is not defined", 28 | "output_type": "error", 29 | "traceback": [ 30 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 31 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 32 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m '''\n\u001b[0;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 33 | "\u001b[1;32m\u001b[0m in \u001b[0;36mmid_class\u001b[1;34m()\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 87\u001b[1;33m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 88\u001b[0m '''\n\u001b[0;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 34 | "\u001b[1;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "class mid_class():\n", 40 | " def __init__(self, this_exchange):\n", 41 | " '''\n", 42 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 43 | " 设定好密钥……\n", 44 | " \n", 45 | " Args:\n", 46 | " this_exchange: FMZ的交易所结构\n", 47 | " \n", 48 | " '''\n", 49 | " self.init_timestamp = time.time()\n", 50 | " self.exchange = this_exchange\n", 51 | " self.name = self.exchange.GetName()\n", 52 | " self.jyd = self.exchange.GetCurrency() \n", 53 | " \n", 54 | " def get_account(self):\n", 55 | " '''\n", 56 | " 获取账户信息\n", 57 | " \n", 58 | " Returns:\n", 59 | " 获取信息成功返回True,获取信息失败返回False\n", 60 | " '''\n", 61 | " self.Balance = '---'\n", 62 | " self.Amount = '---'\n", 63 | " self.FrozenBalance = '---'\n", 64 | " self.FrozenStocks = '---'\n", 65 | " \n", 66 | " try:\n", 67 | " self.account = self.exchange.GetAccount()\n", 68 | "\n", 69 | " self.Balance = self.account['Balance']\n", 70 | " self.Amount = self.account['Stocks']\n", 71 | " self.FrozenBalance = self.account['FrozenBalance']\n", 72 | " self.FrozenStocks = self.account['FrozenStocks']\n", 73 | " return True\n", 74 | " except:\n", 75 | " return False\n", 76 | " \n", 77 | " def get_ticker(self):\n", 78 | " '''\n", 79 | " 获取市价信息\n", 80 | " \n", 81 | " Returns:\n", 82 | " 获取信息成功返回True,获取信息失败返回False\n", 83 | " '''\n", 84 | " self.high = '---'\n", 85 | " self.low = '---'\n", 86 | " self.Sell = '---'\n", 87 | " self.Buy = '---'\n", 88 | " self.last = '---'\n", 89 | " self.Volume = '---'\n", 90 | " \n", 91 | " try:\n", 92 | " self.ticker = self.exchange.GetTicker()\n", 93 | " \n", 94 | " self.high = self.ticker['High']\n", 95 | " self.low = self.ticker['Low']\n", 96 | " self.Sell = self.ticker['Sell']\n", 97 | " self.Buy = self.ticker['Buy']\n", 98 | " self.last = self.ticker['Last']\n", 99 | " self.Volume = self.ticker['Volume']\n", 100 | " return True\n", 101 | " except:\n", 102 | " return False\n", 103 | " \n", 104 | " \n", 105 | " def get_depth(self):\n", 106 | " '''\n", 107 | " 获取深度信息\n", 108 | " \n", 109 | " Returns:\n", 110 | " 获取信息成功返回True,获取信息失败返回False\n", 111 | " '''\n", 112 | " self.Ask = '---'\n", 113 | " self.Bids = '---'\n", 114 | " \n", 115 | " try:\n", 116 | " self.Depth = self.exchange.GetDepth()\n", 117 | " self.Ask = self.Depth['Asks']\n", 118 | " self.Bids = self.Depth ['Bids']\n", 119 | " return True\n", 120 | " except:\n", 121 | " return False\n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 126 | " '''\n", 127 | " 获取K线信息\n", 128 | " \n", 129 | " Args:\n", 130 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 131 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 132 | " '''\n", 133 | " self.ohlc_data = exchange.GetRecords(period)\n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " def create_order(self, order_type, price, amount):\n", 138 | " '''\n", 139 | " post一个挂单信息\n", 140 | " \n", 141 | " Args:\n", 142 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 143 | " price:挂单价格\n", 144 | " amount:挂单数量\n", 145 | " \n", 146 | " Returns:\n", 147 | " 挂单Id号,可用以取消挂单\n", 148 | " '''\n", 149 | " if order_type == 'buy':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Buy( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " elif order_type == 'sell':\n", 156 | " try:\n", 157 | " order_id = self.exchange.Sell( price, amount)\n", 158 | " except:\n", 159 | " return False\n", 160 | " \n", 161 | " return order_id\n", 162 | " \n", 163 | " def get_orders(self):\n", 164 | " self.undo_ordes = self.exchange.GetOrders()\n", 165 | " return self.undo_ordes\n", 166 | " \n", 167 | " def cancel_order(self, order_id):\n", 168 | " '''\n", 169 | " 取消一个挂单信息\n", 170 | " \n", 171 | " Args:\n", 172 | " order_id:希望取消的挂单ID号\n", 173 | " \n", 174 | " Returns:\n", 175 | " 取消挂单成功返回True,取消挂单失败返回False\n", 176 | " '''\n", 177 | " return self.exchange.CancelOrder(order_id)\n", 178 | " \n", 179 | " def refreash_data(self):\n", 180 | " '''\n", 181 | " 刷新信息\n", 182 | " \n", 183 | " Returns:\n", 184 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 185 | " '''\n", 186 | "\n", 187 | " if not self.get_account():\n", 188 | " return 'false_get_account'\n", 189 | " \n", 190 | " if not self.get_ticker():\n", 191 | " return 'false_get_ticker'\n", 192 | " if not self.get_depth():\n", 193 | " return 'false_get_depth'\n", 194 | " try:\n", 195 | " self.get_ohlc_data()\n", 196 | " except:\n", 197 | " return 'false_get_K_line_info'\n", 198 | " \n", 199 | " return 'refreash_data_finish!'\n" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 5, 205 | "metadata": {}, 206 | "outputs": [], 207 | "source": [ 208 | "class zuoshi():\n", 209 | " def __init__(self, mid_class, amount_N, price_N):\n", 210 | " self.jys = mid_class\n", 211 | " self.done_amount = {'pan_kou':0, 'dui_qiao':0}\n", 212 | " self.init_time = time.time()\n", 213 | " self.last_time = time.time()\n", 214 | " self.amount_N = amount_N\n", 215 | " self.price_N = price_N\n", 216 | " self.wait_time = 60\n", 217 | " \n", 218 | " self.traded_pair = {'pan_kou':[], 'dui_qiao':[]}\n", 219 | " self.undo_state = []\n", 220 | " self.had_gua_times = 0\n", 221 | " \n", 222 | " def refreash_data(self):\n", 223 | " \n", 224 | " self.jys.refreash_data()\n", 225 | " self.B = self.jys.Amount\n", 226 | " self.money = self.jys.Balance\n", 227 | " self.can_buy_B = self.money/ self.jys.Buy\n", 228 | " self.mid_price = ( self.jys.Sell + self.jys.Buy )/2\n", 229 | " \n", 230 | " return \n", 231 | " \n", 232 | " \n", 233 | " def make_trade_by_dict(self, trade_dicts):\n", 234 | " for trade_dict in trade_dicts:\n", 235 | " if trade_dict['do_trade']:\n", 236 | " buy_id = self.jys.create_order( 'buy', trade_dict['buy_price'] , trade_dict['amount'] ) \n", 237 | " sell_id = self.jys.create_order( 'sell',trade_dict['sell_price'] , trade_dict['amount'] ) \n", 238 | " \n", 239 | " if trade_dict['buy_price'] == trade_dict['sell_price']:\n", 240 | " self.done_amount['dui_qiao'] += trade_dict['amount']\n", 241 | " self.traded_pair['dui_qiao'].append({'buy_id': buy_id, 'sell_id': sell_id, 'init_time':time.time(),'amount':trade_dict['amount'] })\n", 242 | " else:\n", 243 | " \n", 244 | " self.traded_pair['pan_kou'].append({'buy_id': buy_id, 'sell_id': sell_id, 'init_time':time.time(),'amount':trade_dict['amount'] })\n", 245 | " \n", 246 | " self.last_time = time.time()\n", 247 | " \n", 248 | " def make_duiqiao_trade_dict(self, set_amount, every_time_amount):\n", 249 | " \n", 250 | " trade_price = self.mid_price\n", 251 | " trade_price = round(trade_price, self.price_N)\n", 252 | " \n", 253 | " if trade_price > self.jys.Buy and trade_price< self.jys.Sell: \n", 254 | " do_trade = self.B > every_time_amount\n", 255 | " do_trade = do_trade and self.can_buy_B > every_time_amount\n", 256 | " trade_dict = {'do_trade':do_trade,\n", 257 | " 'buy_price': trade_price,\n", 258 | " 'sell_price':trade_price,\n", 259 | " 'amount':every_time_amount }\n", 260 | " \n", 261 | " return [trade_dict]\n", 262 | " \n", 263 | " def deal_with_frozen(self):\n", 264 | " undo_orders = self.jys.get_orders()\n", 265 | " if len( undo_orders) > 0:\n", 266 | " for i in undo_orders:\n", 267 | " self.jys.cancel_order(i['Id'])\n", 268 | " \n", 269 | " def make_pankou_dict(self, price_range , min_price_len, every_time_amount ):\n", 270 | " mid_price = self.mid_price\n", 271 | " \n", 272 | " price_alpha = price_range - self.had_gua_times * min_price_len\n", 273 | " do_dict = price_alpha> 0\n", 274 | " if do_dict:\n", 275 | " \n", 276 | " buy_price = mid_price - price_alpha\n", 277 | " buy_price = round(buy_price, self.price_N)\n", 278 | " can_buy_B = self.money/buy_price\n", 279 | " \n", 280 | " sell_price = mid_price + price_alpha\n", 281 | " sell_price = round(sell_price, self.price_N)\n", 282 | "\n", 283 | "\n", 284 | " do_dict = do_dict and self.B > every_time_amount\n", 285 | " do_dict = do_dict and can_buy_B > every_time_amount\n", 286 | "\n", 287 | " amount = every_time_amount\n", 288 | "\n", 289 | " trade_dict = { 'do_trade':do_dict,\n", 290 | " 'buy_price': buy_price,\n", 291 | " 'sell_price':sell_price,\n", 292 | " 'amount':every_time_amount }\n", 293 | " return [trade_dict]\n", 294 | " else:\n", 295 | " self.had_gua_times = 0\n", 296 | " \n", 297 | " def check_if_traded( self , now_times):\n", 298 | " for traded_id in self.traded_pair['pan_kou']:\n", 299 | " try:\n", 300 | " this_buy_state = self.jys.exchange.GetOrder(traded_id['buy_id'])\n", 301 | " except:\n", 302 | " self.jys.cancel_order( traded_id['sell_id'] )\n", 303 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 304 | " try:\n", 305 | " this_sell_state = self.jys.exchange.GetOrder(traded_id['sell_id'])\n", 306 | " except:\n", 307 | " self.jys.cancel_order( traded_id['buy_id'] )\n", 308 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 309 | " \n", 310 | " \n", 311 | " if { this_sell_state['Status'], this_buy_state['Status'] } == {0, 0}:\n", 312 | " if now_times% 50 ==0 :\n", 313 | " Log(this_buy_state['Status'], this_sell_state['Status'], now_times% 50 )\n", 314 | "# if ( time.time() - traded_id['init_time'] )/1000/60 > self.wait_time:\n", 315 | " self.jys.cancel_order( traded_id['buy_id'] )\n", 316 | " self.jys.cancel_order( traded_id['sell_id'] )\n", 317 | " self.had_gua_times += 0\n", 318 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 319 | "\n", 320 | " elif {this_sell_state['Status'], this_buy_state['Status'] } == { 1, 0}:\n", 321 | " if now_times% 50 ==0 :\n", 322 | " Log(this_buy_state['Status'], this_sell_state['Status'], now_times% 50 )\n", 323 | "# if ( time.time() - traded_id['init_time'] )/1000/60 > self.wait_time:\n", 324 | " if this_buy_state['Status'] == 'ORDER_STATE_PENDING':\n", 325 | " self.jys.cancel_order( traded_id['buy_id'] )\n", 326 | " self.undo_state.append(['buy', this_buy_state['Status']])\n", 327 | " self.traded_pair['pan_kou'].remove( self.traded_id )\n", 328 | " elif this_sell_state['Status'] == 'ORDER_STATE_PENDING':\n", 329 | " self.jys.cancel_order( traded_id['sell_id'] )\n", 330 | " self.undo_state.append(['sell', this_sell_state['Status']])\n", 331 | " self.traded_pair['pan_kou'].remove( self.traded_id )\n", 332 | " \n", 333 | " elif {this_sell_state['Status'], this_buy_state['Status'] } == {1,1}:\n", 334 | " Log(this_buy_state['Status'], this_sell_state['Status'], traded_id['amount'] )\n", 335 | " self.done_amount['pan_kou'] += traded_id['amount'] \n", 336 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 337 | " else:\n", 338 | " Log(this_buy_state,this_sell_state)\n", 339 | " Log('2id:',this_buy_state['Status'], this_sell_state['Status'] )\n", 340 | " Log(traded_id)\n", 341 | " \n" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": null, 347 | "metadata": {}, 348 | "outputs": [], 349 | "source": [ 350 | "def main():\n", 351 | " \n", 352 | " times = 0\n", 353 | " \n", 354 | " Set_amount_N = 4\n", 355 | " Set_price_N = 4\n", 356 | " set_amount = 10\n", 357 | " \n", 358 | " price_range = 50\n", 359 | " min_price_len = 1\n", 360 | " every_time_amount = 0.01\n", 361 | " \n", 362 | " test_mid = mid_class(exchange)\n", 363 | " Log(test_mid.refreash_data())\n", 364 | " test_zuoshi = zuoshi(test_mid, Set_amount_N, Set_price_N)\n", 365 | " \n", 366 | " while( test_zuoshi.done_amount['pan_kou'] < set_amount):\n", 367 | " \n", 368 | " test_zuoshi.check_if_traded(times)\n", 369 | " Sleep(1000)\n", 370 | " test_zuoshi.refreash_data()\n", 371 | " \n", 372 | " if len( test_zuoshi.traded_pair['pan_kou'] ) < 1:\n", 373 | " trade_dicts = test_zuoshi.make_pankou_dict( price_range , min_price_len, every_time_amount )\n", 374 | " \n", 375 | " test_zuoshi.make_trade_by_dict( trade_dicts )\n", 376 | " Log( test_zuoshi.done_amount['pan_kou'] )\n", 377 | " \n", 378 | " times += 1\n", 379 | " \n", 380 | " Log( test_zuoshi.B, test_zuoshi.can_buy_B)\n" 381 | ] 382 | } 383 | ], 384 | "metadata": { 385 | "kernelspec": { 386 | "display_name": "Python [conda env:py37]", 387 | "language": "python", 388 | "name": "conda-env-py37-py" 389 | }, 390 | "language_info": { 391 | "codemirror_mode": { 392 | "name": "ipython", 393 | "version": 3 394 | }, 395 | "file_extension": ".py", 396 | "mimetype": "text/x-python", 397 | "name": "python", 398 | "nbconvert_exporter": "python", 399 | "pygments_lexer": "ipython3", 400 | "version": "3.5.4" 401 | } 402 | }, 403 | "nbformat": 4, 404 | "nbformat_minor": 2 405 | } 406 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/写一个均仓策略- 下-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 1、写一个均仓策略\n", 8 | "# 2、如何debug\n", 9 | "# 3、如何使用FMZ(botvs)的回测" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def __init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 3, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "class juncang_class():\n", 184 | " def __init__(self, mid_class):\n", 185 | " self.jys = mid_class\n", 186 | " self.last_time = time.time()\n", 187 | " self.last_trade_price = self.jys.last\n", 188 | " self.Buy_count = 0\n", 189 | " self.Sell_count = 0\n", 190 | " \n", 191 | " def make_need_account_info(self):\n", 192 | " self.jys.refreash_data()\n", 193 | " self.B = self.jys.Amount\n", 194 | " self.money = self.jys.Balance\n", 195 | " now_price = self.jys.last\n", 196 | " \n", 197 | " self.total_money = self.B* now_price + self.money\n", 198 | " self.half_money = self.total_money/2\n", 199 | " self.need_buy = (self.half_money - self.B*now_price )/now_price\n", 200 | " self.need_sell = (self.half_money - self.money)/now_price\n", 201 | " \n", 202 | " def do_juncang(self):\n", 203 | " if self.need_buy > 0.001:\n", 204 | " self.jys.create_order( 'buy', self.jys.low , self.need_buy ) \n", 205 | " self.Buy_count +=1\n", 206 | " elif self.need_sell > 0.001:\n", 207 | " self.jys.create_order( 'sell', self.jys.high , self.need_sell ) \n", 208 | " self.Sell_count += 1\n", 209 | " \n", 210 | " Log('Buy_times:',self.Buy_count , 'Sell_times:', self.Sell_count)\n", 211 | " \n", 212 | " \n", 213 | " def if_need_trade(self, condition, prama):\n", 214 | " if condition == 'time':\n", 215 | " if time.time() - self.last_time > prama:\n", 216 | " self.do_juncang()\n", 217 | " self.last_time = time.time()\n", 218 | " if condition == 'price':\n", 219 | " if abs((self.jys.last - self.last_trade_price)/self.last_trade_price) > prama:\n", 220 | " self.do_juncang()\n", 221 | " self.last_trade_price = self.jys.last" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 4, 227 | "metadata": {}, 228 | "outputs": [], 229 | "source": [ 230 | "def main():\n", 231 | " test_mid = mid_class(exchange)\n", 232 | " Log(test_mid.refreash_data())\n", 233 | " test_juncang = juncang_class(test_mid)\n", 234 | " \n", 235 | " while(True):\n", 236 | " Sleep(1000)\n", 237 | " test_juncang.make_need_account_info()\n", 238 | " test_juncang.if_need_trade('price', 0.05)" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [ 247 | "1 1000 --- 1000" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 5, 253 | "metadata": {}, 254 | "outputs": [ 255 | { 256 | "data": { 257 | "text/plain": [ 258 | "1.5" 259 | ] 260 | }, 261 | "execution_count": 5, 262 | "metadata": {}, 263 | "output_type": "execute_result" 264 | } 265 | ], 266 | "source": [ 267 | "0.75 + 1500 ---- 2000" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": 8, 273 | "metadata": {}, 274 | "outputs": [ 275 | { 276 | "data": { 277 | "text/plain": [ 278 | "1125" 279 | ] 280 | }, 281 | "execution_count": 8, 282 | "metadata": {}, 283 | "output_type": "execute_result" 284 | } 285 | ], 286 | "source": [ 287 | "1.125 1125 --- 1000" 288 | ] 289 | }, 290 | { 291 | "cell_type": "code", 292 | "execution_count": null, 293 | "metadata": {}, 294 | "outputs": [], 295 | "source": [] 296 | }, 297 | { 298 | "cell_type": "code", 299 | "execution_count": null, 300 | "metadata": {}, 301 | "outputs": [], 302 | "source": [ 303 | "1 1000 --- 1000" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": null, 309 | "metadata": {}, 310 | "outputs": [], 311 | "source": [ 312 | "1.5 750 ---- 500" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": null, 318 | "metadata": {}, 319 | "outputs": [], 320 | "source": [ 321 | "1.5 750 ---- 200" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 4, 327 | "metadata": {}, 328 | "outputs": [ 329 | { 330 | "data": { 331 | "text/plain": [ 332 | "1050.0" 333 | ] 334 | }, 335 | "execution_count": 4, 336 | "metadata": {}, 337 | "output_type": "execute_result" 338 | } 339 | ], 340 | "source": [ 341 | "(1.5*200 + 750)" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 5, 347 | "metadata": {}, 348 | "outputs": [ 349 | { 350 | "data": { 351 | "text/plain": [ 352 | "1200" 353 | ] 354 | }, 355 | "execution_count": 5, 356 | "metadata": {}, 357 | "output_type": "execute_result" 358 | } 359 | ], 360 | "source": [ 361 | "1*200 + 1000" 362 | ] 363 | }, 364 | { 365 | "cell_type": "code", 366 | "execution_count": 3, 367 | "metadata": {}, 368 | "outputs": [ 369 | { 370 | "data": { 371 | "text/plain": [ 372 | "2.625" 373 | ] 374 | }, 375 | "execution_count": 3, 376 | "metadata": {}, 377 | "output_type": "execute_result" 378 | } 379 | ], 380 | "source": [ 381 | "2.625 525.0 ---- 200" 382 | ] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": {}, 387 | "source": [ 388 | "## 均仓策略 收益来源于价格一定范围内来回波动 风险来源于在执行操作之后,价格继续单边(上涨或下跌)" 389 | ] 390 | } 391 | ], 392 | "metadata": { 393 | "kernelspec": { 394 | "display_name": "Python [conda env:py37]", 395 | "language": "python", 396 | "name": "conda-env-py37-py" 397 | }, 398 | "language_info": { 399 | "codemirror_mode": { 400 | "name": "ipython", 401 | "version": 3 402 | }, 403 | "file_extension": ".py", 404 | "mimetype": "text/x-python", 405 | "name": "python", 406 | "nbconvert_exporter": "python", 407 | "pygments_lexer": "ipython3", 408 | "version": "3.5.4" 409 | } 410 | }, 411 | "nbformat": 4, 412 | "nbformat_minor": 2 413 | } 414 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/写一个均仓策略-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 1、写一个均仓策略\n", 8 | "# 2、如何debug\n", 9 | "# 3、如何使用FMZ(botvs)的回测" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def __init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 3, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "class juncang_class():\n", 184 | " def __init__(self, mid_class):\n", 185 | " self.jys = mid_class\n", 186 | " self.last_time = time.time()\n", 187 | " self.last_trade_price = self.jys.last\n", 188 | " \n", 189 | " def make_need_account_info(self):\n", 190 | " self.jys.refreash_data()\n", 191 | " self.B = self.jys.Amount\n", 192 | " self.money = self.jys.Balance\n", 193 | " now_price = self.jys.last\n", 194 | " \n", 195 | " self.total_money = self.B* now_price + self.money\n", 196 | " self.half_money = self.total_money/2\n", 197 | " self.need_buy = (self.half_money - self.B*now_price )/now_price\n", 198 | " self.need_sell = (self.half_money - self.money)/now_price\n", 199 | " \n", 200 | " def do_juncang(self):\n", 201 | " if self.need_buy > 0.001:\n", 202 | " self.jys.create_order( 'buy', self.jys.low , self.need_buy ) \n", 203 | " elif self.need_sell > 0.001:\n", 204 | " self.jys.create_order( 'sell', self.jys.high , self.need_sell ) \n", 205 | " \n", 206 | " \n", 207 | " def if_need_trade(self, condition, prama):\n", 208 | " if condition == 'time':\n", 209 | " if time.time() - self.last_time > prama:\n", 210 | " self.do_juncang()\n", 211 | " self.last_time = time.time()\n", 212 | " if condition == 'price':\n", 213 | " if abs((self.jys.last - self.last_trade_price)/self.last_trade_price) > prama:\n", 214 | " self.do_juncang()\n", 215 | " self.last_trade_price = self.jys.last" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 4, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "def main():\n", 225 | " test_mid = mid_class(exchange)\n", 226 | " Log(test_mid.refreash_data())\n", 227 | " test_juncang = juncang_class(test_mid)\n", 228 | " \n", 229 | " while(True):\n", 230 | " Sleep(1000)\n", 231 | " test_juncang.make_need_account_info()\n", 232 | " test_juncang.if_need_trade('price', 0.05)" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": null, 238 | "metadata": {}, 239 | "outputs": [], 240 | "source": [ 241 | "1 1000 --- 1000" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 5, 247 | "metadata": {}, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "text/plain": [ 252 | "1.5" 253 | ] 254 | }, 255 | "execution_count": 5, 256 | "metadata": {}, 257 | "output_type": "execute_result" 258 | } 259 | ], 260 | "source": [ 261 | "0.75 + 1500 ---- 2000" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 8, 267 | "metadata": {}, 268 | "outputs": [ 269 | { 270 | "data": { 271 | "text/plain": [ 272 | "1125" 273 | ] 274 | }, 275 | "execution_count": 8, 276 | "metadata": {}, 277 | "output_type": "execute_result" 278 | } 279 | ], 280 | "source": [ 281 | "1.125 1125 --- 1000" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": null, 287 | "metadata": {}, 288 | "outputs": [], 289 | "source": [] 290 | } 291 | ], 292 | "metadata": { 293 | "kernelspec": { 294 | "display_name": "Python [conda env:py37]", 295 | "language": "python", 296 | "name": "conda-env-py37-py" 297 | }, 298 | "language_info": { 299 | "codemirror_mode": { 300 | "name": "ipython", 301 | "version": 3 302 | }, 303 | "file_extension": ".py", 304 | "mimetype": "text/x-python", 305 | "name": "python", 306 | "nbconvert_exporter": "python", 307 | "pygments_lexer": "ipython3", 308 | "version": "3.5.4" 309 | } 310 | }, 311 | "nbformat": 4, 312 | "nbformat_minor": 2 313 | } 314 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/开始写策略量化教程-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 1.我们需要获取数据,但不需要一直获取数据\n", 8 | "## 2.我们需要做容错\n", 9 | "## 3.一些数据的处理不需要放在逻辑层里" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def _init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | } 177 | ], 178 | "metadata": { 179 | "kernelspec": { 180 | "display_name": "Python [conda env:py37]", 181 | "language": "python", 182 | "name": "conda-env-py37-py" 183 | }, 184 | "language_info": { 185 | "codemirror_mode": { 186 | "name": "ipython", 187 | "version": 3 188 | }, 189 | "file_extension": ".py", 190 | "mimetype": "text/x-python", 191 | "name": "python", 192 | "nbconvert_exporter": "python", 193 | "pygments_lexer": "ipython3", 194 | "version": "3.5.4" 195 | } 196 | }, 197 | "nbformat": 4, 198 | "nbformat_minor": 2 199 | } 200 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/教程-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/趋势类策略入门-2-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 趋势策略入门" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### 关键函数:\n", 15 | " - 1 交易函数(接收一个交易字典,包含交易价格,交易量,币种,交易方向等)\n", 16 | " - 2 持仓计算函数(根据仓位情况和风险设定,计算限制交易量以及交易价格)\n", 17 | " - 3 趋势条件计算函数(根据品种价格情况,判断是否执行交易,交易方向,交易量,以及交易价格)" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "ename": "NameError", 27 | "evalue": "name 'PERIOD_M5' is not defined", 28 | "output_type": "error", 29 | "traceback": [ 30 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 31 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 32 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m '''\n\u001b[1;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 33 | "\u001b[0;32m\u001b[0m in \u001b[0;36mmid_class\u001b[0;34m()\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 87\u001b[0;31m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 88\u001b[0m '''\n\u001b[1;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 34 | "\u001b[0;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "class mid_class():\n", 40 | " def __init__(self, this_exchange):\n", 41 | " '''\n", 42 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 43 | " 设定好密钥……\n", 44 | " \n", 45 | " Args:\n", 46 | " this_exchange: FMZ的交易所结构\n", 47 | " \n", 48 | " '''\n", 49 | " self.init_timestamp = time.time()\n", 50 | " self.exchange = this_exchange\n", 51 | " self.name = self.exchange.GetName()\n", 52 | " self.jyd = self.exchange.GetCurrency() \n", 53 | " \n", 54 | " def get_account(self):\n", 55 | " '''\n", 56 | " 获取账户信息\n", 57 | " \n", 58 | " Returns:\n", 59 | " 获取信息成功返回True,获取信息失败返回False\n", 60 | " '''\n", 61 | " self.Balance = '---'\n", 62 | " self.Amount = '---'\n", 63 | " self.FrozenBalance = '---'\n", 64 | " self.FrozenStocks = '---'\n", 65 | " \n", 66 | " try:\n", 67 | " self.account = self.exchange.GetAccount()\n", 68 | "\n", 69 | " self.Balance = self.account['Balance']\n", 70 | " self.Amount = self.account['Stocks']\n", 71 | " self.FrozenBalance = self.account['FrozenBalance']\n", 72 | " self.FrozenStocks = self.account['FrozenStocks']\n", 73 | " return True\n", 74 | " except:\n", 75 | " return False\n", 76 | " \n", 77 | " def get_ticker(self):\n", 78 | " '''\n", 79 | " 获取市价信息\n", 80 | " \n", 81 | " Returns:\n", 82 | " 获取信息成功返回True,获取信息失败返回False\n", 83 | " '''\n", 84 | " self.high = '---'\n", 85 | " self.low = '---'\n", 86 | " self.Sell = '---'\n", 87 | " self.Buy = '---'\n", 88 | " self.last = '---'\n", 89 | " self.Volume = '---'\n", 90 | " \n", 91 | " try:\n", 92 | " self.ticker = self.exchange.GetTicker()\n", 93 | " \n", 94 | " self.high = self.ticker['High']\n", 95 | " self.low = self.ticker['Low']\n", 96 | " self.Sell = self.ticker['Sell']\n", 97 | " self.Buy = self.ticker['Buy']\n", 98 | " self.last = self.ticker['Last']\n", 99 | " self.Volume = self.ticker['Volume']\n", 100 | " return True\n", 101 | " except:\n", 102 | " return False\n", 103 | " \n", 104 | " \n", 105 | " def get_depth(self):\n", 106 | " '''\n", 107 | " 获取深度信息\n", 108 | " \n", 109 | " Returns:\n", 110 | " 获取信息成功返回True,获取信息失败返回False\n", 111 | " '''\n", 112 | " self.Ask = '---'\n", 113 | " self.Bids = '---'\n", 114 | " \n", 115 | " try:\n", 116 | " self.Depth = self.exchange.GetDepth()\n", 117 | " self.Ask = self.Depth['Asks']\n", 118 | " self.Bids = self.Depth ['Bids']\n", 119 | " return True\n", 120 | " except:\n", 121 | " return False\n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 126 | " '''\n", 127 | " 获取K线信息\n", 128 | " \n", 129 | " Args:\n", 130 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 131 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 132 | " '''\n", 133 | " self.ohlc_data = exchange.GetRecords(period)\n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " def create_order(self, order_type, price, amount):\n", 138 | " '''\n", 139 | " post一个挂单信息\n", 140 | " \n", 141 | " Args:\n", 142 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 143 | " price:挂单价格\n", 144 | " amount:挂单数量\n", 145 | " \n", 146 | " Returns:\n", 147 | " 挂单Id号,可用以取消挂单\n", 148 | " '''\n", 149 | " if order_type == 'buy':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Buy( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " elif order_type == 'sell':\n", 156 | " try:\n", 157 | " order_id = self.exchange.Sell( price, amount)\n", 158 | " except:\n", 159 | " return False\n", 160 | " \n", 161 | " return order_id\n", 162 | " \n", 163 | " def get_orders(self):\n", 164 | " self.undo_ordes = self.exchange.GetOrders()\n", 165 | " return self.undo_ordes\n", 166 | " \n", 167 | " def cancel_order(self, order_id):\n", 168 | " '''\n", 169 | " 取消一个挂单信息\n", 170 | " \n", 171 | " Args:\n", 172 | " order_id:希望取消的挂单ID号\n", 173 | " \n", 174 | " Returns:\n", 175 | " 取消挂单成功返回True,取消挂单失败返回False\n", 176 | " '''\n", 177 | " return self.exchange.CancelOrder(order_id)\n", 178 | " \n", 179 | " def refreash_data(self):\n", 180 | " '''\n", 181 | " 刷新信息\n", 182 | " \n", 183 | " Returns:\n", 184 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 185 | " '''\n", 186 | "\n", 187 | " if not self.get_account():\n", 188 | " return 'false_get_account'\n", 189 | " \n", 190 | " if not self.get_ticker():\n", 191 | " return 'false_get_ticker'\n", 192 | " if not self.get_depth():\n", 193 | " return 'false_get_depth'\n", 194 | " try:\n", 195 | " self.get_ohlc_data()\n", 196 | " except:\n", 197 | " return 'false_get_K_line_info'\n", 198 | " \n", 199 | " return 'refreash_data_finish!'\n" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 3, 205 | "metadata": { 206 | "collapsed": true 207 | }, 208 | "outputs": [], 209 | "source": [ 210 | "class qushi_class():\n", 211 | " def __init__(self, mid_class, amount_N, price_N):\n", 212 | " '''\n", 213 | " 设定好初始需要考虑的参数\n", 214 | " Args:\n", 215 | " mid_class: 所使用的交易所中间层\n", 216 | " amount_N:数量小数点限制\n", 217 | " price_N:价格小数点限制\n", 218 | " \n", 219 | " Attributes:\n", 220 | " amount_N:数量小数点限制\n", 221 | " price_N:价格小数点限制\n", 222 | " init_time:初始时间\n", 223 | " last_time:上一次执行操作的时间\n", 224 | " trade_list:交易请求的id\n", 225 | " '''\n", 226 | " self.jys = mid_class\n", 227 | " \n", 228 | " self.init_time = time.time()\n", 229 | " self.last_time = time.time()\n", 230 | " \n", 231 | " self.amount_N = amount_N\n", 232 | " self.price_N = price_N\n", 233 | " \n", 234 | " self.trade_list = []\n", 235 | " \n", 236 | " def refreash_data(self):\n", 237 | " '''\n", 238 | " 用来从交易所获取最新的价格和数量信息\n", 239 | " \n", 240 | " Attributes:\n", 241 | " B:商品币数量\n", 242 | " money:计价币数量\n", 243 | " can_buy_B:当前理论可购买商品币数量\n", 244 | " Buy_price:当前市场上最近的一单挂单买价\n", 245 | " Sell_price:当前市场上最近的一单挂单卖价\n", 246 | " '''\n", 247 | " \n", 248 | " self.jys.refreash_data()\n", 249 | " self.B = self.jys.Amount\n", 250 | " self.money = self.jys.Balance\n", 251 | " self.Buy_price = self.jys.Buy\n", 252 | " self.Sell_price = self.jys.Sell\n", 253 | " self.can_buy_B = self.money/ self.Sell_price\n", 254 | " self.can_buy_B = _N(self.can_buy_B, self.amount_N )\n", 255 | " self.can_sell_B = _N(self.B, self.amount_N )\n", 256 | " \n", 257 | " def make_trade_by_dict(self, trade_dicts):\n", 258 | " '''\n", 259 | " 用来批量完成交易订单\n", 260 | " \n", 261 | " Attributes:\n", 262 | " trade_list:已提交的交易请求的id\n", 263 | " '''\n", 264 | " for this_trade in trade_dicts:\n", 265 | " this_trade_id = self.jys.create_order( this_trade['side'], this_trade['price'] , this_trade['amount'] ) \n", 266 | " self.trade_list.append( this_trade_id )\n", 267 | " \n", 268 | " def condition_chicang(self, hands_num):\n", 269 | " '''\n", 270 | " 根据持仓情况来做交易判定的条件\n", 271 | " Args:\n", 272 | " hands_num:表示交易一共几手(我们假设当前每次交易不高于一手)\n", 273 | " \n", 274 | " Attributes:\n", 275 | " min_trade_B: 一手最多交易的商品币数量\n", 276 | " min_trade_money: 一手最多交易的计价币数量\n", 277 | " \n", 278 | " '''\n", 279 | " self.min_trade_B = (self.can_buy_B + self.B) / hands_num\n", 280 | " self.min_buy_B = min(self.min_trade_B, self.can_buy_B)\n", 281 | " self.min_sell_B = min(self.min_trade_B, self.B)\n", 282 | " \n", 283 | " self.min_trade_money = self.min_trade_B* self.jys.Buy\n", 284 | "\n", 285 | "\n", 286 | " \n", 287 | " def condition_qushi(self, change_pct ):\n", 288 | " '''\n", 289 | " 根据市场价格情况来做交易判定的条件\n", 290 | " Args:\n", 291 | " change_pct:表示价格变化多少来确定一次交易(假设根据之前一段时间均值判断)\n", 292 | " \n", 293 | " Returns:\n", 294 | " min_trade_B: 一手最多交易的商品币数量\n", 295 | " min_trade_money: 一手最多交易的计价币数量\n", 296 | " \n", 297 | " '''\n", 298 | " mean_price = sum( [x['Close'] for x in self.jys.ohlc_data[-12*24:]])/(12*24)\n", 299 | " do_buy = self.jys.Buy > mean_price* (100.0 + change_pct )/100.0\n", 300 | " do_sell = self.jys.Sell < mean_price/ ((100.0 + change_pct )/100.0)\n", 301 | " \n", 302 | " if do_buy or do_sell:\n", 303 | " rt = 'Buy' if do_buy else 'Sell'\n", 304 | " return rt\n", 305 | " else:\n", 306 | " return False\n", 307 | " \n", 308 | " def make_trade_dicts(self, hands_num, change_pct ):\n", 309 | " self.condition_chicang(hands_num)\n", 310 | " rt = self.condition_qushi( change_pct )\n", 311 | " this_trade_dicts = []\n", 312 | " if rt:\n", 313 | " if rt == 'Buy':\n", 314 | " if self.min_buy_B > 10**-self.amount_N:\n", 315 | " this_trade_dicts.append({\n", 316 | " 'side':'buy',\n", 317 | " 'price':self.jys.Buy,\n", 318 | " 'amount':self.min_buy_B\n", 319 | " })\n", 320 | " else:\n", 321 | " if self.min_sell_B > 10**-self.amount_N:\n", 322 | " this_trade_dicts.append({\n", 323 | " 'side':'sell',\n", 324 | " 'price':self.jys.Sell,\n", 325 | " 'amount':self.min_sell_B\n", 326 | " })\n", 327 | " return this_trade_dicts\n", 328 | " else:\n", 329 | " return False\n", 330 | " " 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 2, 336 | "metadata": {}, 337 | "outputs": [ 338 | { 339 | "data": { 340 | "text/plain": [ 341 | "1e-05" 342 | ] 343 | }, 344 | "execution_count": 2, 345 | "metadata": {}, 346 | "output_type": "execute_result" 347 | } 348 | ], 349 | "source": [ 350 | "1e-5" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 1, 356 | "metadata": {}, 357 | "outputs": [], 358 | "source": [ 359 | "def main():\n", 360 | " \n", 361 | " Set_amount_N = 4\n", 362 | " Set_price_N = 4\n", 363 | " \n", 364 | " hands_num = 20\n", 365 | " price_change_percentage = 2\n", 366 | " \n", 367 | " test_mid = mid_class(exchange)\n", 368 | " Log(test_mid.refreash_data())\n", 369 | " test_qushi = qushi_class(test_mid , Set_amount_N, Set_price_N)\n", 370 | " \n", 371 | " while True:\n", 372 | " \n", 373 | " Sleep(1000)\n", 374 | " try:\n", 375 | " test_qushi.refreash_data()\n", 376 | "\n", 377 | " now_trade_dicts = test_qushi.make_trade_dicts(hands_num, price_change_percentage)\n", 378 | " if now_trade_dicts:\n", 379 | " test_qushi.make_trade_by_dict(now_trade_dicts)\n", 380 | " now_trade_dicts = False\n", 381 | " except:\n", 382 | " pass" 383 | ] 384 | } 385 | ], 386 | "metadata": { 387 | "kernelspec": { 388 | "display_name": "Python 3", 389 | "language": "python", 390 | "name": "python3" 391 | }, 392 | "language_info": { 393 | "codemirror_mode": { 394 | "name": "ipython", 395 | "version": 3 396 | }, 397 | "file_extension": ".py", 398 | "mimetype": "text/x-python", 399 | "name": "python", 400 | "nbconvert_exporter": "python", 401 | "pygments_lexer": "ipython3", 402 | "version": "3.7.4" 403 | } 404 | }, 405 | "nbformat": 4, 406 | "nbformat_minor": 2 407 | } 408 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/趋势类策略入门-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 趋势策略入门" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### 关键函数:\n", 15 | " - 1 交易函数(接收一个交易字典,包含交易价格,交易量,币种,交易方向等)\n", 16 | " - 2 持仓计算函数(根据仓位情况和风险设定,计算限制交易量以及交易价格)\n", 17 | " - 3 趋势条件计算函数(根据品种价格情况,判断是否执行交易,交易方向,交易量,以及交易价格)" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 1, 23 | "metadata": { 24 | "collapsed": false 25 | }, 26 | "outputs": [ 27 | { 28 | "ename": "NameError", 29 | "evalue": "name 'PERIOD_M5' is not defined", 30 | "output_type": "error", 31 | "traceback": [ 32 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 33 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 34 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m '''\n\u001b[1;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 35 | "\u001b[0;32m\u001b[0m in \u001b[0;36mmid_class\u001b[0;34m()\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 87\u001b[0;31m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 88\u001b[0m '''\n\u001b[1;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 36 | "\u001b[0;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 37 | ] 38 | } 39 | ], 40 | "source": [ 41 | "class mid_class():\n", 42 | " def __init__(self, this_exchange):\n", 43 | " '''\n", 44 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 45 | " 设定好密钥……\n", 46 | " \n", 47 | " Args:\n", 48 | " this_exchange: FMZ的交易所结构\n", 49 | " \n", 50 | " '''\n", 51 | " self.init_timestamp = time.time()\n", 52 | " self.exchange = this_exchange\n", 53 | " self.name = self.exchange.GetName()\n", 54 | " self.jyd = self.exchange.GetCurrency() \n", 55 | " \n", 56 | " def get_account(self):\n", 57 | " '''\n", 58 | " 获取账户信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.Balance = '---'\n", 64 | " self.Amount = '---'\n", 65 | " self.FrozenBalance = '---'\n", 66 | " self.FrozenStocks = '---'\n", 67 | " \n", 68 | " try:\n", 69 | " self.account = self.exchange.GetAccount()\n", 70 | "\n", 71 | " self.Balance = self.account['Balance']\n", 72 | " self.Amount = self.account['Stocks']\n", 73 | " self.FrozenBalance = self.account['FrozenBalance']\n", 74 | " self.FrozenStocks = self.account['FrozenStocks']\n", 75 | " return True\n", 76 | " except:\n", 77 | " return False\n", 78 | " \n", 79 | " def get_ticker(self):\n", 80 | " '''\n", 81 | " 获取市价信息\n", 82 | " \n", 83 | " Returns:\n", 84 | " 获取信息成功返回True,获取信息失败返回False\n", 85 | " '''\n", 86 | " self.high = '---'\n", 87 | " self.low = '---'\n", 88 | " self.Sell = '---'\n", 89 | " self.Buy = '---'\n", 90 | " self.last = '---'\n", 91 | " self.Volume = '---'\n", 92 | " \n", 93 | " try:\n", 94 | " self.ticker = self.exchange.GetTicker()\n", 95 | " \n", 96 | " self.high = self.ticker['High']\n", 97 | " self.low = self.ticker['Low']\n", 98 | " self.Sell = self.ticker['Sell']\n", 99 | " self.Buy = self.ticker['Buy']\n", 100 | " self.last = self.ticker['Last']\n", 101 | " self.Volume = self.ticker['Volume']\n", 102 | " return True\n", 103 | " except:\n", 104 | " return False\n", 105 | " \n", 106 | " \n", 107 | " def get_depth(self):\n", 108 | " '''\n", 109 | " 获取深度信息\n", 110 | " \n", 111 | " Returns:\n", 112 | " 获取信息成功返回True,获取信息失败返回False\n", 113 | " '''\n", 114 | " self.Ask = '---'\n", 115 | " self.Bids = '---'\n", 116 | " \n", 117 | " try:\n", 118 | " self.Depth = self.exchange.GetDepth()\n", 119 | " self.Ask = self.Depth['Asks']\n", 120 | " self.Bids = self.Depth ['Bids']\n", 121 | " return True\n", 122 | " except:\n", 123 | " return False\n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 128 | " '''\n", 129 | " 获取K线信息\n", 130 | " \n", 131 | " Args:\n", 132 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 133 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 134 | " '''\n", 135 | " self.ohlc_data = exchange.GetRecords(period)\n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " def create_order(self, order_type, price, amount):\n", 140 | " '''\n", 141 | " post一个挂单信息\n", 142 | " \n", 143 | " Args:\n", 144 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 145 | " price:挂单价格\n", 146 | " amount:挂单数量\n", 147 | " \n", 148 | " Returns:\n", 149 | " 挂单Id号,可用以取消挂单\n", 150 | " '''\n", 151 | " if order_type == 'buy':\n", 152 | " try:\n", 153 | " order_id = self.exchange.Buy( price, amount)\n", 154 | " except:\n", 155 | " return False\n", 156 | " \n", 157 | " elif order_type == 'sell':\n", 158 | " try:\n", 159 | " order_id = self.exchange.Sell( price, amount)\n", 160 | " except:\n", 161 | " return False\n", 162 | " \n", 163 | " return order_id\n", 164 | " \n", 165 | " def get_orders(self):\n", 166 | " self.undo_ordes = self.exchange.GetOrders()\n", 167 | " return self.undo_ordes\n", 168 | " \n", 169 | " def cancel_order(self, order_id):\n", 170 | " '''\n", 171 | " 取消一个挂单信息\n", 172 | " \n", 173 | " Args:\n", 174 | " order_id:希望取消的挂单ID号\n", 175 | " \n", 176 | " Returns:\n", 177 | " 取消挂单成功返回True,取消挂单失败返回False\n", 178 | " '''\n", 179 | " return self.exchange.CancelOrder(order_id)\n", 180 | " \n", 181 | " def refreash_data(self):\n", 182 | " '''\n", 183 | " 刷新信息\n", 184 | " \n", 185 | " Returns:\n", 186 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 187 | " '''\n", 188 | "\n", 189 | " if not self.get_account():\n", 190 | " return 'false_get_account'\n", 191 | " \n", 192 | " if not self.get_ticker():\n", 193 | " return 'false_get_ticker'\n", 194 | " if not self.get_depth():\n", 195 | " return 'false_get_depth'\n", 196 | " try:\n", 197 | " self.get_ohlc_data()\n", 198 | " except:\n", 199 | " return 'false_get_K_line_info'\n", 200 | " \n", 201 | " return 'refreash_data_finish!'\n" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 3, 207 | "metadata": { 208 | "collapsed": true 209 | }, 210 | "outputs": [], 211 | "source": [ 212 | "class qushi_class():\n", 213 | " def __init__(self, mid_class, amount_N, price_N):\n", 214 | " '''\n", 215 | " 设定好初始需要考虑的参数\n", 216 | " Args:\n", 217 | " mid_class: 所使用的交易所中间层\n", 218 | " amount_N:数量小数点限制\n", 219 | " price_N:价格小数点限制\n", 220 | " \n", 221 | " Attributes:\n", 222 | " amount_N:数量小数点限制\n", 223 | " price_N:价格小数点限制\n", 224 | " init_time:初始时间\n", 225 | " last_time:上一次执行操作的时间\n", 226 | " trade_list:交易请求的id\n", 227 | " '''\n", 228 | " self.jys = mid_class\n", 229 | " \n", 230 | " self.init_time = time.time()\n", 231 | " self.last_time = time.time()\n", 232 | " \n", 233 | " self.amount_N = amount_N\n", 234 | " self.price_N = price_N\n", 235 | " \n", 236 | " self.trade_list = []\n", 237 | " \n", 238 | " def refreash_data(self):\n", 239 | " '''\n", 240 | " 用来从交易所获取最新的价格和数量信息\n", 241 | " \n", 242 | " Attributes:\n", 243 | " B:商品币数量\n", 244 | " money:计价币数量\n", 245 | " can_buy_B:当前理论可购买商品币数量\n", 246 | " Buy_price:当前市场上最近的一单挂单买价\n", 247 | " Sell_price:当前市场上最近的一单挂单卖价\n", 248 | " '''\n", 249 | " \n", 250 | " self.jys.refreash_data()\n", 251 | " self.B = self.jys.Amount\n", 252 | " self.money = self.jys.Balance\n", 253 | " self.Buy_price = self.jys.Buy\n", 254 | " self.Sell_price = self.jys.Sell\n", 255 | " self.can_buy_B = self.money/ self.Buy_price\n", 256 | " \n", 257 | " def make_trade_by_dict(self, trade_dicts):\n", 258 | " '''\n", 259 | " 用来批量完成交易订单\n", 260 | " \n", 261 | " Attributes:\n", 262 | " trade_list:已提交的交易请求的id\n", 263 | " '''\n", 264 | " for this_trade in trade_dicts:\n", 265 | " this_trade_id = self.jys.create_order( trade_dicts['side'], trade_dict['buy_price'] , trade_dict['amount'] ) \n", 266 | " self.trade_list.append( this_trade_id )\n", 267 | " \n", 268 | " def condition_chicang(self, hands_num):\n", 269 | " '''\n", 270 | " 根据持仓情况来做交易判定的条件\n", 271 | " Args:\n", 272 | " hands_num:表示交易一共几手(我们假设当前每次交易不高于一手)\n", 273 | " \n", 274 | " Attributes:\n", 275 | " min_trade_B: 一手最多交易的商品币数量\n", 276 | " min_trade_money: 一手最多交易的计价币数量\n", 277 | " \n", 278 | " '''\n", 279 | " self.min_trade_B = (self.can_buy_B + self.B) / hands_num\n", 280 | " self.min_trade_money = self.min_trade_B* self.jys.Buy\n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " def condition_qushi(self, change_pct ):\n", 285 | " '''\n", 286 | " 根据市场价格情况来做交易判定的条件\n", 287 | " Args:\n", 288 | " change_pct:表示价格变化多少来确定一次交易(假设根据之前一段时间均值判断)\n", 289 | " \n", 290 | " Returns:\n", 291 | " min_trade_B: 一手最多交易的商品币数量\n", 292 | " min_trade_money: 一手最多交易的计价币数量\n", 293 | " \n", 294 | " '''\n", 295 | " mean_price = self.jys.ohlc_data[-12*24:]/(12*24)\n", 296 | " do_buy = self.jys.Buy > mean_price* (100.0 + change_pct )/100.0\n", 297 | " do_sell = self.jys.Sell < mean_price/ ((100.0 + change_pct )/100.0)\n", 298 | " \n", 299 | " if do_buy or do_sell:\n", 300 | " rt = 'Buy' if do_buy else 'Sell'\n", 301 | " \n", 302 | " return rt\n", 303 | " \n", 304 | " def make_trade_dicts:\n", 305 | " pass" 306 | ] 307 | } 308 | ], 309 | "metadata": { 310 | "kernelspec": { 311 | "display_name": "Python 3", 312 | "language": "python", 313 | "name": "python3" 314 | }, 315 | "language_info": { 316 | "codemirror_mode": { 317 | "name": "ipython", 318 | "version": 3 319 | }, 320 | "file_extension": ".py", 321 | "mimetype": "text/x-python", 322 | "name": "python", 323 | "nbconvert_exporter": "python", 324 | "pygments_lexer": "ipython3", 325 | "version": "3.6.0" 326 | } 327 | }, 328 | "nbformat": 4, 329 | "nbformat_minor": 2 330 | } 331 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 这是子楠讲量化课程的课件仓库,可以在这里下载到视频里讲到的课件 2 | -------------------------------------------------------------------------------- /Untitled.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 7, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "{'Stocks': 0.0, 'FrozenBalance': 0.0, 'Balance': 3.0, 'FrozenStocks': 0.0}\n", 13 | "{'Sell': 0.01459702, 'Last': 0.01459701, 'Low': 0.014597, 'Buy': 0.014597, 'Volume': 182.5233, 'High': 0.01459702, 'Time': 1529337600000}\n", 14 | "b'{\"Chart\":{\"Cfg\":\"\",\"Datas\":[]},\"Elapsed\":471000000,\"Finished\":true,\"Indicators\":{},\"LoadBytes\":488573,\"LoadElapsed\":455000000,\"LogsCount\":0,\"Profit\":0.0,\"ProfitLogs\":[],\"Progress\":100.0,\"RuntimeLogs\":[],\"Snapshort\":[{\"Balance\":3.0,\"BaseCurrency\":\"LTC\",\"Commission\":0.0,\"FrozenBalance\":0.0,\"FrozenStocks\":0.0,\"Id\":\"OKEX\",\"QuoteCurrency\":\"BTC\",\"Stocks\":0.0,\"Symbols\":{\"LTC_BTC_OKEX\":{\"Last\":0.01117758}},\"TradeStatus\":{}}],\"Status\":\"\",\"Task\":{\"Args\":null,\"Exchanges\":[{\"Balance\":3,\"BaseCurrency\":\"LTC\",\"BasePeriod\":300000,\"BasePrecision\":4,\"DepthAmount\":20,\"DepthDeep\":5,\"FaultTolerant\":0,\"FeeDenominator\":5,\"FeeMaker\":75,\"FeeMin\":0,\"FeeTaker\":80,\"Id\":\"OKEX\",\"Label\":\"OKEX\",\"PriceTick\":1e-08,\"QuoteCurrency\":\"BTC\",\"QuotePrecision\":8,\"SlipPoint\":0,\"Stocks\":0}],\"Options\":{\"DataServer\":\"q.fmz.com\",\"MaxChartLogs\":800,\"MaxProfitLogs\":800,\"MaxRuntimeLogs\":800,\"NetDelay\":200,\"Period\":900000,\"RetFlags\":189,\"SnapshortPeriod\":300000,\"TimeBegin\":1529337600,\"TimeEnd\":1532232000,\"UpdatePeriod\":5000}},\"TaskStatus\":1,\"Time\":1532232000000}'\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "'''backtest\n", 20 | "start: 2018-06-19 00:00:00\n", 21 | "end: 2018-07-22 12:00:00\n", 22 | "period: 15m\n", 23 | "exchanges: [{\"eid\":\"OKEX\",\"currency\":\"LTC_BTC\",\"balance\":3,\"stocks\":0}]\n", 24 | "'''\n", 25 | "from fmz import *\n", 26 | "task = VCtx(__doc__) # initialize backtest engine from __doc__\n", 27 | "print (exchange.GetAccount())\n", 28 | "print( exchange.GetTicker())\n", 29 | "print( task.Join()) # print backtest result" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 8, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "{'Stocks': 0.0, 'FrozenBalance': 0.0, 'Balance': 3.0, 'FrozenStocks': 0.0}\n" 42 | ] 43 | }, 44 | { 45 | "ename": "OSError", 46 | "evalue": "exception: access violation reading 0x0000628C0724EE18", 47 | "output_type": "error", 48 | "traceback": [ 49 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 50 | "\u001b[1;31mOSError\u001b[0m Traceback (most recent call last)", 51 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mprint\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mexchange\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mGetAccount\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m \u001b[0mexchange\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mGetTicker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m \u001b[0mtask\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mJoin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# print backtest result\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 52 | "\u001b[1;32mE:\\ProgramData\\Anaconda3\\envs\\py37\\lib\\site-packages\\fmz.py\u001b[0m in \u001b[0;36mGetTicker\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 642\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mGetTicker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 643\u001b[0m \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_TICKER\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 644\u001b[1;33m \u001b[0mret\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapi_Exchange_GetTicker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mctx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0midx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mctypes\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbyref\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 645\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mret\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mAPI_ERR_SUCCESS\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 646\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtoObj\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 53 | "\u001b[1;31mOSError\u001b[0m: exception: access violation reading 0x0000628C0724EE18" 54 | ] 55 | } 56 | ], 57 | "source": [ 58 | "print (exchange.GetAccount())\n", 59 | "print( exchange.GetTicker())\n", 60 | "print( task.Join()) # print backtest result" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [] 69 | } 70 | ], 71 | "metadata": { 72 | "kernelspec": { 73 | "display_name": "Python [conda env:py37]", 74 | "language": "python", 75 | "name": "conda-env-py37-py" 76 | }, 77 | "language_info": { 78 | "codemirror_mode": { 79 | "name": "ipython", 80 | "version": 3 81 | }, 82 | "file_extension": ".py", 83 | "mimetype": "text/x-python", 84 | "name": "python", 85 | "nbconvert_exporter": "python", 86 | "pygments_lexer": "ipython3", 87 | "version": "3.5.4" 88 | } 89 | }, 90 | "nbformat": 4, 91 | "nbformat_minor": 2 92 | } 93 | -------------------------------------------------------------------------------- /mid_class_example.py: -------------------------------------------------------------------------------- 1 | import ccxt 2 | import datetime,time 3 | import pandas as pd 4 | import numpy as np 5 | import traceback 6 | 7 | class mid_class(): 8 | def __init__(self, public_key, secret_key, symbol, jys_name, do_it_testnet): 9 | self.symbol = symbol 10 | if jys_name == 'bitmex': 11 | self.agent = ccxt.bitmex() 12 | if do_it_testnet: 13 | if 'test' in self.agent.urls: 14 | self.agent.urls['api'] = self.agent.urls['test'] 15 | else: 16 | Log('Can not translate into bitmex testnet') 17 | self.agent.apiKey = public_key 18 | self.agent.secret = secret_key 19 | 20 | def make_min_not_num(self, price_N, amount_N): 21 | #由于bitmex期货市场的小数点位数和币种有关,而不是和现货一样统一,所以这里不能用通行法则。暂定人工手写。 22 | self.price_N = price_N 23 | self.amount_N = amount_N 24 | 25 | def get_ohlc_data(self, timeframe, stm, limit, params): 26 | self.ohlc_data = self.agent.fetch_ohlcv( self.symbol, timeframe, stm, limit, params) 27 | return self.ohlc_data 28 | 29 | def get_position_data(self): 30 | self.position_data = self.agent.private_get_position( self.symbol ) 31 | self.position_dict = self.position_data[0] 32 | return self.position_dict 33 | 34 | def get_balance_data (self): 35 | #Log ( self.agent.fetch_balance() ) 36 | self.balance_data = self.agent.fetch_balance( ) 37 | return self.balance_data 38 | 39 | def get_ticker_data (self): 40 | self.tiker_data = self.agent.fetch_ticker( self.symbol) 41 | self.close_tiker_data = self.tiker_data['close'] 42 | return self.close_tiker_data 43 | 44 | def get_orders_data(self): 45 | self.orders_data = self.agent.fetchOpenOrders( self.symbol, limit = 200) 46 | return self.orders_data 47 | 48 | def createLimitOrder(self, hand_type, amount, price): 49 | try: 50 | return self.agent.createLimitOrder(symbol, hand_type, amount, price) 51 | except: 52 | time.sleep(1) 53 | return self.agent.createLimitOrder(symbol, hand_type, amount, price) 54 | 55 | def creatMarketOrder(self, hand_type, amount): 56 | try: 57 | return self.agent.createMarketOrder(symbol, hand_type, amount) 58 | except: 59 | time.sleep(1) 60 | return self.agent.createMarketOrder(symbol, hand_type, amount) 61 | 62 | def cancel_order(self, order_id ): 63 | try: 64 | return self.agent.cancelOrder ( order_id ) 65 | except: 66 | time.sleep(1) 67 | return self.agent.cancelOrder ( order_id ) 68 | 69 | def close_position(self, symbol, price = None): 70 | if price: 71 | self.agent.private_post_order_closeposition( {'symbol': symbol,'price':price } ) 72 | else: 73 | self.agent.private_post_order_closeposition( {'symbol': symbol } ) 74 | 75 | 76 | def get_wallet_history_data(self): 77 | self.wallet_history_data = self.agent.private_get_user_wallethistory() 78 | return self.wallet_history_data 79 | 80 | def refreash_data(self): 81 | self.get_position_data() 82 | time.sleep(0.1) 83 | self.get_orders_data() 84 | time.sleep(0.1) 85 | self.get_balance_data() 86 | time.sleep(0.1) 87 | self.get_ticker_data() 88 | time.sleep(0.1) 89 | 90 | def post_order(self, side, order_type, price, check_price, amount): 91 | this_symbol = 'XBTUSD' if self.symbol =='BTC/USD' else self.symbol 92 | params = { 93 | 'symbol': this_symbol, 94 | 'side' : side, 95 | 'ordType': order_type, 96 | 'price' : price, 97 | 'stopPx' : check_price, 98 | 'orderQty' : amount 99 | } 100 | rt = bitmex.agent.private_post_order(params) 101 | return rt 102 | -------------------------------------------------------------------------------- /midclass教程-下-Copy1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 1.我们需要获取数据,但不需要一直获取数据\n", 8 | "## 2.我们需要做容错\n", 9 | "## 3.一些数据的处理不需要放在逻辑层里" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def _init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": null, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [] 183 | } 184 | ], 185 | "metadata": { 186 | "kernelspec": { 187 | "display_name": "Python [conda env:py37]", 188 | "language": "python", 189 | "name": "conda-env-py37-py" 190 | }, 191 | "language_info": { 192 | "codemirror_mode": { 193 | "name": "ipython", 194 | "version": 3 195 | }, 196 | "file_extension": ".py", 197 | "mimetype": "text/x-python", 198 | "name": "python", 199 | "nbconvert_exporter": "python", 200 | "pygments_lexer": "ipython3", 201 | "version": "3.5.4" 202 | } 203 | }, 204 | "nbformat": 4, 205 | "nbformat_minor": 2 206 | } 207 | -------------------------------------------------------------------------------- /midclass教程-下.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 1.我们需要获取数据,但不需要一直获取数据\n", 8 | "## 2.我们需要做容错\n", 9 | "## 3.一些数据的处理不需要放在逻辑层里" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def __init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | } 177 | ], 178 | "metadata": { 179 | "kernelspec": { 180 | "display_name": "Python [conda env:py37]", 181 | "language": "python", 182 | "name": "conda-env-py37-py" 183 | }, 184 | "language_info": { 185 | "codemirror_mode": { 186 | "name": "ipython", 187 | "version": 3 188 | }, 189 | "file_extension": ".py", 190 | "mimetype": "text/x-python", 191 | "name": "python", 192 | "nbconvert_exporter": "python", 193 | "pygments_lexer": "ipython3", 194 | "version": "3.5.4" 195 | } 196 | }, 197 | "nbformat": 4, 198 | "nbformat_minor": 2 199 | } 200 | -------------------------------------------------------------------------------- /midclass教程.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 1.我们需要获取数据,但不需要一直获取数据\n", 8 | "## 2.我们需要做容错\n", 9 | "## 3.一些数据的处理不需要放在逻辑层里" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def _init__(self):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " '''\n", 24 | " pass\n", 25 | " \n", 26 | " def get_account(self):\n", 27 | " '''\n", 28 | " 获取账户信息\n", 29 | " '''\n", 30 | " pass\n", 31 | " \n", 32 | " def get_ticker(self):\n", 33 | " '''\n", 34 | " 获取市价信息\n", 35 | " '''\n", 36 | " pass\n", 37 | " \n", 38 | " def get_depth(self):\n", 39 | " '''\n", 40 | " 获取深度信息\n", 41 | " '''\n", 42 | " pass\n", 43 | " \n", 44 | " def get_ohlc_data(self):\n", 45 | " '''\n", 46 | " 获取K线信息\n", 47 | " '''\n", 48 | " pass\n", 49 | " \n", 50 | " def create_order(self):\n", 51 | " '''\n", 52 | " post一个挂单信息\n", 53 | " '''\n", 54 | " pass\n", 55 | " \n", 56 | " def cancel_order(self):\n", 57 | " '''\n", 58 | " 取消一个挂单信息\n", 59 | " '''\n", 60 | " pass\n", 61 | " \n", 62 | " def refreash_data(self):\n", 63 | " '''\n", 64 | " 刷新信息\n", 65 | " '''\n", 66 | " pass" 67 | ] 68 | } 69 | ], 70 | "metadata": { 71 | "kernelspec": { 72 | "display_name": "Python [conda env:py37]", 73 | "language": "python", 74 | "name": "conda-env-py37-py" 75 | }, 76 | "language_info": { 77 | "codemirror_mode": { 78 | "name": "ipython", 79 | "version": 3 80 | }, 81 | "file_extension": ".py", 82 | "mimetype": "text/x-python", 83 | "name": "python", 84 | "nbconvert_exporter": "python", 85 | "pygments_lexer": "ipython3", 86 | "version": "3.5.4" 87 | } 88 | }, 89 | "nbformat": 4, 90 | "nbformat_minor": 2 91 | } -------------------------------------------------------------------------------- /做市策略入门.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 做市策略\n", 8 | "### 1、对敲做量\n", 9 | "### 2、盘口高频吃利润\n", 10 | "### 3、缓步先买后卖抬高品种价格\n", 11 | "### 4、缓步先卖后买拉低品种价格" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "ename": "NameError", 21 | "evalue": "name 'PERIOD_M5' is not defined", 22 | "output_type": "error", 23 | "traceback": [ 24 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 25 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 26 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m '''\n\u001b[0;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 27 | "\u001b[1;32m\u001b[0m in \u001b[0;36mmid_class\u001b[1;34m()\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 87\u001b[1;33m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 88\u001b[0m '''\n\u001b[0;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 28 | "\u001b[1;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "class mid_class():\n", 34 | " def __init__(self, this_exchange):\n", 35 | " '''\n", 36 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 37 | " 设定好密钥……\n", 38 | " \n", 39 | " Args:\n", 40 | " this_exchange: FMZ的交易所结构\n", 41 | " \n", 42 | " '''\n", 43 | " self.init_timestamp = time.time()\n", 44 | " self.exchange = this_exchange\n", 45 | " self.name = self.exchange.GetName()\n", 46 | " self.jyd = self.exchange.GetCurrency() \n", 47 | " \n", 48 | " def get_account(self):\n", 49 | " '''\n", 50 | " 获取账户信息\n", 51 | " \n", 52 | " Returns:\n", 53 | " 获取信息成功返回True,获取信息失败返回False\n", 54 | " '''\n", 55 | " self.Balance = '---'\n", 56 | " self.Amount = '---'\n", 57 | " self.FrozenBalance = '---'\n", 58 | " self.FrozenStocks = '---'\n", 59 | " \n", 60 | " try:\n", 61 | " self.account = self.exchange.GetAccount()\n", 62 | "\n", 63 | " self.Balance = self.account['Balance']\n", 64 | " self.Amount = self.account['Stocks']\n", 65 | " self.FrozenBalance = self.account['FrozenBalance']\n", 66 | " self.FrozenStocks = self.account['FrozenStocks']\n", 67 | " return True\n", 68 | " except:\n", 69 | " return False\n", 70 | " \n", 71 | " def get_ticker(self):\n", 72 | " '''\n", 73 | " 获取市价信息\n", 74 | " \n", 75 | " Returns:\n", 76 | " 获取信息成功返回True,获取信息失败返回False\n", 77 | " '''\n", 78 | " self.high = '---'\n", 79 | " self.low = '---'\n", 80 | " self.Sell = '---'\n", 81 | " self.Buy = '---'\n", 82 | " self.last = '---'\n", 83 | " self.Volume = '---'\n", 84 | " \n", 85 | " try:\n", 86 | " self.ticker = self.exchange.GetTicker()\n", 87 | " \n", 88 | " self.high = self.ticker['High']\n", 89 | " self.low = self.ticker['Low']\n", 90 | " self.Sell = self.ticker['Sell']\n", 91 | " self.Buy = self.ticker['Buy']\n", 92 | " self.last = self.ticker['Last']\n", 93 | " self.Volume = self.ticker['Volume']\n", 94 | " return True\n", 95 | " except:\n", 96 | " return False\n", 97 | " \n", 98 | " \n", 99 | " def get_depth(self):\n", 100 | " '''\n", 101 | " 获取深度信息\n", 102 | " \n", 103 | " Returns:\n", 104 | " 获取信息成功返回True,获取信息失败返回False\n", 105 | " '''\n", 106 | " self.Ask = '---'\n", 107 | " self.Bids = '---'\n", 108 | " \n", 109 | " try:\n", 110 | " self.Depth = self.exchange.GetDepth()\n", 111 | " self.Ask = self.Depth['Asks']\n", 112 | " self.Bids = self.Depth ['Bids']\n", 113 | " return True\n", 114 | " except:\n", 115 | " return False\n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 120 | " '''\n", 121 | " 获取K线信息\n", 122 | " \n", 123 | " Args:\n", 124 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 125 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 126 | " '''\n", 127 | " self.ohlc_data = exchange.GetRecords(period)\n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " def create_order(self, order_type, price, amount):\n", 132 | " '''\n", 133 | " post一个挂单信息\n", 134 | " \n", 135 | " Args:\n", 136 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 137 | " price:挂单价格\n", 138 | " amount:挂单数量\n", 139 | " \n", 140 | " Returns:\n", 141 | " 挂单Id号,可用以取消挂单\n", 142 | " '''\n", 143 | " if order_type == 'buy':\n", 144 | " try:\n", 145 | " order_id = self.exchange.Buy( price, amount)\n", 146 | " except:\n", 147 | " return False\n", 148 | " \n", 149 | " elif order_type == 'sell':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Sell( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " return order_id\n", 156 | " \n", 157 | " def get_orders(self):\n", 158 | " self.undo_ordes = self.exchange.GetOrders()\n", 159 | " return self.undo_ordes\n", 160 | " \n", 161 | " def cancel_order(self, order_id):\n", 162 | " '''\n", 163 | " 取消一个挂单信息\n", 164 | " \n", 165 | " Args:\n", 166 | " order_id:希望取消的挂单ID号\n", 167 | " \n", 168 | " Returns:\n", 169 | " 取消挂单成功返回True,取消挂单失败返回False\n", 170 | " '''\n", 171 | " return self.exchange.CancelOrder(order_id)\n", 172 | " \n", 173 | " def refreash_data(self):\n", 174 | " '''\n", 175 | " 刷新信息\n", 176 | " \n", 177 | " Returns:\n", 178 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 179 | " '''\n", 180 | "\n", 181 | " if not self.get_account():\n", 182 | " return 'false_get_account'\n", 183 | " \n", 184 | " if not self.get_ticker():\n", 185 | " return 'false_get_ticker'\n", 186 | " if not self.get_depth():\n", 187 | " return 'false_get_depth'\n", 188 | " try:\n", 189 | " self.get_ohlc_data()\n", 190 | " except:\n", 191 | " return 'false_get_K_line_info'\n", 192 | " \n", 193 | " return 'refreash_data_finish!'\n" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 5, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "class zuoshi():\n", 203 | " def __init__(self, mid_class, amount_N, price_N):\n", 204 | " self.jys = mid_class\n", 205 | " self.done_amount = 0\n", 206 | " self.init_time = time.time()\n", 207 | " self.last_time = time.time()\n", 208 | " self.amount_N = amount_N\n", 209 | " self.price_N = price_N\n", 210 | " \n", 211 | " def trade_duiqiao(self, trade_dict):\n", 212 | " \n", 213 | " self.jys.create_order( 'buy', trade_dict['price'] , trade_dict['amount'] ) \n", 214 | " self.jys.create_order( 'sell',trade_dict['price'] , trade_dict['amount'] ) \n", 215 | " self.done_amount += trade_dict['amount']\n", 216 | " self.last_time = time.time()\n", 217 | " \n", 218 | " def make_duiqiao_trade_dict(self, set_amount, every_time_amount):\n", 219 | " self.jys.refreash_data()\n", 220 | " \n", 221 | " trade_price = ( self.jys.Sell + self.jys.Buy )/2\n", 222 | " trade_price = round(trade_price, self.price_N)\n", 223 | " if trade_price > self.jys.Buy and trade_price< self.jys.Sell: \n", 224 | " self.B = self.jys.Amount\n", 225 | " self.money = self.jys.Balance\n", 226 | " self.can_buy_B = self.money/ trade_price\n", 227 | " do_trade = self.B > every_time_amount\n", 228 | " do_trade = do_trade and self.can_buy_B > every_time_amount\n", 229 | " trade_dict = {'do_trade':do_trade,\n", 230 | " 'price': trade_price,\n", 231 | " 'amount':every_time_amount }\n", 232 | " return trade_dict\n", 233 | " \n", 234 | " def deal_with_frozen(self):\n", 235 | " undo_orders = self.jys.get_orders()\n", 236 | " if len( undo_orders) > 0:\n", 237 | " for i in undo_orders:\n", 238 | " self.jys.cancel_order(i['Id'])\n" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [ 247 | "def main():\n", 248 | " Set_amount_N = 4\n", 249 | " Set_price_N = 4\n", 250 | " set_amount = 10\n", 251 | " every_time_amount = 0.1\n", 252 | " \n", 253 | " test_mid = mid_class(exchange)\n", 254 | " Log(test_mid.refreash_data())\n", 255 | " test_duiqiao = zuoshi(test_mid, Set_amount_N, Set_price_N)\n", 256 | " \n", 257 | " while(test_duiqiao.done_amount < set_amount):\n", 258 | " test_duiqiao.deal_with_frozen()\n", 259 | " Sleep(1000)\n", 260 | " trade_dict = test_duiqiao.make_duiqiao_trade_dict(set_amount, every_time_amount)\n", 261 | " if trade_dict['do_trade']:\n", 262 | " test_duiqiao.trade_duiqiao( trade_dict )\n", 263 | " \n", 264 | " Log(test_duiqiao.done_amount)\n", 265 | " Log(test_duiqiao.B)" 266 | ] 267 | } 268 | ], 269 | "metadata": { 270 | "kernelspec": { 271 | "display_name": "Python [conda env:py37]", 272 | "language": "python", 273 | "name": "conda-env-py37-py" 274 | }, 275 | "language_info": { 276 | "codemirror_mode": { 277 | "name": "ipython", 278 | "version": 3 279 | }, 280 | "file_extension": ".py", 281 | "mimetype": "text/x-python", 282 | "name": "python", 283 | "nbconvert_exporter": "python", 284 | "pygments_lexer": "ipython3", 285 | "version": "3.5.4" 286 | } 287 | }, 288 | "nbformat": 4, 289 | "nbformat_minor": 2 290 | } 291 | -------------------------------------------------------------------------------- /做市策略入门(2).ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 1、写盘口高频策略\n", 8 | "### 2、把对敲与盘口高频整合到一起" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "### 盘口高频为何能有盈利空间\n", 16 | "- 1、市场上有人急着买,有人急着卖,急着买的买的和急着卖的差价就可以被你吃到\n", 17 | "- 2、市场存在微小的价格波动,类似于网格吃波动可以吃到利润" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "ename": "NameError", 27 | "evalue": "name 'PERIOD_M5' is not defined", 28 | "output_type": "error", 29 | "traceback": [ 30 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 31 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 32 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m '''\n\u001b[0;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 33 | "\u001b[1;32m\u001b[0m in \u001b[0;36mmid_class\u001b[1;34m()\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 87\u001b[1;33m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 88\u001b[0m '''\n\u001b[0;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 34 | "\u001b[1;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "class mid_class():\n", 40 | " def __init__(self, this_exchange):\n", 41 | " '''\n", 42 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 43 | " 设定好密钥……\n", 44 | " \n", 45 | " Args:\n", 46 | " this_exchange: FMZ的交易所结构\n", 47 | " \n", 48 | " '''\n", 49 | " self.init_timestamp = time.time()\n", 50 | " self.exchange = this_exchange\n", 51 | " self.name = self.exchange.GetName()\n", 52 | " self.jyd = self.exchange.GetCurrency() \n", 53 | " \n", 54 | " def get_account(self):\n", 55 | " '''\n", 56 | " 获取账户信息\n", 57 | " \n", 58 | " Returns:\n", 59 | " 获取信息成功返回True,获取信息失败返回False\n", 60 | " '''\n", 61 | " self.Balance = '---'\n", 62 | " self.Amount = '---'\n", 63 | " self.FrozenBalance = '---'\n", 64 | " self.FrozenStocks = '---'\n", 65 | " \n", 66 | " try:\n", 67 | " self.account = self.exchange.GetAccount()\n", 68 | "\n", 69 | " self.Balance = self.account['Balance']\n", 70 | " self.Amount = self.account['Stocks']\n", 71 | " self.FrozenBalance = self.account['FrozenBalance']\n", 72 | " self.FrozenStocks = self.account['FrozenStocks']\n", 73 | " return True\n", 74 | " except:\n", 75 | " return False\n", 76 | " \n", 77 | " def get_ticker(self):\n", 78 | " '''\n", 79 | " 获取市价信息\n", 80 | " \n", 81 | " Returns:\n", 82 | " 获取信息成功返回True,获取信息失败返回False\n", 83 | " '''\n", 84 | " self.high = '---'\n", 85 | " self.low = '---'\n", 86 | " self.Sell = '---'\n", 87 | " self.Buy = '---'\n", 88 | " self.last = '---'\n", 89 | " self.Volume = '---'\n", 90 | " \n", 91 | " try:\n", 92 | " self.ticker = self.exchange.GetTicker()\n", 93 | " \n", 94 | " self.high = self.ticker['High']\n", 95 | " self.low = self.ticker['Low']\n", 96 | " self.Sell = self.ticker['Sell']\n", 97 | " self.Buy = self.ticker['Buy']\n", 98 | " self.last = self.ticker['Last']\n", 99 | " self.Volume = self.ticker['Volume']\n", 100 | " return True\n", 101 | " except:\n", 102 | " return False\n", 103 | " \n", 104 | " \n", 105 | " def get_depth(self):\n", 106 | " '''\n", 107 | " 获取深度信息\n", 108 | " \n", 109 | " Returns:\n", 110 | " 获取信息成功返回True,获取信息失败返回False\n", 111 | " '''\n", 112 | " self.Ask = '---'\n", 113 | " self.Bids = '---'\n", 114 | " \n", 115 | " try:\n", 116 | " self.Depth = self.exchange.GetDepth()\n", 117 | " self.Ask = self.Depth['Asks']\n", 118 | " self.Bids = self.Depth ['Bids']\n", 119 | " return True\n", 120 | " except:\n", 121 | " return False\n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 126 | " '''\n", 127 | " 获取K线信息\n", 128 | " \n", 129 | " Args:\n", 130 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 131 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 132 | " '''\n", 133 | " self.ohlc_data = exchange.GetRecords(period)\n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " def create_order(self, order_type, price, amount):\n", 138 | " '''\n", 139 | " post一个挂单信息\n", 140 | " \n", 141 | " Args:\n", 142 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 143 | " price:挂单价格\n", 144 | " amount:挂单数量\n", 145 | " \n", 146 | " Returns:\n", 147 | " 挂单Id号,可用以取消挂单\n", 148 | " '''\n", 149 | " if order_type == 'buy':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Buy( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " elif order_type == 'sell':\n", 156 | " try:\n", 157 | " order_id = self.exchange.Sell( price, amount)\n", 158 | " except:\n", 159 | " return False\n", 160 | " \n", 161 | " return order_id\n", 162 | " \n", 163 | " def get_orders(self):\n", 164 | " self.undo_ordes = self.exchange.GetOrders()\n", 165 | " return self.undo_ordes\n", 166 | " \n", 167 | " def cancel_order(self, order_id):\n", 168 | " '''\n", 169 | " 取消一个挂单信息\n", 170 | " \n", 171 | " Args:\n", 172 | " order_id:希望取消的挂单ID号\n", 173 | " \n", 174 | " Returns:\n", 175 | " 取消挂单成功返回True,取消挂单失败返回False\n", 176 | " '''\n", 177 | " return self.exchange.CancelOrder(order_id)\n", 178 | " \n", 179 | " def refreash_data(self):\n", 180 | " '''\n", 181 | " 刷新信息\n", 182 | " \n", 183 | " Returns:\n", 184 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 185 | " '''\n", 186 | "\n", 187 | " if not self.get_account():\n", 188 | " return 'false_get_account'\n", 189 | " \n", 190 | " if not self.get_ticker():\n", 191 | " return 'false_get_ticker'\n", 192 | " if not self.get_depth():\n", 193 | " return 'false_get_depth'\n", 194 | " try:\n", 195 | " self.get_ohlc_data()\n", 196 | " except:\n", 197 | " return 'false_get_K_line_info'\n", 198 | " \n", 199 | " return 'refreash_data_finish!'\n" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 5, 205 | "metadata": {}, 206 | "outputs": [], 207 | "source": [ 208 | "class zuoshi():\n", 209 | " def __init__(self, mid_class, amount_N, price_N):\n", 210 | " self.jys = mid_class\n", 211 | " self.done_amount = {'pan_kou':0, 'dui_qiao':0}\n", 212 | " self.init_time = time.time()\n", 213 | " self.last_time = time.time()\n", 214 | " self.amount_N = amount_N\n", 215 | " self.price_N = price_N\n", 216 | " self.wait_time = 60\n", 217 | " \n", 218 | " self.traded_pair = {'pan_kou':[], 'dui_qiao':[]}\n", 219 | " self.undo_state = []\n", 220 | " self.had_gua_times = 0\n", 221 | " \n", 222 | " def refreash_data(self):\n", 223 | " \n", 224 | " self.jys.refreash_data()\n", 225 | " self.B = self.jys.Amount\n", 226 | " self.money = self.jys.Balance\n", 227 | " self.can_buy_B = self.money/ self.jys.Buy\n", 228 | " self.mid_price = ( self.jys.Sell + self.jys.Buy )/2\n", 229 | " \n", 230 | " return \n", 231 | " \n", 232 | " \n", 233 | " def make_trade_by_dict(self, trade_dicts):\n", 234 | " for trade_dict in trade_dicts:\n", 235 | " if trade_dict['do_trade']:\n", 236 | " buy_id = self.jys.create_order( 'buy', trade_dict['buy_price'] , trade_dict['amount'] ) \n", 237 | " sell_id = self.jys.create_order( 'sell',trade_dict['sell_price'] , trade_dict['amount'] ) \n", 238 | " \n", 239 | " if trade_dict['buy_price'] == trade_dict['sell_price']:\n", 240 | " self.done_amount['dui_qiao'] += trade_dict['amount']\n", 241 | " self.traded_pair['dui_qiao'].append({'buy_id': buy_id, 'sell_id': sell_id, 'init_time':time.time(),'amount':trade_dict['amount'] })\n", 242 | " else:\n", 243 | " \n", 244 | " self.traded_pair['pan_kou'].append({'buy_id': buy_id, 'sell_id': sell_id, 'init_time':time.time(),'amount':trade_dict['amount'] })\n", 245 | " \n", 246 | " self.last_time = time.time()\n", 247 | " \n", 248 | " def make_duiqiao_trade_dict(self, set_amount, every_time_amount):\n", 249 | " \n", 250 | " trade_price = self.mid_price\n", 251 | " trade_price = round(trade_price, self.price_N)\n", 252 | " \n", 253 | " if trade_price > self.jys.Buy and trade_price< self.jys.Sell: \n", 254 | " do_trade = self.B > every_time_amount\n", 255 | " do_trade = do_trade and self.can_buy_B > every_time_amount\n", 256 | " trade_dict = {'do_trade':do_trade,\n", 257 | " 'buy_price': trade_price,\n", 258 | " 'sell_price':trade_price,\n", 259 | " 'amount':every_time_amount }\n", 260 | " \n", 261 | " return [trade_dict]\n", 262 | " \n", 263 | " def deal_with_frozen(self):\n", 264 | " undo_orders = self.jys.get_orders()\n", 265 | " if len( undo_orders) > 0:\n", 266 | " for i in undo_orders:\n", 267 | " self.jys.cancel_order(i['Id'])\n", 268 | " \n", 269 | " def make_pankou_dict(self, price_range , min_price_len, every_time_amount ):\n", 270 | " mid_price = self.mid_price\n", 271 | " \n", 272 | " price_alpha = price_range - self.had_gua_times * min_price_len\n", 273 | " do_dict = price_alpha> 0\n", 274 | " if do_dict:\n", 275 | " \n", 276 | " buy_price = mid_price - price_alpha\n", 277 | " buy_price = round(buy_price, self.price_N)\n", 278 | " can_buy_B = self.money/buy_price\n", 279 | " \n", 280 | " sell_price = mid_price + price_alpha\n", 281 | " sell_price = round(sell_price, self.price_N)\n", 282 | "\n", 283 | "\n", 284 | " do_dict = do_dict and self.B > every_time_amount\n", 285 | " do_dict = do_dict and can_buy_B > every_time_amount\n", 286 | "\n", 287 | " amount = every_time_amount\n", 288 | "\n", 289 | " trade_dict = { 'do_trade':do_dict,\n", 290 | " 'buy_price': buy_price,\n", 291 | " 'sell_price':sell_price,\n", 292 | " 'amount':every_time_amount }\n", 293 | " return [trade_dict]\n", 294 | " else:\n", 295 | " self.had_gua_times = 0\n", 296 | " \n", 297 | " def check_if_traded( self , now_times):\n", 298 | " for traded_id in self.traded_pair['pan_kou']:\n", 299 | " try:\n", 300 | " this_buy_state = self.jys.exchange.GetOrder(traded_id['buy_id'])\n", 301 | " except:\n", 302 | " self.jys.cancel_order( traded_id['sell_id'] )\n", 303 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 304 | " try:\n", 305 | " this_sell_state = self.jys.exchange.GetOrder(traded_id['sell_id'])\n", 306 | " except:\n", 307 | " self.jys.cancel_order( traded_id['buy_id'] )\n", 308 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 309 | " \n", 310 | " \n", 311 | " if { this_sell_state['Status'], this_buy_state['Status'] } == {0, 0}:\n", 312 | " if now_times% 50 ==0 :\n", 313 | " Log(this_buy_state['Status'], this_sell_state['Status'], now_times% 50 )\n", 314 | "# if ( time.time() - traded_id['init_time'] )/1000/60 > self.wait_time:\n", 315 | " self.jys.cancel_order( traded_id['buy_id'] )\n", 316 | " self.jys.cancel_order( traded_id['sell_id'] )\n", 317 | " self.had_gua_times += 0\n", 318 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 319 | "\n", 320 | " elif {this_sell_state['Status'], this_buy_state['Status'] } == { 1, 0}:\n", 321 | " if now_times% 50 ==0 :\n", 322 | " Log(this_buy_state['Status'], this_sell_state['Status'], now_times% 50 )\n", 323 | "# if ( time.time() - traded_id['init_time'] )/1000/60 > self.wait_time:\n", 324 | " if this_buy_state['Status'] == 'ORDER_STATE_PENDING':\n", 325 | " self.jys.cancel_order( traded_id['buy_id'] )\n", 326 | " self.undo_state.append(['buy', this_buy_state['Status']])\n", 327 | " self.traded_pair['pan_kou'].remove( self.traded_id )\n", 328 | " elif this_sell_state['Status'] == 'ORDER_STATE_PENDING':\n", 329 | " self.jys.cancel_order( traded_id['sell_id'] )\n", 330 | " self.undo_state.append(['sell', this_sell_state['Status']])\n", 331 | " self.traded_pair['pan_kou'].remove( self.traded_id )\n", 332 | " \n", 333 | " elif {this_sell_state['Status'], this_buy_state['Status'] } == {1,1}:\n", 334 | " Log(this_buy_state['Status'], this_sell_state['Status'], traded_id['amount'] )\n", 335 | " self.done_amount['pan_kou'] += traded_id['amount'] \n", 336 | " self.traded_pair['pan_kou'].remove( traded_id )\n", 337 | " else:\n", 338 | " Log(this_buy_state,this_sell_state)\n", 339 | " Log('2id:',this_buy_state['Status'], this_sell_state['Status'] )\n", 340 | " Log(traded_id)\n", 341 | " \n" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": null, 347 | "metadata": {}, 348 | "outputs": [], 349 | "source": [ 350 | "def main():\n", 351 | " \n", 352 | " times = 0\n", 353 | " \n", 354 | " Set_amount_N = 4\n", 355 | " Set_price_N = 4\n", 356 | " set_amount = 10\n", 357 | " \n", 358 | " price_range = 50\n", 359 | " min_price_len = 1\n", 360 | " every_time_amount = 0.01\n", 361 | " \n", 362 | " test_mid = mid_class(exchange)\n", 363 | " Log(test_mid.refreash_data())\n", 364 | " test_zuoshi = zuoshi(test_mid, Set_amount_N, Set_price_N)\n", 365 | " \n", 366 | " while( test_zuoshi.done_amount['pan_kou'] < set_amount):\n", 367 | " \n", 368 | " test_zuoshi.check_if_traded(times)\n", 369 | " Sleep(1000)\n", 370 | " test_zuoshi.refreash_data()\n", 371 | " \n", 372 | " if len( test_zuoshi.traded_pair['pan_kou'] ) < 1:\n", 373 | " trade_dicts = test_zuoshi.make_pankou_dict( price_range , min_price_len, every_time_amount )\n", 374 | " \n", 375 | " test_zuoshi.make_trade_by_dict( trade_dicts )\n", 376 | " Log( test_zuoshi.done_amount['pan_kou'] )\n", 377 | " \n", 378 | " times += 1\n", 379 | " \n", 380 | " Log( test_zuoshi.B, test_zuoshi.can_buy_B)\n" 381 | ] 382 | } 383 | ], 384 | "metadata": { 385 | "kernelspec": { 386 | "display_name": "Python [conda env:py37]", 387 | "language": "python", 388 | "name": "conda-env-py37-py" 389 | }, 390 | "language_info": { 391 | "codemirror_mode": { 392 | "name": "ipython", 393 | "version": 3 394 | }, 395 | "file_extension": ".py", 396 | "mimetype": "text/x-python", 397 | "name": "python", 398 | "nbconvert_exporter": "python", 399 | "pygments_lexer": "ipython3", 400 | "version": "3.5.4" 401 | } 402 | }, 403 | "nbformat": 4, 404 | "nbformat_minor": 2 405 | } 406 | -------------------------------------------------------------------------------- /写一个均仓策略- 下.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 1、写一个均仓策略\n", 8 | "# 2、如何debug\n", 9 | "# 3、如何使用FMZ(botvs)的回测" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": { 16 | "collapsed": true 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "class mid_class():\n", 21 | " def __init__(self, this_exchange):\n", 22 | " '''\n", 23 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 24 | " 设定好密钥……\n", 25 | " \n", 26 | " Args:\n", 27 | " this_exchange: FMZ的交易所结构\n", 28 | " \n", 29 | " '''\n", 30 | " self.init_timestamp = time.time()\n", 31 | " self.exchange = this_exchange\n", 32 | " self.name = self.exchange.GetName()\n", 33 | " self.jyd = self.exchange.GetCurrency() \n", 34 | " \n", 35 | " def get_account(self):\n", 36 | " '''\n", 37 | " 获取账户信息\n", 38 | " \n", 39 | " Returns:\n", 40 | " 获取信息成功返回True,获取信息失败返回False\n", 41 | " '''\n", 42 | " self.Balance = '---'\n", 43 | " self.Amount = '---'\n", 44 | " self.FrozenBalance = '---'\n", 45 | " self.FrozenStocks = '---'\n", 46 | " \n", 47 | " try:\n", 48 | " self.account = self.exchange.GetAccount()\n", 49 | "\n", 50 | " self.Balance = self.account['Balance']\n", 51 | " self.Amount = self.account['Stocks']\n", 52 | " self.FrozenBalance = self.account['FrozenBalance']\n", 53 | " self.FrozenStocks = self.account['FrozenStocks']\n", 54 | " return True\n", 55 | " except:\n", 56 | " return False\n", 57 | " \n", 58 | " def get_ticker(self):\n", 59 | " '''\n", 60 | " 获取市价信息\n", 61 | " \n", 62 | " Returns:\n", 63 | " 获取信息成功返回True,获取信息失败返回False\n", 64 | " '''\n", 65 | " self.high = '---'\n", 66 | " self.low = '---'\n", 67 | " self.Sell = '---'\n", 68 | " self.Buy = '---'\n", 69 | " self.last = '---'\n", 70 | " self.Volume = '---'\n", 71 | " \n", 72 | " try:\n", 73 | " self.ticker = self.exchange.GetTicker()\n", 74 | " \n", 75 | " self.high = self.ticker['High']\n", 76 | " self.low = self.ticker['Low']\n", 77 | " self.Sell = self.ticker['Sell']\n", 78 | " self.Buy = self.ticker['Buy']\n", 79 | " self.last = self.ticker['Last']\n", 80 | " self.Volume = self.ticker['Volume']\n", 81 | " return True\n", 82 | " except:\n", 83 | " return False\n", 84 | " \n", 85 | " \n", 86 | " def get_depth(self):\n", 87 | " '''\n", 88 | " 获取深度信息\n", 89 | " \n", 90 | " Returns:\n", 91 | " 获取信息成功返回True,获取信息失败返回False\n", 92 | " '''\n", 93 | " self.Ask = '---'\n", 94 | " self.Bids = '---'\n", 95 | " \n", 96 | " try:\n", 97 | " self.Depth = self.exchange.GetDepth()\n", 98 | " self.Ask = self.Depth['Asks']\n", 99 | " self.Bids = self.Depth ['Bids']\n", 100 | " return True\n", 101 | " except:\n", 102 | " return False\n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 107 | " '''\n", 108 | " 获取K线信息\n", 109 | " \n", 110 | " Args:\n", 111 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 112 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 113 | " '''\n", 114 | " self.ohlc_data = exchange.GetRecords(period)\n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " def create_order(self, order_type, price, amount):\n", 119 | " '''\n", 120 | " post一个挂单信息\n", 121 | " \n", 122 | " Args:\n", 123 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 124 | " price:挂单价格\n", 125 | " amount:挂单数量\n", 126 | " \n", 127 | " Returns:\n", 128 | " 挂单Id号,可用以取消挂单\n", 129 | " '''\n", 130 | " if order_type == 'buy':\n", 131 | " try:\n", 132 | " order_id = self.exchange.Buy( price, amount)\n", 133 | " except:\n", 134 | " return False\n", 135 | " \n", 136 | " elif order_type == 'sell':\n", 137 | " try:\n", 138 | " order_id = self.exchange.Sell( price, amount)\n", 139 | " except:\n", 140 | " return False\n", 141 | " \n", 142 | " return order_id\n", 143 | " \n", 144 | " def cancel_order(self, order_id):\n", 145 | " '''\n", 146 | " 取消一个挂单信息\n", 147 | " \n", 148 | " Args:\n", 149 | " order_id:希望取消的挂单ID号\n", 150 | " \n", 151 | " Returns:\n", 152 | " 取消挂单成功返回True,取消挂单失败返回False\n", 153 | " '''\n", 154 | " return self.exchange.CancelOrder(order_id)\n", 155 | " \n", 156 | " def refreash_data(self):\n", 157 | " '''\n", 158 | " 刷新信息\n", 159 | " \n", 160 | " Returns:\n", 161 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 162 | " '''\n", 163 | "\n", 164 | " if not self.get_account():\n", 165 | " return 'false_get_account'\n", 166 | " \n", 167 | " if not self.get_ticker():\n", 168 | " return 'false_get_ticker'\n", 169 | " if not self.get_depth():\n", 170 | " return 'false_get_depth'\n", 171 | " try:\n", 172 | " self.get_ohlc_data()\n", 173 | " except:\n", 174 | " return 'false_get_K_line_info'\n", 175 | " \n", 176 | " return 'refreash_data_finish!'\n" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 3, 182 | "metadata": { 183 | "collapsed": true 184 | }, 185 | "outputs": [], 186 | "source": [ 187 | "class juncang_class():\n", 188 | " def __init__(self, mid_class):\n", 189 | " self.jys = mid_class\n", 190 | " self.last_time = time.time()\n", 191 | " self.last_trade_price = self.jys.last\n", 192 | " self.Buy_count = 0\n", 193 | " self.Sell_count = 0\n", 194 | " \n", 195 | " def make_need_account_info(self):\n", 196 | " self.jys.refreash_data()\n", 197 | " self.B = self.jys.Amount\n", 198 | " self.money = self.jys.Balance\n", 199 | " now_price = self.jys.last\n", 200 | " \n", 201 | " self.total_money = self.B* now_price + self.money\n", 202 | " self.half_money = self.total_money/2\n", 203 | " self.need_buy = (self.half_money - self.B*now_price )/now_price\n", 204 | " self.need_sell = (self.half_money - self.money)/now_price\n", 205 | " \n", 206 | " def do_juncang(self):\n", 207 | " if self.need_buy > 0.002:\n", 208 | " self.jys.create_order( 'buy', self.jys.low , self.need_buy ) \n", 209 | " self.Buy_count +=1\n", 210 | " elif self.need_sell > 0.002:\n", 211 | " self.jys.create_order( 'sell', self.jys.high , self.need_sell ) \n", 212 | " self.Sell_count += 1\n", 213 | " \n", 214 | " Log('Buy_times:',self.Buy_count , 'Sell_times:', self.Sell_count)\n", 215 | " \n", 216 | " \n", 217 | " def if_need_trade(self, condition, prama):\n", 218 | " if condition == 'time':\n", 219 | " if time.time() - self.last_time > prama:\n", 220 | " self.do_juncang()\n", 221 | " self.last_time = time.time()\n", 222 | " if condition == 'price':\n", 223 | " if abs((self.jys.last - self.last_trade_price)/self.last_trade_price) > prama:\n", 224 | " self.do_juncang()\n", 225 | " self.last_trade_price = self.jys.last" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 4, 231 | "metadata": { 232 | "collapsed": true 233 | }, 234 | "outputs": [], 235 | "source": [ 236 | "def main():\n", 237 | " test_mid = mid_class(exchange)\n", 238 | " Log(test_mid.refreash_data())\n", 239 | " test_juncang = juncang_class(test_mid)\n", 240 | " \n", 241 | " while(True):\n", 242 | " Sleep(1000)\n", 243 | " test_juncang.make_need_account_info()\n", 244 | " test_juncang.if_need_trade( 'price', 0.05 )" 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": null, 250 | "metadata": { 251 | "collapsed": true 252 | }, 253 | "outputs": [], 254 | "source": [ 255 | "1 1000 --- 1000" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": 5, 261 | "metadata": { 262 | "collapsed": false 263 | }, 264 | "outputs": [ 265 | { 266 | "data": { 267 | "text/plain": [ 268 | "1.5" 269 | ] 270 | }, 271 | "execution_count": 5, 272 | "metadata": {}, 273 | "output_type": "execute_result" 274 | } 275 | ], 276 | "source": [ 277 | "0.75 + 1500 ---- 2000" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 8, 283 | "metadata": { 284 | "collapsed": false 285 | }, 286 | "outputs": [ 287 | { 288 | "data": { 289 | "text/plain": [ 290 | "1125" 291 | ] 292 | }, 293 | "execution_count": 8, 294 | "metadata": {}, 295 | "output_type": "execute_result" 296 | } 297 | ], 298 | "source": [ 299 | "1.125 1125 --- 1000" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": null, 305 | "metadata": { 306 | "collapsed": true 307 | }, 308 | "outputs": [], 309 | "source": [] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": null, 314 | "metadata": { 315 | "collapsed": true 316 | }, 317 | "outputs": [], 318 | "source": [ 319 | "1 1000 --- 1000" 320 | ] 321 | }, 322 | { 323 | "cell_type": "code", 324 | "execution_count": null, 325 | "metadata": { 326 | "collapsed": true 327 | }, 328 | "outputs": [], 329 | "source": [ 330 | "1.5 750 ---- 500" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": null, 336 | "metadata": { 337 | "collapsed": true 338 | }, 339 | "outputs": [], 340 | "source": [ 341 | "1.5 750 ---- 200" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 4, 347 | "metadata": { 348 | "collapsed": false 349 | }, 350 | "outputs": [ 351 | { 352 | "data": { 353 | "text/plain": [ 354 | "1050.0" 355 | ] 356 | }, 357 | "execution_count": 4, 358 | "metadata": {}, 359 | "output_type": "execute_result" 360 | } 361 | ], 362 | "source": [ 363 | "(1.5*200 + 750)" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 5, 369 | "metadata": { 370 | "collapsed": false 371 | }, 372 | "outputs": [ 373 | { 374 | "data": { 375 | "text/plain": [ 376 | "1200" 377 | ] 378 | }, 379 | "execution_count": 5, 380 | "metadata": {}, 381 | "output_type": "execute_result" 382 | } 383 | ], 384 | "source": [ 385 | "1*200 + 1000" 386 | ] 387 | }, 388 | { 389 | "cell_type": "code", 390 | "execution_count": 3, 391 | "metadata": { 392 | "collapsed": false 393 | }, 394 | "outputs": [ 395 | { 396 | "data": { 397 | "text/plain": [ 398 | "2.625" 399 | ] 400 | }, 401 | "execution_count": 3, 402 | "metadata": {}, 403 | "output_type": "execute_result" 404 | } 405 | ], 406 | "source": [ 407 | "2.625 525.0 ---- 200" 408 | ] 409 | }, 410 | { 411 | "cell_type": "markdown", 412 | "metadata": {}, 413 | "source": [ 414 | "## 均仓策略 收益来源于价格一定范围内来回波动 风险来源于在执行操作之后,价格继续单边(上涨或下跌)" 415 | ] 416 | }, 417 | { 418 | "cell_type": "code", 419 | "execution_count": 6, 420 | "metadata": { 421 | "collapsed": false 422 | }, 423 | "outputs": [ 424 | { 425 | "data": { 426 | "text/plain": [ 427 | "0.957345971563981" 428 | ] 429 | }, 430 | "execution_count": 6, 431 | "metadata": {}, 432 | "output_type": "execute_result" 433 | } 434 | ], 435 | "source": [ 436 | "202 /211" 437 | ] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": 7, 442 | "metadata": { 443 | "collapsed": false 444 | }, 445 | "outputs": [ 446 | { 447 | "data": { 448 | "text/plain": [ 449 | "0.9737274220032841" 450 | ] 451 | }, 452 | "execution_count": 7, 453 | "metadata": {}, 454 | "output_type": "execute_result" 455 | } 456 | ], 457 | "source": [ 458 | "593/ 609" 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": 8, 464 | "metadata": { 465 | "collapsed": false 466 | }, 467 | "outputs": [ 468 | { 469 | "data": { 470 | "text/plain": [ 471 | "1.0022050716648292" 472 | ] 473 | }, 474 | "execution_count": 8, 475 | "metadata": {}, 476 | "output_type": "execute_result" 477 | } 478 | ], 479 | "source": [ 480 | "4545 /4535" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": 9, 486 | "metadata": { 487 | "collapsed": false 488 | }, 489 | "outputs": [ 490 | { 491 | "data": { 492 | "text/plain": [ 493 | "134" 494 | ] 495 | }, 496 | "execution_count": 9, 497 | "metadata": {}, 498 | "output_type": "execute_result" 499 | } 500 | ], 501 | "source": [ 502 | "3677 - 3543" 503 | ] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": 11, 508 | "metadata": { 509 | "collapsed": false 510 | }, 511 | "outputs": [ 512 | { 513 | "data": { 514 | "text/plain": [ 515 | "10" 516 | ] 517 | }, 518 | "execution_count": 11, 519 | "metadata": {}, 520 | "output_type": "execute_result" 521 | } 522 | ], 523 | "source": [ 524 | "4545- 4535" 525 | ] 526 | }, 527 | { 528 | "cell_type": "markdown", 529 | "metadata": {}, 530 | "source": [ 531 | "# 一般价格变动范围设置在手续费的4倍左右为基准开始调优较为合理:\n", 532 | "### 市场活跃时,手续费1.5~2倍都时可以的。市场不太活跃时,手续费的8倍,十倍,甚至二十,五十倍都是可以的。\n", 533 | "\n", 534 | "# 控制最小交易数量,也可以降低交易频率,增加抓取到更优点位的概率。从而提高收益" 535 | ] 536 | }, 537 | { 538 | "cell_type": "code", 539 | "execution_count": null, 540 | "metadata": { 541 | "collapsed": true 542 | }, 543 | "outputs": [], 544 | "source": [] 545 | } 546 | ], 547 | "metadata": { 548 | "kernelspec": { 549 | "display_name": "Python 3", 550 | "language": "python", 551 | "name": "python3" 552 | }, 553 | "language_info": { 554 | "codemirror_mode": { 555 | "name": "ipython", 556 | "version": 3 557 | }, 558 | "file_extension": ".py", 559 | "mimetype": "text/x-python", 560 | "name": "python", 561 | "nbconvert_exporter": "python", 562 | "pygments_lexer": "ipython3", 563 | "version": "3.6.0" 564 | } 565 | }, 566 | "nbformat": 4, 567 | "nbformat_minor": 2 568 | } 569 | -------------------------------------------------------------------------------- /写一个均仓策略.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 1、写一个均仓策略\n", 8 | "# 2、如何debug\n", 9 | "# 3、如何使用FMZ(botvs)的回测" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "class mid_class():\n", 19 | " def __init__(self, this_exchange):\n", 20 | " '''\n", 21 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 22 | " 设定好密钥……\n", 23 | " \n", 24 | " Args:\n", 25 | " this_exchange: FMZ的交易所结构\n", 26 | " \n", 27 | " '''\n", 28 | " self.init_timestamp = time.time()\n", 29 | " self.exchange = this_exchange\n", 30 | " self.name = self.exchange.GetName()\n", 31 | " self.jyd = self.exchange.GetCurrency() \n", 32 | " \n", 33 | " def get_account(self):\n", 34 | " '''\n", 35 | " 获取账户信息\n", 36 | " \n", 37 | " Returns:\n", 38 | " 获取信息成功返回True,获取信息失败返回False\n", 39 | " '''\n", 40 | " self.Balance = '---'\n", 41 | " self.Amount = '---'\n", 42 | " self.FrozenBalance = '---'\n", 43 | " self.FrozenStocks = '---'\n", 44 | " \n", 45 | " try:\n", 46 | " self.account = self.exchange.GetAccount()\n", 47 | "\n", 48 | " self.Balance = self.account['Balance']\n", 49 | " self.Amount = self.account['Stocks']\n", 50 | " self.FrozenBalance = self.account['FrozenBalance']\n", 51 | " self.FrozenStocks = self.account['FrozenStocks']\n", 52 | " return True\n", 53 | " except:\n", 54 | " return False\n", 55 | " \n", 56 | " def get_ticker(self):\n", 57 | " '''\n", 58 | " 获取市价信息\n", 59 | " \n", 60 | " Returns:\n", 61 | " 获取信息成功返回True,获取信息失败返回False\n", 62 | " '''\n", 63 | " self.high = '---'\n", 64 | " self.low = '---'\n", 65 | " self.Sell = '---'\n", 66 | " self.Buy = '---'\n", 67 | " self.last = '---'\n", 68 | " self.Volume = '---'\n", 69 | " \n", 70 | " try:\n", 71 | " self.ticker = self.exchange.GetTicker()\n", 72 | " \n", 73 | " self.high = self.ticker['High']\n", 74 | " self.low = self.ticker['Low']\n", 75 | " self.Sell = self.ticker['Sell']\n", 76 | " self.Buy = self.ticker['Buy']\n", 77 | " self.last = self.ticker['Last']\n", 78 | " self.Volume = self.ticker['Volume']\n", 79 | " return True\n", 80 | " except:\n", 81 | " return False\n", 82 | " \n", 83 | " \n", 84 | " def get_depth(self):\n", 85 | " '''\n", 86 | " 获取深度信息\n", 87 | " \n", 88 | " Returns:\n", 89 | " 获取信息成功返回True,获取信息失败返回False\n", 90 | " '''\n", 91 | " self.Ask = '---'\n", 92 | " self.Bids = '---'\n", 93 | " \n", 94 | " try:\n", 95 | " self.Depth = self.exchange.GetDepth()\n", 96 | " self.Ask = self.Depth['Asks']\n", 97 | " self.Bids = self.Depth ['Bids']\n", 98 | " return True\n", 99 | " except:\n", 100 | " return False\n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 105 | " '''\n", 106 | " 获取K线信息\n", 107 | " \n", 108 | " Args:\n", 109 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 110 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 111 | " '''\n", 112 | " self.ohlc_data = exchange.GetRecords(period)\n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " def create_order(self, order_type, price, amount):\n", 117 | " '''\n", 118 | " post一个挂单信息\n", 119 | " \n", 120 | " Args:\n", 121 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 122 | " price:挂单价格\n", 123 | " amount:挂单数量\n", 124 | " \n", 125 | " Returns:\n", 126 | " 挂单Id号,可用以取消挂单\n", 127 | " '''\n", 128 | " if order_type == 'buy':\n", 129 | " try:\n", 130 | " order_id = self.exchange.Buy( price, amount)\n", 131 | " except:\n", 132 | " return False\n", 133 | " \n", 134 | " elif order_type == 'sell':\n", 135 | " try:\n", 136 | " order_id = self.exchange.Sell( price, amount)\n", 137 | " except:\n", 138 | " return False\n", 139 | " \n", 140 | " return order_id\n", 141 | " \n", 142 | " def cancel_order(self, order_id):\n", 143 | " '''\n", 144 | " 取消一个挂单信息\n", 145 | " \n", 146 | " Args:\n", 147 | " order_id:希望取消的挂单ID号\n", 148 | " \n", 149 | " Returns:\n", 150 | " 取消挂单成功返回True,取消挂单失败返回False\n", 151 | " '''\n", 152 | " return self.exchange.CancelOrder(order_id)\n", 153 | " \n", 154 | " def refreash_data(self):\n", 155 | " '''\n", 156 | " 刷新信息\n", 157 | " \n", 158 | " Returns:\n", 159 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 160 | " '''\n", 161 | "\n", 162 | " if not self.get_account():\n", 163 | " return 'false_get_account'\n", 164 | " \n", 165 | " if not self.get_ticker():\n", 166 | " return 'false_get_ticker'\n", 167 | " if not self.get_depth():\n", 168 | " return 'false_get_depth'\n", 169 | " try:\n", 170 | " self.get_ohlc_data()\n", 171 | " except:\n", 172 | " return 'false_get_K_line_info'\n", 173 | " \n", 174 | " return 'refreash_data_finish!'\n" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 3, 180 | "metadata": {}, 181 | "outputs": [], 182 | "source": [ 183 | "class juncang_class():\n", 184 | " def __init__(self, mid_class):\n", 185 | " self.jys = mid_class\n", 186 | " self.last_time = time.time()\n", 187 | " self.last_trade_price = self.jys.last\n", 188 | " \n", 189 | " def make_need_account_info(self):\n", 190 | " self.jys.refreash_data()\n", 191 | " self.B = self.jys.Amount\n", 192 | " self.money = self.jys.Balance\n", 193 | " now_price = self.jys.last\n", 194 | " \n", 195 | " self.total_money = self.B* now_price + self.money\n", 196 | " self.half_money = self.total_money/2\n", 197 | " self.need_buy = (self.half_money - self.B*now_price )/now_price\n", 198 | " self.need_sell = (self.half_money - self.money)/now_price\n", 199 | " \n", 200 | " def do_juncang(self):\n", 201 | " if self.need_buy > 0.001:\n", 202 | " self.jys.create_order( 'buy', self.jys.low , self.need_buy ) \n", 203 | " elif self.need_sell > 0.001:\n", 204 | " self.jys.create_order( 'sell', self.jys.high , self.need_sell ) \n", 205 | " \n", 206 | " \n", 207 | " def if_need_trade(self, condition, prama):\n", 208 | " if condition == 'time':\n", 209 | " if time.time() - self.last_time > prama:\n", 210 | " self.do_juncang()\n", 211 | " self.last_time = time.time()\n", 212 | " if condition == 'price':\n", 213 | " if abs((self.jys.last - self.last_trade_price)/self.last_trade_price) > prama:\n", 214 | " self.do_juncang()\n", 215 | " self.last_trade_price = self.jys.last" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 4, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "def main():\n", 225 | " test_mid = mid_class(exchange)\n", 226 | " Log(test_mid.refreash_data())\n", 227 | " test_juncang = juncang_class(test_mid)\n", 228 | " \n", 229 | " while(True):\n", 230 | " Sleep(1000)\n", 231 | " test_juncang.make_need_account_info()\n", 232 | " test_juncang.if_need_trade('price', 0.05)" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": null, 238 | "metadata": {}, 239 | "outputs": [], 240 | "source": [ 241 | "1 1000 --- 1000" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 5, 247 | "metadata": {}, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "text/plain": [ 252 | "1.5" 253 | ] 254 | }, 255 | "execution_count": 5, 256 | "metadata": {}, 257 | "output_type": "execute_result" 258 | } 259 | ], 260 | "source": [ 261 | "0.75 + 1500 ---- 2000" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 8, 267 | "metadata": {}, 268 | "outputs": [ 269 | { 270 | "data": { 271 | "text/plain": [ 272 | "1125" 273 | ] 274 | }, 275 | "execution_count": 8, 276 | "metadata": {}, 277 | "output_type": "execute_result" 278 | } 279 | ], 280 | "source": [ 281 | "1.125 1125 --- 1000" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": null, 287 | "metadata": {}, 288 | "outputs": [], 289 | "source": [] 290 | } 291 | ], 292 | "metadata": { 293 | "kernelspec": { 294 | "display_name": "Python [conda env:py37]", 295 | "language": "python", 296 | "name": "conda-env-py37-py" 297 | }, 298 | "language_info": { 299 | "codemirror_mode": { 300 | "name": "ipython", 301 | "version": 3 302 | }, 303 | "file_extension": ".py", 304 | "mimetype": "text/x-python", 305 | "name": "python", 306 | "nbconvert_exporter": "python", 307 | "pygments_lexer": "ipython3", 308 | "version": "3.5.4" 309 | } 310 | }, 311 | "nbformat": 4, 312 | "nbformat_minor": 2 313 | } 314 | -------------------------------------------------------------------------------- /开始写策略量化教程.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [] 7 | }, 8 | { 9 | "cell_type": "code", 10 | "execution_count": null, 11 | "metadata": {}, 12 | "outputs": [], 13 | "source": [] 14 | } 15 | ], 16 | "metadata": { 17 | "kernelspec": { 18 | "display_name": "Python [conda env:py37]", 19 | "language": "python", 20 | "name": "conda-env-py37-py" 21 | }, 22 | "language_info": { 23 | "codemirror_mode": { 24 | "name": "ipython", 25 | "version": 3 26 | }, 27 | "file_extension": ".py", 28 | "mimetype": "text/x-python", 29 | "name": "python", 30 | "nbconvert_exporter": "python", 31 | "pygments_lexer": "ipython3", 32 | "version": "3.5.4" 33 | } 34 | }, 35 | "nbformat": 4, 36 | "nbformat_minor": 2 37 | } 38 | -------------------------------------------------------------------------------- /趋势类策略入门-2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 趋势策略入门" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### 关键函数:\n", 15 | " - 1 交易函数(接收一个交易字典,包含交易价格,交易量,币种,交易方向等)\n", 16 | " - 2 持仓计算函数(根据仓位情况和风险设定,计算限制交易量以及交易价格)\n", 17 | " - 3 趋势条件计算函数(根据品种价格情况,判断是否执行交易,交易方向,交易量,以及交易价格)" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "ename": "NameError", 27 | "evalue": "name 'PERIOD_M5' is not defined", 28 | "output_type": "error", 29 | "traceback": [ 30 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 31 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 32 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m '''\n\u001b[1;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 33 | "\u001b[0;32m\u001b[0m in \u001b[0;36mmid_class\u001b[0;34m()\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 87\u001b[0;31m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 88\u001b[0m '''\n\u001b[1;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 34 | "\u001b[0;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "class mid_class():\n", 40 | " def __init__(self, this_exchange):\n", 41 | " '''\n", 42 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 43 | " 设定好密钥……\n", 44 | " \n", 45 | " Args:\n", 46 | " this_exchange: FMZ的交易所结构\n", 47 | " \n", 48 | " '''\n", 49 | " self.init_timestamp = time.time()\n", 50 | " self.exchange = this_exchange\n", 51 | " self.name = self.exchange.GetName()\n", 52 | " self.jyd = self.exchange.GetCurrency() \n", 53 | " \n", 54 | " def get_account(self):\n", 55 | " '''\n", 56 | " 获取账户信息\n", 57 | " \n", 58 | " Returns:\n", 59 | " 获取信息成功返回True,获取信息失败返回False\n", 60 | " '''\n", 61 | " self.Balance = '---'\n", 62 | " self.Amount = '---'\n", 63 | " self.FrozenBalance = '---'\n", 64 | " self.FrozenStocks = '---'\n", 65 | " \n", 66 | " try:\n", 67 | " self.account = self.exchange.GetAccount()\n", 68 | "\n", 69 | " self.Balance = self.account['Balance']\n", 70 | " self.Amount = self.account['Stocks']\n", 71 | " self.FrozenBalance = self.account['FrozenBalance']\n", 72 | " self.FrozenStocks = self.account['FrozenStocks']\n", 73 | " return True\n", 74 | " except:\n", 75 | " return False\n", 76 | " \n", 77 | " def get_ticker(self):\n", 78 | " '''\n", 79 | " 获取市价信息\n", 80 | " \n", 81 | " Returns:\n", 82 | " 获取信息成功返回True,获取信息失败返回False\n", 83 | " '''\n", 84 | " self.high = '---'\n", 85 | " self.low = '---'\n", 86 | " self.Sell = '---'\n", 87 | " self.Buy = '---'\n", 88 | " self.last = '---'\n", 89 | " self.Volume = '---'\n", 90 | " \n", 91 | " try:\n", 92 | " self.ticker = self.exchange.GetTicker()\n", 93 | " \n", 94 | " self.high = self.ticker['High']\n", 95 | " self.low = self.ticker['Low']\n", 96 | " self.Sell = self.ticker['Sell']\n", 97 | " self.Buy = self.ticker['Buy']\n", 98 | " self.last = self.ticker['Last']\n", 99 | " self.Volume = self.ticker['Volume']\n", 100 | " return True\n", 101 | " except:\n", 102 | " return False\n", 103 | " \n", 104 | " \n", 105 | " def get_depth(self):\n", 106 | " '''\n", 107 | " 获取深度信息\n", 108 | " \n", 109 | " Returns:\n", 110 | " 获取信息成功返回True,获取信息失败返回False\n", 111 | " '''\n", 112 | " self.Ask = '---'\n", 113 | " self.Bids = '---'\n", 114 | " \n", 115 | " try:\n", 116 | " self.Depth = self.exchange.GetDepth()\n", 117 | " self.Ask = self.Depth['Asks']\n", 118 | " self.Bids = self.Depth ['Bids']\n", 119 | " return True\n", 120 | " except:\n", 121 | " return False\n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 126 | " '''\n", 127 | " 获取K线信息\n", 128 | " \n", 129 | " Args:\n", 130 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 131 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 132 | " '''\n", 133 | " self.ohlc_data = exchange.GetRecords(period)\n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " def create_order(self, order_type, price, amount):\n", 138 | " '''\n", 139 | " post一个挂单信息\n", 140 | " \n", 141 | " Args:\n", 142 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 143 | " price:挂单价格\n", 144 | " amount:挂单数量\n", 145 | " \n", 146 | " Returns:\n", 147 | " 挂单Id号,可用以取消挂单\n", 148 | " '''\n", 149 | " if order_type == 'buy':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Buy( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " elif order_type == 'sell':\n", 156 | " try:\n", 157 | " order_id = self.exchange.Sell( price, amount)\n", 158 | " except:\n", 159 | " return False\n", 160 | " \n", 161 | " return order_id\n", 162 | " \n", 163 | " def get_orders(self):\n", 164 | " self.undo_ordes = self.exchange.GetOrders()\n", 165 | " return self.undo_ordes\n", 166 | " \n", 167 | " def cancel_order(self, order_id):\n", 168 | " '''\n", 169 | " 取消一个挂单信息\n", 170 | " \n", 171 | " Args:\n", 172 | " order_id:希望取消的挂单ID号\n", 173 | " \n", 174 | " Returns:\n", 175 | " 取消挂单成功返回True,取消挂单失败返回False\n", 176 | " '''\n", 177 | " return self.exchange.CancelOrder(order_id)\n", 178 | " \n", 179 | " def refreash_data(self):\n", 180 | " '''\n", 181 | " 刷新信息\n", 182 | " \n", 183 | " Returns:\n", 184 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 185 | " '''\n", 186 | "\n", 187 | " if not self.get_account():\n", 188 | " return 'false_get_account'\n", 189 | " \n", 190 | " if not self.get_ticker():\n", 191 | " return 'false_get_ticker'\n", 192 | " if not self.get_depth():\n", 193 | " return 'false_get_depth'\n", 194 | " try:\n", 195 | " self.get_ohlc_data()\n", 196 | " except:\n", 197 | " return 'false_get_K_line_info'\n", 198 | " \n", 199 | " return 'refreash_data_finish!'\n" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 3, 205 | "metadata": { 206 | "collapsed": true 207 | }, 208 | "outputs": [], 209 | "source": [ 210 | "class qushi_class():\n", 211 | " def __init__(self, mid_class, amount_N, price_N):\n", 212 | " '''\n", 213 | " 设定好初始需要考虑的参数\n", 214 | " Args:\n", 215 | " mid_class: 所使用的交易所中间层\n", 216 | " amount_N:数量小数点限制\n", 217 | " price_N:价格小数点限制\n", 218 | " \n", 219 | " Attributes:\n", 220 | " amount_N:数量小数点限制\n", 221 | " price_N:价格小数点限制\n", 222 | " init_time:初始时间\n", 223 | " last_time:上一次执行操作的时间\n", 224 | " trade_list:交易请求的id\n", 225 | " '''\n", 226 | " self.jys = mid_class\n", 227 | " \n", 228 | " self.init_time = time.time()\n", 229 | " self.last_time = time.time()\n", 230 | " \n", 231 | " self.amount_N = amount_N\n", 232 | " self.price_N = price_N\n", 233 | " \n", 234 | " self.trade_list = []\n", 235 | " \n", 236 | " def refreash_data(self):\n", 237 | " '''\n", 238 | " 用来从交易所获取最新的价格和数量信息\n", 239 | " \n", 240 | " Attributes:\n", 241 | " B:商品币数量\n", 242 | " money:计价币数量\n", 243 | " can_buy_B:当前理论可购买商品币数量\n", 244 | " Buy_price:当前市场上最近的一单挂单买价\n", 245 | " Sell_price:当前市场上最近的一单挂单卖价\n", 246 | " '''\n", 247 | " \n", 248 | " self.jys.refreash_data()\n", 249 | " self.B = self.jys.Amount\n", 250 | " self.money = self.jys.Balance\n", 251 | " self.Buy_price = self.jys.Buy\n", 252 | " self.Sell_price = self.jys.Sell\n", 253 | " self.can_buy_B = self.money/ self.Sell_price\n", 254 | " self.can_buy_B = _N(self.can_buy_B, self.amount_N )\n", 255 | " self.can_sell_B = _N(self.B, self.amount_N )\n", 256 | " \n", 257 | " def make_trade_by_dict(self, trade_dicts):\n", 258 | " '''\n", 259 | " 用来批量完成交易订单\n", 260 | " \n", 261 | " Attributes:\n", 262 | " trade_list:已提交的交易请求的id\n", 263 | " '''\n", 264 | " for this_trade in trade_dicts:\n", 265 | " this_trade_id = self.jys.create_order( this_trade['side'], this_trade['price'] , this_trade['amount'] ) \n", 266 | " self.trade_list.append( this_trade_id )\n", 267 | " \n", 268 | " def condition_chicang(self, hands_num):\n", 269 | " '''\n", 270 | " 根据持仓情况来做交易判定的条件\n", 271 | " Args:\n", 272 | " hands_num:表示交易一共几手(我们假设当前每次交易不高于一手)\n", 273 | " \n", 274 | " Attributes:\n", 275 | " min_trade_B: 一手最多交易的商品币数量\n", 276 | " min_trade_money: 一手最多交易的计价币数量\n", 277 | " \n", 278 | " '''\n", 279 | " self.min_trade_B = (self.can_buy_B + self.B) / hands_num\n", 280 | " self.min_buy_B = min(self.min_trade_B, self.can_buy_B)\n", 281 | " self.min_sell_B = min(self.min_trade_B, self.B)\n", 282 | " \n", 283 | " self.min_trade_money = self.min_trade_B* self.jys.Buy\n", 284 | "\n", 285 | "\n", 286 | " \n", 287 | " def condition_qushi(self, change_pct ):\n", 288 | " '''\n", 289 | " 根据市场价格情况来做交易判定的条件\n", 290 | " Args:\n", 291 | " change_pct:表示价格变化多少来确定一次交易(假设根据之前一段时间均值判断)\n", 292 | " \n", 293 | " Returns:\n", 294 | " min_trade_B: 一手最多交易的商品币数量\n", 295 | " min_trade_money: 一手最多交易的计价币数量\n", 296 | " \n", 297 | " '''\n", 298 | " mean_price = sum( [x['Close'] for x in self.jys.ohlc_data[-12*24:]])/(12*24)\n", 299 | " do_buy = self.jys.Buy > mean_price* (100.0 + change_pct )/100.0\n", 300 | " do_sell = self.jys.Sell < mean_price/ ((100.0 + change_pct )/100.0)\n", 301 | " \n", 302 | " if do_buy or do_sell:\n", 303 | " rt = 'Buy' if do_buy else 'Sell'\n", 304 | " return rt\n", 305 | " else:\n", 306 | " return False\n", 307 | " \n", 308 | " def make_trade_dicts(self, hands_num, change_pct ):\n", 309 | " self.condition_chicang(hands_num)\n", 310 | " rt = self.condition_qushi( change_pct )\n", 311 | " this_trade_dicts = []\n", 312 | " if rt:\n", 313 | " if rt == 'Buy':\n", 314 | " if self.min_buy_B > 10**-self.amount_N:\n", 315 | " this_trade_dicts.append({\n", 316 | " 'side':'buy',\n", 317 | " 'price':self.jys.Buy,\n", 318 | " 'amount':self.min_buy_B\n", 319 | " })\n", 320 | " else:\n", 321 | " if self.min_sell_B > 10**-self.amount_N:\n", 322 | " this_trade_dicts.append({\n", 323 | " 'side':'sell',\n", 324 | " 'price':self.jys.Sell,\n", 325 | " 'amount':self.min_sell_B\n", 326 | " })\n", 327 | " return this_trade_dicts\n", 328 | " else:\n", 329 | " return False\n", 330 | " " 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 2, 336 | "metadata": {}, 337 | "outputs": [ 338 | { 339 | "data": { 340 | "text/plain": [ 341 | "1e-05" 342 | ] 343 | }, 344 | "execution_count": 2, 345 | "metadata": {}, 346 | "output_type": "execute_result" 347 | } 348 | ], 349 | "source": [ 350 | "1e-5" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 1, 356 | "metadata": {}, 357 | "outputs": [], 358 | "source": [ 359 | "def main():\n", 360 | " \n", 361 | " Set_amount_N = 4\n", 362 | " Set_price_N = 4\n", 363 | " \n", 364 | " hands_num = 20\n", 365 | " price_change_percentage = 2\n", 366 | " \n", 367 | " test_mid = mid_class(exchange)\n", 368 | " Log(test_mid.refreash_data())\n", 369 | " test_qushi = qushi_class(test_mid , Set_amount_N, Set_price_N)\n", 370 | " \n", 371 | " while True:\n", 372 | " \n", 373 | " Sleep(1000)\n", 374 | " try:\n", 375 | " test_qushi.refreash_data()\n", 376 | "\n", 377 | " now_trade_dicts = test_qushi.make_trade_dicts(hands_num, price_change_percentage)\n", 378 | " if now_trade_dicts:\n", 379 | " test_qushi.make_trade_by_dict(now_trade_dicts)\n", 380 | " now_trade_dicts = False\n", 381 | " except:\n", 382 | " pass" 383 | ] 384 | } 385 | ], 386 | "metadata": { 387 | "kernelspec": { 388 | "display_name": "Python 3", 389 | "language": "python", 390 | "name": "python3" 391 | }, 392 | "language_info": { 393 | "codemirror_mode": { 394 | "name": "ipython", 395 | "version": 3 396 | }, 397 | "file_extension": ".py", 398 | "mimetype": "text/x-python", 399 | "name": "python", 400 | "nbconvert_exporter": "python", 401 | "pygments_lexer": "ipython3", 402 | "version": "3.7.4" 403 | } 404 | }, 405 | "nbformat": 4, 406 | "nbformat_minor": 2 407 | } 408 | -------------------------------------------------------------------------------- /趋势类策略入门.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 趋势策略入门" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### 关键函数:\n", 15 | " - 1 交易函数(接收一个交易字典,包含交易价格,交易量,币种,交易方向等)\n", 16 | " - 2 持仓计算函数(根据仓位情况和风险设定,计算限制交易量以及交易价格)\n", 17 | " - 3 趋势条件计算函数(根据品种价格情况,判断是否执行交易,交易方向,交易量,以及交易价格)" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 1, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "ename": "NameError", 27 | "evalue": "name 'PERIOD_M5' is not defined", 28 | "output_type": "error", 29 | "traceback": [ 30 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 31 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 32 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[1;32mclass\u001b[0m \u001b[0mmid_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mthis_exchange\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m '''\n\u001b[1;32m 4\u001b[0m \u001b[0m初始化数据填充交易所的信息\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取价格\u001b[0m\u001b[0;31m,\u001b[0m\u001b[0m首次获取account信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0m设定好密钥\u001b[0m\u001b[0;31m…\u001b[0m\u001b[0;31m…\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 33 | "\u001b[0;32m\u001b[0m in \u001b[0;36mmid_class\u001b[0;34m()\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 87\u001b[0;31m \u001b[1;32mdef\u001b[0m \u001b[0mget_ohlc_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mperiod\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPERIOD_M5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 88\u001b[0m '''\n\u001b[1;32m 89\u001b[0m \u001b[0m获取K线信息\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 34 | "\u001b[0;31mNameError\u001b[0m: name 'PERIOD_M5' is not defined" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "class mid_class():\n", 40 | " def __init__(self, this_exchange):\n", 41 | " '''\n", 42 | " 初始化数据填充交易所的信息,首次获取价格,首次获取account信息\n", 43 | " 设定好密钥……\n", 44 | " \n", 45 | " Args:\n", 46 | " this_exchange: FMZ的交易所结构\n", 47 | " \n", 48 | " '''\n", 49 | " self.init_timestamp = time.time()\n", 50 | " self.exchange = this_exchange\n", 51 | " self.name = self.exchange.GetName()\n", 52 | " self.jyd = self.exchange.GetCurrency() \n", 53 | " \n", 54 | " def get_account(self):\n", 55 | " '''\n", 56 | " 获取账户信息\n", 57 | " \n", 58 | " Returns:\n", 59 | " 获取信息成功返回True,获取信息失败返回False\n", 60 | " '''\n", 61 | " self.Balance = '---'\n", 62 | " self.Amount = '---'\n", 63 | " self.FrozenBalance = '---'\n", 64 | " self.FrozenStocks = '---'\n", 65 | " \n", 66 | " try:\n", 67 | " self.account = self.exchange.GetAccount()\n", 68 | "\n", 69 | " self.Balance = self.account['Balance']\n", 70 | " self.Amount = self.account['Stocks']\n", 71 | " self.FrozenBalance = self.account['FrozenBalance']\n", 72 | " self.FrozenStocks = self.account['FrozenStocks']\n", 73 | " return True\n", 74 | " except:\n", 75 | " return False\n", 76 | " \n", 77 | " def get_ticker(self):\n", 78 | " '''\n", 79 | " 获取市价信息\n", 80 | " \n", 81 | " Returns:\n", 82 | " 获取信息成功返回True,获取信息失败返回False\n", 83 | " '''\n", 84 | " self.high = '---'\n", 85 | " self.low = '---'\n", 86 | " self.Sell = '---'\n", 87 | " self.Buy = '---'\n", 88 | " self.last = '---'\n", 89 | " self.Volume = '---'\n", 90 | " \n", 91 | " try:\n", 92 | " self.ticker = self.exchange.GetTicker()\n", 93 | " \n", 94 | " self.high = self.ticker['High']\n", 95 | " self.low = self.ticker['Low']\n", 96 | " self.Sell = self.ticker['Sell']\n", 97 | " self.Buy = self.ticker['Buy']\n", 98 | " self.last = self.ticker['Last']\n", 99 | " self.Volume = self.ticker['Volume']\n", 100 | " return True\n", 101 | " except:\n", 102 | " return False\n", 103 | " \n", 104 | " \n", 105 | " def get_depth(self):\n", 106 | " '''\n", 107 | " 获取深度信息\n", 108 | " \n", 109 | " Returns:\n", 110 | " 获取信息成功返回True,获取信息失败返回False\n", 111 | " '''\n", 112 | " self.Ask = '---'\n", 113 | " self.Bids = '---'\n", 114 | " \n", 115 | " try:\n", 116 | " self.Depth = self.exchange.GetDepth()\n", 117 | " self.Ask = self.Depth['Asks']\n", 118 | " self.Bids = self.Depth ['Bids']\n", 119 | " return True\n", 120 | " except:\n", 121 | " return False\n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " def get_ohlc_data(self, period = PERIOD_M5):\n", 126 | " '''\n", 127 | " 获取K线信息\n", 128 | " \n", 129 | " Args:\n", 130 | " period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,\n", 131 | " PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。\n", 132 | " '''\n", 133 | " self.ohlc_data = exchange.GetRecords(period)\n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " def create_order(self, order_type, price, amount):\n", 138 | " '''\n", 139 | " post一个挂单信息\n", 140 | " \n", 141 | " Args:\n", 142 | " order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单\n", 143 | " price:挂单价格\n", 144 | " amount:挂单数量\n", 145 | " \n", 146 | " Returns:\n", 147 | " 挂单Id号,可用以取消挂单\n", 148 | " '''\n", 149 | " if order_type == 'buy':\n", 150 | " try:\n", 151 | " order_id = self.exchange.Buy( price, amount)\n", 152 | " except:\n", 153 | " return False\n", 154 | " \n", 155 | " elif order_type == 'sell':\n", 156 | " try:\n", 157 | " order_id = self.exchange.Sell( price, amount)\n", 158 | " except:\n", 159 | " return False\n", 160 | " \n", 161 | " return order_id\n", 162 | " \n", 163 | " def get_orders(self):\n", 164 | " self.undo_ordes = self.exchange.GetOrders()\n", 165 | " return self.undo_ordes\n", 166 | " \n", 167 | " def cancel_order(self, order_id):\n", 168 | " '''\n", 169 | " 取消一个挂单信息\n", 170 | " \n", 171 | " Args:\n", 172 | " order_id:希望取消的挂单ID号\n", 173 | " \n", 174 | " Returns:\n", 175 | " 取消挂单成功返回True,取消挂单失败返回False\n", 176 | " '''\n", 177 | " return self.exchange.CancelOrder(order_id)\n", 178 | " \n", 179 | " def refreash_data(self):\n", 180 | " '''\n", 181 | " 刷新信息\n", 182 | " \n", 183 | " Returns:\n", 184 | " 刷新信息成功返回 'refreash_data_finish!' 否则返回相应刷新失败的信息提示\n", 185 | " '''\n", 186 | "\n", 187 | " if not self.get_account():\n", 188 | " return 'false_get_account'\n", 189 | " \n", 190 | " if not self.get_ticker():\n", 191 | " return 'false_get_ticker'\n", 192 | " if not self.get_depth():\n", 193 | " return 'false_get_depth'\n", 194 | " try:\n", 195 | " self.get_ohlc_data()\n", 196 | " except:\n", 197 | " return 'false_get_K_line_info'\n", 198 | " \n", 199 | " return 'refreash_data_finish!'\n" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 3, 205 | "metadata": { 206 | "collapsed": true 207 | }, 208 | "outputs": [], 209 | "source": [ 210 | "class qushi_class():\n", 211 | " def __init__(self, mid_class, amount_N, price_N):\n", 212 | " '''\n", 213 | " 设定好初始需要考虑的参数\n", 214 | " Args:\n", 215 | " mid_class: 所使用的交易所中间层\n", 216 | " amount_N:数量小数点限制\n", 217 | " price_N:价格小数点限制\n", 218 | " \n", 219 | " Attributes:\n", 220 | " amount_N:数量小数点限制\n", 221 | " price_N:价格小数点限制\n", 222 | " init_time:初始时间\n", 223 | " last_time:上一次执行操作的时间\n", 224 | " trade_list:交易请求的id\n", 225 | " '''\n", 226 | " self.jys = mid_class\n", 227 | " \n", 228 | " self.init_time = time.time()\n", 229 | " self.last_time = time.time()\n", 230 | " \n", 231 | " self.amount_N = amount_N\n", 232 | " self.price_N = price_N\n", 233 | " \n", 234 | " self.trade_list = []\n", 235 | " \n", 236 | " def refreash_data(self):\n", 237 | " '''\n", 238 | " 用来从交易所获取最新的价格和数量信息\n", 239 | " \n", 240 | " Attributes:\n", 241 | " B:商品币数量\n", 242 | " money:计价币数量\n", 243 | " can_buy_B:当前理论可购买商品币数量\n", 244 | " Buy_price:当前市场上最近的一单挂单买价\n", 245 | " Sell_price:当前市场上最近的一单挂单卖价\n", 246 | " '''\n", 247 | " \n", 248 | " self.jys.refreash_data()\n", 249 | " self.B = self.jys.Amount\n", 250 | " self.money = self.jys.Balance\n", 251 | " self.Buy_price = self.jys.Buy\n", 252 | " self.Sell_price = self.jys.Sell\n", 253 | " self.can_buy_B = self.money/ self.Buy_price\n", 254 | " \n", 255 | " def make_trade_by_dict(self, trade_dicts):\n", 256 | " '''\n", 257 | " 用来批量完成交易订单\n", 258 | " \n", 259 | " Attributes:\n", 260 | " trade_list:已提交的交易请求的id\n", 261 | " '''\n", 262 | " for this_trade in trade_dicts:\n", 263 | " this_trade_id = self.jys.create_order( trade_dicts['side'], trade_dict['buy_price'] , trade_dict['amount'] ) \n", 264 | " self.trade_list.append( this_trade_id )\n", 265 | " \n", 266 | " def condition_chicang(self, hands_num):\n", 267 | " '''\n", 268 | " 根据持仓情况来做交易判定的条件\n", 269 | " Args:\n", 270 | " hands_num:表示交易一共几手(我们假设当前每次交易不高于一手)\n", 271 | " \n", 272 | " Attributes:\n", 273 | " min_trade_B: 一手最多交易的商品币数量\n", 274 | " min_trade_money: 一手最多交易的计价币数量\n", 275 | " \n", 276 | " '''\n", 277 | " self.min_trade_B = (self.can_buy_B + self.B) / hands_num\n", 278 | " self.min_trade_money = self.min_trade_B* self.jys.Buy\n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " def condition_qushi(self, change_pct ):\n", 283 | " '''\n", 284 | " 根据市场价格情况来做交易判定的条件\n", 285 | " Args:\n", 286 | " change_pct:表示价格变化多少来确定一次交易(假设根据之前一段时间均值判断)\n", 287 | " \n", 288 | " Returns:\n", 289 | " min_trade_B: 一手最多交易的商品币数量\n", 290 | " min_trade_money: 一手最多交易的计价币数量\n", 291 | " \n", 292 | " '''\n", 293 | " mean_price = self.jys.ohlc_data[-12*24:]/(12*24)\n", 294 | " do_buy = self.jys.Buy > mean_price* (100.0 + change_pct )/100.0\n", 295 | " do_sell = self.jys.Sell < mean_price/ ((100.0 + change_pct )/100.0)\n", 296 | " \n", 297 | " if do_buy or do_sell:\n", 298 | " rt = 'Buy' if do_buy else 'Sell'\n", 299 | " \n", 300 | " return rt\n", 301 | " \n", 302 | " def make_trade_dicts:\n", 303 | " pass" 304 | ] 305 | } 306 | ], 307 | "metadata": { 308 | "kernelspec": { 309 | "display_name": "Python 3", 310 | "language": "python", 311 | "name": "python3" 312 | }, 313 | "language_info": { 314 | "codemirror_mode": { 315 | "name": "ipython", 316 | "version": 3 317 | }, 318 | "file_extension": ".py", 319 | "mimetype": "text/x-python", 320 | "name": "python", 321 | "nbconvert_exporter": "python", 322 | "pygments_lexer": "ipython3", 323 | "version": "3.7.4" 324 | } 325 | }, 326 | "nbformat": 4, 327 | "nbformat_minor": 2 328 | } 329 | --------------------------------------------------------------------------------