盤中警示,如何設定A商品(股期標的),下B商品(股票期貨)

  •   764 
  • 最後發表   alpa  2023 七月 28
alpa 發文於   2021/01/29

盤中警示,如何設定A商品(股期標的),下B商品(股票期貨)

排序方式: 標準 | 最新
XQ小幫手 發文於   2021/02/01

alpa 您好

您可以在腳本中以 getsymbolfield的方式抓取指定股票的數值

像是GetSymbolField("2330.TW","收盤價","D")

請參考該函式的介紹

https://xshelp.xq.com.tw/XSHelp/?HelpName=GetSymbolField&group=FIELDFUNC

這部分就是設定商品A

-------------

而撰寫完成後,您只要在雷達上選擇"股期" 就是指定商品B下單了

 

alpa 發文於   2022/09/14

所以,XQ目前無法針對所有股期商品,做盤中策略雷達下單,只能針對單一股期商品?

alpa 發文於   2022/09/14

XQ大大您好:小弟有一程式(盤中策略雷達),以5分鐘頻率執行,程式中有跨頻率60分鐘;但是一直都沒有觸發商品,不知道程式哪裡有錯?可否麻煩指正,謝謝! 程式如下:

variable:rsv_60(0),kk_60(0),dd_60(0),jj_60(0); //60分KD

value1 = xfMin_XAverage("60",GetField("Close","60"),30); //計算60分鐘線30ma

value2 = xfMin_XAverage("60",GetField("Close","60"),60); //計算60分鐘線60ma

value3 = xfMin_XAverage("60",GetField("Volume","60"),5); //計算60分鐘線5mv

value4 = xfMin_GetValue("60",volume,1); //計算60分鐘線Volume

xfMin_Stochastic("60",9,3,3,rsv_60,kk_60,dd_60);

condition1= xfMin_CrossOver("60",kk_60,dd_60);

value5 = xfMin_GetValue("60",kk_60,1) ;

value6 = xfMin_GetValue("60",dd_60,1) ;

condition2= value5 <= 50 ;

condition3= value6 <= 50 ;

 

input: x(7)  ; //漲幅 %

input: y(50)  ; //量增率 %

input: length(5);

 

variable:vi(0);

vi= q_EstimatedTotalVolume; //q_EstimatedTotalVolume 為內建預估量

 

input:Leng1(5),Leng2(10),Leng3(30),Leng4(60);

variable: ma5(0), ma10(0),ma30(0), ma60(0);

variable:volume5(0) ;

ma5 = average(close, Leng1);

ma10 = average(close, Leng2);

ma30 = average(close, Leng3);

ma60 = average(close, Leng4);

volume5=average(volume, 5);

 

input: Length1(9), RSVt(3), Kt(3);

variable: rsv(0), k(0), _d(0);

Stochastic(Length1, RSVt, Kt, rsv, k, _d);

 

if  vi >600 and  q_Last <= q_RefPrice *(1 + x/100) and k cross Above _d  and k <= 50 and _d <= 50 

 and condition1  and condition2 and condition3 and value4 >= value3*3

then 

 

ret=1;

XQ小幫手 發文於   2022/09/21

Hello alpa,

 

您可以在腳本中使用print計算相關數據來確認運算情況。

舉例來說:

print(date, time, vi >600,  q_Last <= q_RefPrice *(1 + x/100), k cross Above _d, k <= 50, _d <= 50, condition1, condition2, condition3, value4 >= value3*3);

您的 value4 >= value3*3 條件感覺有點奇怪,如果要取60分鐘成交量的話,應該是使用getfield("volume", "60")才對。

value4 = xfMin_GetValue("60",volume,1); 取到的會是上根60分鐘頻率時最後一根5分鐘的成交量。

所以 value4 >= value3*3 會是5分鐘成交量與60分鐘成交量的指數平均乘以3比較,應該很難達成。

 

另外您在計算時資料讀取筆數可能不夠。

xfMin_XAverage 計算的不是移動平均(ma),是指數移動平均(ema)。

指數移動平均需要大約4倍的前期值才能得出正確結果,由於您是5分鐘頻率跨60分鐘頻率,小幫手會建議您設定 settotalBar((60+1) * 4 *12); 才夠。

同理KD的也是如此,需要的筆數可以參考選股腳本,您的狀況應該會是 (9 * 3 * 12),比指數平均所需的筆數還要少,所以不用另外設定。

 

  • 按讚來自於
  • Pingzz0719
alpa 發文於   2022/11/01

謝謝!

alpa 發文於   2022/11/01

XQ大大您好:小弟有一程式(盤中策略雷達),以5分鐘頻率執行,成交價高於條件K棒之最高價,觸發

