怎样将实盘交易信息,同步显示在K线图上?

论坛 期权论坛 期权     
期权匿名问答   2022-5-5 01:56   9223   0
根据前面文章“低门槛搭建个人量化平台 — 第五天:自定义功能和指标”(在【1】中),不仅可以在自已的量化平台上修改K线图形及各式设置,在图表上显示一些自定义数据或指标,而且还可以随心所欲增加自己感兴趣的个性化扩展定制内容。
本篇简要介绍,怎样将自己的实盘交易操作信息,同步记录并显示在K线图上。
一个图例如下:白糖SR2109合约的小时K线图上,B代表买入,S代表卖出。当鼠标移动到圆圈上浮动显示具体信息,包含当时交易买卖的时间、手数、价格、手续费等。这样结合日志功能,方便自己复盘分析。



来源: adog.net.cn

下面是通过 tradingView GET /marks 方法实现的,说明如下:
Request:GET /marks?symbol=<ticker_name>&from=<unix_timestamp>&to=<unix_timestamp>&resolution=<resolution>

    symbol: symbol name or ticker.
    from: unix timestamp (UTC) or leftmost visible bar
    to: unix timestamp (UTC) or rightmost visible bar
    resolution: string

Response: 响应预期是一个对象,下面列出了一些属性。此对象与JS API中的respective response相似,但每个属性都被视为表的列,如上所述。

{
    id: [array of ids],
    time: [array of times],
    color: [array of colors],
    text: [array of texts],
    label: [array of labels],
    labelFontColor: [array of label font colors],
    minSize: [array of minSizes],
}

