Hi 小幫手,
我正在撰寫自動交易,我的邏輯如下,請幫忙看一下我的程式是否能達到我的需求,謝謝。
我想要達成的邏輯如下:
我想要達成的邏輯跟code如下:
var: isRealTime(1); //1:開盤期間, 0:回測期間。
{
1.
09:00:00 ~ 09:30:00
開盤時,一律將昨天買的賣在開盤價。
2.
09:30:01 ~ 13:22:00
滿足條件就買,一次買足。
3.
13:22:01 ~ 13:25:00
快收盤時,價格低於成本就攤平。
}
var: trigger(False);
var: _buy_qty(0);
SetBarBack(160, "D");
SetTotalBar(270);
if GetField("Date") <> GetField("Date")[1]
then begin
condition1 = False;
condition2 = False;
end;
trigger = condition1 and condition2;
if GetField("Time") < 092900 then begin
{1. 昨天買的,今天一律賣在開盤價}
if Position <> 0 and FilledRecordCount <> 0 and FilledRecordDate(FilledRecordCount) <> getfield("Date")then begin
Setposition(0, Market, label:="出清");
end;
end
else if GetField("Time") >= 093000 and GetField("Time") < 132200 and getinfo("isRealtime") = isRealTime then begin
{2. 滿足條件就買,一次買足。不可重復委托,以免要重新排隊。}
if Position = 0 and trigger = True then begin
_buy_qty = 5
setposition( _buy_qty, Market, label:="1st買");
end;
end
else if GetField("Time") >= 132200 and getinfo("isRealtime") = isRealTime then begin
{3. 快收盤時,若價錢低於成本,則攤平。攤平的張數以庫存為依據。}
if Filled > 0 and Close <= FilledAvgPrice * 0.7 then begin
if Close > FilledAvgPrice * 0.5 then begin
{若價錢在成本的(0.7~0.5間,則攤平(持有張數*1)。}
_buy_qty = Filled * 1;
end
else begin
{若價錢在成本的(小於0.5,則攤平(持有張數*2。}
_buy_qty = Filled * 2;
end;
setposition(_buy_qty + Position, Market, label:="2st買");
end;
end;
我想要達成的邏輯跟code如下:
1. 就是隔天開盤時,把昨天買的全部在開盤時用市價賣掉。
if GetField("Time") < 092900 then begin
{1. 昨天買的,今天一律賣在開盤價}
if Position <> 0 and FilledRecordCount <> 0 and FilledRecordDate(FilledRecordCount) <> getfield("Date")then begin
Setposition(0, Market, label:="出清");
end;
end
2. 在09:30:01 ~ 13:22:00開始執行交易本體,這段期間滿足條件就執行買入的動作,例如委托市價買5張,那希望做到,在13:22:00可以買滿5張,除非委托失敗,否則不要重復送委托單,因為這樣就會重新排隊。
if GetField("Time") >= 093000 and GetField("Time") < 132200 and getinfo("isRealtime") = isRealTime then begin
{2. 滿足條件就買,一次買足。不可重復委托,以免要重新排隊。}
if Position = 0 and trigger = True then begin
_buy_qty = 5
setposition( _buy_qty, Market, label:="1st買");
end;
end
這裡用"已成交的張數" x2,我是這樣寫的 Filled * 2 , 用Filled對嗎?
3.
尾盤如果: 1. 現價低於成本價就做攤平,然後攤平的張數是用"已成交的張數" x 2 (or x 1)。 因為之前的委托不見得買的到,所以有買到才做攤平。
if GetField("Time") >= 132200 and getinfo("isRealtime") = isRealTime then begin
{3. 快收盤時,若價錢低於成本,則攤平。攤平的張數以庫存為依據。}
if Filled > 0 and Close <= FilledAvgPrice * 0.7 then begin
if Close > FilledAvgPrice * 0.5 then begin
{若現價在成本的(0.7~0.5間,則攤平(持有張數*1)。}
_buy_qty = Filled * 1;
end
else begin
{若現價比成本(小於0.5,則攤平(持有張數*2)。}
_buy_qty = Filled * 2;
end;
setposition(_buy_qty + Position, Market, label:="2st買"); //這裡要用Position or Filled??
end;
end;
另外,getinfo("isRealtime") = isRealTime這個的目的就要讓我方便在盤中即時交易跟盤後回測做切換,
不知有沒有更方便的寫法,希望能做到code在不更動的情況下可以同時滿足盤中交易跟盤後回測,謝謝。
1 評論