小幫手你好
我最近在測試當沖腳本,為了避免沒有出場訊號導致留倉,我在出場腳本寫了一段time>131500則出場的碼
但是實際跑策略,在其它出場條件沒有觸發的情況下,時間到都還是沒有觸發出場
小幫手你好
我最近在測試當沖腳本,為了避免沒有出場訊號導致留倉,我在出場腳本寫了一段time>131500則出場的碼
但是實際跑策略,在其它出場條件沒有觸發的情況下,時間到都還是沒有觸發出場
Hi 河馬,
您好,您可以使用 Print 語法驗證相關運算數值,
以利檢驗策略想法與撰寫程式碼是否有落差,
以上方向供您參考,謝謝。
若仍有疑問,請您提供策略雷達內容的屬性設定畫面(如下圖),
以利小幫手提供給您方向,謝謝。

小幫手你好
我的構想是三個退場是獨立運作的,只要其中一個成立即退場,
如果前二個退場無觸發的情況下,最晚應該在13:15分之後要出現退場訊號
但我的問題是Time>131500的退場沒有發生作用,Time應該是隨著時間改變的系統變數,除此之外並無需要驗證的變數
或者該用CurrentTime? (但是用CurrentTime似乎無法進行回測)
以下是策略雷達的畫面(出場用)

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;
小幫手你好
抱歉,是在移動停利的段落少了一個end。因為腳本中有很多被我標注//的段落,為了節省長度我有刪掉,不小心刪到了
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 也不會觸發,
以上方向供您參考,您可以在檢驗看看,謝謝。
小幫手你好
這個腳本我用回測跑一分鐘頻率,也是出現有持股超過一天再出場的現象,我以為是Time在回測中可能沒作用,所以用模擬帳號實測
這個腳本我測了幾星期,出場腳本監控的是庫存,庫存有股票卻留倉,所以才發文詢問,並不是byin的問題,有買進表示庫存股的byin=true,請小幫手可以將condition1拿掉再試試
而我想我的退場寫法,不論其它退場方式有幾項,有多少變數還在計算,應該都不會影響到最後一個的判斷才是。
為了留倉的問題,我還更改過不同的退場寫法,但都還是會有留倉的股票
還請小幫手再幫忙查看,謝謝
Hi 河馬,
謝謝提供相關資訊,
請問您XQ左上角系統版號為何?(例如:2.42)
待確定版號後,再繼續了解原因,謝謝。
有買進表示庫存股的byin=true
看起來您的進/出場腳本是分開寫的?如是的話,請您提供:
1. 進場腳本程式碼
2. 進場雷達設定(如 20181107 圖片範例)
以利小幫手分析一下原因,謝謝。
小幫手建議您可以使用 Print 語法,在實測的時候,將相關運算數值紀錄下來,
這樣若發生不如預期的狀況,就有紀錄可以回頭查看是否是策略想法與撰寫的程式碼有所落差?
以上方向供參考,謝謝。
小幫手你好
版號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變數是不是在回測中無效,所以改用實測的方式

以下是進場設定的畫面

請小幫手再協助確認,謝謝
Hi 河馬,
謝謝您提供詳細資訊,
小幫手想先從回測對照查看,故請您提供回測設定畫面,如下圖,以利小幫手查看問題的原因,謝謝。

小幫手你好
以下請參考

30 評論