macd -0軸下金叉

  •   472 
  • 最後發表   東尼  2023 七月 25
東尼 發文於   2023/07/11

工程師您好:

之前於2月時 曾問過工程師一個指令碼的寫法,當時問題時是要寫"macd二次金叉":

條件1:第一次(較遠期)是在d i f<0 的時候macd金叉(osc>0),

條件2:第二次(近期/當日 )就是也就是在dif>0的時候macd金叉(osc>0)  

 下列程式是您當時指導的程式碼  (連結  macd 0軸下金叉 - XQ全球贏家官方論壇)

if difValue Crosses Above macdValue then begin    //黃金交叉十

    if value1 = 1 and difValue > 0 then ret = 1;    //前一次交叉在0以下,這一次在0之上

    if difValue < 0 then value1 = 1 else value1 = -1;     //更新value1數值,0以下的話為1,不然就是-1

    end;

如今想將程式碼略做修正 欲將條件2 (條件1不變)調整如下:  

條件1:第一次(較遠期)是在也就是d i f<0 的時候macd金叉(osc>0),

條件2:第二次(近期/當日 )就是 是在  dif >0的時候   macd死叉(osc<0)  但 k>d (畫底線為要變動部分)

 提問人已將程式碼修改如下

 if  k>_d and difValue < macdValue then begin    // k>_d + osc<0 dif>0

    if value1 = 1 and difValue > 0 then ret = 1;    //前一次交叉在0以下,這一次在0之上

    if difValue < 0 then value1 = 1 else value1 = -1;     //更新value1數值,0以下的話為1,不然就是-1

 由於修改程式碼後 所得到的搜尋結果  似乎不太正確   煩請工程師撥空指導 !

請看附圖  橘色框框處   條件2: k>_d and osc<0 and dif>0  條件1:藍色框框處

感謝您~

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/07/13

 Hello 東尼,

 

之前的文章中之所以可以那樣寫是因為兩次條件都是MACD黃金交叉。

這次0上與0下的條件不同,所以要分開撰寫:

if difValue Crosses Above macdValue then begin    //黃金交叉

    if difValue < 0 then value1 = 1 else value1 = -1;    //0下的話 value1 為1。0上的話 value1為 -1

    end;

 

if difValue Crosses under macdValue and k > _d and value1 = 1 then ret = 1;  //MACD死亡交叉,K大於D且 value1 要為1 (前一次黃金交叉為0下)

東尼 發文於   2023/07/13

感謝工程師的回覆與指導!!

東尼 發文於   2023/07/13

工程師您好 : 

感謝您的回覆與指導

如果想再增加一個條件  也就是上述案例  "中間再增加一次0上macd金叉 " =  第2條件 (依照順序)

第一條件: 0下macd金叉 (同上案例)     第2(次)條件:  0上macd金叉(本例欲增加之條件)    第3(次)條件:  0上 macd死叉 k>d  (同上案例) 

煩請您撥空指導    "中間再增加一次 0上macd金叉 "  請問該如何撰寫程式碼?

感謝!

 

XQ小幫手 發文於   2023/07/18

Hello 東尼,

 

網站上有教學區,裡面有XS語法的基礎和應用可以閱覽。

 

由於 0下macd金叉 和 0上macd金叉 的部分和之前的相同,所以您可以將其稍作修改繼續使用:

if difValue Crosses Above macdValue then begin    //黃金交叉

    if value1 = 1 and difValue > 0 then value2 = 1 else value2 = 0;    //前一次黃金交叉在0以下,這一次黃金交叉在0之上的話 value2 = 1

    if difValue < 0 then value1 = 1 else value1 = -1;     //更新value1數值,0以下的話為1,不然就是-1

    end;

 

if value2 = 1 and difValue Crosses under macdValue then begin

    if k > d and difValue > 0 then ret = 1 else value2 = 0;    //如果達成條件1和2後的死亡交叉符合 k > d 且在0上的話警示,不然就將value2 歸0重來

    end;

 

