月上漲機率高語法改變成季上漲機率高語法

  •   209 
  • 最後發表   師哥  2024 六月 27
師哥 發文於   2024/06/20

想請問如果下列語法是在看過去十年來當月上漲大於1%的次數多寡有哪些個股。那如果現在我想把下列的語法更改為"當季"有哪些個股上漲>1%,m1[x]=(close[12*x-1]-close[12*x])/close[12*x]  這個語法不知道怎麼做更動才能變為當季呢?

先謝謝了

array:m1[10](0);

variable:x(0),count(0);

for x=1 to 10

begin

m1[x]=(close[12*x-1]-close[12*x])/close[12*x];

end;

count=0;

for x=1 to 10

begin

if m1[x]>0.01

then count=count+1;

end;

if count>=1 and close>5 

and average(volume,20)>10000

then ret=1;

outputfield(1,count,0,"符合的次數");

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/06/20

大部份情況下,XS的程式不需要跑迴圈。跑迴圈的處理是很沒效率的做法。以下的程式選出過去10年,至少有5季漲幅超過1%,且列出超過1%有幾季。若希望知道當月漲超過1%,只需要將程式第二行的Q改成M,第三行的4改成12即可。

input: myYear(10,"分析年度");

setBarFreq("Q");

settotalBar(4*myYear+1);

input: percent(1,"上漲趴數");

input: BenchCount(5,"達標次數(以上)");

var: count(0);

var: MQStr("");

 

MQStr=RightStr(formatMQY(currentDate),2);

if currentBar>1 and MQStr=RightStr(formatMQY(date),2) then

begin

if rateOfChange(c,1)>percent then count=count+1;

if isLastBar then

begin

if count>=BenchCount and close>5 

and average(volume,20)>10000

then ret=1;

outputfield(1,count,0,"符合的次數");

end;

end;

師哥 發文於   2024/06/20

謝謝許教授,

請問如果我想要找第三季季漲的個股,是否需要等選股中心的日期跑至六月的最後一個交易日(6/28)再做選股的動作呢? 

因為以往我選月漲的策略時,都需要等到月底才能作執行下一個月漲的動作。比如: 六月的就要到5/31收盤後再去選

虎科大許教授 發文於   2024/06/20

若第二季還沒結束,c 代表當季最新的成交價,而非當季收盤價。用它來判斷是否漲超過1%,當然與6/30的收盤價計算的漲幅不同。你可以等6月底再執行選股,這樣會比較貼近你的需求。

師哥 發文於   2024/06/20

謝謝許教授回復,

我把您的語法更改為月漲機率高的,想請問如果要跑6月漲機率高的,您的語法是不是要等6月開始後才能執行呢? 因為我用您的語法與我的比較,設5/31一起跑跑6月月漲機率高的,但是兩者結果差距甚多。

 

虎科大許教授 發文於   2024/06/20

因為你的條件是當月份在過去10年的漲幅超過1%,因此要跑6月漲機率高的,6月份任何一天跑都可以,只是6月的漲跌幅會用最新的成交價,例如今天跑,會用今天的收盤價代表6月的收盤價以計算6月份的漲跌幅。你可挑其中一檔股票,計算漲幅是否符合超過1%的條件。

虎科大許教授 發文於   2024/06/20

我估計你要的並非「當月上漲機率高的選股策略」,而是「特定月份上漲機率高的選股策略」,這樣的話,比較有彈性,可以在六月份的現在就算出過去10年七月份上漲的次數;為了避免使用者輸入錯誤的參數,月份參數我用下拉式選單讓使用者選取,預設是七月份。程式碼如下:

input: MQStr("07", "分析月份", InputKind:=dict(

["一月", "01"], ["二月", "02"], ["三月", "03"], ["四月", "04"], 

["五月", "05"], ["六月", "06"], ["七月", "07"], ["八月", "08"], 

["九月", "09"], ["十月", "10"], ["十一月", "11"], ["十二月", "12"]));

input: myYear(10,"分析年度");

setBarFreq("M");

settotalBar(12*myYear+1);

input: percent(1,"上漲趴數");

input: BenchCount(5,"達標次數(以上)");

var: count(0);

if currentBar>1 and RightStr(formatMQY(date),2)=MQStr then

if rateOfChange(c,1)>percent then count=count+1;

if isLastBar then

begin

if count>=BenchCount and close>5 

and average(volume,20)>10000

then ret=1;

outputfield(1,count,0,MQStr+"月份符合的次數");

end;

 

  • 按讚來自於
  • sky911191
師哥 發文於   2024/06/21

挖,太謝謝許教授了,一下子就解決了我的問題。

Aaron168 發文於   2024/06/24

不好意思,請問許教授,如果要 outputfield 個股這10年指定月份的漲幅要怎麼寫呢 

 

 

是要用來迴圈指定MQStr 儲存1-10年的漲跌幅嗎,chatgpt改出來後,執行跑不出來不知道從何下手

虎科大許教授 發文於   2024/06/24

outputField第一個參數必須是數值型態的常數,不能是變數,若你要跑迴圈,勢必要用變數,這樣是不行的。你只能一個一個outputField處理。以下會把今年漲跌幅超過1%的股票選出來,並顯示今年及去年的漲跌幅。

 

setBarFreq("Y");

value1=GetField("漲跌幅", "Y");

if value1>1 then ret=1;

outputField1(value1,"今年漲跌幅");

outputField2(value1[1],"去年漲跌幅");

Aaron168 發文於   2024/06/25

教授您好不好意思,我是想問有辦法讓您上面這段程式(input: MQStr("07", "分析月份")

假設程式碼指定的過去10年7月份上漲趴數達陣被篩選出來外

在後面並顯現出,指定月份1-10年漲跌幅,例如過去第1年7月份的漲幅、過去第2年7月份的漲幅、~過去第10年7月份的漲幅 ,謝謝您

 

顯示更多回應 發表回覆
Close