2022年1月15日 星期六

範例:MultiCharts多商品交易到下單大師

myCTA 的基礎上,我有把這個基礎擴展到多商品,過去曾經有極為少數的幾位朋友上過 myCTA 多商品版本的的課程(當時取名為 SmartCTA),但後來就不再開課,coding 難度實在太高了~

因為要交易多商品,造成在下單設定上的困擾。當你要同時交易 50、100、200、300個商品的話,想一下光是下單機上的設定,就非常痛苦了。為了降低這個痛點,之前與下單大師溝通,並得到大力協助下,才能使用 order 模式的方式,讓多商品的交易得以實現:不需要設定超多數量的"策略",也不需要設定一大堆的"商品"!僅需3~5個下單文字檔,就能駕馭你的一籃子商品了。

以下是多商品交易時,輸出下單文字檔的範例,因為這牽涉到所有商品-策略訊號的統合器的設計,無法提供一如過去分享的單一 fuction
    for j= 1 to howmany begin

      change[j]= _tPosition[j] - _lastPos[j];

      if pos(change[j])>=1 then begin
      
        dealPrice= iff( change[j]>0, Watcher_ask[j], Watcher_bid[j] );
        
        timeFormat= FormatDate( "yyyy/MM/dd", computerDateTime )+" "+
                    FormatTime( "HH:mm:ss", computerDateTime );

        ActionContent= text( " ", Watcher_Description[j], " :",
                             " ", _sign(change[j],2,0), " @", dealPrice:12:6, 
                             " (",_sign(_tPosition[j],2,0),")",
                             " t$", _commaFormat(tEquity,0) );
        _writeLog( logPATH+"ActionLog_"+AccountName+".txt", ActionContent );


        if OrderTXTs>1 then begin

          if TimeValue-orderTime[txtIndex]>1 then begin
            timeFormat= FormatDate( "yyyy/MM/dd", computerDateTime )+" "+
                        FormatTime( "HH:mm:ss", computerDateTime );
            orderFormat= text("STK_US,", Watcher_Exchange[j],"_",Watcher_Symbol[j],
                              ",A,Y#", timeFormat,",", change[j]:0:0,",", dealPrice:0:2 );
          
            orderFileName= text(OrderPATH,AccountName,"_",NumToStr(txtIndex,0),".txt");
            _writeTXT( orderFileName, orderFormat );
            _writeLog( f_orderLog, " " + orderFormat );
                  
            _lastPos[j]= _tPosition[j];
            orderTime[txtIndex]= TimeValue;
            txtIndex= iff( txtIndex>=orderTXTs, 1, txtIndex+1 );
          end;

        end;

      end;

    end;

我們需要對上方的 code 做一點點的解釋:

以下是陣列: 
    ● _Watcher_ask[j]:各個商品現在的 ask 價 
    ● _Watcher_bid[j]:各個商品現在的 bid 價 
    ● Watcher_Exchange[j]:各個商品所屬的交易所
    ● Watcher_Synbol[j]:各個商品的商品代號
    ● _tPosition[j]:各個商品的目前部位 
    ● _lastPos[j]:各個商品的之前部位 
    ● _change[j]:各個商品當下的部位變化值 
    ● orderTime[]:記錄每個下單文字檔上次被寫入時間 

以下是變數: 
    ◎ orderTXTs:總共使用幾個下單文字檔 
    ◎ txtIndex:用來指向寫到哪個下單文字檔 
    ◎ dealPrice:用來寫入 log 與 下單文字檔的成交價 
    ◎ orderFormat:寫入下單文字檔的內容(這裡是下單美股到 IB-盈透證券的) 
    ◎ orderFileName:下單文字檔的路徑與檔名


我交易多商品的架構分成三層:
第一層是商品-訊號以產生每個策略的部位,使用 Portfolio Trader 去執行。
第二層是商品整合,每個商品下可能會有多個訊號一起執行,所以需要把各商品的訊號部位價總,可以使用圖表(PT也可)。
第三層是輸出下單文字檔與一籃子商品的持有部位狀態,這就使用圖表來做,上述的 code 就在這一層裡面。

以上這些工作,除了真實的送單到券商需要下單大師去執行外,全部都在 MultiCharts 裡完成,基本上只要第一層是用 PT 去執行的話,要監視並交易個 1000個商品以上,不是問題。但你要熟捻陣列與 intrabar persisit 的運用。

在理解了以上的 code 之後,應該可以看出,其實使用到陣列就是為了在一籃子商品中,用迴圈做逐個執行:把每個商品的交易動作,輸出到幾個文字檔(輪流使用),直接告訴下單大師對哪個商品買賣多少數量,這就是 order 模式。

對你來說,最重要的就是必須知道你要下單的券商的商品代號規則,依每一家券商而有差異,不見得同一個商品在不同券商的商品代號就會一樣!在上述 code 中,因為是下到 IB 的美股現貨,最重要就是這一段的紅字部分: 
orderFormat= text("STK_US,", Watcher_Exchange[j],"_",Watcher_Symbol[j], ",A,Y#", timeFormat,",", change[j]:0:0,",", dealPrice:0:2 );

透過這樣的模式運作,你可以保有很高的商品選擇彈性,直接把第一層的商品更換掉或增加,第二層的調整則很少,第三層不需更動,後面的下單大師也都不需要變動,自動適應。

這個輸出下單文字檔的原理,也應用在STO。交易選擇權本來就是多商品,PUT / CALL 多個履約價隨時調換。
串接下單大師 2.5 的設定: https://youtu.be/r94WCubbAIk
串接下單大師 4.0 的設定: https://youtu.be/4iZguVsrMxA