Ejemplo n.º 1
0
    # def grid_trade(self):
    def grid_trade(self):
        while True:
            self.api.wait_update()
            print("grid_trade")
            print(self.kwargs["param1"])

    def run(self):
        if hasattr(self, self.strategyName):
            func = getattr(self, self.strategyName)
            return func()


if __name__ == "__main__":
    api = TqApi(TqSim(), backtest=TqBacktest(start_dt=date(2019, 8, 1), end_dt=date(2019, 10, 1)),web_gui=True )
    print("策略开始运行")

    instrumentId = "DCE.jd2005"  # 合约代码
    quote = api.get_quote(instrumentId)
    klines = api.get_kline_serial(instrumentId, 24 * 60 * 60)  # 86400使用日线
    target_pos = TargetPosTask(api, instrumentId)

    trade = QuantTrade(api,instrumentId,"macd_trade", trade=Trade(api))

    # buy_line, sell_line = trade.dual_thrust_trade(quote, klines)  # 获取上下轨

    while True:
        api.wait_update()
        # if api.is_changing(klines.iloc[-1], ["datetime", "open"]):  # 新产生一根日线或开盘价发生变化: 重新计算上下轨
        #     buy_line, sell_line = trade.dual_thrust_trade(quote, klines)
Ejemplo n.º 2
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
__author__ = 'limin'

from tqsdk import TqApi
from tqsdk.ta import MA
'''
画图示例: 在主图中画指标线
注意:1 画图功能仅在天勤终端/天勤Vscode插件中生效,请在这两个平台中运行画图相关的代码
     2 画图示例中用到的数据不含有实际意义,请根据自己的实际策略情况进行修改
'''

api = TqApi(web_gui=True)
klines = api.get_kline_serial("SHFE.au2006", 5)

ma = MA(klines, 30)  # 使用tqsdk自带指标函数计算均线
klines["ma_MAIN"] = ma.ma
# 在主图中画一根默认颜色(红色)的ma指标线

while True:
    api.wait_update()
    if api.is_changing(klines):
        ma = MA(klines, 30)  # 使用tqsdk自带指标函数计算均线
        klines["ma_MAIN"] = ma.ma
Ejemplo n.º 3
0
                elif change_day > today >= last_change_day:
                    limit_dict = {'FU': 1500, 'SC': 1500}
                else:
                    limit_dict = {'FU': 500, 'SC': 500}
                data_dict[symbol] = limit_dict[product]
            elif product in ['TF', 'TS', 'T']:
                expireDate = pd.to_datetime(expireDate)
                change_day = self.find_tradeday(-1,
                                                date=expireDate.replace(day=1),
                                                exchange=exchange_id)
                if today < change_day:
                    limit_dict = {'TF': 2000, 'TS': 2000, 'T': 2000}
                else:
                    limit_dict = {'TF': 600, 'TS': 600, 'T': 600}
                data_dict[symbol] = limit_dict[product]
        return data_dict


if __name__ == '__main__':
    # DataFactory.config(MONGDB_PW='jz2018*', MONGDB_IP='192.168.2.201', MONGDB_USER='******',
    #                    DATASOURCE_DEFAULT=global_variable.DATASOURCE_REMOTE
    #                    , logging_level=global_variable.logging.INFO)
    # rd = redis.Redis('192.168.1.36')
    api = TqApi(TqAccount("G国泰君安", "85030120", "jz04282020"), web_gui=True)
    Trd = Trading(api)
    for i in range(1):
        order = Trd.insert_order_bp_limit('INE.sc2012', 1)
        order = Trd.insert_order_sp_limit('INE.sc2008', 1)
        time.sleep(5)
log_path = 'E://proj-futures/logs_debug/'
log_name = log_path + runningDate + '-' + SYMBOL + '-' + c + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='a+')
fh.setLevel(logging.DEBUG)  # 输出到file的log等级的开关
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)  # 输出到console的log等级的开关
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 第四步,将logger添加到handler里面
logger.addHandler(fh)
logger.addHandler(ch)

api = TqApi(TqSim(), backtest=TqBacktest(start_dt=date(YEAR, MONTH, DAY), end_dt=date(YEAR, MONTH, DAY)))


logger.info("start %s daily strategy for %s in %d.%d.%d!"%(c, SYMBOL, YEAR, MONTH, DAY))

#time_slot_start = datetime.time(START_HOUR, START_MINUTE)  # 计划交易时段起始时间点
#time_slot_end = datetime.time(END_HOUR, END_MINUTE)  # 计划交易时段终点时间点
klines = api.get_kline_serial(SYMBOL, TIME_CELL, data_length=int(10 * 60 * 60 / TIME_CELL))
target_pos = TargetPosTask(api, SYMBOL)
position = api.get_position(SYMBOL)  # 持仓信息
quote = api.get_quote(SYMBOL)


current_volume = 0  # 记录持仓量
cur_trading_date = ''
traded_volume = 0
Ejemplo n.º 5
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-

from tqsdk import TqApi, TqSim

api = TqApi(TqSim())
quote = api.get_quote("SHFE.rb1910")
# 开仓两手并等待完成
order = api.insert_order(symbol="SHFE.rb1910",
                         direction="BUY",
                         offset="OPEN",
                         limit_price=quote["ask_price1"],
                         volume=2)
while order["status"] != "FINISHED":
    api.wait_update()
print("已开仓")
# 平今两手并等待完成
order = api.insert_order(symbol="SHFE.rb1910",
                         direction="SELL",
                         offset="CLOSETODAY",
                         limit_price=quote["bid_price1"],
                         volume=2)
while order["status"] != "FINISHED":
    api.wait_update()
print("已平今")
# 关闭api,释放相应资源
api.close()
Ejemplo n.º 6
0
15分钟级别、三均线策略

