關於特定時間出場問題

  •   74 
  • 最後發表   河馬  16 小時前
河馬 發文於   2018/11/07

小幫手你好

我最近在測試當沖腳本,為了避免沒有出場訊號導致留倉,我在出場腳本寫了一段time>131500則出場的碼

但是實際跑策略,在其它出場條件沒有觸發的情況下,時間到都還是沒有觸發出場

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

Hi 河馬,

您好,您可以使用 Print 語法驗證相關運算數值,

以利檢驗策略想法與撰寫程式碼是否有落差,

以上方向供您參考,謝謝。


若仍有疑問,請您提供策略雷達內容的屬性設定畫面(如下圖),

以利小幫手提供給您方向,謝謝。

河馬 發文於   2018/11/07

小幫手你好

我的構想是三個退場是獨立運作的,只要其中一個成立即退場, 

如果前二個退場無觸發的情況下,最晚應該在13:15分之後要出現退場訊號

但我的問題是Time>131500的退場沒有發生作用,Time應該是隨著時間改變的系統變數,除此之外並無需要驗證的變數

或者該用CurrentTime? (但是用CurrentTime似乎無法進行回測)

 

 

以下是策略雷達的畫面(出場用)

XQ小幫手 發文於   2018/11/08

Hi 河馬,

謝謝提供相關資訊,小幫手這邊使用您的程式碼發現編譯無法成功,請您再確認一下您提供的程式碼是否有部分遺漏?

小幫手有試著改為如下就會編譯成功,不過您應該是沒有提供完整程式碼,請您再確認一下,謝謝。

//找了系統中的"開盤5分鐘三創新高"策略做為當沖基本策略進行修改測試,系統策略如下
//1.開高。
//2.五日均量大於1000張
//3.中小型股
//4.一分鐘線,開盤後扣除第一根之外的五根裡,至少有三根高點比前一根的高點高,而且收盤比前一根的收盤高
//5.前三天的漲幅不大
//6.這五根一分鐘線的成交量達到五日均量的一定比例
//7.大盤屬於多頭格局

input: volumeRatio(0.1, "分鐘量暴量比例");
input: changeRatio(3, "最近3日最大上漲幅度");
input: averageVolume(3000, "5日均量");

variable:KBarOfDay(0), BreakHigh(false), bycount(0);

KBarOfDay+=1;
if date<>date[1] then begin
 KBarOfDay=1;
 BreakHigh = false;
 bycount=0; //利用此變數控制每支個股一天只沖一次
end;

condition1 = KBarOfDay = 6;
//一分鐘線每天的第六根
condition2 = Countif(High > High[1] and Close > Close[1] ,5) >=3;
//近五根裡至少三根最高價比前一根高且收盤比前一根高

if KBarOfDay = 1
and close > getfield("close", "d")[1] then BreakHigh = true;
//開高
value1 = average(GetField("Volume", "D")[1], 5);
//五日均量
condition3 = value1 > averageVolume;
//五日均量大於某張數
value2 = rateofchange(GetField("Close", "D")[1], 3);
condition4 = AbsValue(value2) < changeRatio;
//前三日漲幅小於一定標準
condition5 = summation(volume, 5) > value1 * volumeRatio;
//前五根一分鐘線成交量的合計大於五日均量某個比例
//GetSymbolField("TSE.TW","收盤價","D")>average(GetSymbolField("TSE.TW","收盤價","D"),10);
//大盤屬於多頭結構
settotalbar(300);
condition10=average(volume,5)>average(volume,25);
//5分均量大於25分均量
condition11=average(close,5)>average(close,25) and linearregslope(average(close,5),5)>0 and linearregslope(average(close,25),5)>0;
//5分均線須在25分均線上
condition12=average(getfield("close","5"),5)>average(getfield("close","5"),25) and linearregslope(average(getfield("close","5"),5),5)>0 and linearregslope(average(getfield("close","5"),25),5)>0;
//5五分均線須在25五分均線上

//進場
variable:byin(false),byprice(0);
if time<130000 and byin=false and bycount=0 and condition1 and condition2 and condition3
//and Condition4 and Condition5 and BreakHigh and condition6
and condition10 and condition11 and condition12 then
  begin
  byin=true;
  byprice=close;
  bycount=1;
  end;

