none
有關在表單上繪製圖表的問題 RRS feed

  • 問題

  • 各位前輩好,這裡是新手發問,若有錯誤請多指教。

    我最近開始寫一個求算所有投資組合的程式,當我運算出所有投資組合的報酬率及標準差之後,我把這些資料繪製在pictureBox上。

    然後我在pictureBox的mouseDown事件裡寫了以下的程式碼:

    Code Snippet


    Form1.ActiveForm.Text = "報酬(Y) = " + (100 - (e.Y / 6)) + "%,風險(X) = " + (e.X / 8) + "%";

                string str = "";
                decimal dectemp = 0m;

                int x = e.X;
                int y = e.Y;

                for (int i = e.X; i < (e.X + 5) && i > 0; i++) //往右搜尋
                {
                    if (dectemp != 0) break;
                    for (int j = e.Y; j > (e.Y - 5) && j > 0; j--) //往上搜尋
                    {
                        for (int k = 0; k < n; k++)
                        {
                            dectemp = dectemp + decArrayEfficientFrontier[i, j, k];
                        }
                        if (dectemp != 0)
                        {

                            for (int ti = 0; ti < n; ti++)
                            {
                                str = str + "," + decArrayEfficientFrontier[i, j, ti].ToString();
                            }

                            lblShow.Text = str;
                            break;

                        }
                        else
                            lblShow.Text = "";


                    }
                }


    在程式裡,我把運算出來的所有投資組合的「權數陣列」(註)放在decArrayEfficientFrontier[i, j, k](註)裡,其中 i = pictureBox 的寬度,也就是800,j = pictureBox的長度,也就是600, k就是權數陣列的長度。

    我的想法是,我在反覆運算投資組合的程式中把運算出來的資料全部放入decArrayEfficientFrontier[i, j, k]裡,然後在pictureBox的mouseDown事件中檢查現在的滑鼠所在座標在哪裡,然後用座標去搜尋decArrayEfficientFrontier[i, j, k]裡的資料。

    但這樣做出來其實很不美觀,而且還需要大量修改,例如:

    1.運算出來的資料分佈點若只佔pictureBox的百分之二十,會有大量空白。
    2.圖形即時重繪的問題。

    想請教各位前輩,若針對以下的需求,您們的建議是什麼?

    需求1:圖形資料內容必須跟著視窗內容一起放大縮小。
    需求2:繪圖區不可有太大空白。
    需求3:在游標放上資料所在點時,必須在即時show出該資料點的投資組合(權數陣列…)。

    另外再請教:Crystal Report元件能做到我的需求嗎?

    謝謝各路高手指教。

    註:權數陣列 - 如現在有三檔資檔,而這三檔資料的投資組合權數為[0.05,0.8,0.15](總和為1),那我把這個權數所產生的投資組合報酬及標準差(這兩個數字大約會在0-1之間,目前還沒考慮<0的情況)分別*800及600,分別放入decArrayEfficientFrontier[風險,報酬, k]中,再將權數陣列的內容放入k裡。

    ps:我知道matlab能求算效率前緣,而且絕對又快又好,但matlab沒辦法求算定期定額報酬率及標準差,以及後續我想要的求算投資技術指標最佳組合


    2007年4月25日 上午 06:18

所有回覆

  • HI,

     

    在.NET 2.0的環境中可以透過GDI+的功能繪製您需要的圖表, 而且也可以在FORM放大/縮小的時候重新繪製圖表, 反而是Crystal Report或是MS的Reporting Service是靜態的圖表, 只能利用報表本身的顯示比例進行放大和縮小

     

    tihs

    2007年4月28日 下午 12:36
  • 謝謝,看來還是只能自己寫幾個專門對繪圖區進行動態最佳化及滑鼠游標搜尋的物件了。


    2007年4月30日 下午 06:08