Remark: 备注:如果您的datafeed在传输的配置数据中发送了supports_marks:true,则会调用此方法。
在下面的 marks(request) 方法中,将数据获取后,根据15、30、60分钟及日、周周期对交易数量、交易金额、交易手续费等进行聚合统计,以满足K线图在不同时间周期下的调用和显示。
def marks(request):
        def getDataByFreq(code,dx,freqx):
                dx['dt']=pd.to_datetime(dx['dtime'])
                dx.set_index('dt',inplace=True)
                cheshu=max(dx['cheshu'])
               
                d_hands=dx.hands.resample(freqx).agg({'hands': 'sum'}).unstack().T
                d_amount=dx.amount.resample(freqx).agg({'amount': 'sum'}).unstack().T.round(1)
                d_fee=dx['手续费'].resample(freqx).agg({'手续费': 'sum'}).unstack().T.round(1)
               
                df=d_hands.join(d_amount).join(d_fee)
                hands']!=0.0)&(df['amount']!=0.0)&(df['手续费']!=0.0)]
                df=df[(df['hands']!=0.0)]
                df.reset_index(drop=False,inplace=True)
                df['dt']=df['dt'].astype(str)
                df['avgPrice']=df.apply(lambda d: 0. if d.hands==0. else d.amount/d.hands/cheshu,axis=1).round(1)
                if 'D' in freqx or 'W' in freqx:
                        df['time']=df.apply(lambda d: xtool.timeString2timeLong(d['dt'],format='day'),axis=1)
                elif 'min' in freqx:
                        df['time']=df.apply(lambda d: xtool.timeString2timeLong(d['dt'],format='sec'),axis=1)
               
                df['color']=df.apply(lambda d: \
                                                        { 'border': '#d2a99d', 'background': '#d2a99d' } if d['hands']>=0 \
                                                        else  { 'border': '#94becc', 'background': '#94becc' },axis=1)

                df['label']=df.apply(lambda d: 'Buy' if d['hands']>=0 else 'Sell',axis=1)
               
                df['text']= df.apply(lambda d: '%s <br>%s <br> %s: %s hand<br>avg Price:%s <br> amount: %s <br> fee: %s'%(d['dt'],
                                                                                                                                                                                                                                code,
                                                                                                                                                                                                                        d['label'],
                                                                                                                                                                                                                        d['hands'],
                                                                                                                                                                                                                        d['avgPrice'],
                                                                                                                                                                                                                        d['amount'],
                                                                                                                                                                                                                        d['手续费']
                                                                                                                                                                                                                        ),axis=1)
                df['labelFontColor']='#5a533a'
                df['minSize']=20

                #df=df.round(1)
                df['id']=df.index
                df=df[['id','time','color','text','label','labelFontColor','minSize']]
                return df
   
        code = request.GET.get("symbol","A8888").upper()
        freq = request.GET.get("resolution","1D").upper()
       
        code=xtool.code_jq2wxy(code, broker=None)
        sql_cmffc='select acc,合约,实际成交日期,成交时间,买卖,开平,手数,成交价,成交额,手续费,平仓盈亏 from acc.deal_fut_cfmmc where 合约 = "%s" order by 实际成交日期,成交时间'%(code)   
        data=dbcom.select_tuple_dict(sql_cmffc)
        data=pd.DataFrame(data)
       
        sql_wxy='select InvestorID acc,InstrumentID 合约,TradingDay 实际成交日期,TradeTime 成交时间,IF(Direction="0","买","卖") 买卖,IF(TradeType="0","开","平") 开平,TradeVolume 手数,TradePrice 成交价,TradeAmnt 成交额,UsedFee 手续费,CloseProfit 平仓盈亏 from acc.XS_Trade where InstrumentID = "%s" order by  TradingDay,TradeTime'%(code)   
        data_wxy=dbcom.select_tuple_dict(sql_wxy)
        data_wxy=pd.DataFrame(data_wxy)
        if len(data_wxy)>0:
                data_wxy['实际成交日期']=data_wxy.apply(lambda df: TD.getBefAftTradeDay(df['实际成交日期'][:4]+"-"+df['实际成交日期'][4:6]+"-"+df['实际成交日期'][6:],-1,verbose=False) \
                                                                        if df['成交时间']>='21:00:00' else df['实际成交日期'][:4]+"-"+df['实际成交日期'][4:6]+"-"+df['实际成交日期'][6:],axis=1)
       
        data=data.append(data_wxy)
       
        if data is not None and len(data)>0:
                data['平仓盈亏']=data.apply(lambda df: '0.' if df['平仓盈亏']=='--' else df['平仓盈亏'],axis=1)
                data[['手数','成交价','成交额','手续费','平仓盈亏']]=data[['手数','成交价','成交额','手续费','平仓盈亏']].astype(float)
                data['dtime']=data['实际成交日期']+' '+data['成交时间']
               
                data['hands']=data.apply(lambda df: df['手数'] if df['买卖']=='买' else -df['手数'],axis=1)
               
                cheshu=int(max(max(data['成交额']/data['成交价']),1))
                data['cheshu']=cheshu
               
                data['amount']=data.apply(lambda df: df['成交价']*df['手数']*df['cheshu']-df['手续费']+df['平仓盈亏'] if df['买卖']=='买' else -(df['成交价']*df['手数']*df['cheshu']-df['手续费']+df['平仓盈亏']),axis=1)
                       
                if freq=='1D':
                        data=getDataByFreq(code,data,'1D')
                elif freq=='1W' or  freq=='W':
                        data=getDataByFreq(code,data,'1W')
                       
                elif freq=='15' or freq=='30':
                        data=getDataByFreq(code,data,freq+'min')
                elif freq=='60' or freq=='1H' or freq=='1h':
                        data=getDataByFreq(code,data,'60min')
                       
               
               
                dict=data.to_dict('list')
               
                return dict
同时别忘记在总配置 config()  中,将 "supports_marks" 设为 True。
def config():
    dict= {
         "supports_search":True,
         "supports_group_request":False,
         "supports_marks":True,
        ...
仅两步,步骤不复杂。但需要提前准备好自己的实时或历史行情数据和交易数据(【2】)。
请点赞支持。如有疑问,可以到我的知识星球详细讨论或下载源码。

参考:

  • 【1】阿岛格专栏:低门槛搭建个人量化平台
  • 【2】阿岛格:低门槛搭建个人量化平台 — 第四天:实时数据
  • 【3】阿岛格专栏:基于人工智能的量化投资
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP