2019年2月21日 星期四

多策略整合之比例式部位實作


前文:多策略部位整合(http://www.yctseng.net/2018/12/blog-post.html)的文末說到改造成比例式下單是很容易的,這篇我們就來實作一下吧。

由於我們不會直接連結到下單命令的執行,稱為比例式"下單"不大適當,所以文章標題採用了比例式部位,反正你只要把這個換算出來的比例式部位,丟文字檔或其他管道給下單機,也就真的是比例式下單了。

我們先來定義一下這個比例式部位的 比例式是個什麼碗糕?畢竟每個人對比例的含意很有可能是不同,你當然可以沿用這樣的架構,去實作出你自己的"比例"。本文所作的比例是:目前策略組合的訊號部位總和佔過去各策略最大持倉數量的百分比;而比例式部位則是把這個比例再乘上對照目前資金量的單位數。


由於本文的比例需要知道過去各策略的最大持倉量,所以在放在策略圖表上輸出資訊的這端需要多輸出該策略的最大持倉,做一下修改,從下圖變成後面的程式碼,仔細對照看看。

input: chartNO(1);
var: MP(0), intrabarpersist maxHold(0);


if LastBarOnChart then begin

  MP= i_MarketPosition * i_CurrentContracts;
  
  if i_CurrentContracts>maxHold then  maxHold= i_CurrentContracts;
  
  
  GVSetNamedInt( "iam"+NumToStr(chartNO,0), 1 );
  GVSetNamedInt( "chartMP"+NumToStr(chartNO,0), MP );
  GVSetNamedInt( "maxHold"+NumToStr(chartNO,0), maxHold );


  plot1( text("chart",chartNO:0:0,"= ", MP:0:0) );
  
  _omTXT( MP, text("F:\",chartNO:0:0,".txt"), close );
  
end;


RecalcLastBarAfter(0.1);



在整合部位這端,把各個策略輸出的最大持倉量資訊接收進來,加總成為比例的分母,再將目前的策略訊號部位總和,就可以得到目前策略組合的... 比例(contractRatio)。此時需要多一個參數:每單位資金對應的口數(contractsPerUnit)是多少?以這裡的參數 default 值來看,就是每100萬元、下5口,看當時策略組合訊號的比例,決定下幾個 5口,也許 0.13個、也許 0.57 個、也許... 1個(滿倉)!
input: myMoney(200000), unitMoney(1000000), contractsPerUnit(5);
input: fileName("F:\OrderMaster.txt");
input: text1("Charts"), text2("combinSignals"), text3("Position");

array: intrabarpersist chartPosition[](0),
       intrabarpersist maxHold[](0);
       
var: j(0), OnOff(0), 
     intrabarpersist units(0),
     intrabarpersist totalCharts(0), intrabarpersist chartSignals(0),
     intrabarpersist totalMaxHold(0);
var: show(""), detail("");
var: intrabarpersist contractRatio(0), intrabarpersist toDeal(0);     


  
if LastBarOnChart then begin
  
  detail= "";
  array_setmaxindex( chartPosition, 1 );
  array_setmaxindex( maxHold, 1 );
  for j= 1 to 3000 begin

    OnOff= GVGetNamedInt( "iam"+numtostr(j,0), 0 );
    
    if OnOff<>1 then
      break
    else 
      begin
        array_setmaxindex( chartPosition, array_getmaxindex(chartPosition)+1 );
        array_setmaxindex( maxHold, array_getmaxindex(maxHold)+1 );
        
        chartPosition[j]= GVGetNamedInt( "chartMP"+numtostr(j,0), 0 );
        maxHold[j]= GVGetNamedInt( "maxHold"+numtostr(j,0), 0 );
        
        detail= detail + text(" chart", NumToStr(j,0), ": ", chartPosition[j]:0:0 )+newline;
      end;
  
  end;
  
  totalCharts= array_getmaxindex(chartPosition) - 1;
  chartSignals= Summation_a( chartPosition, array_getmaxindex(chartPosition) );
  totalMaxHold= Summation_a( maxHold, array_getmaxindex(chartPosition) );
  contractRatio= iff( totalMaxHold>0, chartSignals / totalMaxHold, 0 );
  
  units= myMoney / unitMoney ;
  toDeal= round( contractRatio * contractsPerUnit * units, 0 );
  
  
  _omTXT( toDeal, fileName, q_last );
  
  
  show= text( " ", text1, "= ", totalCharts:0:0, " " ) + newline;
  show= show + text( " ", text2, "= ", chartSignals:0:0, "(", contractRatio*100, "%) " ) + newline;
  show= show + text( " ", text3, "= ", toDeal:0:0, " " ) + newline;
  show= show + text( "-------------------- " ) + newline;
  show= show + detail;

  text_delete(value98);  
  value98= text_new_bn(barnumber, GetAppInfo(aiHighestDispValue),"");
  TEXT_SetString(value98, show); 
  TEXT_SetBGColor(value98, black);
  TEXT_SetStyle(value98, 1, 0);
  TEXT_SetSize(value98,13);
  TEXT_SetColor(value98, white);
  
end;  


RecalcLastBarAfter(0.1);



以上,你比較看看「多策略部位整合」那篇的 code ,應該會感覺修改成所謂的比例式下單,要修改的 code 其實是很少的。

如果再仔細去深入思考本文與 「多策略部位整合」的差異,我會說:「多策略部位整合」本身就已經比例式下單了啊!只是槓桿的表現方式不同而已 XD


這雖然實現了小資金也能使用很多很多策略構成組合來做交易,卻沒有風險控管的機制:http://www.yctseng.net/2018/11/mycta_15.html


文章最後,下載點:https://isn.page.link/pm6C

熱門文章