コード例 #1
0
    def __init__(self):
        wx.Frame.__init__(self,
                          parent=None,
                          title=u'量化软件',
                          size=(1500, 800),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)
        #创建显示区面板
        self.DispPanel = MPL_Panel_Base(self)
        self.BackPanel = Loop_Panel_Base(self)
        self.am = self.DispPanel.am
        self.vol = self.DispPanel.vol
        self.devol = self.DispPanel.devol
        self.macd = self.DispPanel.macd

        #创建参数区面板
        self.ParaPanel = wx.Panel(self, -1)

        paraInput_Box = wx.StaticBox(self.ParaPanel, -1, u'参数输入')
        paraInput_Sizer = wx.StaticBoxSizer(paraInput_Box, wx.VERTICAL)
        self.StNameCodedict = {
            u"开山股份": "300257.SZ",
            u"浙大网新": "600797.SS",
            u"水晶光电": "002273.SZ",
            u"高鸿股份": "000851.SZ"
        }

        #初始化股票代码变量
        self.stockName_Val = u"开山股份"
        self.stockCode_Val = self.StNameCodedict[self.stockName_Val]

        self.stockName_CMBO = wx.ComboBox(
            self.ParaPanel,
            -1,
            self.stockName_Val,
            choices=list(self.StNameCodedict.keys()),
            style=wx.CB_READONLY | wx.CB_DROPDOWN)  #股票名称
        stockCode_Text = wx.StaticText(self.ParaPanel, -1, u'股票名称')

        #策略选取
        strate_Text = wx.StaticText(self.ParaPanel, -1, u'策略名称')
        strate_Combo_Val = [u"双趋势融合", u"阿尔法", u"布林带"]
        self.pickstrate_Val = u"双趋势融合"
        self.pickstrate_CMBO = wx.ComboBox(self.ParaPanel,
                                           -1,
                                           self.pickstrate_Val,
                                           choices=strate_Combo_Val,
                                           style=wx.CB_READONLY
                                           | wx.CB_DROPDOWN)  #策略名称

        #日历控件选择数据周期
        # self.dpcEndTime = wx.DatePickerCtrl(self.ParaPanel, -1,style = wx.DP_DROPDOWN|wx.DP_SHOWCENTURY|wx.DP_ALLOWNONE)#结束时间
        # self.dpcStartTime = wx.DatePickerCtrl(self.ParaPanel, -1,style = wx.DP_DROPDOWN|wx.DP_SHOWCENTURY|wx.DP_ALLOWNONE)#起始时间
        self.dpcEndTime = wx.adv.DatePickerCtrl(self.ParaPanel,
                                                -1,
                                                style=wx.adv.DP_DROPDOWN
                                                | wx.adv.DP_SHOWCENTURY
                                                | wx.adv.DP_ALLOWNONE)  #结束时间
        self.dpcStartTime = wx.adv.DatePickerCtrl(self.ParaPanel,
                                                  -1,
                                                  style=wx.adv.DP_DROPDOWN
                                                  | wx.adv.DP_SHOWCENTURY
                                                  | wx.adv.DP_ALLOWNONE)  #起始时间
        DateTimeNow = wx.DateTime.Now()  #wx.DateTime格式"03/03/18 00:00:00"
        self.dpcEndTime.SetValue(DateTimeNow)
        # DateTimeNow.SetYear(DateTimeNow.Year-1)
        DateTimeNow.SetYear(DateTimeNow.year - 1)
        self.dpcStartTime.SetValue(DateTimeNow)
        stockData_Text = wx.StaticText(self.ParaPanel, -1, u'日期(Start-End)')

        #初始化时间变量
        dateVal = self.dpcStartTime.GetValue()
        self.stockSdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        dateVal = self.dpcEndTime.GetValue()
        self.stockEdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)

        paraInput_Sizer.Add(stockCode_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.stockName_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(stockData_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.dpcStartTime, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.dpcEndTime, 0, wx.EXPAND | wx.ALL | wx.CENTER,
                            2)
        paraInput_Sizer.Add(strate_Text, 0, wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.pickstrate_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)

        RadioList = ["不显示", "跳空缺口", "金叉/死叉", "N日突破"]
        self.StratInputBox = wx.RadioBox(self.ParaPanel,
                                         -1,
                                         label=u'指标提示',
                                         choices=RadioList,
                                         majorDimension=4,
                                         style=wx.RA_SPECIFY_ROWS)
        self.StratInputBox.Bind(wx.EVT_RADIOBOX, self.OnRadioBox_Indicator)
        #初始化指标变量
        self.IndicatInput_Val = self.StratInputBox.GetStringSelection()

        self.TextAInput = wx.TextCtrl(self.ParaPanel,
                                      -1,
                                      "交易信息提示:",
                                      style=wx.TE_MULTILINE
                                      | wx.TE_READONLY)  #多行|只读

        vboxnetA = wx.BoxSizer(wx.VERTICAL)  #纵向box
        vboxnetA.Add(paraInput_Sizer,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)  #proportion参数控制容器尺寸比例
        vboxnetA.Add(self.StratInputBox,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)
        vboxnetA.Add(self.TextAInput,
                     proportion=1,
                     flag=wx.EXPAND | wx.ALL,
                     border=2)
        self.ParaPanel.SetSizer(vboxnetA)

        #创建Right面板
        self.CtrlPanel = wx.Panel(self, -1)
        #创建FlexGridSizer布局网格
        self.FlexGridSizer = wx.FlexGridSizer(rows=3, cols=1, vgap=3, hgap=3)

        #行情按钮
        self.Firmoffer = wx.Button(self.CtrlPanel, -1, "行情")
        self.Firmoffer.Bind(wx.EVT_BUTTON, self.FirmEvent)  #绑定行情按钮事件
        #选股按钮
        self.Stockpick = wx.Button(self.CtrlPanel, -1, "选股")
        self.Stockpick.Bind(wx.EVT_BUTTON, self.PstockpEvent)  #绑定选股按钮事件
        #回测按钮
        self.Backtrace = wx.Button(self.CtrlPanel, -1, "回测")
        self.Backtrace.Bind(wx.EVT_BUTTON, self.BackEvent)  #绑定回测按钮事件

        #加入Sizer中
        self.FlexGridSizer.Add(self.Firmoffer,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Stockpick,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Backtrace,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)

        self.CtrlPanel.SetSizer(self.FlexGridSizer)

        self.HBoxPanel = wx.BoxSizer(wx.HORIZONTAL)
        self.HBoxPanel.Add(self.ParaPanel,
                           proportion=1.5,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.DispPanel,
                           proportion=8,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.CtrlPanel,
                           proportion=1,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.SetSizer(self.HBoxPanel)
コード例 #2
0
class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,
                          parent=None,
                          title=u'量化软件',
                          size=(1500, 800),
                          style=wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)
        #创建显示区面板
        self.DispPanel = MPL_Panel_Base(self)
        self.BackPanel = Loop_Panel_Base(self)
        self.am = self.DispPanel.am
        self.vol = self.DispPanel.vol
        self.devol = self.DispPanel.devol
        self.macd = self.DispPanel.macd

        #创建参数区面板
        self.ParaPanel = wx.Panel(self, -1)

        paraInput_Box = wx.StaticBox(self.ParaPanel, -1, u'参数输入')
        paraInput_Sizer = wx.StaticBoxSizer(paraInput_Box, wx.VERTICAL)
        self.StNameCodedict = {
            u"开山股份": "300257.SZ",
            u"浙大网新": "600797.SS",
            u"水晶光电": "002273.SZ",
            u"高鸿股份": "000851.SZ"
        }

        #初始化股票代码变量
        self.stockName_Val = u"开山股份"
        self.stockCode_Val = self.StNameCodedict[self.stockName_Val]

        self.stockName_CMBO = wx.ComboBox(
            self.ParaPanel,
            -1,
            self.stockName_Val,
            choices=list(self.StNameCodedict.keys()),
            style=wx.CB_READONLY | wx.CB_DROPDOWN)  #股票名称
        stockCode_Text = wx.StaticText(self.ParaPanel, -1, u'股票名称')

        #策略选取
        strate_Text = wx.StaticText(self.ParaPanel, -1, u'策略名称')
        strate_Combo_Val = [u"双趋势融合", u"阿尔法", u"布林带"]
        self.pickstrate_Val = u"双趋势融合"
        self.pickstrate_CMBO = wx.ComboBox(self.ParaPanel,
                                           -1,
                                           self.pickstrate_Val,
                                           choices=strate_Combo_Val,
                                           style=wx.CB_READONLY
                                           | wx.CB_DROPDOWN)  #策略名称

        #日历控件选择数据周期
        # self.dpcEndTime = wx.DatePickerCtrl(self.ParaPanel, -1,style = wx.DP_DROPDOWN|wx.DP_SHOWCENTURY|wx.DP_ALLOWNONE)#结束时间
        # self.dpcStartTime = wx.DatePickerCtrl(self.ParaPanel, -1,style = wx.DP_DROPDOWN|wx.DP_SHOWCENTURY|wx.DP_ALLOWNONE)#起始时间
        self.dpcEndTime = wx.adv.DatePickerCtrl(self.ParaPanel,
                                                -1,
                                                style=wx.adv.DP_DROPDOWN
                                                | wx.adv.DP_SHOWCENTURY
                                                | wx.adv.DP_ALLOWNONE)  #结束时间
        self.dpcStartTime = wx.adv.DatePickerCtrl(self.ParaPanel,
                                                  -1,
                                                  style=wx.adv.DP_DROPDOWN
                                                  | wx.adv.DP_SHOWCENTURY
                                                  | wx.adv.DP_ALLOWNONE)  #起始时间
        DateTimeNow = wx.DateTime.Now()  #wx.DateTime格式"03/03/18 00:00:00"
        self.dpcEndTime.SetValue(DateTimeNow)
        # DateTimeNow.SetYear(DateTimeNow.Year-1)
        DateTimeNow.SetYear(DateTimeNow.year - 1)
        self.dpcStartTime.SetValue(DateTimeNow)
        stockData_Text = wx.StaticText(self.ParaPanel, -1, u'日期(Start-End)')

        #初始化时间变量
        dateVal = self.dpcStartTime.GetValue()
        self.stockSdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        dateVal = self.dpcEndTime.GetValue()
        self.stockEdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)

        paraInput_Sizer.Add(stockCode_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.stockName_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(stockData_Text,
                            proportion=0,
                            flag=wx.EXPAND | wx.ALL,
                            border=2)
        paraInput_Sizer.Add(self.dpcStartTime, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.dpcEndTime, 0, wx.EXPAND | wx.ALL | wx.CENTER,
                            2)
        paraInput_Sizer.Add(strate_Text, 0, wx.EXPAND | wx.ALL | wx.CENTER, 2)
        paraInput_Sizer.Add(self.pickstrate_CMBO, 0,
                            wx.EXPAND | wx.ALL | wx.CENTER, 2)

        RadioList = ["不显示", "跳空缺口", "金叉/死叉", "N日突破"]
        self.StratInputBox = wx.RadioBox(self.ParaPanel,
                                         -1,
                                         label=u'指标提示',
                                         choices=RadioList,
                                         majorDimension=4,
                                         style=wx.RA_SPECIFY_ROWS)
        self.StratInputBox.Bind(wx.EVT_RADIOBOX, self.OnRadioBox_Indicator)
        #初始化指标变量
        self.IndicatInput_Val = self.StratInputBox.GetStringSelection()

        self.TextAInput = wx.TextCtrl(self.ParaPanel,
                                      -1,
                                      "交易信息提示:",
                                      style=wx.TE_MULTILINE
                                      | wx.TE_READONLY)  #多行|只读

        vboxnetA = wx.BoxSizer(wx.VERTICAL)  #纵向box
        vboxnetA.Add(paraInput_Sizer,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)  #proportion参数控制容器尺寸比例
        vboxnetA.Add(self.StratInputBox,
                     proportion=0,
                     flag=wx.EXPAND | wx.BOTTOM,
                     border=2)
        vboxnetA.Add(self.TextAInput,
                     proportion=1,
                     flag=wx.EXPAND | wx.ALL,
                     border=2)
        self.ParaPanel.SetSizer(vboxnetA)

        #创建Right面板
        self.CtrlPanel = wx.Panel(self, -1)
        #创建FlexGridSizer布局网格
        self.FlexGridSizer = wx.FlexGridSizer(rows=3, cols=1, vgap=3, hgap=3)

        #行情按钮
        self.Firmoffer = wx.Button(self.CtrlPanel, -1, "行情")
        self.Firmoffer.Bind(wx.EVT_BUTTON, self.FirmEvent)  #绑定行情按钮事件
        #选股按钮
        self.Stockpick = wx.Button(self.CtrlPanel, -1, "选股")
        self.Stockpick.Bind(wx.EVT_BUTTON, self.PstockpEvent)  #绑定选股按钮事件
        #回测按钮
        self.Backtrace = wx.Button(self.CtrlPanel, -1, "回测")
        self.Backtrace.Bind(wx.EVT_BUTTON, self.BackEvent)  #绑定回测按钮事件

        #加入Sizer中
        self.FlexGridSizer.Add(self.Firmoffer,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Stockpick,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.Add(self.Backtrace,
                               proportion=1,
                               border=5,
                               flag=wx.ALL | wx.EXPAND)
        self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)

        self.CtrlPanel.SetSizer(self.FlexGridSizer)

        self.HBoxPanel = wx.BoxSizer(wx.HORIZONTAL)
        self.HBoxPanel.Add(self.ParaPanel,
                           proportion=1.5,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.DispPanel,
                           proportion=8,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.HBoxPanel.Add(self.CtrlPanel,
                           proportion=1,
                           border=2,
                           flag=wx.EXPAND | wx.ALL)
        self.SetSizer(self.HBoxPanel)

    def ProcessStock(self):
        #df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2017,1,1), datetime.date.today())
        df_stockload = GetStockDatPro(self.stockCode_Val, self.stockSdate_Val,
                                      self.stockEdate_Val)
        """ 绘制移动平均线图 """
        #self.am.plot(self.numic[0:self.butNum],self.close[0:self.butNum],'#0f0ff0',linewidth=1.0)

        dispCont_List = []

        examp_trade = Excave_Indic_Base()
        if self.IndicatInput_Val == u"金叉/死叉":
            dispCont_pd, dispCont_List = examp_trade.plot_Aver_Cross(
                df_stockload)
            self.DispPanel.draw_avercross(df_stockload, dispCont_pd)
        elif self.IndicatInput_Val == u"跳空缺口":
            dispCont_pd, dispCont_List = examp_trade.plot_Jump_Thrd(
                df_stockload)
            self.DispPanel.draw_jumpgap(df_stockload, dispCont_pd)
        elif self.IndicatInput_Val == u"N日突破":
            dispCont_pd, dispCont_List = examp_trade.plot_Ndays_Break(
                df_stockload)
            self.DispPanel.draw_ndaysbreak(df_stockload, dispCont_pd)
        else:
            dispCont_List = dispCont_List

        self.TextAInput.SetValue(u"指标提示信息如下:" + '\n')
        for i in dispCont_List:
            self.TextAInput.AppendText(i)

        numic = np.arange(0, len(df_stockload.index))
        butNum = len(df_stockload.index)
        self.DispPanel.xylabel_tick_lim(self.stockName_Val, df_stockload.index)
        self.DispPanel.draw_subgraph(df_stockload, numic)

    def ProcessLoop(self):

        df_stockload = GetStockDatPro(self.stockCode_Val, self.stockSdate_Val,
                                      self.stockEdate_Val)
        dispCont_List = []
        if self.pickstrate_Val == u"双趋势融合":
            #多趋势融合策略执行 """
            examp_trade = QuantPickTimeSys(df_stockload)
            dispCont_List = examp_trade.run_factor_plot(
                self.BackPanel.trade, self.BackPanel.total,
                self.BackPanel.profit)
        else:
            #执行其他策略
            pass

        self.TextAInput.SetValue(u"策略提示信息如下:" + '\n')
        for i in dispCont_List:
            self.TextAInput.AppendText(i)
        self.BackPanel.xylabel_tick_lim(self.stockName_Val)

    def reFlashLoop(self):
        self.BackPanel.clear_subgraph()  #必须清理图形才能显示下一幅图
        self.ProcessLoop()
        self.BackPanel.update_subgraph()  #必须刷新才能显示下一幅图

    def reFlashFrame(self):
        self.DispPanel.clear_subgraph()  #必须清理图形才能显示下一幅图
        self.ProcessStock()
        self.DispPanel.update_subgraph()  #必须刷新才能显示下一幅图

    def FirmEvent(self, event):
        #显示行情面板
        self.HBoxPanel.Hide(self.BackPanel)
        self.HBoxPanel.Replace(self.BackPanel, self.DispPanel)
        self.HBoxPanel.Show(self.DispPanel)
        # self.HBoxPanel.Remove(self.BackPanel)
        self.SetSizer(self.HBoxPanel)
        self.HBoxPanel.Layout()

        #获取列表股票代码和起始时间
        self.stockName_Val = self.stockName_CMBO.GetString(
            self.stockName_CMBO.GetSelection())
        self.stockCode_Val = self.StNameCodedict[self.stockName_Val]

        dateVal = self.dpcStartTime.GetValue()
        self.stockSdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)
        dateVal = self.dpcEndTime.GetValue()
        self.stockEdate_Val = datetime.datetime(dateVal.year,
                                                dateVal.month + 1, dateVal.day)

        self.reFlashFrame()

    def BackEvent(self, event):
        #显示回测面板
        self.HBoxPanel.Hide(self.DispPanel)
        self.HBoxPanel.Replace(self.DispPanel, self.BackPanel)
        self.HBoxPanel.Show(self.BackPanel)
        # self.HBoxPanel.Remove(self.DispPanel)
        self.SetSizer(self.HBoxPanel)
        self.HBoxPanel.Layout()

        #获取策略名称
        self.pickstrate_Val = self.pickstrate_CMBO.GetString(
            self.pickstrate_CMBO.GetSelection())
        print('self.pickstrate_Val:=========================>')
        print(self.pickstrate_Val)
        self.reFlashLoop()

    def PstockpEvent(self, event):
        dispCont_List = []
        """ 选股策略执行 """
        examp_trade = FactorPickStockAng()
        for index, stockName in enumerate(self.StNameCodedict.keys()):
            print("stockName", stockName, self.StNameCodedict[stockName])
            df_stockload = GetStockDatPro(self.StNameCodedict[stockName],
                                          self.stockSdate_Val,
                                          self.stockEdate_Val)
            df_stockload.fillna(method='bfill', inplace=True)  #后一个数据填充NAN1
            dispCont_List.append(stockName + '\n' +
                                 examp_trade.fit_pick(df_stockload.Close) +
                                 '\n')
        print(dispCont_List)
        """ 选股策略执行 """
        """ 自定义提示框 """
        myPickStock = UserDialog(self, dispCont_List)
        if myPickStock.ShowModal() == wx.ID_OK:
            pass
        else:
            pass
        """ 自定义提示框 """

    def OnRadioBox_Indicator(self, event):
        self.IndicatInput_Val = self.StratInputBox.GetStringSelection()