//退場
//移動停損
condition13=Countif(High[1] < byprice,3) =3 and close < lowest(low[1],3);

if byin=true and condition13 then
  begin
  byin=false;
  ret=1;
  end;

//移動停利
if byin=true and lowest(low[1],6)>byprice then
  begin 
  if close<lowest(low[1],3) then //跌破近3根低點退場
    begin
    byin=false;
    ret=1;
  end;


//固定退場,時間到13:15時,不論賺賠必須退場,不留至隔天
if byin=true and time>131500 then
  begin
  byin=false;
  ret=1;
  end;
end;

 

河馬 發文於   2018/11/08

小幫手你好

抱歉,是在移動停利的段落少了一個end。因為腳本中有很多被我標注//的段落,為了節省長度我有刪掉,不小心刪到了

XQ小幫手 發文於   2018/11/09

Hi 河馬,

謝謝您提供詳細資訊,

小幫手使用以下 Print 語法查看

print(date,time,byin,condition1,condition2,condition3,condition10,condition11,condition12,KBarOfDay);

發現 byin 都是 False,您的 byin 為 true 的狀況是【所有的condition都要為 true】

但是小幫手發現您的 condition1 很難為 true,一天只有一次為true,且要在僅有的這次條件全部都要達成,條件太過嚴苛,

故 byin 為 False,所以即使 time>131500 也不會觸發,

 

以上方向供您參考,您可以在檢驗看看,謝謝。

河馬 發文於   2018/11/09

小幫手你好

這個腳本我用回測跑一分鐘頻率,也是出現有持股超過一天再出場的現象,我以為是Time在回測中可能沒作用,所以用模擬帳號實測

這個腳本我測了幾星期,出場腳本監控的是庫存,庫存有股票卻留倉,所以才發文詢問,並不是byin的問題,有買進表示庫存股的byin=true,請小幫手可以將condition1拿掉再試試

而我想我的退場寫法,不論其它退場方式有幾項,有多少變數還在計算,應該都不會影響到最後一個的判斷才是。

為了留倉的問題,我還更改過不同的退場寫法,但都還是會有留倉的股票

還請小幫手再幫忙查看,謝謝

XQ小幫手 發文於   2018/11/12

Hi 河馬,

謝謝提供相關資訊,

請問您XQ左上角系統版號為何?(例如:2.42)

待確定版號後,再繼續了解原因,謝謝。


有買進表示庫存股的byin=true

看起來您的進/出場腳本是分開寫的?如是的話,請您提供:

1. 進場腳本程式碼

2. 進場雷達設定(如 20181107 圖片範例)

以利小幫手分析一下原因,謝謝。


 

小幫手建議您可以使用 Print 語法,在實測的時候,將相關運算數值紀錄下來,

這樣若發生不如預期的狀況,就有紀錄可以回頭查看是否是策略想法與撰寫的程式碼有所落差?

以上方向供參考,謝謝。

河馬 發文於   2018/11/12

小幫手你好

版號2.42

1.進出場腳本是共用的,差別在ret=1指令的位置不同。

 由於小幫手有說condition1難以成立,因此我提供一個修改過的版本,請小幫手以此版本測試

 

以下是進場腳本

//找了系統中的"開盤5分鐘三創新高"策略做為當沖基本策略進行修改測試,系統策略如下
//1.開高。
//2.五日均量大於1000張
//3.中小型股
//4.一分鐘線,開盤後扣除第一根之外的五根裡,至少有三根高點比前一根的高點高,而且收盤比前一根的收盤高
//5.前三天的漲幅不大
//6.這五根一分鐘線的成交量達到五日均量的一定比例
//7.大盤屬於多頭格局

input: volumeRatio(0.1, "分鐘量暴量比例");
input: changeRatio(3, "最近3日最大上漲幅度");
input: averageVolume(3000, "5日均量");

variable:KBarOfDay(0), BreakHigh(false), bycount(0);

KBarOfDay+=1;
if date<>date[1] then begin
 KBarOfDay=1;
 BreakHigh = false;
 bycount=0; //利用此變數控制每支個股一天只沖一次
