2018年10月4日 星期四

函數在迴圈內時,也許跟你想得不一樣?


如果你需要在程式碼中處理有特定規律且重複做的事情,通常會直覺的想要用迴圈去做。比如:我要讀取很多個有檔名規律的文字檔,這樣寫... 很一般、普通、正常吧

var: j(0), fileName("");
array: getting[11](0);

for j=1 to 10 begin
  fileName= "F:\" + NumToStr(j,0) + ".txt";
  getting[j]= _readTXT( fileName );
end;


但是在 MultiCharts,我卻發現這會跟我們想像的不大一樣~ 至少,上面那樣寫的效果,跟下面這麼寫的就不見得會相同咧(以下這種寫法才不大正常啊 XD)。

array: getting[11](0);

getting[1]= _readTXT( "F:\1.txt" );
getting[2]= _readTXT( "F:\2.txt" );
getting[3]= _readTXT( "F:\3.txt" );
getting[4]= _readTXT( "F:\4.txt" );
getting[5]= _readTXT( "F:\5.txt" );
getting[6]= _readTXT( "F:\6.txt" );
getting[7]= _readTXT( "F:\7.txt" );
getting[8]= _readTXT( "F:\8.txt" );
getting[9]= _readTXT( "F:\91.txt" );
getting[10]= _readTXT( "F:\10.txt" );

後文就是分享上述這個為何所得不相同的測試、觀察與結論。
====================

2018年9月27日 星期四

函數(_priceTWS):適應台股最小跳動的價格轉換


台灣股票的最小跳動間距,算是自外於國際現況,會因為股價高低而有不同的最小跳動,相關規則可參考:https://dh3p7.app.goo.gl/vBs5

這個函數的用途在於,我們在編寫交易策略的時候,常常會有指定價位的 stop 或是 limit 交易指令,如果我們指定的價格(比如:往上碰到5日均線時買進,往下觸到布林通道下緣出場)沒有經過處理轉換,又剛好下單機是採掛價送單的話,就會出現掛價不存在而遭退單。

就算你是看股票現貨做股票期貨也是一樣的狀況,所以,我們會需要一個函數來幫忙把指定價格轉換成在該價格對應到符合最小跳動規格的正確數字。

函數 _priceTWS,參數:輸入你要指定的價位,傳回數值。
input: price(Numeric);
var: tick(0), grand(0);

switch( price ) 
begin

  case >1000:
    begin
      tick= 5;
      grand= 1000;
    end;

  case 500 to 999.9:
    begin
      tick= 1;
      grand= 500;
    end;

  case 100 to 499.9:
    begin
      tick= 0.5;
      grand= 100;
    end;

  case 50 to 99.999:
    begin
      tick= 0.1;
      grand= 50;
    end;

  case 10 to 49.999:
    begin
      tick= 0.05;
      grand= 10;
    end;

  case <10:
    begin
      tick= 0.01;
      grand= 0;
    end;

end;



_priceTWS= grand + round( (price-grand)/tick, 0) * tick;



使用舉例:

var: MA1(0), MA2(0), MA3(0);
var: toBuy(0), toSell(0);

MA1=  Average( C, 5 );
MA2= Average( C, 20 );
MA3= Average( C, 60 );

toBuy= _priceTWS( maxlist( MA1, MA2, MA3 ) );
toSell= _priceTWS( minlist( MA1, MA2, MA3 ) );

if marketposition=0 and Close>MA1 and MA1>MA1[1] then
  buy next bar toBuy stop;

if marketposition>0 then
  sell next bar toSell stop;

2018年7月2日 星期一

函數(_isSettlementDay):多商品版結算日判斷


這篇文章的緣由有兩個,一是這個函數能比較多的適用在不同商品的結算日判斷,二是應該還有許多人對於在函數中的參數對宣告成 Reference 型態的使用感到疑惑。

本文所分享的函數 code 原作不是我,出處來自:https://goo.gl/7Nni3p 的第三樓。
感謝 Vincez 的分享,原始 code 請自行連過去閱讀。

2018年2月11日 星期日

智能風險管理系統:myCTA


你手上已有數個交易策略,卻擔心或無法決定如何執行這些策略?
你對策略何時上架、下架、該投入多少資金到個別策略感到困難?
你想適度降低隔夜風險,卻又不想改寫手上僅有日盤設計的策略?
你還困惑於是否該在策略中或是策略組合去設計加、減碼的機制?

把 Dataram 的 RAMDISK 設為 NTFS



過去沒有嘗試把 myCTA / SmatCTA 所需要用到跨圖表傳遞的資訊,都盡量採用文字檔的方式來存取時,不大會發現 FAT32 有什麼問題。但是,當策略圖表大量增加到某種程度以上後,慢慢會發現我要存取的檔案怎麼... 怪怪的?因為,在 FAT32 的檔案系統下,單一目錄下的檔案數量有上限

於是,我們需要把 RAMDISK 的檔案系統,換成 NTFS。也許不同家的 RAMDISK 軟體,可以直接指定檔案系統,但我已經花錢買了的 Dataram RAMDISK 就沒有指定成 NTFS 的選項。所以,我們需要做點處理。

2018年2月4日 星期日

函數(_isTrading):判斷商品當下是否有在交易中


由於正在往國外期貨做更多的努力,也陸陸續續碰到很多問題,維運方面或是策略、管理對不同市場、商品的自動適應都有。

這是為了在做出下單動作的時候,先判斷一下目前該商品,是否處於可交易的狀態?因為我自己已經發生多次,輸出部位的文字檔改變了,卻在該商品沒有交易的時段 XDDD


函數: _isTrading。回傳:True / False。
var: intrabarpersist volToday(0), intrabarpersist volUpdateTime(0),
     intrabarpersist TimeValue(0), intrabarpersist isTrading(false);


if LastBarOnChart then begin
  
  value1= currentTime_s;
  value2= HoursFromDateTime( ELTimeToDateTime_s(value1) );
  value3= MinutesFromDateTime( ELTimeToDateTime_s(value1) );
  value4= SecondsFromDateTime( ELTimeToDateTime_s(value1) );
  TimeValue= value2*3600 + value3*60 + value4;
  
  once volToday= q_ask*q_bid + q_totalvolume; 

  if (q_ask*q_bid+q_totalvolume) <> volToday then begin
    volUpdateTime= TimeValue;
    volToday= (q_ask*q_bid+q_totalvolume);
  end;
  
  _isTrading= TimeValue-volUpdateTime < 60 and volUpdateTime <> 0 
              and q_bid*q_ask <> 0 and q_bid <> q_ask;

end;

2017年12月19日 星期二

函數(_commaFormat):讓數字以千分位形式顯示


在製作介面的時候,有關於資金量的顯示,如果是短短的萬元以下,通常我們的人眼辨識沒有什麼問題,當數字位數多一些起來時,往往就會有辨識解讀的困擾(這是一種略帶快樂的麻煩嗎?)

然而 MultiCharts 內建的數字顯示形式的功能,我只看到 :7:0 這類的方式,好像沒有看到以千分位加個逗號的形式?因此,自己就做了個函數,在數字最後要顯示在畫面上時,可以用千分位加逗號的文字型態來表現。

熱門文章