但觸發價不是想要的價位,不知程式哪裡有錯?可否麻煩指正,謝謝! 程式如下:
  condition1=false;
input: x(5)  ; //漲幅 %
input: y(50)  ; //量增率 %
input: length(5);
variable:vi(0);
variable:  xHigh1(0) ;
vi= qEstimatedTotalVolume; //qEstimatedTotalVolume 為內建預估量

if  close[1] > qRefPrice *(1 + x/100) and  close[1] >500  then return;
 
if   vi > q
PreTotalVolume * 2  
 
and close[1] >= 5 and close[1] >= qRefPrice *1.025 and volume[1] >30 and volume[1] > highest(volume[2],162) 
 and close[1] <= q
RefPrice (1 + x/100) and average(GetField("Volume","D"),5)>100
and vi > highest(GetField("Volume","D")[1],length)
(1+y/100)  and    xHigh1  = high then  
condition1=true ;

//=================
value1=barslast(condition1) ;

if value1 <> currentbar and  vi > 2000 
and qLast >= qRefPrice *1.025 and qLast <= qRefPrice *(1 + x/100)  and   q_Last   >    xHigh1

then ret=1;   

XQ小幫手 發文於   2022/11/03

 Hello alpa,

 

小幫手不知道您想要的觸發價位是什麼,觸發條件是什麼,所以很難找出腳本錯誤的原因。

建議您可以使用 print 函數將條件相關數值印出,確認運算是否有如您所想一樣的運作。

如果還是有問題,麻煩您提供 策略雷達匯出檔勾選(包含)警示腳本,並詳細描述遇到的問題情況和需求條件,讓小幫手確認。

您可以直接將檔案上傳,也可以Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小幫手才能盡早處理)。

感謝。

 

alpa 發文於   2022/11/16

XQ大大您好:小弟有一程式(盤中策略雷達),以5分鐘頻率執行,符合條件K棒之最高價( value1 ) ,之後,任一K棒之成交價,高於 value1  觸發:但發現觸發價不是我想要的價位,不知程式哪裡有錯?可否麻煩指正,謝謝! 程式如下:

settotalBar(200);
input: x(5)  ; //漲幅 %
input: y(50)  ; //量增率 %
input: length(5);
variable:vi(0);
vi= q_EstimatedTotalVolume;  //q_EstimatedTotalVolume 為內建預估量

if  close[1] > q_RefPrice *(1 + x/100) and  close[1] >500  then return;

condition1 = vi > qPreTotalVolume *2  
and close[1] >= 5 and close[1] >= q
RefPrice 1.025 and volume[1] >30 and volume[1] > highest(volume[2],162)    // 往前推3日(5分K棒,共162根K棒)
and close[1] <= q_RefPrice *(1 + x/100) and average(GetField("Volume","D"),5)>100
and vi > highest(GetField("Volume","D")[1],length)
(1+y/100)   ;
if condition1    
then begin
value1 = high ; //紀錄符合條件K棒之最高價
end ;
value2=barslast(condition1) ;
if value2 <> currentbar and  vi > 2000 
and qLast >= qRefPrice *1.025 and qLast <= qRefPrice *(1 + x/100) and  qLast > value1 and qLast = q_DailyHigh
then ret=1;  

 

 

XQ小幫手 發文於   2022/11/17

Hello alpa,

 

您可以將條件中使用的數值和 value1 print出來檢查看是否有如同您想像中的運作。

小幫手推測可能是因為您使用逐筆洗價,所以value1和value2不會保存在K棒中符合條件時的數值。

您可以將所使用的變數宣告為 intrabarpersist,這樣就可以在同根Bar洗價的時候保留符合條件時的數值。

 

另外需注意, highest/lowest 在計算跨頻率的時候有可能會出錯,所以小幫手會建議您遇到這樣的情況改使用 simplehighest / simplelowest。

不過您這邊的使用的方式應該不會計算錯誤。

還有可以將報價欄位改為資料欄位 (ex. q_EstimatedTotalVolume 改為 GetField("估計量")),這樣就可以在回測上作測試。

如果還是有問題,麻煩告知您覺得有問題的日期時間商品和應該有的數值,讓小幫手確認是資料有誤還是腳本撰寫的方式有問題。

感謝。

XQ小幫手 發文於   2022/12/26

Hello alpa,

 

您可以用變數來記錄當天經過幾根Bar,接著在取用 highest 的時候套入該數值。

舉例來說:

if issessionfirstbar then value1 = 1 else value1 +=1;

 

highest(volume[value1], 162) 就會是不包含當日的162根5分鐘Bar。

顯示更多回應 發表回覆
Close