自動交易腳本_setposition 指定掛單價格的問題

  •   354 
  • 最後發表   expe  2024 五月 22
expe 發文於   2024/05/16

如題,我有撰寫了2種進場作放空的程式碼,分別是

第一種是先抓今日的開盤價格Rec_O,再用Rec_O去計算出進場的價格Rec_O*(1+0.01*p1)

if GetInfo("IsRealTime")=0 then return;

Once(GetInfo("IsRealTime")=1 and GetField("成交量", "Tick")<>0) begin

Rec_O=GetField("開盤價", "D");

Alert("Rec_O",Rec_O," s_in=",Rec_O*(1+0.01*p1),"數量",Floor(amount*10/Close)," 估_停損價=",Rec_O*(1+0.01*p1)*(1+0.01*LossP));

end;

 

SetPosition((-1)*Floor(amount*10/Close),Rec_O*(1+0.01*p1),Label:="1st_空單");

 

 

此種寫法不知道什麼原因,在測試自動交易腳本的時候,腳本沒能按照計算出的 Rec_O*(1+0.01*p1) 價格來下單

 

======================================================================================

我的第二種寫法如下,此作法則會按照設定的價格下單,價格沒達到,則不會成交( 是我想要的指定下單價格)

setposition((-1)*qty[1],SCost01,label:="Sell In_進場01");   // 此SCost01為input自行設定的數值

 

======================================================================================

 

想請教 為什麼第一種setposition的寫法,會產生直接市價下單就直接成交了的效果 ( 不想要市價下單成交)

測試的結果  大致如下圖

排序方式: 標準 | 最新
expe 發文於   2024/05/16

上面的變數宣告 我並沒有採用 IntraBarPersist的用法,而是寫成Variables:Rec_O(0);

明天我再來測試看看 換寫成Variables:IntraBarPersist Rec_O(0);

 

對照組有成功按照設定價格掛單的寫法是寫成 input: SCost01(0,"股票01空進價位_S_in"),

虎科大許教授 發文於   2024/05/16

Rec_O在使用之前都會被賦予當天開盤價的數據,不需要加IntraBarPersist。問題並不在它。你應該檢視計算委託價公式裡面的P1數值是否正確。你提供的圖片太模糊,若能提供實際委託價格及及公式運算的值,對於判斷問題所在會比較有幫助。

expe 發文於   2024/05/17

 

下列是我寫的第一種進場做空的程式碼,此腳本在用模擬帳號運作時,會發生不是想指定的價格進場,如圖片1(上圖),程式碼計算出了該股當日的開盤價格Rec_O之後,再經由計算進場的掛單價格為Rec_O*(1+0.01*p1),p1預設為2,即想要做到該股票今日從開盤價計算上漲2%之後,進場做放空s_in。

以圖1的商品2618.TW為例,經由觀察對照後發現,原本掛單價格應該要是37.43做放空,但是程式運作時變成委託價格32.8,所以馬上就成交了,成交均價36.45

 

input:T1(130500, "times出場時間01"),FixedP(5,"停利%"),LossP(3.5,"停損%"),limt(15,"單筆金額(萬)"),stp1(5,"停利%"),stp2(5,"停損%");

input:p1(2,"開盤後漲幅_S_in");

 

input: GD(7,"掛單距N個Tick"),amount(50,"換算買入金額(W)");

input: SCost01(0,"股票01空進價位_S_in"),SOut01(0,"股票01空出價位_S_Out"),SLose01(0,"股票01空_停損價_S_lose");

 

Variables:intrabarpersist s_in(false),intrabarpersist s_out(false),intrabarpersist s_lose(false),intrabarpersist time_out(false);

Variables:Rec_O(0);

Variables:intraBarPersist MKP(0),mkp2(0);

settotalbar(1000);

setbackBar(700);

if GetInfo("IsRealTime")=0 then return;

Once(GetInfo("IsRealTime")=1 and GetField("成交量", "Tick")<>0) begin

Rec_O=GetField("開盤價", "D");

Alert("Rec_O",Rec_O," s_in=",Rec_O*(1+0.01*p1),"數量",Floor(amount*10/Close)," 估_停損價=",Rec_O*(1+0.01*p1)*(1+0.01*LossP));

end;

//==========================條件區==========================

s_in=Close>=AddSpread(Rec_O*(1+0.01*p1),-GD); // 開盤價上漲p1%後,進場做空(預掛)

s_out=Close<=AddSpread(SOut01,GD) or Close<=AddSpread(SOut01,GD);

s_lose=Close>=FilledAvgPrice*(1+0.01*LossP) and FilledAvgPrice<>0;

time_out=CurrentTime>=T1;

 

 

//==========================S_in_進場區==========================

if s_in and MKP=0 and FilledAvgPrice=0 and not time_out then begin

MKP=-1;

SetPosition((-1)*Floor(amount*10/Close),Rec_O*(1+0.01*p1),Label:="1st_空單");

end;

//==========================S_lose_停損出場區==========================

if s_lose and MKP<>0 and FilledAvgPrice<>0 then begin

MKP=0;

time_out=true;

SetPosition(0,AddSpread(Close,2),Label:="s_lose_停損出場01");

end;

//==========================S_out_停利出場區==========================

if s_out and MKP<>0 and FilledAvgPrice<>0 then begin

MKP=0;

time_out=true;

SetPosition(0,SOut01,Label:="s_out_停利出場01");

end;

expe 發文於   2024/05/17

input:p1(2,"開盤後漲幅_S_in");

 

p1除了一開始的指定輸入為2之外,沒有經過其他的運算

 

虎科大許教授 發文於   2024/05/17

32.80是當天的跌停價,等於觸發訊號時是用市價單去放空。按照你的程式,委託價應該是37.45才對。實在找不出原因。

XS小編 發文於   2024/05/21

Hello expe,

 

小編建議您可以在進場前 print 出委託的價格 Rec_O*(1+0.01*p1) 確認。

若您的策略是逐筆洗價的話,可能是因為 Rec_O 沒有設定為 IntraBarPersist 所導致,因為

Once(GetInfo("IsRealTime")=1 and GetField("成交量", "Tick")<>0) begin

    Rec_O=GetField("開盤價", "D");

    Alert("Rec_O",Rec_O," s_in=",Rec_O*(1+0.01*p1),"數量",Floor(amount*10/Close)," 估_停損價=",Rec_O*(1+0.01*p1)*(1+0.01*LossP));

    end;

這段會讓腳本在進入即時洗價的時候執行一次,除非該次洗價剛好是當根Bar最後一次洗價,否則Rec_O會維持在0 (預設值),讓 Rec_O*(1+0.01*p1) 計算出來為0,

SetPosition 當委託價格超出漲跌停價格時,系統會保證價格不會超過漲跌停,也就是委託價0會被轉變為跌停價。

 

感謝 虎科大許教授 的熱心回覆。

  • 按讚來自於
  • UHJU0231
expe 發文於   2024/05/22

感謝小編管理員 幫忙解答,確實策略腳本是開逐筆洗價,並且把 Rec_O 變數設定為 IntraBarPersist 即可解決問題

發表回覆
Close