简化对API的引用结构,增加vnpy版本信息
This commit is contained in:
parent
8905ae311d
commit
65a23f5fd8
@ -0,0 +1,4 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
__version__ = 'v1.6.2 dev'
|
||||||
|
__author__ = u'用Python的交易员'
|
@ -0,0 +1,5 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnctpmd import MdApi
|
||||||
|
from vnctptd import TdApi
|
||||||
|
from ctp_data_type import defineDict
|
5
vnpy/api/femas/__init__.py
Normal file
5
vnpy/api/femas/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnfemasmd import MdApi
|
||||||
|
from vnfemastd import TdApi
|
||||||
|
from femas_data_type import defineDict
|
3
vnpy/api/huobi/__init__.py
Normal file
3
vnpy/api/huobi/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnhuobi import TradeApi, DataApi
|
3
vnpy/api/ib/__init__.py
Normal file
3
vnpy/api/ib/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnib import *
|
4
vnpy/api/ksgold/__init__.py
Normal file
4
vnpy/api/ksgold/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnksgoldtd import TdApi
|
||||||
|
from ksgold_data_type import defineDict
|
5
vnpy/api/ksotp/__init__.py
Normal file
5
vnpy/api/ksotp/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnksotpmd import MdApi
|
||||||
|
from vnksotptd import TdApi
|
||||||
|
from ksotp_data_type import defineDict
|
3
vnpy/api/lhang/__init__.py
Normal file
3
vnpy/api/lhang/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnlhang import LhangApi
|
6
vnpy/api/lts/__init__.py
Normal file
6
vnpy/api/lts/__init__.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnltsmd import MdApi
|
||||||
|
from vnltstd import TdApi
|
||||||
|
from vnltsqry import QryApi
|
||||||
|
from lts_data_type import defineDict
|
3
vnpy/api/oanda/__init__.py
Normal file
3
vnpy/api/oanda/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnoanda import OandaApi
|
3
vnpy/api/okcoin/__init__.py
Normal file
3
vnpy/api/okcoin/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnokcoin import OkCoinApi
|
5
vnpy/api/qdp/__init__.py
Normal file
5
vnpy/api/qdp/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnqdpmd import MdApi
|
||||||
|
from vnqdptd import TdApi
|
||||||
|
from qdp_data_type import defineDict
|
5
vnpy/api/sgit/__init__.py
Normal file
5
vnpy/api/sgit/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnsgitmd import MdApi
|
||||||
|
from vnsgittd import TdApi
|
||||||
|
from sgit_data_type import defineDict
|
3
vnpy/api/shzd/__init__.py
Normal file
3
vnpy/api/shzd/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnshzd import ShzdApi
|
5
vnpy/api/xspeed/__init__.py
Normal file
5
vnpy/api/xspeed/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from vnxspeedmd import MdApi
|
||||||
|
from vnxspeedtd import TdApi
|
||||||
|
from xspeed_data_type import defineDict
|
@ -0,0 +1 @@
|
|||||||
|
# encoding: UTF-8
|
@ -12,7 +12,7 @@ from itertools import product
|
|||||||
import multiprocessing
|
import multiprocessing
|
||||||
import pymongo
|
import pymongo
|
||||||
|
|
||||||
import vtGlobal
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
from ctaBase import *
|
from ctaBase import *
|
||||||
from vtConstant import *
|
from vtConstant import *
|
||||||
from vtGateway import VtOrderData, VtTradeData
|
from vtGateway import VtOrderData, VtTradeData
|
||||||
@ -119,7 +119,7 @@ class BacktestingEngine(object):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def loadHistoryData(self):
|
def loadHistoryData(self):
|
||||||
"""载入历史数据"""
|
"""载入历史数据"""
|
||||||
self.dbClient = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
self.dbClient = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
collection = self.dbClient[self.dbName][self.symbol]
|
collection = self.dbClient[self.dbName][self.symbol]
|
||||||
|
|
||||||
self.output(u'开始载入数据')
|
self.output(u'开始载入数据')
|
||||||
|
@ -12,7 +12,7 @@ import pymongo
|
|||||||
from time import time
|
from time import time
|
||||||
from multiprocessing.pool import ThreadPool
|
from multiprocessing.pool import ThreadPool
|
||||||
|
|
||||||
import vtGlobal
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
from ctaBase import *
|
from ctaBase import *
|
||||||
from vtConstant import *
|
from vtConstant import *
|
||||||
from datayesClient import DatayesClient
|
from datayesClient import DatayesClient
|
||||||
@ -34,7 +34,7 @@ class HistoryDataEngine(object):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Constructor"""
|
"""Constructor"""
|
||||||
self.dbClient = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
self.dbClient = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
self.datayesClient = DatayesClient()
|
self.datayesClient = DatayesClient()
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@ -372,7 +372,7 @@ def loadMcCsv(fileName, dbName, symbol):
|
|||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
collection = client[dbName][symbol]
|
collection = client[dbName][symbol]
|
||||||
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
|
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
|
||||||
|
|
||||||
@ -406,7 +406,7 @@ def loadTdxCsv(fileName, dbName, symbol):
|
|||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
collection = client[dbName][symbol]
|
collection = client[dbName][symbol]
|
||||||
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
|
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
|
||||||
|
|
||||||
@ -445,7 +445,7 @@ def loadTBCsv(fileName, dbName, symbol):
|
|||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
collection = client[dbName][symbol]
|
collection = client[dbName][symbol]
|
||||||
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
|
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ same as CTA engine. Real trading code can be directly used for backtesting.
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
import vtGlobal
|
|
||||||
|
|
||||||
from ctaBacktesting import *
|
from ctaBacktesting import *
|
||||||
|
|
||||||
@ -70,7 +69,7 @@ class BacktestEngineMultiTF(BacktestingEngine):
|
|||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
def loadHistoryData(self):
|
def loadHistoryData(self):
|
||||||
"""载入历史数据"""
|
"""载入历史数据"""
|
||||||
self.dbClient = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
self.dbClient = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
collection = self.dbClient[self.dbName][self.symbol]
|
collection = self.dbClient[self.dbName][self.symbol]
|
||||||
|
|
||||||
# Load historical data of information symbols, construct a dictionary of Database
|
# Load historical data of information symbols, construct a dictionary of Database
|
||||||
|
@ -13,9 +13,7 @@ import json
|
|||||||
from copy import copy
|
from copy import copy
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from vnpy.api.ctp.vnctpmd import MdApi
|
from vnpy.api.ctp import MdApi, TdApi, defineDict
|
||||||
from vnpy.api.ctp.vnctptd import TdApi
|
|
||||||
from .ctpDataType import defineDict
|
|
||||||
from vnpy.trader.vtGateway import *
|
from vnpy.trader.vtGateway import *
|
||||||
from language import text
|
from language import text
|
||||||
|
|
||||||
|
@ -10,9 +10,7 @@ vn.femas的gateway接入
|
|||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from vnfemasmd import MdApi
|
from vnpy.api.femas import MdApi, TdApi, defineDict
|
||||||
from vnfemastd import TdApi
|
|
||||||
from femasDataType import *
|
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
# 以下为一些VT类型和CTP类型的映射字典
|
# 以下为一些VT类型和CTP类型的映射字典
|
||||||
|
@ -13,7 +13,7 @@ from threading import Condition
|
|||||||
from Queue import Queue
|
from Queue import Queue
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
import vnhuobi
|
from vnpy.api.huobi import vnhuobi
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,652 +0,0 @@
|
|||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
import urllib
|
|
||||||
import hashlib
|
|
||||||
|
|
||||||
import json
|
|
||||||
import requests
|
|
||||||
from time import time, sleep
|
|
||||||
from Queue import Queue, Empty
|
|
||||||
from threading import Thread
|
|
||||||
|
|
||||||
|
|
||||||
# 常量定义
|
|
||||||
COINTYPE_BTC = 1
|
|
||||||
COINTYPE_LTC = 2
|
|
||||||
|
|
||||||
ACCOUNTTYPE_CNY = 1
|
|
||||||
ACCOUNTTYPE_USD = 2
|
|
||||||
|
|
||||||
LOANTYPE_CNY = 1
|
|
||||||
LOANTYPE_BTC = 2
|
|
||||||
LOANTYPE_LTC = 3
|
|
||||||
LOANTYPE_USD = 4
|
|
||||||
|
|
||||||
MARKETTYPE_CNY = 'cny'
|
|
||||||
MARKETTYPE_USD = 'usd'
|
|
||||||
|
|
||||||
SYMBOL_BTCCNY = 'BTC_CNY'
|
|
||||||
SYMBOL_LTCCNY = 'LTC_CNY'
|
|
||||||
SYMBOL_BTCUSD = 'BTC_USD'
|
|
||||||
|
|
||||||
PERIOD_1MIN = '001'
|
|
||||||
PERIOD_5MIN = '005'
|
|
||||||
PERIOD_15MIN = '015'
|
|
||||||
PERIOD_30MIN = '030'
|
|
||||||
PERIOD_60MIN = '060'
|
|
||||||
PERIOD_DAILY = '100'
|
|
||||||
PERIOD_WEEKLY = '200'
|
|
||||||
PERIOD_MONTHLY = '300'
|
|
||||||
PERIOD_ANNUALLY = '400'
|
|
||||||
|
|
||||||
# API相关定义
|
|
||||||
HUOBI_TRADE_API = 'https://api.huobi.com/apiv3'
|
|
||||||
|
|
||||||
# 功能代码
|
|
||||||
FUNCTIONCODE_GETACCOUNTINFO = 'get_account_info'
|
|
||||||
FUNCTIONCODE_GETORDERS = 'get_orders'
|
|
||||||
FUNCTIONCODE_ORDERINFO = 'order_info'
|
|
||||||
FUNCTIONCODE_BUY = 'buy'
|
|
||||||
FUNCTIONCODE_SELL = 'sell'
|
|
||||||
FUNCTIONCODE_BUYMARKET = 'buy_market'
|
|
||||||
FUNCTIONCODE_SELLMARKET = 'sell_market'
|
|
||||||
FUNCTIONCODE_CANCELORDER = 'cancel_order'
|
|
||||||
FUNCTIONCODE_GETNEWDEALORDERS = 'get_new_deal_orders'
|
|
||||||
FUNCTIONCODE_GETORDERIDBYTRADEID = 'get_order_id_by_trade_id'
|
|
||||||
FUNCTIONCODE_WITHDRAWCOIN = 'withdraw_coin'
|
|
||||||
FUNCTIONCODE_CANCELWITHDRAWCOIN = 'cancel_withdraw_coin'
|
|
||||||
FUNCTIONCODE_GETWITHDRAWCOINRESULT = 'get_withdraw_coin_result'
|
|
||||||
FUNCTIONCODE_TRANSFER = 'transfer'
|
|
||||||
FUNCTIONCODE_LOAN = 'loan'
|
|
||||||
FUNCTIONCODE_REPAYMENT = 'repayment'
|
|
||||||
FUNCTIONCODE_GETLOANAVAILABLE = 'get_loan_available'
|
|
||||||
FUNCTIONCODE_GETLOANS = 'get_loans'
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def signature(params):
|
|
||||||
"""生成签名"""
|
|
||||||
params = sorted(params.iteritems(), key=lambda d:d[0], reverse=False)
|
|
||||||
message = urllib.urlencode(params)
|
|
||||||
|
|
||||||
m = hashlib.md5()
|
|
||||||
m.update(message)
|
|
||||||
m.digest()
|
|
||||||
|
|
||||||
sig=m.hexdigest()
|
|
||||||
return sig
|
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
class TradeApi(object):
|
|
||||||
"""交易接口"""
|
|
||||||
DEBUG = True
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def __init__(self):
|
|
||||||
"""Constructor"""
|
|
||||||
self.accessKey = ''
|
|
||||||
self.secretKey = ''
|
|
||||||
|
|
||||||
self.active = False # API工作状态
|
|
||||||
self.reqID = 0 # 请求编号
|
|
||||||
self.reqQueue = Queue() # 请求队列
|
|
||||||
self.reqThread = Thread(target=self.processQueue) # 请求处理线程
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def processRequest(self, req):
|
|
||||||
"""处理请求"""
|
|
||||||
# 读取方法和参数
|
|
||||||
method = req['method']
|
|
||||||
params = req['params']
|
|
||||||
optional = req['optional']
|
|
||||||
|
|
||||||
# 在参数中增加必须的字段
|
|
||||||
params['created'] = long(time())
|
|
||||||
params['access_key'] = self.accessKey
|
|
||||||
params['secret_key'] = self.secretKey
|
|
||||||
params['method'] = method
|
|
||||||
|
|
||||||
# 添加签名
|
|
||||||
sign = signature(params)
|
|
||||||
params['sign'] = sign
|
|
||||||
del params['secret_key']
|
|
||||||
|
|
||||||
# 添加选填参数
|
|
||||||
if optional:
|
|
||||||
params.update(optional)
|
|
||||||
|
|
||||||
# 发送请求
|
|
||||||
payload = urllib.urlencode(params)
|
|
||||||
|
|
||||||
r = requests.post(HUOBI_TRADE_API, params=payload)
|
|
||||||
if r.status_code == 200:
|
|
||||||
data = r.json()
|
|
||||||
return data
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def processQueue(self):
|
|
||||||
"""处理请求队列中的请求"""
|
|
||||||
while self.active:
|
|
||||||
try:
|
|
||||||
req = self.reqQueue.get(block=True, timeout=1) # 获取请求的阻塞为一秒
|
|
||||||
callback = req['callback']
|
|
||||||
reqID = req['reqID']
|
|
||||||
|
|
||||||
data = self.processRequest(req)
|
|
||||||
|
|
||||||
# 请求失败
|
|
||||||
if 'code' in data and 'message' in data:
|
|
||||||
error = u'错误信息:%s' %data['message']
|
|
||||||
self.onError(error, req, reqID)
|
|
||||||
# 请求成功
|
|
||||||
else:
|
|
||||||
if self.DEBUG:
|
|
||||||
print callback.__name__
|
|
||||||
callback(data, req, reqID)
|
|
||||||
|
|
||||||
except Empty:
|
|
||||||
pass
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def sendRequest(self, method, params, callback, optional=None):
|
|
||||||
"""发送请求"""
|
|
||||||
# 请求编号加1
|
|
||||||
self.reqID += 1
|
|
||||||
|
|
||||||
# 生成请求字典并放入队列中
|
|
||||||
req = {}
|
|
||||||
req['method'] = method
|
|
||||||
req['params'] = params
|
|
||||||
req['callback'] = callback
|
|
||||||
req['optional'] = optional
|
|
||||||
req['reqID'] = self.reqID
|
|
||||||
self.reqQueue.put(req)
|
|
||||||
|
|
||||||
# 返回请求编号
|
|
||||||
return self.reqID
|
|
||||||
|
|
||||||
####################################################
|
|
||||||
## 主动函数
|
|
||||||
####################################################
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def init(self, accessKey, secretKey):
|
|
||||||
"""初始化"""
|
|
||||||
self.accessKey = accessKey
|
|
||||||
self.secretKey = secretKey
|
|
||||||
|
|
||||||
self.active = True
|
|
||||||
self.reqThread.start()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def exit(self):
|
|
||||||
"""退出"""
|
|
||||||
self.active = False
|
|
||||||
|
|
||||||
if self.reqThread.isAlive():
|
|
||||||
self.reqThread.join()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getAccountInfo(self, market='cny'):
|
|
||||||
"""查询账户"""
|
|
||||||
method = FUNCTIONCODE_GETACCOUNTINFO
|
|
||||||
params = {}
|
|
||||||
callback = self.onGetAccountInfo
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getOrders(self, coinType=COINTYPE_BTC, market='cny'):
|
|
||||||
"""查询委托"""
|
|
||||||
method = FUNCTIONCODE_GETORDERS
|
|
||||||
params = {'coin_type': coinType}
|
|
||||||
callback = self.onGetOrders
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def orderInfo(self, id_, coinType=COINTYPE_BTC, market='cny'):
|
|
||||||
"""获取委托详情"""
|
|
||||||
method = FUNCTIONCODE_ORDERINFO
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'id': id_
|
|
||||||
}
|
|
||||||
callback = self.onOrderInfo
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def buy(self, price, amount, coinType=COINTYPE_BTC,
|
|
||||||
tradePassword='', tradeId = '', market='cny'):
|
|
||||||
"""委托买入"""
|
|
||||||
method = FUNCTIONCODE_BUY
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'price': price,
|
|
||||||
'amount': amount
|
|
||||||
}
|
|
||||||
callback = self.onBuy
|
|
||||||
optional = {
|
|
||||||
'trade_password': tradePassword,
|
|
||||||
'trade_id': tradeId,
|
|
||||||
'market': market
|
|
||||||
}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def sell(self, price, amount, coinType=COINTYPE_BTC,
|
|
||||||
tradePassword='', tradeId = '', market='cny'):
|
|
||||||
"""委托卖出"""
|
|
||||||
method = FUNCTIONCODE_SELL
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'price': price,
|
|
||||||
'amount': amount
|
|
||||||
}
|
|
||||||
callback = self.onSell
|
|
||||||
optional = {
|
|
||||||
'trade_password': tradePassword,
|
|
||||||
'trade_id': tradeId,
|
|
||||||
'market': market
|
|
||||||
}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def buyMarket(self, amount, coinType=COINTYPE_BTC,
|
|
||||||
tradePassword='', tradeId = '', market='cny'):
|
|
||||||
"""市价买入"""
|
|
||||||
method = FUNCTIONCODE_BUYMARKET
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'amount': amount
|
|
||||||
}
|
|
||||||
callback = self.onBuyMarket
|
|
||||||
optional = {
|
|
||||||
'trade_password': tradePassword,
|
|
||||||
'trade_id': tradeId,
|
|
||||||
'market': market
|
|
||||||
}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def sellMarket(self, amount, coinType=COINTYPE_BTC,
|
|
||||||
tradePassword='', tradeId = '', market='cny'):
|
|
||||||
"""市价卖出"""
|
|
||||||
method = FUNCTIONCODE_SELLMARKET
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'amount': amount
|
|
||||||
}
|
|
||||||
callback = self.onSellMarket
|
|
||||||
optional = {
|
|
||||||
'trade_password': tradePassword,
|
|
||||||
'trade_id': tradeId,
|
|
||||||
'market': market
|
|
||||||
}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def cancelOrder(self, id_, coinType=COINTYPE_BTC, market='cny'):
|
|
||||||
"""撤销委托"""
|
|
||||||
method = FUNCTIONCODE_CANCELORDER
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'id': id_
|
|
||||||
}
|
|
||||||
callback = self.onCancelOrder
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getNewDealOrders(self, market='cny'):
|
|
||||||
"""查询最新10条成交"""
|
|
||||||
method = FUNCTIONCODE_GETNEWDEALORDERS
|
|
||||||
params = {}
|
|
||||||
callback = self.onGetNewDealOrders
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getOrderIdByTradeId(self, tradeId, coinType=COINTYPE_BTC,
|
|
||||||
market='cny'):
|
|
||||||
"""通过成交编号查询委托编号"""
|
|
||||||
method = FUNCTIONCODE_GETORDERIDBYTRADEID
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'trade_id': tradeId
|
|
||||||
}
|
|
||||||
callback = self.onGetOrderIdByTradeId
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def withdrawCoin(self, withdrawAddress, withdrawAmount,
|
|
||||||
coinType=COINTYPE_BTC, tradePassword='',
|
|
||||||
market='cny', withdrawFee=0.0001):
|
|
||||||
"""提币"""
|
|
||||||
method = FUNCTIONCODE_WITHDRAWCOIN
|
|
||||||
params = {
|
|
||||||
'coin_type': coinType,
|
|
||||||
'withdraw_address': withdrawAddress,
|
|
||||||
'withdraw_amount': withdrawAmount
|
|
||||||
}
|
|
||||||
callback = self.onWithdrawCoin
|
|
||||||
optional = {
|
|
||||||
'market': market,
|
|
||||||
'withdraw_fee': withdrawFee
|
|
||||||
}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def cancelWithdrawCoin(self, id_, market='cny'):
|
|
||||||
"""取消提币"""
|
|
||||||
method = FUNCTIONCODE_CANCELWITHDRAWCOIN
|
|
||||||
params = {'withdraw_coin_id': id_}
|
|
||||||
callback = self.onCancelWithdrawCoin
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetWithdrawCoinResult(self, id_, market='cny'):
|
|
||||||
"""查询提币结果"""
|
|
||||||
method = FUNCTIONCODE_GETWITHDRAWCOINRESULT
|
|
||||||
params = {'withdraw_coin_id': id_}
|
|
||||||
callback = self.onGetWithdrawCoinResult
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def transfer(self, amountFrom, amountTo, amount,
|
|
||||||
coinType=COINTYPE_BTC ):
|
|
||||||
"""账户内转账"""
|
|
||||||
method = FUNCTIONCODE_TRANSFER
|
|
||||||
params = {
|
|
||||||
'amount_from': amountFrom,
|
|
||||||
'amount_to': amountTo,
|
|
||||||
'amount': amount,
|
|
||||||
'coin_type': coinType
|
|
||||||
}
|
|
||||||
callback = self.onTransfer
|
|
||||||
optional = {}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def loan(self, amount, loan_type=LOANTYPE_CNY,
|
|
||||||
market=MARKETTYPE_CNY):
|
|
||||||
"""申请杠杆"""
|
|
||||||
method = FUNCTIONCODE_LOAN
|
|
||||||
params = {
|
|
||||||
'amount': amount,
|
|
||||||
'loan_type': loan_type
|
|
||||||
}
|
|
||||||
callback = self.onLoan
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def repayment(self, id_, amount, repayAll=0,
|
|
||||||
market=MARKETTYPE_CNY):
|
|
||||||
"""归还杠杆"""
|
|
||||||
method = FUNCTIONCODE_REPAYMENT
|
|
||||||
params = {
|
|
||||||
'loan_id': id_,
|
|
||||||
'amount': amount
|
|
||||||
}
|
|
||||||
callback = self.onRepayment
|
|
||||||
optional = {
|
|
||||||
'repay_all': repayAll,
|
|
||||||
'market': market
|
|
||||||
}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getLoanAvailable(self, market='cny'):
|
|
||||||
"""查询杠杆额度"""
|
|
||||||
method = FUNCTIONCODE_GETLOANAVAILABLE
|
|
||||||
params = {}
|
|
||||||
callback = self.onLoanAvailable
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getLoans(self, market='cny'):
|
|
||||||
"""查询杠杆列表"""
|
|
||||||
method = FUNCTIONCODE_GETLOANS
|
|
||||||
params = {}
|
|
||||||
callback = self.onGetLoans
|
|
||||||
optional = {'market': market}
|
|
||||||
return self.sendRequest(method, params, callback, optional)
|
|
||||||
|
|
||||||
####################################################
|
|
||||||
## 回调函数
|
|
||||||
####################################################
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onError(self, error, req, reqID):
|
|
||||||
"""错误推送"""
|
|
||||||
print error, reqID
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetAccountInfo(self, data, req, reqID):
|
|
||||||
"""查询账户回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetOrders(self, data, req, reqID, fuck):
|
|
||||||
"""查询委托回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onOrderInfo(self, data, req, reqID):
|
|
||||||
"""委托详情回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onBuy(self, data, req, reqID):
|
|
||||||
"""买入回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onSell(self, data, req, reqID):
|
|
||||||
"""卖出回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onBuyMarket(self, data, req, reqID):
|
|
||||||
"""市价买入回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onSellMarket(self, data, req, reqID):
|
|
||||||
"""市价卖出回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onCancelOrder(self, data, req, reqID):
|
|
||||||
"""撤单回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetNewDealOrders(self, data, req, reqID):
|
|
||||||
"""查询最新成交回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetOrderIdByTradeId(self, data, req, reqID):
|
|
||||||
"""通过成交编号查询委托编号回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onWithdrawCoin(self, data, req, reqID):
|
|
||||||
"""提币回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onCancelWithdrawCoin(self, data, req, reqID):
|
|
||||||
"""取消提币回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetWithdrawCoinResult(self, data, req, reqID):
|
|
||||||
"""查询提币结果回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onTransfer(self, data, req, reqID):
|
|
||||||
"""转账回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onLoan(self, data, req, reqID):
|
|
||||||
"""申请杠杆回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onRepayment(self, data, req, reqID):
|
|
||||||
"""归还杠杆回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onLoanAvailable(self, data, req, reqID):
|
|
||||||
"""查询杠杆额度回调"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetLoans(self, data, req, reqID):
|
|
||||||
"""查询杠杆列表"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
class DataApi(object):
|
|
||||||
"""行情接口"""
|
|
||||||
TICK_SYMBOL_URL = {
|
|
||||||
SYMBOL_BTCCNY: 'http://api.huobi.com/staticmarket/detail_btc_json.js',
|
|
||||||
SYMBOL_LTCCNY: 'http://api.huobi.com/staticmarket/detail_ltc_json.js',
|
|
||||||
SYMBOL_BTCUSD: 'http://api.huobi.com/usdmarket/detail_btc_json.js'
|
|
||||||
}
|
|
||||||
|
|
||||||
QUOTE_SYMBOL_URL = {
|
|
||||||
SYMBOL_BTCCNY: 'http://api.huobi.com/staticmarket/ticker_btc_json.js',
|
|
||||||
SYMBOL_LTCCNY: 'http://api.huobi.com/staticmarket/ticker_ltc_json.js',
|
|
||||||
SYMBOL_BTCUSD: 'http://api.huobi.com/usdmarket/ticker_btc_json.js'
|
|
||||||
}
|
|
||||||
|
|
||||||
DEPTH_SYMBOL_URL = {
|
|
||||||
SYMBOL_BTCCNY: 'http://api.huobi.com/staticmarket/depth_btc_json.js',
|
|
||||||
SYMBOL_LTCCNY: 'http://api.huobi.com/staticmarket/depth_ltc_json.js',
|
|
||||||
SYMBOL_BTCUSD: 'http://api.huobi.com/usdmarket/depth_btc_json.js'
|
|
||||||
}
|
|
||||||
|
|
||||||
KLINE_SYMBOL_URL = {
|
|
||||||
SYMBOL_BTCCNY: 'http://api.huobi.com/staticmarket/btc_kline_[period]_json.js',
|
|
||||||
SYMBOL_LTCCNY: 'http://api.huobi.com/staticmarket/btc_kline_[period]_json.js',
|
|
||||||
SYMBOL_BTCUSD: 'http://api.huobi.com/usdmarket/btc_kline_[period]_json.js'
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG = True
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def __init__(self):
|
|
||||||
"""Constructor"""
|
|
||||||
self.active = False
|
|
||||||
|
|
||||||
self.taskInterval = 0 # 每轮请求延时
|
|
||||||
self.taskList = [] # 订阅的任务列表
|
|
||||||
self.taskThread = Thread(target=self.run) # 处理任务的线程
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def init(self, interval, debug):
|
|
||||||
"""初始化"""
|
|
||||||
self.taskInterval = interval
|
|
||||||
self.DEBUG = debug
|
|
||||||
|
|
||||||
self.active = True
|
|
||||||
self.taskThread.start()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def exit(self):
|
|
||||||
"""退出"""
|
|
||||||
self.active = False
|
|
||||||
|
|
||||||
if self.taskThread.isAlive():
|
|
||||||
self.taskThread.join()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def run(self):
|
|
||||||
"""连续运行"""
|
|
||||||
while self.active:
|
|
||||||
for url, callback in self.taskList:
|
|
||||||
try:
|
|
||||||
r = requests.get(url)
|
|
||||||
if r.status_code == 200:
|
|
||||||
data = r.json()
|
|
||||||
if self.DEBUG:
|
|
||||||
print callback.__name__
|
|
||||||
callback(data)
|
|
||||||
except Exception, e:
|
|
||||||
print e
|
|
||||||
|
|
||||||
sleep(self.taskInterval)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def subscribeTick(self, symbol):
|
|
||||||
"""订阅实时成交数据"""
|
|
||||||
url = self.TICK_SYMBOL_URL[symbol]
|
|
||||||
task = (url, self.onTick)
|
|
||||||
self.taskList.append(task)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def subscribeQuote(self, symbol):
|
|
||||||
"""订阅实时报价数据"""
|
|
||||||
url = self.QUOTE_SYMBOL_URL[symbol]
|
|
||||||
task = (url, self.onQuote)
|
|
||||||
self.taskList.append(task)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def subscribeDepth(self, symbol, level=0):
|
|
||||||
"""订阅深度数据"""
|
|
||||||
url = self.DEPTH_SYMBOL_URL[symbol]
|
|
||||||
|
|
||||||
if level:
|
|
||||||
url = url.replace('json', str(level))
|
|
||||||
|
|
||||||
task = (url, self.onDepth)
|
|
||||||
self.taskList.append(task)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onTick(self, data):
|
|
||||||
"""实时成交推送"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onQuote(self, data):
|
|
||||||
"""实时报价推送"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onDepth(self, data):
|
|
||||||
"""实时深度推送"""
|
|
||||||
print data
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getKline(self, symbol, period, length=0):
|
|
||||||
"""查询K线数据"""
|
|
||||||
url = self.KLINE_SYMBOL_URL[symbol]
|
|
||||||
url = url.replace('[period]', period)
|
|
||||||
|
|
||||||
if length:
|
|
||||||
url = url + '?length=' + str(length)
|
|
||||||
|
|
||||||
try:
|
|
||||||
r = requests.get(url)
|
|
||||||
if r.status_code == 200:
|
|
||||||
data = r.json()
|
|
||||||
return data
|
|
||||||
except Exception, e:
|
|
||||||
print e
|
|
||||||
return None
|
|
@ -17,7 +17,7 @@ import calendar
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from copy import copy
|
from copy import copy
|
||||||
|
|
||||||
from vnib import *
|
from vnpy.api.ib import *
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
from language import text
|
from language import text
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -11,8 +11,7 @@ import os
|
|||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from vnksgoldtd import TdApi
|
from vnpy.api.ksgold import TdApi, defineDict
|
||||||
from ksgoldDataType import *
|
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
# 以下类型映射参考的是原生API里的Constant.h
|
# 以下类型映射参考的是原生API里的Constant.h
|
||||||
|
@ -8,9 +8,7 @@ vn.ksotp的gateway接入
|
|||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from vnksotpmd import MdApi
|
from vnpy.api.ksotp import MdApi, TdApi, defineDict
|
||||||
from vnksotptd import TdApi
|
|
||||||
from ksotpDataType import *
|
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
# 以下为一些VT类型和CTP类型的映射字典
|
# 以下为一些VT类型和CTP类型的映射字典
|
||||||
|
@ -10,7 +10,7 @@ import json
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
import vnlhang
|
from vnpy.api.lhang import LhangApi
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ class LhangGateway(VtGateway):
|
|||||||
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
class LhangApi(vnlhang.LhangApi):
|
class LhangApi(LhangApi):
|
||||||
""""""
|
""""""
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
@ -1,307 +0,0 @@
|
|||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
import urllib
|
|
||||||
import hashlib
|
|
||||||
|
|
||||||
import requests
|
|
||||||
from Queue import Queue, Empty
|
|
||||||
from threading import Thread
|
|
||||||
from time import sleep
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LHANG_API_ROOT ="https://api.lhang.com/v1/"
|
|
||||||
|
|
||||||
FUNCTION_TICKER = ('ticker.do', 'get')
|
|
||||||
FUNCTION_DEPTH = ('depth.do', 'get')
|
|
||||||
FUNCTION_TRADES = ('trades.do', 'get')
|
|
||||||
FUNCTION_KLINE = ('kline.do', 'get')
|
|
||||||
|
|
||||||
FUNCTION_USERINFO = ('user_info.do', 'post')
|
|
||||||
FUNCTION_CREATEORDER = ('create_order.do', 'post')
|
|
||||||
FUNCTION_CANCELORDER = ('cancel_order.do', 'post')
|
|
||||||
FUNCTION_ORDERSINFO = ('orders_info.do', 'post')
|
|
||||||
FUNCTION_ORDERSINFOHISTORY = ('orders_info_history.do', 'post')
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def signature(params, secretKey):
|
|
||||||
"""生成签名"""
|
|
||||||
params = sorted(params.iteritems(), key=lambda d:d[0], reverse=False)
|
|
||||||
params.append(('secret_key', secretKey))
|
|
||||||
message = urllib.urlencode(params)
|
|
||||||
|
|
||||||
m = hashlib.md5()
|
|
||||||
m.update(message)
|
|
||||||
m.digest()
|
|
||||||
|
|
||||||
sig=m.hexdigest()
|
|
||||||
return sig
|
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
class LhangApi(object):
|
|
||||||
""""""
|
|
||||||
DEBUG = True
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def __init__(self):
|
|
||||||
"""Constructor"""
|
|
||||||
self.apiKey = ''
|
|
||||||
self.secretKey = ''
|
|
||||||
|
|
||||||
self.interval = 1 # 每次请求的间隔等待
|
|
||||||
self.active = False # API工作状态
|
|
||||||
self.reqID = 0 # 请求编号
|
|
||||||
self.reqQueue = Queue() # 请求队列
|
|
||||||
self.reqThread = Thread(target=self.processQueue) # 请求处理线程
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def init(self, apiKey, secretKey, interval):
|
|
||||||
"""初始化"""
|
|
||||||
self.apiKey = apiKey
|
|
||||||
self.secretKey = secretKey
|
|
||||||
self.interval = interval
|
|
||||||
|
|
||||||
self.active = True
|
|
||||||
self.reqThread.start()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def exit(self):
|
|
||||||
"""退出"""
|
|
||||||
self.active = False
|
|
||||||
|
|
||||||
if self.reqThread.isAlive():
|
|
||||||
self.reqThread.join()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def processRequest(self, req):
|
|
||||||
"""处理请求"""
|
|
||||||
# 读取方法和参数
|
|
||||||
api, method = req['function']
|
|
||||||
params = req['params']
|
|
||||||
url = LHANG_API_ROOT + api
|
|
||||||
|
|
||||||
# 在参数中增加必须的字段
|
|
||||||
params['api_key'] = self.apiKey
|
|
||||||
|
|
||||||
# 添加签名
|
|
||||||
sign = signature(params, self.secretKey)
|
|
||||||
params['sign'] = sign
|
|
||||||
|
|
||||||
# 发送请求
|
|
||||||
payload = urllib.urlencode(params)
|
|
||||||
|
|
||||||
r = requests.request(method, url, params=payload)
|
|
||||||
if r.status_code == 200:
|
|
||||||
data = r.json()
|
|
||||||
return data
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def processQueue(self):
|
|
||||||
"""处理请求队列中的请求"""
|
|
||||||
while self.active:
|
|
||||||
try:
|
|
||||||
req = self.reqQueue.get(block=True, timeout=1) # 获取请求的阻塞为一秒
|
|
||||||
callback = req['callback']
|
|
||||||
reqID = req['reqID']
|
|
||||||
|
|
||||||
data = self.processRequest(req)
|
|
||||||
|
|
||||||
# 请求失败
|
|
||||||
if data is None:
|
|
||||||
error = u'请求失败'
|
|
||||||
self.onError(error, req, reqID)
|
|
||||||
elif 'error_code' in data:
|
|
||||||
error = u'请求出错,错误代码:%s' % data['error_code']
|
|
||||||
self.onError(error, req, reqID)
|
|
||||||
# 请求成功
|
|
||||||
else:
|
|
||||||
if self.DEBUG:
|
|
||||||
print callback.__name__
|
|
||||||
callback(data, req, reqID)
|
|
||||||
|
|
||||||
# 流控等待
|
|
||||||
sleep(self.interval)
|
|
||||||
|
|
||||||
except Empty:
|
|
||||||
pass
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def sendRequest(self, function, params, callback):
|
|
||||||
"""发送请求"""
|
|
||||||
# 请求编号加1
|
|
||||||
self.reqID += 1
|
|
||||||
|
|
||||||
# 生成请求字典并放入队列中
|
|
||||||
req = {}
|
|
||||||
req['function'] = function
|
|
||||||
req['params'] = params
|
|
||||||
req['callback'] = callback
|
|
||||||
req['reqID'] = self.reqID
|
|
||||||
self.reqQueue.put(req)
|
|
||||||
|
|
||||||
# 返回请求编号
|
|
||||||
return self.reqID
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onError(self, error, req, reqID):
|
|
||||||
"""错误推送"""
|
|
||||||
print error, req, reqID
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# 行情接口
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def getTicker(self, symbol):
|
|
||||||
"""查询行情"""
|
|
||||||
function = FUNCTION_TICKER
|
|
||||||
params = {'symbol': symbol}
|
|
||||||
callback = self.onGetTicker
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def getDepth(self, symbol, size, merge):
|
|
||||||
"""查询深度"""
|
|
||||||
function = FUNCTION_DEPTH
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'size': size,
|
|
||||||
'mege': merge
|
|
||||||
}
|
|
||||||
callback = self.onGetDepth
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def getTrades(self, symbol, size, time):
|
|
||||||
"""查询历史成交"""
|
|
||||||
function = FUNCTION_TRADES
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'size': size,
|
|
||||||
'time': time
|
|
||||||
}
|
|
||||||
callback = self.onGetTrades
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def getKline(self, symbol, size, type_, time):
|
|
||||||
"""查询K线"""
|
|
||||||
function = FUNCTION_TRADES
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'size': size,
|
|
||||||
'type': type_,
|
|
||||||
'time': time
|
|
||||||
}
|
|
||||||
callback = self.onGetKline
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
def onGetTicker(self, data, req, reqID):
|
|
||||||
"""查询行情回调"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onGetDepth(self, data, req, reqID):
|
|
||||||
"""查询深度回调"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onGetTrades(self, data, req, reqID):
|
|
||||||
"""查询历史成交"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onGetKline(self, data, req, reqID):
|
|
||||||
"""查询K线回报"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# 交易接口
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def getUserInfo(self):
|
|
||||||
"""查询K线"""
|
|
||||||
function = FUNCTION_USERINFO
|
|
||||||
params = {}
|
|
||||||
callback = self.onGetUserInfo
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def createOrder(self, symbol, type_, price, amount):
|
|
||||||
"""发送委托"""
|
|
||||||
function = FUNCTION_CREATEORDER
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'type': type_,
|
|
||||||
'price': price,
|
|
||||||
'amount': amount
|
|
||||||
}
|
|
||||||
callback = self.onCreateOrder
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def cancelOrder(self, symbol, orderId):
|
|
||||||
"""撤单"""
|
|
||||||
function = FUNCTION_CANCELORDER
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'order_id': orderId
|
|
||||||
}
|
|
||||||
callback = self.onCancelOrder
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def getOrdersInfo(self, symbol, orderId):
|
|
||||||
"""查询委托"""
|
|
||||||
function = FUNCTION_ORDERSINFO
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'order_id': orderId
|
|
||||||
}
|
|
||||||
callback = self.onGetOrdersInfo
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def getOrdersInfoHistory(self, symbol, status, currentPage, pageLength):
|
|
||||||
"""撤单"""
|
|
||||||
function = FUNCTION_ORDERSINFOHISTORY
|
|
||||||
params = {
|
|
||||||
'symbol': symbol,
|
|
||||||
'status': status,
|
|
||||||
'current_page': currentPage,
|
|
||||||
'page_length': pageLength
|
|
||||||
}
|
|
||||||
callback = self.onGetOrdersInfoHistory
|
|
||||||
return self.sendRequest(function, params, callback)
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onGetUserInfo(self, data, req, reqID):
|
|
||||||
"""查询K线回报"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onCreateOrder(self, data, req, reqID):
|
|
||||||
"""委托回报"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onCancelOrder(self, data, req, reqID):
|
|
||||||
"""撤单回报"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onGetOrdersInfo(self, data, req, reqID):
|
|
||||||
"""查询委托回报"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
def onGetOrdersInfoHistory(self, data, req, reqID):
|
|
||||||
"""撤单回报"""
|
|
||||||
print data, reqID
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -7,10 +7,7 @@ vn.lts的gateway接入
|
|||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from vnltsmd import MdApi
|
from vnpy.api.lts import MdApi, QryApi, TdApi, defineDict
|
||||||
from vnltstd import TdApi
|
|
||||||
from vnltsqry import QryApi
|
|
||||||
from ltsDataType import *
|
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ import os
|
|||||||
import json
|
import json
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from vnoanda import OandaApi
|
from vnpy.api.oanda import OandaApi
|
||||||
from vtGateway import *
|
from vtGateway import *
|
||||||
|
|
||||||
# 价格类型映射
|
# 价格类型映射
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user