# dtrader **Repository Path**: ginlong/dtrader ## Basic Information - **Project Name**: dtrader - **Description**: 可视化自动化交易软件 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-05-18 - **Last Updated**: 2024-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dtrader * 自动化交易命令行版本 * 支持回测测略和交易策略 **开发环境** : `Centos 7.3` / `Python 2.7`/`PyQt4` ## 安装使用 ### 可视化界面安装使用 * 可视化界面应用了PYQT,在Dtrader/gui 目录运行main.py * 可视化运行效果图 ![策略视图](https://git.oschina.net/uploads/images/2017/0611/210326_413bfaa7_1357936.png "策略视图") ![组合管理视图](https://git.oschina.net/uploads/images/2017/0611/210414_9815abea_1357936.png "组合管理视图") ## 命令行使用 * 命令行是为了调试策略,开发策略用的 ```Bash pip install easytrader ``` * 执行命令build ```Bash python setup.py develop ``` * 执行测试策略 ```Bash      python strategy/simplestrategy.py ``` * 编写策略 ```Python # -*- coding: UTF-8 -*- from decimal import Decimal from dtrader.strategy import LiveTradeStrategy from dtrader.price_handler.tushare_test_tick import TushareTestTickPriceHandler from dtrader.broker.mailbroker import MailBroker try: import Queue as queue except ImportError: import queue class SimpleStrategy(LiveTradeStrategy): def __init__(self): #初始化pricehandler events_queue = queue.Queue() tikcers = ['600479'] price_handler = TushareTestTickPriceHandler(events_queue,tikcers,'2017-06-01') #初始化broker broker = MailBroker(['690484812@qq.com','hezhenke123@163.com'],events_queue) super(SimpleStrategy, self).__init__(price_handler,broker) self.keyword = "SimpleStrategy" self.__option = { "600479":{"buy_price":15,"sell_price":17,"buy_amount":"1000","sell_amount":"1000"} } def on_tick(self, event): try: ticker = event.ticker bid = event.bid ask = event.ask if not self.__option.has_key(ticker): return portfolio = self.get_portfolio() if self.__option[ticker].has_key('buy_price') and self.__option[ticker]['buy_price'] is not None: buy_price = Decimal(str(self.__option[ticker]['buy_price'])) buy_amount = Decimal(str(self.__option[ticker]['buy_amount'])) if buy_price >= bid and buy_amount >= 100: if not portfolio.positions.has_key(ticker): #发送买入信号 self.create_limit_order(ticker,"BOT",buy_amount,bid) self.get_logger().info("buy ticker:%s,amount:%s,price:%s"%(ticker,buy_amount,bid)) if self.__option[ticker].has_key('sell_price') and self.__option[ticker]['sell_price'] is not None: sell_price = Decimal(str(self.__option[ticker]['sell_price'])) sell_amount = Decimal(str(self.__option[ticker]['sell_amount'])) if sell_price <= ask and sell_amount > 100: #发出卖出信号 if portfolio.portfolio.positions.has_key(ticker): self.create_limit_order(ticker, "SLD", sell_amount, ask) self.get_logger().info("sell ticker:%s,amount:%s,price:%s"%(ticker,sell_amount,ask)) except Exception,e: self.get_logger().error("on_tick error,message:%s" % (e.message)) def get_tickers(self): return self.__option.keys() def on_bar(self,event): pass if __name__ == "__main__": strategy = SimpleStrategy() strategy.run(); ``` * 可以自行编写broker(交易接口) price_handler(行情接口),在写自定义策略 ## TODO * 主界面上列出所有的策略(每一个策略可以分为一个tab) * 策略里面可以对交易账户进行设置,不同的策略可以设置不同的交易账号 * 策略里面可以设置策略运行参数,参照vnpy * 点击执行按钮,策略开始执行,并有日志输出到底部日志窗口 * 底部显示执行过程中的仓位情况,仿照VNPY * 底部显示策略执行过程中的订单情况,成交情况 仿照VNPY * 可以对策略进行历史数据回测,并且有图表功能