· MA120 之上:
 - MA10 上穿 MA20 ,金叉,做多
 - MA10 下穿 MA20 ,死叉,平多

· MA120 之下:
 - MA10 下穿 MA20 ,死叉,做空
 - MA10 上穿 MA20 ,金叉,平空
"""

# 实盘交易
# api =  TqApi(TqAccount("G光大期货","[账号]","[密码]"), web_gui=True)
# 回测模式
from datetime import date
api = TqApi(backtest=TqBacktest(date(2019, 7, 1), date(2019, 12, 1)),
            web_gui=True)
# 策略初始化
symbol = "CFFEX.IF1912"
klines = api.get_kline_serial(symbol, 60 * 15)  # 订阅15分钟K线序列
target_pos = TargetPosTask(api, symbol)
try:
    while True:
        api.wait_update()
        if api.is_changing(klines):
            # MA120的最新值
            ma120 = ma(klines.close, 120).iloc[-1]
            # MA10上穿MA20的bool序列的最新值
            up_cross = crossup(ma(klines.close, 10), ma(klines.close,
                                                        20)).iloc[-1]
            # MA10下穿MA20的bool序列的最新值
            down_cross = crossdown(ma(klines.close, 10), ma(klines.close,
Ejemplo n.º 7
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
__author__ = "Ringo"

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("信易账户", "账户密码"))

# 订阅螺纹钢主连
quote = api.get_quote("*****@*****.**")
# 打印现在螺纹钢主连的标的合约
print(quote.underlying_symbol)

api.close()
Ejemplo n.º 8
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
__author__ = 'chenzhang'

import pandas as pd
import datetime as dt
from contextlib import closing
from tqsdk import TqApi, TargetPosTask, TqSim, TqBacktest, BacktestFinished

# 网格计划参数:
# symbol = "DCE.i1905"
ls_symbol = ['DCE.i1905', 'SHFE.rb1905']

api = TqApi(TqSim(),
            backtest=TqBacktest(start_dt=dt.date(2019, 1, 2),
                                end_dt=dt.date(2019, 1, 20)))


async def price_watcher(SYMBOL):
    """该task在价格触发开仓价时开仓,触发平仓价时平仓"""
    klines = api.get_kline_serial(SYMBOL, duration_seconds=5 * 60)
    target_pos = TargetPosTask(api, SYMBOL)
    async with api.register_update_notify(
            klines) as update_price_chan:  # 当 quote 有更新时会发送通知到 update_chan 上
        while True:
            async for _ in update_price_chan:  # 当从 update_chan 上收到行情更新通知时判断是否触发开仓条件
                ys = pd.Series(data=klines.close[-100:-1],
                               index=[
                                   str(dt.datetime.fromtimestamp(i / 1e9))
                                   for i in klines.datetime[-100:-1]
                               ])
Ejemplo n.º 9
0
if __name__ == '__main__':
    loadConfig()
    data = pd.read_excel(para['io_in'],
                         sheet_name=0,
                         converters={'stk_code': str})  # excel读取的品种集合
    log.logger.info('品种数:{0}'.format(len(data['stk_code'])))
    g_security = data['stk_code'].tolist()  # "'a' 品种前缀 g_security
    # 初始化C1 C2极值
    wt_data = pd.DataFrame(columns=['fut_code', 'C1', 'C2'])
    wt_data.to_csv(para['io_out'], index=False)
    # wt_data = pd.DataFrame(columns=['date', 'stk_code', 'win_rate', 'short_val', 'long_val']) #输出落地的excel字段
    # wt_data.to_excel(io_out, index=False)
    # 登录连接信易快期账户
    api = TqApi(TqKq(),
                web_gui=True,
                auth=TqAuth(para['ACCT_ID'], para['ACCT_PWD']))
    #print(api._notify_watcher())
    account = api.get_account()
    log.logger.info('初始账户权益:{0}'.format(account.balance))
    log.logger.info('初始浮动盈亏:{0}'.format(account.float_profit))
    SEC_LIST = []
    for g_sec in g_security:
        ls = api.query_cont_quotes(product_id=g_sec)
        SEC_LIST.append(ls[0])
    log.logger.info('品种集合:{0}'.format(SEC_LIST))
    # 获取主力合约
    # domain = api.get_quote("[email protected]")
    # 获取主力合约的K线引用
    for sec in SEC_LIST:
        positions[sec] = api.get_position(sec)
Ejemplo n.º 10
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
__author__ = 'chengzhi'

from datetime import date
from tqsdk import TqApi, TqAuth, TqBacktest, TargetPosTask
'''
如果当前价格大于5分钟K线的MA15则开多仓
如果小于则平仓
回测从 2018-05-01 到 2018-10-01
'''
# 在创建 api 实例时传入 TqBacktest 就会进入回测模式
api = TqApi(backtest=TqBacktest(start_dt=date(2018, 5, 1),
                                end_dt=date(2018, 10, 1)),
            auth=TqAuth("信易账户", "账户密码"))
# 获得 m1901 5分钟K线的引用
klines = api.get_kline_serial("DCE.m1901", 5 * 60, data_length=15)
# 创建 m1901 的目标持仓 task,该 task 负责调整 m1901 的仓位到指定的目标仓位
target_pos = TargetPosTask(api, "DCE.m1901")

while True:
    api.wait_update()
    if api.is_changing(klines):
        ma = sum(klines.close.iloc[-15:]) / 15
        print("最新价", klines.close.iloc[-1], "MA", ma)
        if klines.close.iloc[-1] > ma:
            print("最新价大于MA: 目标多头5手")
            # 设置目标持仓为多头5手
            target_pos.set_target_volume(5)
        elif klines.close.iloc[-1] < ma:
            print("最新价小于MA: 目标空仓")
Ejemplo n.º 11
0
'''
菲阿里四价(日内突破策略, 在每日收盘前对所持合约进行平仓)

注:
demo仅用于示范如何使用TqSdk获取行情及编写策略程序
若需实际应用, 需要用户根据自己的交易经验进行修改
'''

from tqsdk import TqApi, TqSim, TargetPosTask
from datetime import datetime
import time

symbol = "SHFE.cu1905"  # 合约代码
close_hour, close_minute = 14, 50  # 平仓时间

api = TqApi(TqSim())  # 使用模拟帐号直连行情和交易服务器
quote = api.get_quote(symbol)  # 获取指定合约的盘口行情
klines = api.get_kline_serial(symbol, 24 * 60 * 60)  # 获取日线
position = api.get_position(symbol)  # 持仓信息
target_pos = TargetPosTask(api, symbol)  # 目标持仓

top_rail = klines.high.iloc[-2]  # 上轨: 昨日高点
bottom_rail = klines.low.iloc[-2]  # 下轨: 昨日低点
print("上轨:", top_rail, ",下轨:", bottom_rail, ",昨日收盘价:", klines.close.iloc[-2],
      ",今日开盘价:", klines.open.iloc[-1])

while True:
    api.wait_update()
    if api.is_changing(klines.iloc[-1],
                       "datetime"):  # 如果产生一根新日线 (即到达下一个交易日): 重新获取上下轨
        top_rail = klines.high.iloc[-2]
Ejemplo n.º 12
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
__author__ = 'hongyan'

from tqsdk import TqApi, TqAuth, TqAccount, TqKq, TqSim, TqMultiAccount
# 多账户模式下, 同时操作实盘、模拟交易和快期模拟账户交易
tqact = TqAccount("H海通期货", "123456", "123456")
sim = TqSim()
kq = TqKq()

with TqApi(TqMultiAccount([tqact, sim, kq]), auth=TqAuth("信易账户",
                                                         "账户密码")) as api:
    order1 = api.insert_order(symbol="DCE.m2101",
                              direction="BUY",
                              offset="OPEN",
                              volume=5,
                              account=tqact)
    order2 = api.insert_order(symbol="SHFE.au2012C308",
                              direction="BUY",
                              offset="OPEN",
                              volume=5,
                              limit_price=78.1,
                              account=sim)
    order3 = api.insert_order(symbol="SHFE.cu2101",
                              direction="Sell",
                              offset="OPEN",
                              volume=10,
                              limit_price=51610,
                              account=kq)
    api.cancel_order(order3, kq)
    while order1.status != "FINISHED" or order2.status != "FINISHED":
Ejemplo n.º 13
0
import time
from jqdatasdk import *
import datetime
from trading_simulate.trading_fuction import Trading

# auth('18610039264', 'zg19491001')
from configDB import *
auth(JOINQUANT_USER, JOINQUANT_PW)

if __name__ == '__main__':
    signal_path = 'G://trading_strategy//'
    aum = 1000000
    balance = 10
    bars = 5
    # api = TqApi(TqAccount("快期模拟", "*****@*****.**", "zf1991"), web_gui=True)
    api = TqApi(TqAccount("simnow", "163919", "yo193846"), web_gui=False)
    Trd = Trading(api)
    calen = get_trade_days(count=bars)
    today = datetime.date.today()
    calen = list(calen)
    if today in calen:
        calen, next_tradeday, EndDate, StartDate, hq_last_date = Trd.get_date(
            calen, today)

        temp_ymjh = pd.read_csv(signal_path + 'position_' + 'ymjh' + '_' + hq_last_date + '.csv', index_col=0)[
            ['VolumeMultiple', 'last_price', 'symbol', 'trading_code', 'position']]\
            .rename(columns={'position': 'position_ymjh'})
        temp_tcs = pd.read_csv(signal_path + 'position_' + 'tcs' + '_' + hq_last_date + '.csv', index_col=0)[
            ['VolumeMultiple', 'last_price', 'symbol', 'trading_code', 'position']]\
            .rename(columns={'position': 'position_tcs'})
        temp_momentum = pd.read_csv(signal_path + 'position_' + 'momentum' + '_' + hq_last_date + '.csv', index_col=0)[
Ejemplo n.º 14
0
    def test_get_quote_normal(self):
        """
        获取行情报价

        """
        # 预设服务器端响应
        dir_path = os.path.dirname(os.path.realpath(__file__))
        self.mock.run(
            os.path.join(dir_path, "log_file",
                         "test_md_basic_get_quote_normal.script.lzma"))
        # 获取行情
        api = TqApi(_ins_url=self.ins_url_2019_07_03,
                    _td_url=self.td_url,
                    _md_url=self.md_url)
        q = api.get_quote("SHFE.cu1909")
        self.assertEqual(q.datetime, "2019-09-16 14:59:59.999500")
        self.assertEqual(q.ask_price1, 47650.0)
        self.assertEqual(q.ask_volume1, 10)
        self.assertEqual(q.bid_price1, 47570.0)
        self.assertEqual(q.bid_volume1, 5)
        self.assertEqual(q.last_price, 47580.0)
        self.assertEqual(q.highest, 47860.0)
        self.assertEqual(q.lowest, 47580.0)
        self.assertEqual(q.open, 47860.0)
        self.assertEqual(q.close, 47580.0)
        self.assertEqual(q.average, 47732.35)
        self.assertEqual(q.volume, 9020)
        self.assertEqual(q.amount, 2152729000.0)
        self.assertEqual(q.open_interest, 6940)
        self.assertEqual(q.settlement, 47730.0)
        self.assertEqual(q.upper_limit, 49650.0)
        self.assertEqual(q.lower_limit, 44920)
        self.assertEqual(q.pre_open_interest, 13260)
        self.assertEqual(q.pre_settlement, 47290.0)
        self.assertEqual(q.pre_close, 47590.0)
        self.assertEqual(q.price_tick, 10)
        self.assertEqual(q.price_decs, 0)
        self.assertEqual(q.volume_multiple, 5)
        self.assertEqual(q.max_limit_order_volume, 500)
        self.assertEqual(q.max_market_order_volume, 0)
        self.assertEqual(q.min_limit_order_volume, 0)
        self.assertEqual(q.min_market_order_volume, 0)
        self.assertEqual(q.underlying_symbol, "")
        self.assertTrue(q.strike_price != q.strike_price)  # 判定nan
        self.assertEqual(q.expired, False)
        self.assertEqual(q.ins_class, "FUTURE")
        self.assertEqual(q.margin, 16233.000000000002)
        self.assertEqual(q.commission, 11.594999999999999)
        self.assertEqual(
            repr(q.trading_time.day),
            "[['09:00:00', '10:15:00'], ['10:30:00', '11:30:00'], ['13:30:00', '15:00:00']]"
        )
        self.assertEqual(repr(q.trading_time.night),
                         "[['21:00:00', '25:00:00']]")

        self.assertEqual(q.expire_datetime, 1568617200.0)
        self.assertEqual(q.delivery_month, 9)
        self.assertEqual(q.delivery_year, 2019)
        self.assertEqual(q.instrument_id, "SHFE.cu1909")
        self.assertEqual(q.ask_price2, 47730.0)
        self.assertEqual(q.ask_volume2, 10)
        self.assertEqual(q.ask_price3, 47990.0)
        self.assertEqual(q.ask_volume3, 5)
        self.assertEqual(q.ask_price4, 49250.0)
        self.assertEqual(q.ask_volume4, 50)
        self.assertEqual(q.ask_price5 != q.ask_price5, True)  # 判断nan
        self.assertEqual(q.ask_volume5, 0)
        self.assertEqual(q.bid_price2, 46560.0)
        self.assertEqual(q.bid_volume2, 100)
        self.assertEqual(q.bid_price3, 45650.0)
        self.assertEqual(q.bid_volume3, 270)
        self.assertEqual(q.bid_price4, 44920.0)
        self.assertEqual(q.bid_volume4, 5)
        self.assertEqual(q.bid_price5 != q.bid_price5, True)
        self.assertEqual(q.bid_volume5, 0)

        # 其他取值方式
        self.assertEqual(q["pre_close"], 47590.0)
        self.assertEqual(q.get("pre_settlement"), 47290.0)
        self.assertEqual(q.get("highest"), 47860.0)
        self.assertEqual(q.get("lowest"), 47580.0)
        self.assertEqual(q["open"], 47860.0)
        self.assertEqual(q["close"], 47580.0)
        # 报错测试
        self.assertRaises(Exception, api.get_quote, "SHFE.au1999")
        self.assertRaises(KeyError, q.__getitem__, "ask_price6")

        api.close()
Ejemplo n.º 15
0
    def test_get_order(self):
        """
        获取委托单信息
        """
        # 预设服务器端响应
        dir_path = os.path.dirname(os.path.realpath(__file__))
        self.mock.run(
            os.path.join(dir_path, "log_file",
                         "test_td_basic_get_order_simulate.script"))
        # 测试: 模拟账户下单
        TqApi.RD = random.Random(4)
        api = TqApi(_ins_url=self.ins_url,
                    _td_url=self.td_url,
                    _md_url=self.md_url)
        order1 = api.insert_order("DCE.jd2001", "BUY", "OPEN", 1)
        order2 = api.insert_order("SHFE.cu2001",
                                  "SELL",
                                  "OPEN",
                                  2,
                                  limit_price=47040)
        while order1.status == "ALIVE" or order2.status == "ALIVE":
            api.wait_update()

        orders = api.get_order()
        get_order1 = api.get_order(order1.order_id)
        get_order2 = api.get_order(order2.order_id)

        self.assertEqual(
            str(get_order1),
            "{'order_id': 'b8a1abcd1a6916c74da4f9fc3c6da5d7', 'exchange_order_id': 'b8a1abcd1a6916c74da4f9fc3c6da5d7', 'exchange_id': 'DCE', 'instrument_id': 'jd2001', 'direction': 'BUY', 'offset': 'OPEN', 'volume_orign': 1, 'volume_left': 0, 'limit_price': nan, 'price_type': 'ANY', 'volume_condition': 'ANY', 'time_condition': 'IOC', 'insert_date_time': 631123200000000000, 'last_msg': '全部成交', 'status': 'FINISHED', 'user_id': 'TQSIM', 'symbol': 'DCE.jd2001', 'frozen_margin': 0.0}"
        )
        self.assertEqual(
            str(get_order2),
            "{'order_id': '1710cf5327ac435a7a97c643656412a9', 'exchange_order_id': '1710cf5327ac435a7a97c643656412a9', 'exchange_id': 'SHFE', 'instrument_id': 'cu2001', 'direction': 'SELL', 'offset': 'OPEN', 'volume_orign': 2, 'volume_left': 0, 'limit_price': 47040.0, 'price_type': 'LIMIT', 'volume_condition': 'ANY', 'time_condition': 'GFD', 'insert_date_time': 631123200000000000, 'last_msg': '全部成交', 'status': 'FINISHED', 'user_id': 'TQSIM', 'symbol': 'SHFE.cu2001', 'frozen_margin': 0.0}"
        )

        self.assertEqual(get_order1.order_id,
                         "b8a1abcd1a6916c74da4f9fc3c6da5d7")
        self.assertEqual(get_order1.direction, "BUY")
        self.assertEqual(get_order1.offset, "OPEN")
        self.assertEqual(get_order1.volume_orign, 1)
        self.assertEqual(get_order1.volume_left, 0)
        self.assertEqual(get_order1.limit_price != get_order1.limit_price,
                         True)  # 判断nan
        self.assertEqual(get_order1.price_type, "ANY")
        self.assertEqual(get_order1.volume_condition, "ANY")
        self.assertEqual(get_order1.time_condition, "IOC")
        self.assertEqual(get_order1.insert_date_time, 631123200000000000)
        self.assertEqual(get_order1.last_msg, "全部成交")
        self.assertEqual(get_order1.status, "FINISHED")
        self.assertEqual(get_order1.symbol, "DCE.jd2001")
        self.assertEqual(get_order1.frozen_margin, 0)

        self.assertEqual(get_order2.order_id,
                         "1710cf5327ac435a7a97c643656412a9")
        self.assertEqual(get_order2.direction, "SELL")
        self.assertEqual(get_order2.offset, "OPEN")
        self.assertEqual(get_order2.volume_orign, 2)
        self.assertEqual(get_order2.volume_left, 0)
        self.assertEqual(get_order2.limit_price, 47040)
        self.assertEqual(get_order2.price_type, "LIMIT")
        self.assertEqual(get_order2.volume_condition, "ANY")
        self.assertEqual(get_order2.time_condition, "GFD")
        self.assertEqual(get_order2["insert_date_time"], 631123200000000000)
        self.assertEqual(get_order2["last_msg"], "全部成交")
        self.assertEqual(get_order2["status"], "FINISHED")
        self.assertEqual(get_order2.symbol, "SHFE.cu2001")
        self.assertEqual(get_order2.frozen_margin, 0)

        api.close()
Ejemplo n.º 16
0
import asyncio
import sys
import PySimpleGUI as sg
from tqsdk import TqApi

loop = asyncio.get_event_loop()
api = TqApi(loop=loop)
quote_a = api.get_quote("SHFE.rb1910")
quote_b = api.get_quote("SHFE.rb2001")


async def gui_task():
    layout = [
        [sg.Text('rb1910'),
         sg.Text("99999", key="rb1910.last")],
        [sg.Text('rb2001'),
         sg.Text("99999", key="rb2001.last")],
        [sg.Text('spread'), sg.Text("99999", key="spread")],
    ]

    window = sg.Window('价差显示', layout)

    while True:
        event, values = window.Read(timeout=0)
        if event is None or event == 'Exit':
            sys.exit(0)
        window.Element('rb1910.last').Update(quote_a.last_price)
        window.Element('rb2001.last').Update(quote_b.last_price)
        window.Element('spread').Update(quote_b.last_price -
                                        quote_a.last_price)
        await asyncio.sleep(1)  #注意, 这里必须使用 asyncio.sleep, 不能用time.sleep
Ejemplo n.º 17
0
    down_limit = np.percentile(diff, 1)
    # down_limit = np.min(diff)
    # if down_limit<0:
    #     down_limit = down_limit * 1.2
    # else:
    #     down_limit = down_limit * 0.8

    down_limit2 = np.percentile(diff, 40)
    return up, up_limit, up_limit2, down, down_limit, down_limit2


acc = TqSim(init_balance=1000000)

# 在创建 api 实例时传入 TqBacktest 就会进入回测模式
api = TqApi(acc,
            backtest=TqBacktest(start_dt=date(2020, 1, 1),
                                end_dt=date(2020, 3, 1)),
            web_gui='http://127.0.0.1:8889')  #

kind1 = 'SHFE.cu2003'
kind2 = 'SHFE.cu2004'

# kind1 = 'SHFE.zn2005'
# kind2 = 'SHFE.zn2006'

# 获得 m1901 5分钟K线的引用
klines1 = api.get_kline_serial([kind1], 1 * 30, data_length=2000)
klines2 = api.get_kline_serial([kind2], 1 * 30, data_length=2000)
quote1 = api.get_quote(kind1)
quote2 = api.get_quote(kind2)
# # 创建 m1901 的目标持仓 task,该 task 负责调整 m1901 的仓位到指定的目标仓位
target_pos1 = TargetPosTask(api, kind1)
Ejemplo n.º 18
0
import numpy as np
import pandas as pd
import datetime as dt
import time

import asyncio

from contextlib import closing
from tqsdk import TqApi, TqSim, TqAccount, TqBacktest, BacktestFinished, TargetPosTask

from zigzag_patterns import HS
from zigzag_patterns import HS_plotting

ls_symbols = ['*****@*****.**']
# api = TqApi(TqSim(), backtest=TqBacktest(start_dt=dt.date(2018,1,2), end_dt=dt.date(2019,1,10)))
api = TqApi('SIM')

dict_klines = {}
dict_update_kline_chan = {}

for SYMBOL in ls_symbols:
    dict_klines[SYMBOL] = api.get_kline_serial(SYMBOL,
                                               duration_seconds=30 * 60)
    dict_update_kline_chan[SYMBOL] = api.register_update_notify(
        dict_klines[SYMBOL])


async def signal_generator_HS(SYMBOL):
    """该task应用策略在价格触发时开仓,出发平仓条件时平仓"""
    klines = dict_klines[SYMBOL]
    update_kline_chan = dict_update_kline_chan[SYMBOL]
Ejemplo n.º 19
0
# -*- coding: utf-8 -*-
# @Time    : 2020/4/27 14:53
# @Author  : zhangfang
from tqsdk import TqApi, TqSim, TqAccount

api = TqApi(TqAccount("快期模拟", "*****@*****.**", "zf1991"), web_gui=True)
Ejemplo n.º 20
0
from tqsdk import TqApi, TqAuth, tafunc, TqKq, TqAccount
import xgboost as xgb
import numpy as np
import json

import pandas as pd
import time
import sys
sys.path.append("E:/coderepo/skwquant/")
from skwutils import RawList
from trainer import DataRetriever
pd.set_option('display.max_columns', None)

html_filepath = RawList.html_filepath
api = TqApi(TqKq(), auth=TqAuth("keviniiii", "qkyhpys,1"))
# api = TqApi(TqAccount(u"G国海良时", "88500007", "702211"), auth=TqAuth("keviniiii", "qkyhpys,1"))


def get_predict_result(predict_model, pid, sequence):
    pinzhong = DataRetriever.PinzhongData(pid)
    pinzhong.update_last_feature(sequence=sequence)
    features = [pinzhong.X]
    result = predict_model.predict_proba(np.array(features))[0]
    # print(result)
    result_c = np.array(result).argmax()
    result_prob = int(result[result_c] * 100)
    result_c = int(result_c - 1)
    v_prone_percent = result[2] * 100 / (result[2] + result[0])
    if v_prone_percent > 70:
        result_prone = 1
    elif v_prone_percent < 30:
Ejemplo n.º 21
0
Archivo: tq.py Proyecto: bebeter/pyT
from tqsdk import TqApi, TqAccount

api = TqApi(TqAccount("华鑫期货", "910890802", "1503p.o."), auth="论坛邮箱账户,论坛密码")
order = api.insert_order("DCE.i2009-C-520", "BUY", "OPEN", 1, 110)

while True:
    api.wait_update()
    if order.status == "FINISHED" and order.volume_left == 0:
        print("权限已开通,订单已完成")
        break

api.close()
Ejemplo n.º 22
0
        "*****@*****.**": 4,
    }

    data_path = f"./logs/S05_{datetime.now().strftime('%Y%m%d%H%M%S')}"
    Path(data_path).mkdir(parents=True, exist_ok=False)
    file_log = os.path.join(data_path, "backtest.log")
    file_signals = os.path.join(data_path, "signals.txt")

    logger = create_logger(log_file=file_log, cmd=True, name="S")
    logger.info(f"标的配置:{max_positions}")
    logger.info(f"前端地址:http://127.0.0.1:{port}")
    logger.info(f"策略描述:{TradeAnalyze.__doc__}")

    account = TqSim(init_balance=init_balance)
    backtest = TqBacktest(start_dt=start_dt, end_dt=end_dt)
    api = TqApi(account=account, backtest=backtest, web_gui=f":{port}")
    symbols = list(max_positions.keys())
    freqs = list(freqs_k_count.keys())

    freq_seconds = {
        "1分钟": 60,
        "5分钟": 60 * 5,
        "15分钟": 60 * 15,
        "30分钟": 60 * 30,
        "60分钟": 60 * 60,
        "日线": 3600 * 24
    }

    # 订阅K线
    symbols_klines = {s: dict() for s in symbols}
    for symbol in symbols:
Ejemplo n.º 23
0
    ma_list = [np.mean(data_list[-n:])]
    for i in range(1, len(data_list) - n + 1):
        ma = np.mean(data_list[-n - i:-i])
        ma_list.append(ma)
    return np.array(ma_list)


if __name__ == '__main__':
    data = pd.read_excel(io_in, sheet_name=0, converters={'stk_code':
                                                          str})  # excel读取的品种集合
    print('品种数:', len(data['stk_code']))
    g_security = data['stk_code'].tolist()  # "'a' 品种前缀 g_security
    # wt_data = pd.DataFrame(columns=['date', 'stk_code', 'win_rate', 'short_val', 'long_val']) #输出落地的excel字段
    # wt_data.to_excel(io_out, index=False)
    # 登录连接信易快期账户
    api = TqApi(TqKq(), web_gui=True, auth=TqAuth(ACCT_ID, ACCT_PWD))
    account = api.get_account()
    print('初始账户权益:', account.balance)
    print('初始浮动盈亏:', account.float_profit)
    SEC_LIST = []
    for g_sec in g_security:
        ls = api.query_cont_quotes(product_id=g_sec)
        SEC_LIST.append(ls[0])
    print('品种集合:', SEC_LIST)
    # 获取主力合约
    # domain = api.get_quote("[email protected]")
    # 获取主力合约的K线引用
    for sec in SEC_LIST:
        positions[sec] = api.get_position(sec)
        klines_dict[sec] = api.get_kline_serial(sec, BAR_UNIT, BAR_NUM + 1)
        quotes[sec] = api.get_quote(sec)
Ejemplo n.º 24
0
          [sg.Text('长周期'), sg.Input(60, key="long")],
          [sg.OK(), sg.Cancel()]]
window = sg.Window('请输入策略运行参数', layout)

# 读取用户输入值
event, values = window.Read()
print(event, values)
window.close()


# 正常运行策略代码
SHORT = int(values["short"])  # 短周期
LONG = int(values["long"])  # 长周期
SYMBOL = values["symbol"]

api = TqApi(TqAccount(values["broker_id"], values["user_id"], values["password"]))
print("策略开始运行")

data_length = LONG + 2  # k线数据长度
klines = api.get_kline_serial(SYMBOL, duration_seconds=60, data_length=data_length)
target_pos = TargetPosTask(api, SYMBOL)

while True:
    api.wait_update()

    if api.is_changing(klines.iloc[-1], "datetime"):  # 产生新k线:重新计算SMA
        short_avg = ma(klines["close"], SHORT)  # 短周期
        long_avg = ma(klines["close"], LONG)  # 长周期

        # 均线下穿,做空
        if long_avg.iloc[-2] < short_avg.iloc[-2] and long_avg.iloc[-1] > short_avg.iloc[-1]:
Ejemplo n.º 25
0
# 引入TqSdk模块
from datetime import date
from tqsdk import TqApi, TqBacktest, TargetPosTask
# 创建api实例,设置web_gui=True生成图形化界面
api = TqApi(backtest=TqBacktest(start_dt=date(2020, 2, 12),
                                end_dt=date(2020, 3, 12)),
            web_gui=True)
# 订阅 cu2002 合约的10秒线
klines = api.get_kline_serial("SHFE.cu2005",
                              data_length=200,
                              duration_seconds=5 * 60)
while True:
    # 通过wait_update刷新数据
    api.wait_update()
                'float_profit_short'] > put_position["open_cost_short"] * 0.1:
            get_cover(type)
            currentstate = '等待开仓'
            print("获利平仓")
        if 0 - put_position[
                'float_profit_short'] > put_position["open_cost_short"] * 0.1:
            get_cover(type)
            currentstate = '等待开仓'
            print("亏损平仓")


#回测
try:
    acc = TqSim()
    api = TqApi(acc,
                backtest=TqBacktest(start_dt=date(2020, 1, 1),
                                    end_dt=date(2020, 4, 1)))
    kline = api.get_kline_serial(type, 60, 300)
    while True:
        api.wait_update()
        print(currentstate)
        judge_open()
        cover_test()
except BacktestFinished as e:
    # 回测结束时会执行这里的代码
    pass
api.close()
f.close()

##1.txt
##开多仓:3333.0
Ejemplo n.º 27
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-
import time

from tqsdk import TqApi, TqAccount

api = TqApi(TqAccount('快期模拟', 'yhlz714', '86888196'), web_gui=True)
# 获得 m2005 的持仓引用,当持仓有变化时 position 中的字段会对应更新
position = api.get_position("SHFE.rb2010")
# 获得资金账户引用,当账户有变化时 account 中的字段会对应更新
account = api.get_account()
# 下单并返回委托单的引用,当该委托单有变化时 order 中的字段会对应更新
# order = api.insert_order(symbol="SHFE.rb2010", direction="BUY", offset="OPEN", volume=5, limit_price=3575)
orders = api.get_order()
for i in orders:
    api.cancel_order(orders[i])
count = 0
while True:

    api.wait_update()
    # if api.is_changing(order, ["status", "volume_orign", "volume_left"]):
    #     print("单状态: %s, 已成交: %d 手" % (order.status, order.volume_orign - order.volume_left))
    # print(order.status)
    if api.is_changing(position, "pos_long_today"):
        print("今多头: %d 手" % (position.pos_long_today))
    if api.is_changing(account, "available"):
        print("可用资金: %.2f" % (account.available))
    count += 1
    if 50 < count < 52:
        pass
        # api.cancel_order(order)
Ejemplo n.º 28
0
    def test_get_position(self):
        """
        获取持仓
        """
        # 预设服务器端响应
        dir_path = os.path.dirname(os.path.realpath(__file__))
        self.mock.run(
            os.path.join(dir_path, "log_file",
                         "test_td_basic_get_position_simulate.script"))
        # 测试: 获取数据
        api = TqApi(_ins_url=self.ins_url,
                    _td_url=self.td_url,
                    _md_url=self.md_url)
        order1 = api.insert_order("DCE.jd2001",
                                  "BUY",
                                  "OPEN",
                                  1,
                                  limit_price=4592)
        order2 = api.insert_order("DCE.jd2001", "BUY", "OPEN", 3)
        order3 = api.insert_order("DCE.jd2001", "SELL", "OPEN", 3)

        while order1.status == "ALIVE" or order2.status == "ALIVE" or order3.status == "ALIVE":
            api.wait_update()
        position = api.get_position("DCE.jd2001")
        self.assertEqual(
            "{'exchange_id': 'DCE', 'instrument_id': 'jd2001', 'pos_long_his': 0, 'pos_long_today': 4, 'pos_short_his': 0, 'pos_short_today': 3, 'volume_long_today': 4, 'volume_long_his': 0, 'volume_long': 4, 'volume_long_frozen_today': 0, 'volume_long_frozen_his': 0, 'volume_long_frozen': 0, 'volume_short_today': 3, 'volume_short_his': 0, 'volume_short': 3, 'volume_short_frozen_today': 0, 'volume_short_frozen_his': 0, 'volume_short_frozen': 0, 'open_price_long': 4574.75, 'open_price_short': 4568.0, 'open_cost_long': 182990.0, 'open_cost_short': 137040.0, 'position_price_long': 4574.75, 'position_price_short': 4568.0, 'position_cost_long': 182990.0, 'position_cost_short': 137040.0, 'float_profit_long': -270.0, 'float_profit_short': 0.0, 'float_profit': -270.0, 'position_profit_long': -270.0, 'position_profit_short': 0.0, 'position_profit': -270.0, 'margin_long': 11429.6, 'margin_short': 8572.2, 'margin': 20001.800000000003, 'symbol': 'DCE.jd2001', 'last_price': 4568.0}",
            str(position))

        self.assertEqual(1, position.pos)
        self.assertEqual(4, position.pos_long)
        self.assertEqual(3, position.pos_short)
        self.assertEqual(position.exchange_id, "DCE")
        self.assertEqual(position.instrument_id, "jd2001")
        self.assertEqual(position.pos_long_his, 0)
        self.assertEqual(position.pos_long_today, 4)
        self.assertEqual(position.pos_short_his, 0)
        self.assertEqual(position.pos_short_today, 3)
        self.assertEqual(position.volume_long_today, 4)
        self.assertEqual(position.volume_long_his, 0)
        self.assertEqual(position.volume_long, 4)
        self.assertEqual(position.volume_long_frozen_today, 0)
        self.assertEqual(position.volume_long_frozen_his, 0)
        self.assertEqual(position.volume_long_frozen, 0)
        self.assertEqual(position.volume_short_today, 3)
        self.assertEqual(position.volume_short_his, 0)
        self.assertEqual(position.volume_short, 3)
        self.assertEqual(position.volume_short_frozen_today, 0)
        self.assertEqual(position.volume_short_frozen_his, 0)
        self.assertEqual(position.volume_short_frozen, 0)
        self.assertEqual(position.open_price_long, 4574.75)
        self.assertEqual(position.open_price_short, 4568.0)
        self.assertEqual(position.open_cost_long, 182990.0)
        self.assertEqual(position.open_cost_short, 137040.0)
        self.assertEqual(position.position_price_long, 4574.75)
        self.assertEqual(position.position_price_short, 4568.0)
        self.assertEqual(position.position_cost_long, 182990.0)
        self.assertEqual(position.position_cost_short, 137040.0)
        self.assertEqual(position.float_profit_long, -270.0)
        self.assertEqual(position.float_profit_short, 0.0)
        self.assertEqual(position.float_profit, -270.0)
        self.assertEqual(position.position_profit_long, -270.0)
        self.assertEqual(position.position_profit_short, 0.0)
        self.assertEqual(position.position_profit, -270.0)
        self.assertEqual(position.margin_long, 11429.6)
        self.assertEqual(position.margin_short, 8572.2)
        self.assertEqual(position.margin, 20001.800000000003)
        self.assertEqual(position.symbol, "DCE.jd2001")
        self.assertEqual(position.last_price, 4568.0)

        # 其他取值方式测试
        self.assertEqual(position["pos_long_today"], 4)
        self.assertEqual(position["pos_short_today"], 3)
        self.assertEqual(position["volume_long_his"], 0)
        self.assertEqual(position["volume_long"], 4)

        api.close()
Ejemplo n.º 29
0
#!/usr/bin/env python
#  -*- coding: utf-8 -*-

from tqsdk import TqApi

api = TqApi()
quote = api.get_quote("SHFE.rb2005")
# 开仓两手并等待完成
order = api.insert_order(symbol="SHFE.rb2005",
                         direction="BUY",
                         offset="OPEN",
                         limit_price=quote.ask_price1,
                         volume=2)
while order.status != "FINISHED":
    api.wait_update()
print("已开仓")
# 平今两手并等待完成
order = api.insert_order(symbol="SHFE.rb2005",
                         direction="SELL",
                         offset="CLOSETODAY",
                         limit_price=quote.bid_price1,
                         volume=2)
while order.status != "FINISHED":
    api.wait_update()
print("已平今")
# 关闭api,释放相应资源
api.close()
Ejemplo n.º 30
0
    def test_lib_insert_order_time_check_7(self):
        """
        lib下单时间判断测试7

        订阅合约:
            订阅周六有行情的和周六无行情的
        测试:
            (测试:回测从周六开始时 可交易时间段的计算、判断)
            1 回测刚开始:current_datetime 为 0:00 , 只有cu能下单,另外两个合约直到白盘9点下单
        """
        # 预设服务器端响应
        dir_path = os.path.dirname(os.path.realpath(__file__))
        self.mock.run(
            os.path.join(dir_path, "log_file",
                         "test_lib_insert_order_time_check_7.script.lzma"))

        TqApi.RD = random.Random(4)
        api = TqApi(backtest=TqBacktest(
            datetime.datetime(2019, 11, 30, 0, 0, 0),
            datetime.datetime(2019, 12, 2, 9, 30)),
                    _ins_url=self.ins_url_2019_12_04)
        symbol1 = "SHFE.cu2002"  # 有夜盘,凌晨1点结束夜盘
        symbol2 = "SHFE.rb2002"  # 夜盘23点结束
        symbol3 = "DCE.jd2002"  # 无夜盘
        quote1 = api.get_quote(symbol1)
        quote2 = api.get_quote(symbol2)
        quote3 = api.get_quote(symbol3)
        position1 = api.get_position(symbol1)
        position2 = api.get_position(symbol2)
        position3 = api.get_position(symbol3)
        target_pos1 = TargetPosTask(api, symbol1)
        target_pos2 = TargetPosTask(api, symbol2)
        target_pos3 = TargetPosTask(api, symbol3)
        orders = api.get_order()
        try:
            # 1 回测刚开始:current_datetime 为 0:00 , 只有cu能下单,另外两个合约直到白盘9点下单
            target_pos1.set_target_volume(1)
            target_pos2.set_target_volume(2)
            target_pos3.set_target_volume(3)
            while max(quote1.datetime, quote2.datetime,
                      quote3.datetime) < "2019-11-30 00:02:00.000000":
                api.wait_update()
            self.assertEqual(len(orders), 1)
            while max(quote1.datetime, quote2.datetime,
                      quote3.datetime) < "2019-11-30 00:15:00.000000":
                api.wait_update()
            self.assertEqual(len(orders), 1)
            self.assertEqual(position1.pos, 1)
            self.assertEqual(position2.pos, 0)
            self.assertEqual(position3.pos, 0)

            while max(quote1.datetime, quote2.datetime,
                      quote3.datetime) < "2019-12-02 09:05:00.000000":
                api.wait_update()
            self.assertEqual(len(orders), 3)
            self.assertEqual(position1.pos, 1)
            self.assertEqual(position2.pos, 2)
            self.assertEqual(position3.pos, 3)

            while True:
                api.wait_update()
        except BacktestFinished:
            self.assertEqual(position1.pos, 1)
            self.assertEqual(position2.pos, 2)
            self.assertEqual(position3.pos, 3)
            api.close()