Protraはよくできたソフトだけど、本日の日付を使った売買戦略とか、ファンダメンタル的な手法が実装したい場合には機能が少なすぎます。
どうせ本体の改良に手をつける必要があるなら、最初からOmegachartを使った方が良いのでは?
と思い、Omegachartをいじり中です。
触れば触るほど、売買ツールの自作はやらなくてよかった・・と思います。
Omegachartとは?
岡嶋大介氏(東京大学出身)が2003年に開発し、後に第1回カブロボ・コンテストで野村総研特別賞受賞した株価のテクニカル分析ソフトウェアでApacheライセンスのオープンソースです。
開発者は未踏ソフトウェア創造事業にも携わった方で、2006年にはOmegachartはTactico という名で商品化されました。
最終版の1.8.4が今でもpanacoran氏が(Protraも含めて)保守・改良を続けてくれています。
Omegachartインストール
まずは、Visual Studio Express 2015 をダウンロードしてインストールします。
- OmegaChart-英数字のディレクトリのzanetti.slnをダブルクリックしてVisual Studioを起動する
- ツールバーに表示されているソリューション構成を、ReleaseならDebugに切り替える
- [ビルドの]の[ソリューションのビルド]でビルド
実行すると次のようなエラーがでます。
スキーマーのロード中にエラーが発生しました extensionの一部が見つかりませんでした。
ここからは色々と他のサイトを調べはじめました。
まだ2chのスレッドも残っており色々と助かりました。
実行前の準備
ソースコードが置いてある場所にあるフォルダextensionをビルド後に作成されたOmegaChart.exeが置いてある場所 bin\Debug へコピーする必要がありました。
また、protraが生成したindex.txtをbin\Debugへコピーします。
これで起動はします。
ですが、Protraでは簡単な株価チャートの取得が難しい・・・。
2か月間しか取得できないし、差分取得の概念がないです。
改造してyahooなどから長期データなどをダウンロードする機能をまずは実装する必要があります・・なんと面倒な・・。
長期株価を取得する
長期データの取得方法を紹介しているサイトを見つけました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--- OmegaChart-9cd2e32.org/Download.cs 2017-03-03 18:40:22.000000000 +0900 +++ OmegaChart-9cd2e32/Download.cs 2017-06-05 05:18:07.006673200 +0900 @@ -629,7 +629,7 @@ //無尽蔵でデータの準備ができるのが18~19時だった if(DateTime.Today==ld && (DateTime.UtcNow.Hour<10 || DateTime.UtcNow.Hour>=15)) ld = ld.AddDays(-1); - DateTime start = ld.AddMonths(-2); + DateTime start = ld.AddMonths(-240); ArrayList result = new ArrayList(); while(start.CompareTo(ld)<0) { if(Util.IsMarketOpenDate(ld)) { --- OmegaChart-9cd2e32.org/Data.cs 2017-03-03 18:40:22.000000000 +0900 +++ OmegaChart-9cd2e32/Data.cs 2017-06-05 05:32:30.858679400 +0900 @@ -332,6 +332,10 @@ } else offset -= RECORD_LENGTH; + if (offset < 0) { + offset = 0; + break; + } } while(true); } |
offsetがマイナスになってはいけないはずなので、アンダーフローしたときはbreakするようにしているそうです。
これで2000年より前の株価も取得可能です。取得時間は約24時間ですが・・・・
ロウソク足で陽線の色指定
陰線や、ロウソク自体は色指定できるのになぜか陽線はできません。
そこで他のサイトを丸写しで陽線の色指定ができるように改造しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
--- OmegaChart-9cd2e32.org/ChartDrawing.cs 2017-03-03 18:40:22.000000000 +0900 +++ OmegaChart-9cd2e32/ChartDrawing.cs 2017-06-08 17:19:43.759032900 +0900 @@ -433,7 +433,8 @@ int top = (int)_priceTrans.TransValue(close); int bottom = (int)_priceTrans.TransValue(open); if(_pref.InverseChart) Util.Swap(ref top, ref bottom); - Win32.SelectObject(hdc, _pref.BackBrush.Handle); +// Win32.SelectObject(hdc, _pref.BackBrush.Handle); + Win32.SelectObject(hdc, _pref.YousenBrush.Handle); if(_pref.UseCandleEffect) { Win32.Rectangle(hdc, x-halfcw, top, x+halfcw+1, bottom+1); //上と左 --- OmegaChart-9cd2e32.org/CustomizeDialog.cs 2017-03-03 18:40:22.000000000 +0900 +++ OmegaChart-9cd2e32/CustomizeDialog.cs 2017-06-08 17:19:11.978871200 +0900 @@ -73,6 +73,8 @@ private Label _lCandleColor; private ColPickerComboBox _candleColorBox; private CheckBox _candleShadowEffect; + private Label _lYousenColor; + private ColPickerComboBox _yousenColorBox; private Label _lInsenColor; private ColPickerComboBox _insenColorBox; private Label _lCreditLong; @@ -382,6 +384,8 @@ _lCandleColor = new Label(); _candleColorBox = new ColPickerComboBox(); _candleShadowEffect = new CheckBox(); + _lYousenColor = new Label(); + _yousenColorBox = new ColPickerComboBox(); _lInsenColor = new Label(); _insenColorBox = new ColPickerComboBox(); _lVolumeColor = new Label(); @@ -448,6 +452,7 @@ _candleShadowEffect.CheckedChanged += new EventHandler(EnableApplyButton); _basicColorGroup.Controls.Add(_candleShadowEffect); top += 24; + InitBasicColorConfigUI(_lYousenColor, "陽線の色(&Y)", _yousenColorBox, left1, top, ref tabindex, Env.Preference.YousenBrush.Color); InitBasicColorConfigUI(_lInsenColor, "陰線の色(&I)", _insenColorBox, left1, top, ref tabindex, Env.Preference.InsenBrush.Color); //区切り線 @@ -615,6 +620,7 @@ pr.BackBrush.Update(_backColorBox.Color); pr.DefaultBrush.Update(_textColorBox.Color); pr.CandlePen.Update(_candleColorBox.Color, _backColorBox.Color); + pr.YousenBrush.Update(_yousenColorBox.Color); pr.InsenBrush.Update(_insenColorBox.Color); pr.UseCandleEffect = _candleShadowEffect.Checked; pr.VolumeBrush.Update(_volumeColorBox.Color); --- OmegaChart-9cd2e32.org/Preference.cs 2017-03-03 18:40:22.000000000 +0900 +++ OmegaChart-9cd2e32/Preference.cs 2017-06-08 17:12:52.325040300 +0900 @@ -158,7 +158,8 @@ private ZBrush _backBrush; private ZBrush _volumeBrush; private ZCandlePen _candlePen; - private ZBrush _insenBrush; + private ZBrush _insenBrush; // 陰線の色を指定する + private ZBrush _yousenBrush; private ZPen _monthDivPen; private ZPen _mouseTrackingLinePen; private MouseTrackingLineMode _mouseTrackingLineMode; @@ -272,6 +273,12 @@ return _insenBrush; } } + public ZBrush YousenBrush + { + get{ + return _yousenBrush; + } + } public ZCandlePen CandlePen { get { return _candlePen; @@ -470,6 +477,7 @@ _fontSize = LoadFloat(config, "font-size", 9); _fontStyle = LoadFontStyle(config, "font-style", FontStyle.Regular); + _yousenBrush = new ZBrush(LoadColor(config, "yousen-color", Color.Red)); _defaultBrush = new ZBrush(LoadColor(config, "text-color", Color.White)); _backBrush = new ZBrush(LoadColor(config, "back-color", Color.Black)); _insenBrush = new ZBrush(LoadColor(config, "insen-color", Color.White)); @@ -568,6 +576,7 @@ node["font-style"] = _fontStyle.ToString(); node["text-color"] = Util.FormatColor(_defaultBrush.Color); node["back-color"] = Util.FormatColor(_backBrush.Color); + node["yousen-color"] = Util.FormatColor(_yousenBrush.Color); node["insen-color"] = Util.FormatColor(_insenBrush.Color); node["fushi-color"] = Util.FormatColor(_fushiColor); node["free-line-color"] = Util.FormatColor(_freeLineColor); |
すこし綺麗になりました。
銘柄名検索で1銘柄に絞れたときはEnter押で済ませる
2chでの紹介をやってみました。
銘柄名検索で「湯」と書き入れた後、エンターキー押下で2340極楽湯が表示されます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
--- OmegaChart-9cd2e32.org/SearchBrandDialog.cs 2017-03-03 18:40:22.000000000 +0900 +++ OmegaChart-9cd2e32/SearchBrandDialog.cs 2017-06-09 08:56:38.240599400 +0900 @@ -174,13 +174,16 @@ } private void ShowBrand() { - if(_listBox.SelectedIndex!=-1) - { - string sel = (string)_listBox.Items[_listBox.SelectedIndex]; - int sp = sel.IndexOf(' '); - AbstractBrand br = Env.BrandCollection.FindBrand(Int32.Parse(sel.Substring(0, sp))); - CommandExec.ShowBrand(br); - } + var pos = -1; + if (_listBox.Items.Count == 1) + pos = 0; + else if (_listBox.SelectedIndex!=-1) + pos = _listBox.SelectedIndex; + if (pos == -1) return; + string sel = (string)_listBox.Items[pos]; + int sp = sel.IndexOf(' '); + AbstractBrand br = Env.BrandCollection.FindBrand(Int32.Parse(sel.Substring(0, sp))); + CommandExec.ShowBrand(br); } private void Refill(string name) { |
色々とソースコードを触ればできそうな事はわかりました。
やりたい事(ツールの改造に関して)
オメガチャートに実装したい機能として
- 自動売買(逆指値)
- リアルタイム株価の取得
- 売買結果のデータ集計
- 日足チャートを1年幅で描写
- ファンダメンタル分析機能
目的は自動的にお金を稼ぐ仕組みをつくること・・・
のはずだけど、少しずつ脱線してるような・・・。