XQ 複合指標程式

  •   273 
  • 最後發表   LeonHuang  2024 四月 23
LeonHuang 發文於   2024/03/27

hi 小幫手,

您好,我想寫一程式計算

1. 3日平均成交量及18日平均成交量斜率大於0(表示成交量上升)

2. 3日平均成交量 > 18日平均成交量

3. MACD DIF6-12 >0 且連續3日OSC增加

4. MACD DIF19-39 >0 且連續3日OSC增加

請問該如何寫?感謝!!

排序方式: 標準 | 最新
LeonHuang 發文於   2024/04/01

以下是我試著撰寫的程式,但選出來的很多怪怪的,也有幾天後看有達到條件,但當天卻沒選到,能幫忙校正程式bug嗎?

感謝!!

//MACD INPUT 條件

input: FastLength(6), SlowLength(12), MACDLength(9);

input: LongFastLength(19), LongSlowLength(39);

//MACD

variable: difValue(0), macdValue(0), oscValue(0);

variable: LongdifValue(0), LongmacdValue(0), LongoscValue(0);

variable: DIFValue_w(0), MACDValue_w(0), OSCValue_w(0);

 

SetInputName(1, "DIF短期期數");

SetInputName(2, "DIF長期期數");

SetInputName(3, "MACD期數");

SetInputName(4, "長線DIF短期期數");

SetInputName(5, "長線DIF長期期數");

 

MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue);

MACD(weightedclose(), LongFastLength, LongSlowLength, MACDLength, LongdifValue, LongmacdValue, LongoscValue);

 

//日均量

value301 = Average(Volume, 3);

value302 = Average(Volume, 18);

 

value303 = LinearRegSlope(Volume,3); 

value304 = LinearRegSlope(Volume,18);

 

condition1 = (LongdifValue[3] crosses over LongmacdValue[3]) or (LongdifValue[2] crosses over LongmacdValue[2]) or (LongdifValue[1] crosses over LongmacdValue[1]) or (LongdifValue crosses over LongmacdValue);

condition2 = (DIFValue_w[3] crosses over MACDValue_w[3]) or (DIFValue_w[2] crosses over MACDValue_w[2]) or (DIFValue_w[1] crosses over MACDValue_w[1]) or (DIFValue_w crosses over MACDValue_w);

condition3 = value303>0 and value304>0;

condition4 = value301 >= value302;

 

ret = condition1 and condition2 and condition3 and condition4;

虎科大許教授 發文於   2024/04/15

你應該先outputfield選出來的股票的技術指標數值,然後你會發現,其實技術指標數值是錯誤的,與技術分析圖表的指標數值不同。

XQ小幫手 發文於   2024/04/23

Hello, LeonHuang.

很抱歉小幫手花了點時間才知道你的K線是週K線,下次要麻煩您了,

再來您的程式,看起來是要跑選股,所以MACD這類需要前值做計算的指標,需要設定資料長度(SetTotalBar),

https://www.xq.com.tw/lesson/xspractice/%E8%B3%87%E6%96%99%E8%AE%80%E5%8F%96%E7%AF%84%E5%9C%8D%E8%88%87%E8%85%B3%E6%9C%AC%E5%9F%B7%E8%A1%8C%E7%9A%84%E9%97%9C%E4%BF%82/

 

所以小幫手根據您的描述,將您的選股程式修改如下:

//MACD INPUT 條件
input: FastLength(6), SlowLength(12), MACDLength(9);
input: LongFastLength(19), LongSlowLength(39);
//MACD
variable: difValue(0), macdValue(0), oscValue(0);
variable: LongdifValue(0), LongmacdValue(0), LongoscValue(0);
variable: DIFValue_w(0), MACDValue_w(0), OSCValue_w(0);

SetInputName(1, "DIF短期期數");
SetInputName(2, "DIF長期期數");
SetInputName(3, "MACD期數");
SetInputName(4, "長線DIF短期期數");
SetInputName(5, "長線DIF長期期數");

SetTotalBar((maxlist(FastLength,SlowLength,6,LongFastLength,LongSlowLength) + MACDLength) * 4);

MACD(weightedclose(), FastLength, SlowLength, MACDLength, difValue, macdValue, oscValue);
MACD(weightedclose(), LongFastLength, LongSlowLength, MACDLength, LongdifValue, LongmacdValue, LongoscValue);

//日均量
value301 = Average(Volume, 3);
value302 = Average(Volume, 18);

value303 = LinearRegSlope(Volume,3); 
value304 = LinearRegSlope(Volume,18);

if 
    value303 > 0 and value304 > 0 // 1. 3日平均成交量及18日平均成交量斜率大於0(表示成交量上升)
    and value301 >= value302     // 2. 3日平均成交量 > 18日平均成交量
    and difValue > 0                 // 3. MACD DIF6-12 >0
    and TrueAll(oscValue > oscValue[1], 3)   // 且連續3日OSC增加
    and LongdifValue > 0         // 4.MACD DIF19-39 >0 且連續3日OSC增加
    and TrueAll(LongoscValue > LongoscValue[1], 3)   // 且連續3日OSC增加
then
    ret = 1;

選股頻率要設定週,回溯至該週的週五,

2467有出現在選股結果,

謝謝。

發表回覆
Close