您好,我想測試一個當沖策略的勝率,讓程式出訊號留紀,,請看程式寫得對不對?或是哪裡要修改?

  •   1.6K 
  • 最後發表   neverdie62  2023 五月 23
neverdie62 發文於   2022/07/10

以第一根五分K棒的高點為參考點,觀察接下來的每根五分k棒,當五分k棒出現高點超過第一根五分k棒高點且成交量超過前一根五分k棒的時候進場,接下來只記錄超過前一根五分k棒成交量且創高的五分k棒高低點,持續創高續抱,若跌破最近一根創高的五分k棒低點則出場

If barfreq <> "Min" or Barinterval <>1 then RaiseRuntimeError("請設定頻率為1分鐘");

 

var:Count(0),BarNumberOfToday(0),i(1),entry1(0);

Array: ArrayH[54](0),ArrayL[54](0),ArrayV[54](0),NumArrayH[](0),NumArrayL[](0);

  Array_SetMaxIndex(NumArrayH, Count);

  Array_SetMaxIndex(NumArrayL, Count);

If Date <> Date[1] then begin 

  If Date <> Date[1] then BarNumberOfToday=1 else BarNumberOfToday+=1;//記錄今天的Bar數

   for i=1 to 54 begin

    If barnumberoftoday = 5*i+1  then begin 

    ArrayH[i]=Highest(High[1],5);//記錄每個五分k棒的最高值

    ArrayL[i]=Lowest(Low[1],5);//記錄每個五分k棒的最低值

    ArrayV[i]=v[1]+v[2]+v[3]+v[4]+v[5];//記錄每個五分k棒的總成交量

condition1=ArrayV[i]>ArrayV[i-1] and ArrayH[i]>ArrayH[1];//第一次開始出量且突破開盤五分k棒高點

    condition2=q_CurrentCapitalin100Million<50;//股本小於50億

    condition3=q_OutSize/(q_InSize+q_OutSize)>0.6;//外盤比>60%

     if condition1 and condition2 and condition3 and count=0 then 

     begin 

     Count = Count + 1;

     NumArrayH[Count] = ArrayH[i];

NumArrayL[Count] = ArrayL[i];

entry1=1;

     ret=1;

     retmsg="出量突破第一根五分k高點,進場";

end;

      if entry1=1 then 

  begin 

   if ArrayV[i]>ArrayV[i-1] and ArrayH[i]>NumArrayH[Count] then 

   begin 

   Count = Count + 1;

   NumArrayH[count] = ArrayH[i];

   NumArrayL[count] = ArrayL[i];

       if close < NumArrayL[Count] then retmsg="出場";//入場後作多的出場判斷 

   end;

      end;

     end;    

    end;

   end; 

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

Hello neverdie62,

 

由於您會有進場跟出場,小幫手會建議您使用交易腳本比較適合。

另外,您的腳本寫得太複雜了,小幫手會這樣寫:

If barfreq <> "Min" or Barinterval <> 5 then RaiseRuntimeError("請設定頻率為5分鐘");

 

if date <> date[1] then begin  //每日重置

    value1 = high;

    value2 = volume;

    value3 = low;

    end;

 

if high > value1 and volume > value2 then begin  //價格和成交量創新高

    value1 = high;

    value2 = volume;

    value3 = low;

    if position = 0 and filled = 0 then setposition(1, market);   //只有部位庫存為0時會進場

    print("價格和成交量創新高", date, time, value1, value2);

    end;

 

if close cross under value3 then begin  //跌破最近新高K棒的低點

    if position<> 0 and filled <> 0 then setposition(0, market);    //只有部位庫存不為0時會出場

    print("跌破最近新高K棒的低點", date, time);

    end;

 

您可以觀察print出來的資訊看是否有符合您的預想。

neverdie62 發文於   2022/07/24

回覆有困難,被擋,是字數問題嗎?

neverdie62 發文於   2022/07/24

我傳word試試看

neverdie62 發文於   2022/07/24

您誤會我意思了,價格以第一根五分k的突破為進場條件之一,但是我寫成陣列的原因是因為進場條件中的量是只要超過前一根五分K棒的成交量就會是判斷點,不是跟第一根五分k棒的成交量做比較!

neverdie62 發文於   2022/07/24

ArrayH[1]是第一根五分k的高點,ArrayL[1]是第一根五分k的低點,ArrayV[1]是第一根五分k的成交量,因為要觀察進出點,所以必須每個五分k棒的成交量要逐根比對, 進場邏輯是超過第一根五分k的高點做多,低於第一根五分k低點做空

neverdie62 發文於   2022/07/24

我舉二例:假設是第三根五分k棒價有創高,量也比第一根五分k棒多,就可以進場嗎?如果量比第二根少就不行!; 

又假設第五根五分k棒價有創高,量沒第一根五分k棒多,不可以進場嗎?只要量有比第四根高,就符合條件,要進場!

neverdie62 發文於   2022/07/24

以同時成立價格突破和量增是進場的條件,但量的比較是和前一根五分k棒的量比,不是和創高點的那個五分k棒比,所以小編您那樣的寫法,是要同時價量超過第一根k,老實說,一般股票要同時價量超過第一根五分k棒非常非常稀少,,因為一開盤的量通常最高,後面要出到比第一根五分k棒還多的量可能會非常非常少,且等到出現時可能也很晚不太適合當沖了...

neverdie62 發文於   2022/07/24

所以請小編注意我的進場是價格過第一根五分kArrayH[i]>ArrayH[1] and 量超過前一根五分kArrayV[i]>ArrayV[i-1], 注意只跟前一根比就好

 因為我不知道第幾根五分k棒會超過ArrayH[1]同時有出量,所以用迴圈每間隔五分鐘跑一次判斷,當一出現符合時才進場,同時開始將進場這根k棒的高低點計下來,

neverdie62 發文於   2022/07/24

因為一旦開始進場了,就開始count和entry1都等於1,建立NumArrayH[]NumArrayL[] 然後停止跑這一段程式:

  if condition1 and condition2 and condition3 and count=0 then

     begin

     Count = Count + 1;

     NumArrayH[Count] = ArrayH[i];

NumArrayL[Count] = ArrayL[i];

entry1=1;

ret=1;

     retmsg="出量突破第一根五分k高點,進場";

neverdie62 發文於   2022/07/24

用進場後的陣列NumArrayH[1] 記下進場五分k棒高點,NumArrayL[1]記下進場五分k棒低點,因為這跟續抱和出場有關係...

 因為進場後,要開始移動停利和判斷出場,所以進場後跑這段程式:

  if ArrayV[i]>ArrayV[i-1] and ArrayH[i]>NumArrayH[Count] then

  begin

   Count = Count + 1;

   NumArrayH[count] = ArrayH[i];

   NumArrayL[count] = ArrayL[i];

       if close < NumArrayL[Count] then retmsg="出場";//入場後作多的出場判斷

顯示更多回應 發表回覆
Close