
為什麼XQ用愈久,問題愈多? 都沒有人遇過? XQ收費是不是有該打折?
有些時候可能是程式的問題。我常常講,不要什麼錯都怪XQ。先試著從程式的邏輯去找問題。若需要協助,可貼到論壇來,我可以提供協助。
你在一開盤去抓資料,也許有些資料還沒有準備好而造成執行錯誤。先看看,你程式裡面抓的資料有沒有可能一開盤時還沒有提供。
你可以在可能出現問題的地方用print顯示訊息,這樣會比較容易發現問題出在哪個環節。
許教授護航,護的有點誇張,從來都是先檢討客戶,而不是檢討XQ。"在一開盤去抓資料,也許有些資料還沒有準備好而造成執行錯誤。",請問XQ的文件有說明幾時資料幾時會準備好? 使用者只能Try&Error? 我測試了許久,根據經驗值,要延後1秒等資料準備好,我有測試了,但是XQ的文件說明呢?
此外,這個問題應該是XQ的問題! 因為同時段XQ的看盤軟體也有問題,我在"XQ使用問題"那邊有貼出來,同時間也有人反映遇到一樣的問題! XQ應該要去找出問題,要使用者提供LOG,那絕對沒問題,而不是,我後來看沒問題,那就沒問題了! 相信許教授一定知道,很多bug是隨機發生的,不見得每次都會發生,那麼XQ該怎麼辦?
如果XQ是免費軟體,我不會去要求,但是XQ是付費軟體,那麼XQ就應該要有軟體商該有的態度與精神!
附上程式,請許教授debug
Input: TX_Symbol("FITXN*1.TF","對應商品代碼");
Input: Volume_Threshold(400,"大台放量口數門檻");
Input: VSize(1,"操作口數");
Input: Rate(1.9,"賺賠比");
var: TX_Vol(0);
var: intraBarPersist LongTriggerPrice(0), intraBarPersist ShortTriggerPrice(0);
var: intraBarPersist StopLossPrice1(0), intraBarPersist TakeProfitPrice1(0);
var: intraBarPersist StopLossPrice2(0), intraBarPersist TakeProfitPrice2(0);
var: intraBarPersist IsPendingLong(false), intraBarPersist IsPendingShort(false);
var: intrabarpersist bFirstTime(True);
var: intrabarpersist LastBarTime(0);
//if getInfo("isRealTime")=0 then return;
if ((time>132500 and time<134600) or (time>045000 and time<050100)) and filled=0 then begin
IsPendingLong=False;
IsPendingShort=False;
return; //13:25 or 04:50 後不操作
end;
if time>=134200 and time<134600 then begin
if Position<>0 then setposition(0,Market); // 13:42強制平倉
return;
end;
If time <> LastBarTime then begin
LastBarTime = time;
bFirstTime=True;
//Print(time);
end;
// 監控價格是否突破或跌破訊號K棒的高低點
If IsPendingLong and close>LongTriggerPrice and Filled<=0 then begin
SetPosition(VSize,Label:="突破黑K高點做多");
IsPendingLong = false; // 觸發後關閉等待狀態
end;
if IsPendingShort and close<ShortTriggerPrice and Filled>=0 then begin
SetPosition(-VSize,Label:="跌破紅K低點做空");
IsPendingShort = false; // 觸發後關閉等待狀態
end;
TX_Vol=GetSymbolField(TX_Symbol, "成交量");
value99=getField("時間","Tick");
Value1=Second(value99); //不可以用Time,因為Time沒有秒數
//if isFirstCall("Bar") then begin
if Value1>0 and bFirstTime then begin //不能用isFirstCall,因為資料還沒Ready
bFirstTime=False;
//TX_Vol=GetSymbolField(TX_Symbol, "成交量"); //不知為什麼,擺在這裡抓不到資料
Print(TX_Vol[1],High[1],Low[1]);
if TX_Vol[1]>Volume_Threshold then begin
//根據K棒顏色,設定突破/跌破的觸發條件
If close[1] < Open[1] then begin
// 1分K收黑:開啟「突破高點做多」訊號
IsPendingLong = true;
//IsPendingShort = false;
LongTriggerPrice = High[1];
StopLossPrice1 = Low[1];
TakeProfitPrice1 = High[1] + Rate * (High[1] - Low[1]);
Print("**多",LongTriggerPrice,StopLossPrice1,TakeProfitPrice1);
end
else if close[1] > Open[1] then begin
// 1分K收紅:開啟「跌破低點做空」訊號
IsPendingShort = true;
//IsPendingLong = false;
ShortTriggerPrice = Low[1];
StopLossPrice2 = High[1];
TakeProfitPrice2 = Low[1] - Rate * (High[1] - Low[1]);
Print("**空",ShortTriggerPrice,StopLossPrice2,TakeProfitPrice2);
end
else begin
// 如果是十字線(收開盤同價),則不啟動任何方向
IsPendingLong = false;
IsPendingShort = false;
end;
end;
end;
// 有多單部位時:監控是否碰觸停損或停利
If Filled>0 and Filled=Position then begin
If close <= StopLossPrice1 then begin
if Position<>0 then begin
SetPosition(0,Label:="多單停損出場");
IsPendingLong = false;
end;
end
else if close >= TakeProfitPrice1 then begin
if Position<>0 then begin
SetPosition(0,Label:="多單停利出場");
IsPendingLong = false;
end;
end;
end;
// 有空單部位時:監控是否碰觸停損或停利
If Filled<0 and Filled=Position then begin
If close >= StopLossPrice2 then begin
SetPosition(0,Label:="空單停損出場");
IsPendingShort = false;
end
else if close <= TakeProfitPrice2 then begin
SetPosition(0,Label:="空單停利出場");
IsPendingShort = false;
end;
end;
補充說明,這個問題不是每次都會發生,是偶而發生!
再來,錯誤訊息是"K線取得資料異常",然後程式停止。如果是資料沒有Ready,那只是抓錯資料,造成運算錯誤,而不會造成整個程式停止,許教授,您說是不是?
這裡請教許教授一個問題,GetSymbolField為什麼放在49行讀不到正確數值? 要移到43行才能讀到正確數值?
(1)造成執行錯誤的問題,看起來不是你的程式邏輯造成。由於不只一人反映夜盤的技術分析圖表有遺漏K棒的問題,我懷疑可能是因為XQ系統遺漏K棒造成此問題。
(2)GetSymbolField放在第43或第49行,差別的是第49行要符合value1大於0且bFirstTime為True才會被執行。Value1是Tick時間的秒數,若換K時正好秒數為0,儘管控制每根5分K第一次洗價的bFirstTime為True,一樣不會進去IF執行第49行的指令。
(2)GetSymbolField放在第43或第49行,差別的是第49行要符合value1大於0且bFirstTime為True才會被執行。Value1是Tick時間的秒數,若換K時正好秒數為0,儘管控制每根5分K第一次洗價的bFirstTime為True,一樣不會進去IF執行第49行的指令。
>因為要讓GetSymbolField能抓到正確的資料,所以要等1秒而不能用isFirstCall("Bar"),就如同我註解所寫。因為我只需要每5分鐘進去1次,所以想說放在49行的位置,才不需要每個tick都跑,節省算力,但是沒想到放在49行的位置卻無法每5分鐘抓到正確的值,要放在43行才能抓到正確的值,這我有點不解
(2)GetSymbolField放在第43或第49行,差別的是第49行要符合value1大於0且bFirstTime為True才會被執行。Value1是Tick時間的秒數,若換K時正好秒數為0,儘管控制每根5分K第一次洗價的bFirstTime為True,一樣不會進去IF執行第49行的指令。
>因為要讓GetSymbolField能抓到正確的資料,所以要等1秒而不能用isFirstCall("Bar"),就如同我註解所寫。因為我只需要每5分鐘進去1次,所以想說放在49行的位置,才不需要每個tick都跑,節省算力,但是沒想到放在49行的位置卻無法每5分鐘抓到正確的值,要放在43行才能抓到正確的值,這我有點不解
這裡再請許教授解惑
(1)你的腳本邏輯會在每根5分K第一個Tick的秒數大於0時顯示第49行的訊息,但當第一個Tick的秒數為0時,該Tick不會顯示49行數據,而是要等到後面的Tick的秒數大於0時才會顯示,且每根5分K只會顯示一次。
(2)既然要抓的是跨商品台指期的前一根5分K成交量,用大台的第一個Tick判斷,會比洗價商品的第一個Tick判斷來得好;至少不必延後一秒處理。
if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");
Input: TX_Symbol("FITXN*1.TF","對應商品代碼");
var: intraBarPersist myTime(0);
var: intraBarPersist hasPrinted(false);
var: TX_Vol(0);
myTime=GetSymbolField("FITXN*1.TF", "時間", "5");
if myTime<>myTime[1] then
begin
if hasPrinted=false then
begin
hasPrinted=true;
TX_Vol=GetSymbolField(TX_Symbol, "成交量", "5")[1];
Print(time,TX_Vol,High[1],Low[1]); //大台前5分鐘成交量、小台前1分鐘最高價與最低價
end;
end
else hasPrinted=false;
Hello 麥叔,
關於您在 9/3 發生的取得異常K線資料的部分,可能是由於該日的伺服器資料轉檔較慢所導致。
如果是此狀況的話可透過清除 cache 來解決。
若清除cache後還是有發生相同狀況的話,麻煩提供XQ Log 讓相關人員確認。
您可以透過XQ內的設定 => 問題回報的方式來上傳提供,並附上討論區問題連結。
若需要附上的檔案數量或大小超過了問題回報可附上的範圍,則可以將相關檔案放置在雲端空間開放權限後提供連結。
感謝。
許教授,我測試您的程式,其中改了頻率部分,發現TX_Vol還是不正確。如果TX_Vol=GetSymbolField(TX_Symbol, "成交量");這行移到第七行,這樣TX_Vol才能有正確的值。請問為什麼?
myTime=GetSymbolField("FITXN*1.TF", "時間", "1");
17 評論