有關以固定金額加碼操作的問題,煩請小幫手大大!!

  •   415 
  • 最後發表   信風  2022 一月 03
信風 發文於   2021/12/28

請教小幫手大大及版上先進:

我的交易邏輯如下。

1.5MA、10MA 黃金交叉買進固定金額100萬的部位

2.以第一次進場(底倉)的成本價為基準,上漲+10%加碼100萬的部位

3.加碼後以第二次進場(加碼單)的進場價為基準,上漲+10%再加碼100萬的部位。

共計最多進場3次(1次底倉2次加碼)。

5.成交價跌破20MA全數出場  

 

問題:  以回測股票代號2498為例。

現在的狀況是乎是出現在entry_count的計數上。它總是會跳回到1,因此變成不斷循環在第1次的加碼處,直至總資金耗盡。

我試圖以變數entry_count來控制加碼的次數,但試了幾種不同寫法,出來的結果似乎都不是我想要的。  

我的寫法是否有問題?請問類似像這種固額金額加碼或是限制加碼次數的交易邏輯該怎麼寫呢?還請先進不吝指教。謝謝!!

原始碼如下

{

交易邏輯:

1.5MA、10MA 黃金交叉買進固定金額100萬的部位

2.以第一次進場(底倉)的成本價為基準,上漲+10%加碼100萬的部位

3.加碼後以第二次進場(加碼單)的進場價為基準,上漲+10%再加碼100萬的部位。

  共計最多進場3次(一次底倉2次加碼)。

4.成交價跌破20MA全數出場  

 

問題:  以回測股票代號2498為例。

現在的狀況是乎是出現在entry_count的計數上。它總是會跳回到1,因此變成不斷循環在第1次的加碼處,直至總資金耗盡。

 

}

 

input : ordersize(100, "每筆交易金額(萬)");

 

var:long_condition(false);

var:exit_long_condition(false);

var:entry_count(0);  //進場次數

 

long_condition = crossOver(average(close,5),average(close,10));    //進場條件。5MA、10MA 黃金交叉

exit_long_condition = crossUnder(close,average(close,20));    //出場條件。成交價跌破20MA

 

//  底倉進場  //

if filled = 0 and long_condition then 

begin

var: order_price(0);{ 預期委託價格 }

var: order_qty(0);{ 換算後數量 }

 

order_price = close[1]*1.1;   //預期成交價格

order_qty = ((ordersize*10000) / (order_price * 1000));  //換算後下單量 

SetPosition(order_qty);

 

entry_count = 1;   //計數進場次數

 

print(file("C:\SysJust\XQLite\XS\Print\test.log"),

"Date=", NumToStr(Date, 0),"symbol=",symbol,"Close=", NumToStr(Close, 2),"trade_count=", NumToStr(filledRecordCount, 2),

"possition=",NumToStr(position, 2),"filled=",NumToStr(filled, 2),

"entry_count=", NumToStr(entry_count, 2));

 

    end;

 

//  第一次加碼  //

if entry_count = 1 and filled <> 0 then

begin

var:first_order_cost(0);   //母單成本價

var:first_plratio(0);      //母單進場後漲跌幅

first_order_cost = filledRecordPrice(filledRecordCount);    

if first_order_cost<>0 then first_plratio = ((close-first_order_cost)/first_order_cost)*100;   //停損幅度

 

if first_plratio > 10 then 

begin

order_price = close[1]*1.1;   //預期成交價格

order_qty = ((ordersize*10000) / (order_price * 1000));  //換算後下單量 

SetPosition(position + order_qty);   //加碼

//SetPosition(position + 2);   //加碼

 

entry_count = 2;  //計數進場次數

 

end;

    

print(file("C:\SysJust\XQLite\XS\Print\test1.log"),

"Date=", NumToStr(Date, 0),"symbol=",symbol,"Close=", NumToStr(Close, 2),"trade_count=", NumToStr(filledRecordCount, 2),

"possition=",NumToStr(position, 2),"filled=",NumToStr(filled, 2),

"entry_count=", NumToStr(entry_count, 2));

 

end;

 

//  第二次加碼  //

if entry_count = 2 and Filled <> 0 then

begin

var:second_order_cost(0);   //加碼單成本價

var:second_plratio(0);//加碼單漲跌幅

second_order_cost = filledRecordPrice(filledRecordCount);    

if second_order_cost<>0 then second_plratio = ((close-second_order_cost)/second_order_cost)*100;   //停損幅度

 

if second_plratio > 10 then 

begin

order_price = close[1]*1.1;   //預期成交價格

order_qty = ((ordersize*10000) / (order_price * 1000));  //換算後下單量 

SetPosition(position + order_qty);   //加碼

//SetPosition(position + 3);   //加碼

 

entry_count = 3;  //計數進場次數

 

end;

    

print(file("C:\SysJust\XQLite\XS\Print\test2.log"),

"Date=", NumToStr(Date, 0),"symbol=",symbol,      //"Close=", NumToStr(Close, 2),"trade_count=", NumToStr(filledRecordCount, 2),

"possition=",NumToStr(position, 2),"filled=",NumToStr(filled, 2),

"entry_count=", NumToStr(entry_count, 2));

 

end;

 

//  出場  //

if Position <> 0 and exit_long_condition then 

    begin

 

SetPosition(0);

entry_count = 0;    //進場次數歸零

 

print(file("C:\SysJust\XQLite\XS\Print\test3.log"),

"Date=", NumToStr(Date, 0),"symbol=",symbol,"Close=", NumToStr(Close, 2),"trade_count=", NumToStr(filledRecordCount, 2),

"possition=",NumToStr(position, 2),"filled=",NumToStr(filled, 2),

"entry_count=", NumToStr(entry_count, 2));

 

end;

 

 

print(file("C:\SysJust\XQLite\XS\Print\test4.log"),

"Date=", NumToStr(Date, 0),"symbol=",symbol,"Close=", NumToStr(Close, 2),"trade_count=", NumToStr(filledRecordCount, 2),

"possition=",NumToStr(position, 2),"filled=",NumToStr(filled, 2),

"entry_count=", NumToStr(entry_count, 2));

 

 

 

 

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/01/03

Hello 信風,

 

請問您回測時是用什麼頻率?

如果是使用日頻率的話 entry_count 前須加上 intrabarpersist 這樣才能確保當根Bar(當日)內的逐筆運算 entry_count 都可以維持值。

 

建議您底倉進場時的條件可以修改為

if filled = 0 and long_condition and entry_count = 0 and getinfo("TradeMode") = 1 then begin

因為若還沒有成交的話,只要long_condition符合的話就會一直進入這個條件內。

 

第一次加碼和第二次加碼間建議您要加上控制,不然在同次腳本運算中,第一次加碼執行完(entry_count變為2)第二次加碼馬上就符合。

而此時加碼單成本價還是相同的,會導致entry_count直接累積到3。

舉例來說,您可以修改為:

if entry_count[1] = 1 and filled <> 0 then begin

if entry_count[1] = 2 and Filled <> 0 then begin

這樣的話至少要隔一根Bar才會加碼。

另外需注意若您第一次加碼的單子還未成交的話,進到第二次加碼時的加碼單成本價將會賀第一次加碼取得的成本是相同的。

 

還有,若腳本內同時有複數個SetPosition在執行的話,只會執行最前面的那一個,細節可以參考連結說明。

信風 發文於   2022/01/03

了解了!!十分感謝,謝謝!!

發表回覆
Close