PlotLine( ) 的奇怪現象 ?

  •   110 
  • 最後發表   Jones  18 小時前
Jones 發文於   2025/01/03

Dear All:

 在使用PlotLine() 出現了一個不解的現象?

原本設計如下圖: 手動繪製, 應產生的正解圖形

然後用程式去繪製, 如第2圖

程式產生的x1,y1,x2,y2均用Print()列印出以便查核

一共以60根K為範圍SetTotalBar(60),

列印其中第49根資料的繪圖:

繪圖1 x1= 43  y1= 51.30 x2= 49  y2= 46.55
可是, 並無連結到正確K棒的價位?

我已避免畫線段為同一根K棒了, 可是, 還是無法正確顯示?

是我哪裡有疏忽的地方嗎?

若是需要完整的程式, 我亦可以貼上去

麻煩有知道的先進可否解答一下, 先謝啦!!!

 

 

 

附加文件

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/01/03

也許可貼上程式碼,大家一起研究看看。

Jones 發文於   2025/01/03

謝謝許大您的費心, 貼上程式碼, 無法上傳, Bot is not accessed!

所以將程式碼貼在附檔上

Jones 發文於   2025/01/04

分成四部份上傳:

 

/ Date:    20250103
// Purpose: 以5均價為基, 其上為正價區, 其下為負價區, 相鄰正(負)價區取其最高(低)價, 然後連結最高(低)價
// Version: 1.2 拿掉 陣列: hprice[] lprice[] 加入繪圖
//          1.3 20250103:補充跨5均線時 排除K棒在5均線上的狀況
// Author:  方健忠 Copyright reserved by author
//----------------------------------------------------------------------------------


input: Len(60);//讀取範圍:60天(K棒)
SetTotalBar(Len);

Var: DEBUG(TRUE);

//===== stage1: 讀去過去價格 ============================================================================
Array: K[60](0), flag[60](0);  // hprice[15](0), lprice[15](0); //陣列元素需與Len數目相同
Var: KN(1);  //KN: K number

KN = CurrentBar;
if KN > Len then return
else
   K[KN]      = KN;   

if C > Average(C, 5) then
     flag[KN]   = 1
else if C < Average(C,5) then
     flag[KN]   = -1
else begin  
     flag[KN]   = 0;
end;  
  //if (DEBUG) then Print( "K[",NumToStr(KN,0),"] =", NumToStr(KN,0),"  flag[", NumToStr(KN,0),"]=", NumToStr(flag[KN],0) );   
 
//======  end of stage1:讀去過去價格 ============================================================================

Jones 發文於   2025/01/04

//======  stage2: 找出跨5MA K棒的左右邊界的變數 =================================================================
Var: pv_start(0), pv_end(0), pv_state(0);  //左右邊界, 以KN計數, 邊界皆發生跨越5MA狀況, 然後用
Var: min_price(0), max_price(0), offset(0);  //暫存計算區間內的K棒值與極值
Var: scope(0); //用於extremes()中的期數

//   stage3: 畫線的變數
Var: plot_count(0), x1(0), y1(0), x2(0), y2(0); // PlotLine(序列編號, x1, y1, x2, y2, "序列名稱", add:=1)

if KN = 1 then begin //初始化
     if flag[KN] = 0 then begin    //僅限第一根收盤價=5MA 則由前一根K決定,前一根K若為正價區則為正價區,前一根K若為負價價區則為負價區
         if C[1] > Average(C[1],5) then
              flag[KN]   = 1
         else
             flag[KN]   = -1;    
     end;     
      
   pv_start = KN;       //設定起始(左)邊界
   pv_state = flag[KN]; //設定起始K棒的價區
   
   //if (DEBUG) then Print("pv_start=", NumToStr(pv_start, 0), "  pv_state=", NumToStr(pv_state, 0));
end;         