東尼 發文於   2023/07/18

感謝您的回覆與指導!!

剛執行程式之後 今天沒有任何搜尋結果出來  但剛好有看到一檔個股符合我所要求條件  3680 (附圖2:3680 07月18日)

但3680確沒出現在搜尋結果中   可否請工程師幫忙檢視一下  指令碼有無需要修正之處  感謝您~~  

後來執行7月5日選股    有發現2檔  (附圖1 : 0705)

)

  

 (附圖 2: 3680  07月18日)

 

您提供程式碼 僅略修改粗體字條件   if value2 = 1 and difValue < macdValue  then begin  //

if difValue Crosses Above macdValue then begin  //黃金交叉

 

    if value1 = 1 and difValue > 0 then value2 = 1 else value2 = 0;    //前一次黃金交叉在0以下,這一次黃金交叉在0之上的話 value2 = 1

 

    if difValue < 0 then value1 = 1 else value1 = -1;     //更新value1數值,0以下的話為1,不然就是-1

 

    end;

 

if value2 = 1 and difValue < macdValue  then begin  //

 

    if k > _d and difValue > 0 then ret = 1 else value2 = 0;    //如果達成條件1和2後的死亡交叉符合 k > d 且在0上的話警示,不然就將value2 歸0重來

 

    end;

 

 

XQ小幫手 發文於   2023/07/20

Hello 東尼,

 

是因為您改寫的第3次條件: 0上 difValue < macdValue k>d。

需要同時符合 0上、difValue < macdValue 以及 k > d 才會觸發。

但改寫時您沒有另外處理 value2,所以第一次達成時若沒有同時符合的話,value2就會被改為0中斷。

如果您希望持續檢查的話,應該將下半部分改為:

if value2 = 1 and difValue < macdValue and k > _d and difValue > 0 then ret = 1;

這樣value2就會維持到下次檢查第2次條件時決定該為0還1。

 

建議您將相關數值用 print 和 outputfield 輸出確認,或是將警示腳本改寫為指標腳本直接將相關數值畫在線圖上,這樣會比較好修改邏輯。

小幫手並沒有提供腳本撰寫的服務。

東尼 發文於   2023/07/20

感謝您的指導與回覆~~

因是外行學習XQ  故不懂的邏輯與語法之處甚多  望請見諒!!

您提到:

建議您將相關數值用 print 和 outputfield 輸出確認,或是將警示腳本改寫為指標腳本直接將相關數值畫在線圖上,這樣會比較好修改邏輯。

謝謝您的提醒 使用outputfield方法 :  請問本案例第一次 第二次 的 dif macd osc可以用outputfield輸出嗎? 請問該怎用outputfield表示?  還是只能輸出 value1 value2    ?  

謝謝~~

XQ小幫手 發文於   2023/07/25

Hello 東尼,

 

您可以用變數保存第一次第二次的所需數值,並使用outputfield輸出變數。

舉例來說:

 

f difValue Crosses Above macdValue then begin    //黃金交叉

 

    if value1 = 1 and difValue > 0 then begin 

        value2 = 1;

        value20 = difvalue;         //value20~22保存第二次MACD的數值

        value21 = macdvalue;

        value22 = oscvalue;

        end

    else begin

        value2 = 0;    //前一次黃金交叉在0以下,這一次黃金交叉在0之上的話 value2 = 1

        end;

 

    if difValue < 0 then begin

        value1 = 1;

        value10 = difvalue;         //value10~value12保存第一次MACD的數值

        value11 = macdvalue;

        value12 = oscvalue;

        end

    else begin 

        value1 = -1;     //更新value1數值,0以下的話為1,不然就是-1

        end;

    end;

東尼 發文於   2023/07/25

感謝您的指導與回覆~~受益良多!!

發表回覆
Close