C#- .NET上のChartコンポーネントに線を引きたい
はじめに
株価チャートとかで(部分的に)線を引きたい時にどうすればいいのか手こずったので忘れないうちに記しておく.
方法
Chart全体に線を引きたいならば
chart1.Series["candle"].ChartType = SeriesChartType.Line;
とかやって折れ線グラフを生成すればよいが,株価チャートでトレンドラインを引くときなど,気軽に2点を選択して直線を引きたい場合どうすればいいか結構時間がかかったのでまとめる.
LineAnnotationを利用した.プロパティにはX,Y,Width,Heightしかないが,WidthとHeightをうまく計算すると意図した位置に線を引くことができる.AllowSelecting,AllowMovingプロパティをtrueにすれば選択,移動もできる.他にリサイズも可能.
コード
このコードは,チャート上で2回クリックするとその2点間を結ぶ直線を生成する.LineAnnotation(線注釈)を選択してもカウントされてしまうので注意.
Point point = new Point(); private void chart1_MouseDown(object sender, MouseEventArgs e) { if (point.X == 0 && point.Y == 0) { //始点 point.X = (int)chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X); point.Y = (int)chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y); } else { //終点 Point temp = new Point(); temp.X = (int)chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X); temp.Y = (int)chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y); //線を生成 LineAnnotation ano = new LineAnnotation(); ano.AxisX = chart1.ChartAreas[0].AxisX; ano.AxisY = chart1.ChartAreas[0].AxisY; ano.IsSizeAlwaysRelative = false; ano.AllowSelecting = true; ano.AllowMoving = true; ano.X = point.X; ano.Y = point.Y; ano.Height = temp.Y - point.Y; ano.Width = temp.X - point.X; chart1.Annotations.Add(ano); point = new Point(); } }
C#でのHTML取得方法を比較した
C#でWebページの内容を取得する方法はいくつかあるが,どれが速いのかよく分からなかったのでテキトーに調べてみた.計測とか調べ方はチョー適当なので参考程度に.
今回確かめたC#でWebページの内容を取得するクラスは
- WebClientクラス
- WebRequestクラス
- HttpClientクラス
である.
というかC#でHTMLを取得するいい方法を誰かおしえてください.
計測結果
クラス | 時間(秒) |
---|---|
WebClient | 3.279 |
WebRequest | 4.741 |
HTTPClient | 4.081 |
今回,あるURLのHTMLを50回取ってくるという操作の10回平均を計測した.
今回計測した所WebClientが一番速いという結果になったが,HTTPClientクラスは非同期対応とか各クラスで特徴あるので使い分けましょうということで.
なお下記コードでProxyをnullにしているのは,そうした方が速いらしいからである.
追記
using使ってないクソダサコードだけど許して
コード
using System; using System.Text; using System.Threading.Tasks; using System.Net; using System.IO; using System.Net.Http; namespace Test { class Program { static void Main(string[] args) { // 時間計測用のタイマー var timer = new System.Diagnostics.Stopwatch(); timer.Start(); for (int k = 0; k < 10; k++) { for (int i = 0; i < 50; i++) { string URL = "hogehoge"; ///ここを適宜変更 string temp = getHTML(URL); /// } } timer.Stop(); Console.WriteLine("{0:0.000}秒", timer.Elapsed.TotalSeconds/10); Console.Read(); } static string getHTML(string url) { WebRequest wr = WebRequest.Create(url); wr.Timeout = 10000; HttpWebRequest pcHttpRec = (HttpWebRequest)wr; pcHttpRec.Proxy = null; Encoding enc = Encoding.GetEncoding("UTF-8"); string result = ""; using (Stream st = wr.GetResponse().GetResponseStream()) using (StreamReader sr = new StreamReader(st, enc)) { result = sr.ReadToEnd(); } return result; } static string getHTML2(string url) { Uri webUrl = new Uri(url); Task<string> webTask = GetWebPageAsync(webUrl); webTask.Wait(); string result = webTask.Result; return result; } static string getHTML3(string url) { WebClient wc = new WebClient(); wc.Encoding = Encoding.UTF8; wc.Proxy = null; Stream st = wc.OpenRead(url); Encoding enc = Encoding.GetEncoding("UTF-8"); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); return html; } static async Task<string> GetWebPageAsync(Uri uri) { // HttpClientHandlerにProxy情報を設定する HttpClientHandler ch = new HttpClientHandler(); ch.Proxy = null; using (HttpClient client = new HttpClient(ch)) { // タイムアウトをセット(オプション) client.Timeout = TimeSpan.FromSeconds(10.0); return await client.GetStringAsync(uri); } } } }
ubuntuが爆発したのでlubuntuを導入
ubuntuからpython3を消したところ,誤って別のも消えてしまい,タスクバーとか色々バーが出てこなくなってしまった.戻すのは面倒だし,重要なデータは一応バックアップできたので,lubuntuに変えてみるかということで実際に変えた.
で,lubuntuにした際に初めにいじったやつを書いておく
日本語入力の設定(mozc)
デフォルトのはポなのでまず変えるやつ.
sudo apt-get install fcitx fcitx-mozc fcitx-libs-qt5 fcitx-frontend-qt5
これしたらログイン・ログアウト
ディレクトリ名を英語に
デフォルトだと「Document」が「ドキュメント」になっちゃってるので英語にする
LANG=C xdg-user-dirs-gtk-update
ubuntuにpipがapt-get installで入らなかった時
今話題のTensorFlowを試してみようと思いインストールしようとすると,どうやらpipで入れるのが楽らしい.てことで,Ubuntuに入ってなかったpipを
sudo apt-get install python-pip
によって入れようと思ったらエラー.あれあれおかしいなと慌ててたら他の方法がありました.
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" sudo python get-pip.py
これで僕の場合無事pipがインストールできました.
参考
How to Install Pip on Ubuntu 14.04 LTS | Liquid Web Knowledge Base
簡単にお金を儲けたい・・・簡単にお金を儲けたくない?
お金を儲けたい…そうだ株だ!→適当にやってn万円含み損を抱える
ってなったので,ちゃんとやらなきゃなーと思ってテクニカルでちょっとやってみようと思いました.
プログラミングをちょっと齧ってる身としては,ボタンをポチって押せばテクニカル指標がぱっと見れる奴がほしいなと思ったので作ってみました.
C#で作りました.C#サイコー 左上のテキストボックスに銘柄コードを入れてボタンを押すとテクニカル指標が出てくるようになってます.そしてあるサインを捉えたら売買サインを出すようにもしています.データはヤホーからHTMLを
ガシガシして取ってきてます.
ただ単体の株のテクニカル指標だけ見ても今どれが上がりそうなのか探すの辛くね?って気づいてしまったので,(できるだけ)すべての株についてデータを取ってきて一覧にしてみました.フィルタ機能もあります.
コレ使ってちょっとシミュレーションしてみて思ったのが,テクニカル指標と株の動きってなんか関係なくね?というオチ
久しぶりに.vimrcを整えた
夏休みの間うぶんつたんを触っておらず,vimから離れていたので復帰として.vimrcをいじった.
javacompleteとsyntasticというプラグインを知ったので早速入れてみた.
javacompleteはもちろんjavaの補完をしてくれるやつ.どうしてもEclipseをやりたくないんだ…
こんな感じ
でもこれをするとneocompleteが効かない?補完の関数を変えてるっぽいから仕方ないか
syntasticはコンパイルしなくても構文エラーをチェックしてくれるプラグイン.むしろなんで今まで入れてなかったんだという感じ
:Error
とするとエラーの内容も出してくれる.便利だ…
ちなみに今入れているプラグインは
- neobundle
- vim-quickrun
- neocomplete
- lightline
- vimproc
- syntastic
- javacomplete
texで文章の幅に合わせて画像を貼りたい
texで画像を貼る時って
\includegraphics[width=10cm]{hoge.eps}
ってやると思うんですけど,幅指定って大体直接値で指定しているページが多く,文章の幅と合わせる場合ってどうすりゃいいんだって思ったんで調べた.
\linewidth
を使えば幅が取れるので
\includegraphics[width=\linewidth]{hoge.eps}
とすれば綺麗に揃う.また,
[width=0.8\linewidth]
とすれば幅の0.8倍になる.