if KN > 1 AND KN <= Len then begin   //第2跟K棒以後到結束
   if flag[KN] <> pv_state AND pv_state <> 0 AND flag[KN] <> 0 then begin  //產生跨價區狀況 且 排除收盤在5均線的K棒(更新版)
      if flag[KN] = 1 then begin    //結束(右)邊界為跨入正價區, 則尋找區域內最低點(價)
         pv_end = K[KN];
         scope  = pv_end-pv_start+1; //期數: 尾減投 加1
         extremes(Low, scope, -1, min_price, offset);         
     
         //if (DEBUG) then Print("KN=", NumToStr(K[KN]-offset,0)," 最低價=", NumToStr(min_price,2)," 期數=",NumToStr(scope,0)," offset=",NumToStr(offset,0));
   
         /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Jones 發文於   2025/01/04

         //========  stage3: 繪線段    ==========================================================================================
         if  plot_count = 0 then begin
             x1 = K[KN] - offset;
             y1 = min_price;
             
             plot_count = plot_count + 1;
         end
         else begin
             x2 =  K[KN] - offset;
             y2 =  min_price;             
             //if(DEBUG) then Print("繪圖1 x1=",NumToStr(x1,0)," y1=",NumToStr(y1,2), "x2=",NumToStr(x2,0)," y2=",NumToStr(y2,2));
             
             if x2 <> x1 then begin
                Plotline(1, x1, y1, x2, y2,add:=1);  
                if(DEBUG) then Print("繪圖1 x1=",NumToStr(x1,0)," y1=",NumToStr(y1,2), "x2=",NumToStr(x2,0)," y2=",NumToStr(y2,2));
                x1 = x2;
                y1 = y2;
                plot_count = plot_count + 1;
             end
             else begin //最高價與最低價相同 則不畫線
                if (DEBUG) then Print("繪圖1:高低價同一根K: x1=",NumToStr(x1,0)," y1=",NumToStr(y1,2), "x2=",NumToStr(x2,0)," y2=",NumToStr(y2,2));
                x1 = x2;
                y1 = y2;
                plot_count = plot_count + 1;
 
             end;
             
         end;         
         //========= end of stage3: 繪線段  ==========================================================================================
         /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
      end
      else begin     //結束(右)邊界為跨入負價區, 則尋找區域內最高點(價)
         pv_end = K[KN];
         scope  = pv_end-pv_start+1; //期數: 尾減投 加1
           extremes(High, scope, 1, max_price, offset);
         
         //if (DEBUG) then Print("KN=", NumToStr(K[KN]-offset,0)," 最高價=", NumToStr(max_price,2)," 期數=",NumToStr(scope,0)," offset=",NumToStr(offset,0));

         ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Jones 發文於   2025/01/04

         //==========  stage3: 繪線段    ==========================================================================================
         if  plot_count = 0 then begin
             x1 = K[KN] - offset;
             y1 = max_price;
             
             plot_count = plot_count + 1;
         end
         else begin
             x2 =  K[KN] - offset;
             y2 =  max_price;             
             //if(DEBUG) then Print("繪圖2 x1=",NumToStr(x1,0)," y1=",NumToStr(y1,2), "x2=",NumToStr(x2,0)," y2=",NumToStr(y2,2));
             
             if x2 <> x1 then begin
                Plotline(2, x1, y1, x2, y2, add:=1);  
                if(DEBUG) then Print("繪圖2 x1=",NumToStr(x1,0)," y1=",NumToStr(y1,2), "x2=",NumToStr(x2,0)," y2=",NumToStr(y2,2));                
                
                x1 = x2;
                y1 = y2;
                plot_count = plot_count + 1;
             end
             else begin //最高價與最低價相同 則不畫線
                //Print("畫上一根座標 x1[1]=", NumToStr(x1[1],0)," y1[1]=",NumToStr(y1[1],2));
                //plotline(1, x1[1],y1[1], x1, y1, add:=1);//畫上一根
                if (DEBUG) then Print("繪圖2:高低價同一根K: x1=",NumToStr(x1,0)," y1=",NumToStr(y1,2), "x2=",NumToStr(x2,0)," y2=",NumToStr(y2,2));
                 x1 = x2;
                y1 = y2;
                plot_count = plot_count + 1;
                
             end;
             
         end;
     
         //=========== end of stage3: 繪線段   ==========================================================================================
         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////         
      end;
      
      pv_start = K[KN];   //下一個邊界的起始邊界=現在邊界的結束邊界
      pv_state = flag[KN]; //更新價區狀態
      //if(DEBUG) then Print("更新", " pv_start=", NumToStr(pv_start,0), "pv_state=", NumToStr(pv_state,0));

   end; //End of if ...//產生跨價區狀況

end; //End of if...//第2跟K棒以後到結束

虎科大許教授 發文於   2025/01/04

這應該是系統自動在新的指標在同一根K棒繪製時(原本已繪製到12/18最低價),在12/18又要從最高價繪製指標,會自動將原本繪製在12/18的最低價改畫到12/17。

你若在程式開始時加入if currentBar>50 then return;就可看到指標是繪製到12/18的最低價。

Jones 發文於   2025/01/04

謝謝許大的解謎, 的確參照更多的圖形, 當連結起始點在同一根時(最高價, 最低價), 的確, 系統會沿著畫線的方向往前挪一天(K棒), 難怪, 我一直驗證其數值,還以為我的程式算錯, 看來, 這是系統限制了, 目前無解, 對嗎?  還有其他替代方法嗎?

 

虎科大許教授 發文於   2025/01/04

看起來沒辦法。另外,想用你的例子當作課程範例,是否OK?

Jones 發文於   2025/01/04

請問許大: 可否讓我知道, 採用當課程範例的原因? 我也想繼續精進, 從您的觀點審視.

顯示更多回應 發表回覆
Close