请老师修改指标,修改成文华财经 (文华财经WH6赢顺V6.7)

投资者咨询:请老师修改指标,修改成文华财经 (文华财经WH6赢顺V6.7)
来源:文华财经  日期:2019-6-17 16:13
  <
投资者咨询:请老师修改指标,修改成文华财经 (文华财经WH6赢顺V6.7)
来源:文华财经  日期:2019-6-17 16:13
里面的定时器可以不要
# encoding: UTF-8
"
自动交易-卖
"
from __future__ import division
import talib
import math
import win32api,win32con
from iTraderPy.ctp_data_type import *
from iTraderPy.StrategyBase import *
from iTraderPy.mtConstant import *
from iTraderPy.exportObj import *
import datetime
########################################################################
class AutoTradeLongX(StrategyBase):
    """"""
    name = u'自动交易-卖'                # 策略实例名称
    # 变量列表。可将需要在管理界面显示的变量名加到此处(注意基类已在basevarList中定义显示部份变量,这些变量不需再定义)
    varList = []
    # 参数列表,可将需要在管理界面显示的参数名加到此处
    paramList = []
    #----------------------------------------------------------------------
    def __init__(self, ctaEngine, strategyid):
        """Constructor"""
        super(AutoTradeLongX, self).__init__(ctaEngine, strategyid)
        #继承修改基类变量,若不需修改,也可不继承
        self.rtnAllTrade = False  # 是否返回所有交易,若是,则不是本策略产生的交易也会被返回,否则,只返回本生策略提交的交易
        self.autoGeneratorBar = False #不生成Bar
        self.timerId = 1  # 定义timerid
        self.clearBeginTime = "14:58:00"#清仓时间
        self.clearEndTime = "15:00:00"
        self.insInfo = None  # 合约信息
        self.stepTickNum = 2  # 止盈或加仓判断的价格Tick数量
        self.firstPhasePosNum = 20  # 第一阶段总仓
        self.firstTradeNum = 2  # 第一阶段每次下的仓数
        self.secondTradeNum = 1  # 第二阶段每次下的仓数
        self.tradeDirect = 1 #交易的方向,0:买多,卖空
        self.symbol = "rb1910"  # 交易的合约
        self.symbolList = [self.symbol]
        self._initData() #初始化数据
    # ----------------------------------------------------------------------
    def _initData(self):
        """重新初始化数据。"""
        self.bStartTraded = False  # 是否已启动交易
        self.curActivePrice = 0  # 当前交易成交的价位
        self.PosRemainNum = 0  # 仓位保留的次数
        self.bOpening = False  # 是否正在开仓
        self.forbidTrade = False  # 是否已禁止交易
    # ----------------------------------------------------------------------
    def onInit(self):
        """在策略第一次启动时被调用。用户可继承实现。"""
        pass
    # ----------------------------------------------------------------------
    def onStart(self):
        """在策略启动时被调用。用户可继承实现。"""
        self._initData() #重新初始化数据
        self.insInfo = self.get_instrmentinfo(self.symbol)
        if self.insInfo == None:
            sMessageText = "获得合约信息失败,请检查配置的合约!"
            win32api.MessageBox(0, sMessageText, "提示", win32con.MB_ICONWARNING)
            return START_FAILD
        self.setTimer(self.timerId, 1000, self._onTimerFun)#启动计时器
        self.subSymbol(self.symbol)  # 订阅行情
    # ----------------------------------------------------------------------
    def onStop(self):
        """在策略停止时被调用。用户可继承实现。"""
        pass
    # ----------------------------------------------------------------------
    def onTick(self, tickInfo):
        """收到tick推送的处理函数,用户可继承实现。
        tickInfo为TickInfo类型数据"""
        if self.forbidTrade or self.bOpening:#开仓还未返回,则不加新的仓
            return
        if not self.bStartTraded: #第一次开仓
            self.bStartTraded = True
            marketPrice = tickInfo.upperLimit if self.tradeDirect == 0 else tickInfo.lowerLimit  # 以涨跌停价模拟市价
            self._sendOpenOrder(marketPrice) #以市价开新仓
            self.logs('多头方向第一次开仓')
        elif not math.isclose(self.curActivePrice, 0.0):  # 新仓已开成功
            addPrice = self.curActivePrice - self.insInfo.priceTick * self.stepTickNum if self.tradeDirect == 0 else self.curActivePrice + self.insInfo.priceTick * self.stepTickNum
            needAddOrder = tickInfo.last<=addPrice if self.tradeDirect == 0 else tickInfo.last>=addPrice #判断是否需要加仓
            if needAddOrder:
                self._sendOpenOrder(addPrice)  # 以加仓价开新仓
                self.logs('多头方向触发加仓,加仓价为:'+str(addPrice))
    # ----------------------------------------------------------------------
    def onRtnOrder(self, order):
        """收到委托单推送,用户可继承实现。"""
        pass
    # ----------------------------------------------------------------------
    def onRtnTrade(self, trade):
        """收到成交单推送,用户可继承实现。"""
        if trade.offsetFlag == POSITION_EFFECT_OPEN: #开仓成功
            self.bOpening = False
            self.PosRemainNum += trade.volume
            self.curActivePrice = trade.price  # 成交价格
            self.logs('多头方向加仓成功! 成交价为=' + str(trade.price))
            self.logs('多头方向加仓成功! 仓位为='+str(self.PosRemainNum))
            closePrice = self.curActivePrice+self.insInfo.priceTick*self.stepTickNum if self.tradeDirect == 0 else self.curActivePrice-self.insInfo.priceTick*self.stepTickNum #止盈价
            self._sendCloseOrder(closePrice, trade.volume) #发平仓止盈委托单
            self.logs('多头方向挂止盈平仓! 挂单价为=' + str(closePrice))
        else:#平仓止盈成功
            self.PosRemainNum -= trade.volume #剩余的仓位次数
            self.curActivePrice = trade.price #更新当前最新价
            self.logs('多头方向止盈成功!止盈价为:' + str(trade.price))
            self.logs('多头方向止盈成功!剩余仓位为=' + str(self.PosRemainNum))
            if self.bOpening:  # 判断是否有加新仓,有的话,撤未成交的加仓
                self._cancelAllOpenOrder()#平掉未成交的加仓委托
                self.logs('多头方向触发止盈后撤未成开仓!')
            if self.PosRemainNum <= 0:#已无持仓,用最新的平仓成交价,开新的仓
                self._sendOpenOrder(trade.price)  # 以最新成交价,开新仓
                self.logs('多头方向止盈后触发加仓! 加仓价为=' + str(trade.price))
    # ----------------------------------------------------------------------
    def onRtnOrderInsertErr(self, trade):
        """收到报单失败推送"""
        self.logs('多头方向AutoTradeLongX onRtnOrderInsertErr')
    # ----------------------------------------------------------------------
    def onRtnOrderActionErr(self, trade):
        """收到撤单失败推送"""
        self.logs('多头方向AutoTradeLongX onRtnOrderActionErr')
    # ----------------------------------------------------------------------
    def _sendOpenOrder(self, openPrice):
        """加仓"""
        try:
            self.bOpening = True
            openDirection = BUYSELLTYPE_BUY if  self.tradeDirect == 0 else BUYSELLTYPE_SELL #交易方向为多,则开多,否则开空
            tradeNum = self.firstTradeNum if self.PosRemainNum < self.firstPhasePosNum else self.secondTradeNum #交易的手数
            orderReq = OrderReq.__from_create__(
                self.relevantAccount,
                self.symbol,
                tradeNum,
                openDirection,
                POSITION_EFFECT_OPEN,
                openPrice
            )
            self.submit_order(orderReq)
        except Exception as e:
            self.logs("Exception: onStart " + str(e))
    def _sendCloseOrder(self, closePrice, closeVolum):
        """止赢平仓"""
        try:
            clsoeDirection = BUYSELLTYPE_SELL if  self.tradeDirect == 0 else BUYSELLTYPE_BUY #交易方向为多,则开多,否则开空
            orderReq = OrderReq.__from_create__(
                self.relevantAccount,
                self.symbol,
                closeVolum,
                clsoeDirection,
                POSITION_EFFECT_CLOSE,
                closePrice
            )
            self.submit_order(orderReq)
        except Exception as e:
            self.logs("Exception: onStart " + str(e))
    # ----------------------------------------------------------------------
    def _cancelAllOpenOrder(self):
        """撤销所有处理中的加仓单"""
        self.bOpening = False
        orderDirection = BUYSELLTYPE_BUY if self.tradeDirect == 0 else BUYSELLTYPE_SELL  # 交易方向为多,则开多,否则开空
        pendingOrders = self.get_orders(self.symbol, dataType=1) #得到所有未成交的委托单
        for order in pendingOrders:
            if order.offsetFlag != POSITION_EFFECT_OPEN:#判断是否是开仓单
                continue
投资者咨询:请老师修改指标,修改成文华财经 (文华财经WH6赢顺V6.7)
来源:文华财经  日期:2019-6-17 16:13
 指标要改成SPD标准合约套利用的
技术人员回复
日期:2019-6-17 16:20
 您指标和文华编写语言差异很大,不能直接修改的

如果您想标准套利程序化,您可以使用MQ软件

MQ是收费软件,官网下载



投资者咨询:请老师修改指标,修改成文华财经 (文华财经WH6赢顺V6.7)
来源:文华财经  日期:2019-6-17 16:13
 这个是用的Python写的
技术人员回复
日期:2019-6-17 16:27
 我们核实了下,将来MQ会支持股票的Python模型,但期货上需要改写实现

不过MQ编写很复杂,如果您有MQ实盘授权,会有专门金融工程师帮您完成这个修改

MQ可以到官网主页订购中购买