關於自動交易,自訂變數的問題

  •   75 
  • 最後發表   Fibos  2025 十二月 12
Fibos 發文於   2025/12/08

我有一個 intraBarPersist 變數,在分K環境下運作,紀錄我進場的歷程。

當condition1=True時,變數值=1,並且進場做多。

當多單出現停損時,變數值=2。

當condition1=True再次出現時,變數值=3,並且再次進場做多,此時前面有過一次停損,所以第二次的停損範圍與第一次停損條件不同,因此需要與第一次不同的變數值來控制出場條件。

並且變數不能在換K的後歸零,要延續上根K棒的變數值。
請問要如何寫這段程式碼?

 

我寫的一段程式碼在condition1=True時 then begin 變數值=1; End;
換K後,變數值又歸零。
因此請教小幫手。

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/12/08

若變數用intrabarpersist宣告,則進場時讓它等於1,它會一直保留1,換K並不會變成0。若換K變成0,應該是宣告的寫法錯誤。若問題仍然發生,把宣告的陳述式貼上來看看。

  • 按讚來自於
  • PhoebusLin
Fibos 發文於   2025/12/08

謝謝許教授。

 

它好像在K棒內,由1變成0。

例如:

20251208 90000 ---> 0 // 型態shintai= 1 

20251208 90000 ---> 1 // 型態shintai= 0 

20251208 90000 ---> 1 // 型態shintai= 0 

20251208 90300 ---> 1 // 型態shintai= 0 

我的部分程式碼如下,註解於該程式碼上方//,

如有需要補充,麻煩再請您告知。

 

 

SetBarBack(2);

 

 

var:intraBarPersist shintai(0),intraBarPersist BuWei(0);

 

 

 

BuWei=Filled;

 

 

 

if date<>date[1] then

 

begin

 

shintai=0;

 

End;

 

 

//===================================================================================================================

 

 

 

//進場條件

 

condition1=Time>=090000 and Time<123000 and Filled=0 and 

   CloseD(1)=GetField("漲停價", "D")[1] and GetField("C", "tick")>C[1] ;

 

   

 

if shintai=0 and condition1 then 

 

begin

 

shintai=1;

 

SetPosition(1,Market);

 

End;

 

 

 

BuWei=Filled;

 

 

 

//===================================================================================================================

 

 

 

//出場

 

 

 

//漲跌停

 

if  Time<132400 and BuWei<>0 and 

 

{(} GetField("C", "Tick")>AddSpread(GetField("漲停價", "D"),-2) then 

 

begin

 

SetPosition(0, Market);

 

end;

 

 

//停利

 

if Time<132400 and shintai=1 and filled>0 and GetField("C", "tick")>=FilledAvgPrice*1.015 then

 

begin

 

SetPosition(0,Market);

 

end;

 

 

 

if Time<132400 and shintai=1 and filled>0 and GetField("C", "1")<FilledAvgPrice*0.98  then

 

begin

 

SetPosition(0,Market);

 

end;

 

BuWei=Filled;

 

 

 

 

//===================================================================================================================

 

Print(

 

NumToStr(date,0),NumToStr(time,0),"--->",

 

NumToStr(BuWei,0),

 

"// 型態shintai=",NumToStr(shintai,0)

 

);

 

//===================================================================================================================

附加文件

虎科大許教授 發文於   2025/12/08

Q: 它好像在K棒內,由1變成0。

A: 因為

if date<>date[1] then

begin

   shintai=0; 

End;

會在第一根K棒一直讓shintai變成0。

  • 按讚來自於
  • PhoebusLin
Fibos 發文於   2025/12/09

謝謝教授。

XS小編 發文於   2025/12/12

Hello Fibos,

 

小編補充,您可以使用 IsFirstCall 來判斷是否為當日第一次洗價。

發表回覆
Close