end;

condition1 = KBarOfDay >= 6;
//一分鐘線每天的第六根
condition2 = Countif(High > High[1] and Close > Close[1] ,5) >=3;
//近五根裡至少三根最高價比前一根高且收盤比前一根高

if KBarOfDay = 1
and close > getfield("close", "d")[1] then BreakHigh = true;
//開高
value1 = average(GetField("Volume", "D")[1], 5);
//五日均量
condition3 = value1 > averageVolume;
//五日均量大於某張數
value2 = rateofchange(GetField("Close", "D")[1], 3);

settotalbar(300);

//進場
variable:byin(false),byprice(0);
if time<130000 and byin=false and bycount=0 and condition1 and condition2 and condition3
then
  begin
  byin=true;
  ret=1;
  byprice=close;
  bycount=1;
  end;

//退場
//移動停利
if byin=true and lowest(low[1],6)>byprice then
  begin
  if close<lowest(low[1],3) then //跌破近3根低點退場
    begin
    byin=false;
    end;
  end;

//固定退場,時間到13:15時,不論賺賠必須退場,不留至隔天
if byin=true and time>131500 then
  begin
  byin=false;
  end;

以下是退場腳本

//找了系統中的"開盤5分鐘三創新高"策略做為當沖基本策略進行修改測試,系統策略如下
//1.開高。
//2.五日均量大於1000張
//3.中小型股
//4.一分鐘線,開盤後扣除第一根之外的五根裡,至少有三根高點比前一根的高點高,而且收盤比前一根的收盤高
//5.前三天的漲幅不大
//6.這五根一分鐘線的成交量達到五日均量的一定比例
//7.大盤屬於多頭格局

input: volumeRatio(0.1, "分鐘量暴量比例");
input: changeRatio(3, "最近3日最大上漲幅度");
input: averageVolume(3000, "5日均量");

variable:KBarOfDay(0), BreakHigh(false), bycount(0);

KBarOfDay+=1;
if date<>date[1] then begin
 KBarOfDay=1;
 BreakHigh = false;
 bycount=0; //利用此變數控制每支個股一天只沖一次
end;

condition1 = KBarOfDay >= 6;
//一分鐘線每天的第六根
condition2 = Countif(High > High[1] and Close > Close[1] ,5) >=3;
//近五根裡至少三根最高價比前一根高且收盤比前一根高

if KBarOfDay = 1
and close > getfield("close", "d")[1] then BreakHigh = true;
//開高
value1 = average(GetField("Volume", "D")[1], 5);
//五日均量
condition3 = value1 > averageVolume;
//五日均量大於某張數
value2 = rateofchange(GetField("Close", "D")[1], 3);

settotalbar(300);

//進場
variable:byin(false),byprice(0);
if time<130000 and byin=false and bycount=0 and condition1 and condition2 and condition3
then
  begin
  byin=true;
  byprice=close;
  bycount=1;
  end;

//退場
//移動停利
if byin=true and lowest(low[1],6)>byprice then
  begin
  if close<lowest(low[1],3) then //跌破近3根低點退場
    begin
    byin=false;
    ret=1;
    end;
  end;

//固定退場,時間到13:15時,不論賺賠必須退場,不留至隔天
if byin=true and time>131500 then
  begin
  byin=false;
  ret=1;
  end;

以此腳本進行回測的話,在以下的圖片中可看到是有超過一天的出場,而且出場時間也不是我所設的13:15

由於基本上有進場代表byin=true,因此在最後一個退場byin=true and time=131500的判斷式中,應該時間一到就要ret=1出場

所以我在之前的回文中有說到time變數是不是在回測中無效,所以改用實測的方式

以下是進場設定的畫面

請小幫手再協助確認,謝謝

XQ小幫手 發文於   2018/11/13

Hi 河馬,

謝謝您提供詳細資訊,

小幫手想先從回測對照查看,故請您提供回測設定畫面,如下圖,以利小幫手查看問題的原因,謝謝。

河馬 發文於   2018/11/13

小幫手你好

以下請參考

Show More Posts 發表回覆
Close