简化对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 pymongo
|
||||
|
||||
import vtGlobal
|
||||
from vnpy.trader.vtGlobal import globalSetting
|
||||
from ctaBase import *
|
||||
from vtConstant import *
|
||||
from vtGateway import VtOrderData, VtTradeData
|
||||
@ -119,7 +119,7 @@ class BacktestingEngine(object):
|
||||
#----------------------------------------------------------------------
|
||||
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]
|
||||
|
||||
self.output(u'开始载入数据')
|
||||
|
@ -12,7 +12,7 @@ import pymongo
|
||||
from time import time
|
||||
from multiprocessing.pool import ThreadPool
|
||||
|
||||
import vtGlobal
|
||||
from vnpy.trader.vtGlobal import globalSetting
|
||||
from ctaBase import *
|
||||
from vtConstant import *
|
||||
from datayesClient import DatayesClient
|
||||
@ -34,7 +34,7 @@ class HistoryDataEngine(object):
|
||||
#----------------------------------------------------------------------
|
||||
def __init__(self):
|
||||
"""Constructor"""
|
||||
self.dbClient = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
||||
self.dbClient = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||
self.datayesClient = DatayesClient()
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
@ -372,7 +372,7 @@ def loadMcCsv(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.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)
|
||||
|
||||
# 锁定集合,并创建索引
|
||||
client = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||
collection = client[dbName][symbol]
|
||||
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)
|
||||
|
||||
# 锁定集合,并创建索引
|
||||
client = pymongo.MongoClient(vtGlobal.MONGO_HOST, vtGlobal.MONGO_PORT)
|
||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||
collection = client[dbName][symbol]
|
||||
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
|
||||
import vtGlobal
|
||||
|
||||
from ctaBacktesting import *
|
||||
|
||||
@ -70,7 +69,7 @@ class BacktestEngineMultiTF(BacktestingEngine):
|
||||
# ----------------------------------------------------------------------
|
||||
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]
|
||||
|
||||
# Load historical data of information symbols, construct a dictionary of Database
|
||||
|
@ -13,9 +13,7 @@ import json
|
||||
from copy import copy
|
||||
from datetime import datetime
|
||||
|
||||
from vnpy.api.ctp.vnctpmd import MdApi
|
||||
from vnpy.api.ctp.vnctptd import TdApi
|
||||
from .ctpDataType import defineDict
|
||||
from vnpy.api.ctp import MdApi, TdApi, defineDict
|
||||
from vnpy.trader.vtGateway import *
|
||||
from language import text
|
||||
|
||||
|
@ -10,9 +10,7 @@ vn.femas的gateway接入
|
||||
import os
|
||||
import json
|
||||
|
||||
from vnfemasmd import MdApi
|
||||
from vnfemastd import TdApi
|
||||
from femasDataType import *
|
||||
from vnpy.api.femas import MdApi, TdApi, defineDict
|
||||
from vtGateway import *
|
||||
|
||||
# 以下为一些VT类型和CTP类型的映射字典
|
||||
|
@ -13,7 +13,7 @@ from threading import Condition
|
||||
from Queue import Queue
|
||||
from threading import Thread
|
||||
|
||||
import vnhuobi
|
||||
from vnpy.api.huobi import vnhuobi
|
||||
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 copy import copy
|
||||
|
||||
from vnib import *
|
||||
from vnpy.api.ib import *
|
||||
from vtGateway import *
|
||||
from language import text
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,8 +11,7 @@ import os
|
||||
import json
|
||||
import time
|
||||
|
||||
from vnksgoldtd import TdApi
|
||||
from ksgoldDataType import *
|
||||
from vnpy.api.ksgold import TdApi, defineDict
|
||||
from vtGateway import *
|
||||
|
||||
# 以下类型映射参考的是原生API里的Constant.h
|
||||
|
@ -8,9 +8,7 @@ vn.ksotp的gateway接入
|
||||
import os
|
||||
import json
|
||||
|
||||
from vnksotpmd import MdApi
|
||||
from vnksotptd import TdApi
|
||||
from ksotpDataType import *
|
||||
from vnpy.api.ksotp import MdApi, TdApi, defineDict
|
||||
from vtGateway import *
|
||||
|
||||
# 以下为一些VT类型和CTP类型的映射字典
|
||||
|
@ -10,7 +10,7 @@ import json
|
||||
from datetime import datetime
|
||||
from time import sleep
|
||||
|
||||
import vnlhang
|
||||
from vnpy.api.lhang import LhangApi
|
||||
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 json
|
||||
|
||||
from vnltsmd import MdApi
|
||||
from vnltstd import TdApi
|
||||
from vnltsqry import QryApi
|
||||
from ltsDataType import *
|
||||
from vnpy.api.lts import MdApi, QryApi, TdApi, defineDict
|
||||
from vtGateway import *
|
||||
|
||||
|
||||
|
@ -24,7 +24,7 @@ import os
|
||||
import json
|
||||
import datetime
|
||||
|
||||
from vnoanda import OandaApi
|
||||
from vnpy.api.oanda import OandaApi
|
||||
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