- /*
- * Copyright (c) Daisuke OKAJIMA All rights reserved.
- *
- * $Id$
- */
- // This file is modified by panacoran.
- // Copyright (C) 2013 panacoran <panacoran@users.sourceforge.jp>
- // This program is part of OmegaChart.
- // OmegaChart is licensed under the Apache License, Version 2.0.
- using System;
- using System.Drawing;
- using System.Collections;
- using System.ComponentModel;
- using System.Windows.Forms;
- using System.Diagnostics;
- using System.Text;
- using Travis.Util;
- using Zanetti.Data;
- using Zanetti.Indicators;
- using Zanetti.SystemTrading;
- using Zanetti.SystemTrading.Screening;
- using Zanetti.Config; // for BookmarkFolder
- namespace Zanetti.Forms
- {
- /// <summary>
- /// ScreeningDialog の概要の説明です。
- /// </summary>
- internal class ScreeningDialog : System.Windows.Forms.Form
- {
- private ScreeningOrder _order;
- private System.Windows.Forms.Button _okButton;
- private System.Windows.Forms.Button _cancelButton;
- private System.Windows.Forms.GroupBox _filterGroup;
- private System.Windows.Forms.Label _messageLabel;
- private System.Windows.Forms.Label _filterLabel;
- private System.Windows.Forms.ComboBox _filterBox;
- private System.Windows.Forms.GroupBox _primaryIndicatorGroup;
- private System.Windows.Forms.Label _lCondition;
- private System.Windows.Forms.Label _primaryIndicatorLabel;
- private System.Windows.Forms.ComboBox _primaryIndicatorBox;
- private System.Windows.Forms.Label _countLabel;
- private System.Windows.Forms.ComboBox _numberBox;
- private System.Windows.Forms.GroupBox _dateGroup;
- private System.Windows.Forms.DateTimePicker _datePicker;
- private System.Windows.Forms.ProgressBar _progressBar;
- private System.Windows.Forms.ComboBox _favoriteBox;
- private System.Windows.Forms.Button _specBookmarkFolderButton;
- private System.Windows.Forms.TextBox _bookmarkFolderTextBox;
- private System.Windows.Forms.Label _filterBookmarkLabel;
- /// <summary>
- /// 必要なデザイナ変数です。
- /// </summary>
- private System.ComponentModel.Container components = null;
- private BookmarkFolder _bookmarkFolder;
- public ScreeningDialog()
- {
- //
- // Windows フォーム デザイナ サポートに必要です。
- //
- InitializeComponent();
- //
- // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
- //
- _filterBox.Items.AddRange(EnumDescAttribute.For(typeof(FilterType)).DescriptionCollection());
- _numberBox.Items.AddRange(EnumDescAttribute.For(typeof(ResultCountType)).DescriptionCollection());
- _filterBox.SelectedIndex = 0;
- _numberBox.SelectedIndex = 0;
- InitUI();
- }
- public ScreeningOrder ScreeningOrder {
- get {
- return _order;
- }
- }
- /// <summary>
- /// 使用されているリソースに後処理を実行します。
- /// </summary>
- protected override void Dispose( bool disposing )
- {
- if( disposing )
- {
- if(components != null)
- {
- components.Dispose();
- }
- }
- base.Dispose( disposing );
- }
- #region Windows フォーム デザイナで生成されたコード
- /// <summary>
- /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
- /// コード エディタで変更しないでください。
- /// </summary>
- private void InitializeComponent()
- {
- this._filterGroup = new System.Windows.Forms.GroupBox();
- this._specBookmarkFolderButton = new System.Windows.Forms.Button();
- this._bookmarkFolderTextBox = new System.Windows.Forms.TextBox();
- this._filterBookmarkLabel = new System.Windows.Forms.Label();
- this._filterBox = new System.Windows.Forms.ComboBox();
- this._filterLabel = new System.Windows.Forms.Label();
- this._messageLabel = new System.Windows.Forms.Label();
- this._favoriteBox = new System.Windows.Forms.ComboBox();
- this._primaryIndicatorGroup = new System.Windows.Forms.GroupBox();
- this._lCondition = new System.Windows.Forms.Label();
- this._numberBox = new System.Windows.Forms.ComboBox();
- this._countLabel = new System.Windows.Forms.Label();
- this._primaryIndicatorBox = new System.Windows.Forms.ComboBox();
- this._primaryIndicatorLabel = new System.Windows.Forms.Label();
- this._dateGroup = new System.Windows.Forms.GroupBox();
- this._datePicker = new System.Windows.Forms.DateTimePicker();
- this._progressBar = new System.Windows.Forms.ProgressBar();
- this._okButton = new System.Windows.Forms.Button();
- this._cancelButton = new System.Windows.Forms.Button();
- this._filterGroup.SuspendLayout();
- this._primaryIndicatorGroup.SuspendLayout();
- this._dateGroup.SuspendLayout();
- this.SuspendLayout();
- //
- // _filterGroup
- //
- this._filterGroup.Controls.Add(this._specBookmarkFolderButton);
- this._filterGroup.Controls.Add(this._bookmarkFolderTextBox);
- this._filterGroup.Controls.Add(this._filterBookmarkLabel);
- this._filterGroup.Controls.Add(this._filterBox);
- this._filterGroup.Controls.Add(this._filterLabel);
- this._filterGroup.Controls.Add(this._messageLabel);
- this._filterGroup.FlatStyle = System.Windows.Forms.FlatStyle.System;
- this._filterGroup.Location = new System.Drawing.Point(8, 8);
- this._filterGroup.Name = "_filterGroup";
- this._filterGroup.Size = new System.Drawing.Size(464, 96);
- this._filterGroup.TabIndex = 0;
- this._filterGroup.TabStop = false;
- this._filterGroup.Text = "1 フィルタの設定";
- //
- // _specBookmarkFolderButton
- //
- this._specBookmarkFolderButton.FlatStyle = System.Windows.Forms.FlatStyle.System;
- this._specBookmarkFolderButton.Location = new System.Drawing.Point(368, 64);
- this._specBookmarkFolderButton.Name = "_specBookmarkFolderButton";
- this._specBookmarkFolderButton.Size = new System.Drawing.Size(80, 24);
- this._specBookmarkFolderButton.TabIndex = 6;
- this._specBookmarkFolderButton.Text = "フォルダ指定";
- this._specBookmarkFolderButton.Click += new System.EventHandler(this.OnSelectBookmarkFolder);
- //
- // _bookmarkFolderTextBox
- //
- this._bookmarkFolderTextBox.Location = new System.Drawing.Point(136, 64);
- this._bookmarkFolderTextBox.Name = "_bookmarkFolderTextBox";
- this._bookmarkFolderTextBox.ReadOnly = true;
- this._bookmarkFolderTextBox.Size = new System.Drawing.Size(224, 19);
- this._bookmarkFolderTextBox.TabIndex = 5;
- //
- // _filterBookmarkLabel
- //
- this._filterBookmarkLabel.Location = new System.Drawing.Point(24, 64);
- this._filterBookmarkLabel.Name = "_filterBookmarkLabel";
- this._filterBookmarkLabel.Size = new System.Drawing.Size(72, 16);
- this._filterBookmarkLabel.TabIndex = 4;
- this._filterBookmarkLabel.Text = "お気に入り(&T)";
- this._filterBookmarkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- //
- // _filterBox
- //
- this._filterBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this._filterBox.Location = new System.Drawing.Point(136, 40);
- this._filterBox.Name = "_filterBox";
- this._filterBox.Size = new System.Drawing.Size(224, 20);
- this._filterBox.TabIndex = 3;
- this._filterBox.SelectedIndexChanged += new System.EventHandler(this.OnFilterBoxChanged);
- //
- // _filterLabel
- //
- this._filterLabel.Location = new System.Drawing.Point(24, 40);
- this._filterLabel.Name = "_filterLabel";
- this._filterLabel.Size = new System.Drawing.Size(64, 16);
- this._filterLabel.TabIndex = 2;
- this._filterLabel.Text = "フィルタ(&F)";
- this._filterLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- //
- // _messageLabel
- //
- this._messageLabel.Location = new System.Drawing.Point(16, 16);
- this._messageLabel.Name = "_messageLabel";
- this._messageLabel.Size = new System.Drawing.Size(432, 16);
- this._messageLabel.TabIndex = 1;
- this._messageLabel.Text = "まず検索対象を決めます。ここでの対象銘柄数が少ないほど高速に結果が得られます。";
- //
- // _favoriteBox
- //
- this._favoriteBox.Location = new System.Drawing.Point(0, 0);
- this._favoriteBox.Name = "_favoriteBox";
- this._favoriteBox.Size = new System.Drawing.Size(121, 20);
- this._favoriteBox.TabIndex = 0;
- //
- // _primaryIndicatorGroup
- //
- this._primaryIndicatorGroup.Controls.Add(this._lCondition);
- this._primaryIndicatorGroup.Controls.Add(this._numberBox);
- this._primaryIndicatorGroup.Controls.Add(this._countLabel);
- this._primaryIndicatorGroup.Controls.Add(this._primaryIndicatorBox);
- this._primaryIndicatorGroup.Controls.Add(this._primaryIndicatorLabel);
- this._primaryIndicatorGroup.FlatStyle = System.Windows.Forms.FlatStyle.System;
- this._primaryIndicatorGroup.Location = new System.Drawing.Point(8, 112);
- this._primaryIndicatorGroup.Name = "_primaryIndicatorGroup";
- this._primaryIndicatorGroup.Size = new System.Drawing.Size(464, 96);
- this._primaryIndicatorGroup.TabIndex = 4;
- this._primaryIndicatorGroup.TabStop = false;
- this._primaryIndicatorGroup.Text = "2 ソート条件と件数の設定";
- //
- // _lCondition
- //
- this._lCondition.Location = new System.Drawing.Point(16, 16);
- this._lCondition.Name = "_lCondition";
- this._lCondition.Size = new System.Drawing.Size(432, 23);
- this._lCondition.TabIndex = 5;
- this._lCondition.Text = "ソート条件は拡張キットによって追加することができます。";
- this._lCondition.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- //
- // _numberBox
- //
- this._numberBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this._numberBox.Location = new System.Drawing.Point(136, 64);
- this._numberBox.Name = "_numberBox";
- this._numberBox.Size = new System.Drawing.Size(224, 20);
- this._numberBox.TabIndex = 8;
- //
- // _countLabel
- //
- this._countLabel.Location = new System.Drawing.Point(24, 64);
- this._countLabel.Name = "_countLabel";
- this._countLabel.Size = new System.Drawing.Size(100, 23);
- this._countLabel.TabIndex = 9;
- this._countLabel.Text = "表示件数(&N)";
- this._countLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- //
- // _primaryIndicatorBox
- //
- this._primaryIndicatorBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this._primaryIndicatorBox.Location = new System.Drawing.Point(136, 40);
- this._primaryIndicatorBox.Name = "_primaryIndicatorBox";
- this._primaryIndicatorBox.Size = new System.Drawing.Size(224, 20);
- this._primaryIndicatorBox.TabIndex = 7;
- //
- // _primaryIndicatorLabel
- //
- this._primaryIndicatorLabel.Location = new System.Drawing.Point(24, 40);
- this._primaryIndicatorLabel.Name = "_primaryIndicatorLabel";
- this._primaryIndicatorLabel.Size = new System.Drawing.Size(100, 23);
- this._primaryIndicatorLabel.TabIndex = 6;
- this._primaryIndicatorLabel.Text = "ソート条件(&S)";
- this._primaryIndicatorLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- //
- // _dateGroup
- //
- this._dateGroup.Controls.Add(this._datePicker);
- this._dateGroup.FlatStyle = System.Windows.Forms.FlatStyle.System;
- this._dateGroup.Location = new System.Drawing.Point(8, 216);
- this._dateGroup.Name = "_dateGroup";
- this._dateGroup.Size = new System.Drawing.Size(464, 48);
- this._dateGroup.TabIndex = 10;
- this._dateGroup.TabStop = false;
- this._dateGroup.Text = "3 スクリーニングの基準日";
- //
- // _datePicker
- //
- this._datePicker.Checked = false;
- this._datePicker.Location = new System.Drawing.Point(16, 16);
- this._datePicker.Name = "_datePicker";
- this._datePicker.Size = new System.Drawing.Size(200, 19);
- this._datePicker.TabIndex = 12;
- this._datePicker.ValueChanged += new System.EventHandler(this.OnDateChanged);
- //
- // _progressBar
- //
- this._progressBar.Location = new System.Drawing.Point(8, 272);
- this._progressBar.Name = "_progressBar";
- this._progressBar.Size = new System.Drawing.Size(464, 23);
- this._progressBar.TabIndex = 14;
- //
- // _okButton
- //
- this._okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
- this._okButton.FlatStyle = System.Windows.Forms.FlatStyle.System;
- this._okButton.Location = new System.Drawing.Point(312, 304);
- this._okButton.Name = "_okButton";
- this._okButton.Size = new System.Drawing.Size(75, 23);
- this._okButton.TabIndex = 15;
- this._okButton.Text = "OK";
- this._okButton.Click += new System.EventHandler(this.OnOK);
- //
- // _cancelButton
- //
- this._cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this._cancelButton.FlatStyle = System.Windows.Forms.FlatStyle.System;
- this._cancelButton.Location = new System.Drawing.Point(400, 304);
- this._cancelButton.Name = "_cancelButton";
- this._cancelButton.Size = new System.Drawing.Size(75, 23);
- this._cancelButton.TabIndex = 16;
- this._cancelButton.Text = "キャンセル";
- this._cancelButton.Click += new System.EventHandler(this.OnCancel);
- //
- // ScreeningDialog
- //
- this.AcceptButton = this._okButton;
- this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
- this.CancelButton = this._cancelButton;
- this.ClientSize = new System.Drawing.Size(482, 336);
- this.Controls.Add(this._dateGroup);
- this.Controls.Add(this._primaryIndicatorGroup);
- this.Controls.Add(this._progressBar);
- this.Controls.Add(this._filterGroup);
- this.Controls.Add(this._cancelButton);
- this.Controls.Add(this._okButton);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "ScreeningDialog";
- this.ShowInTaskbar = false;
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "スクリーニング条件設定";
- this._filterGroup.ResumeLayout(false);
- this._filterGroup.PerformLayout();
- this._primaryIndicatorGroup.ResumeLayout(false);
- this._dateGroup.ResumeLayout(false);
- this.ResumeLayout(false);
- }
- #endregion
- /*
- private void InitIndicatorAppearance() {
- ScreeningItem[] target = Env.CurrentIndicators.GetScreeningItems();
- _secondaryIndicatorBoxes = new CheckBox[target.Length];
- for(int i=0; i<target.Length; i++) {
- ScreeningItem item = target[i];
- _primaryIndicatorBox.Items.Add(item.Header);
- CheckBox ch = new CheckBox();
- ch.FlatStyle = FlatStyle.System;
- ch.Text = item.Header;
- ch.Left = 8 + 150 * (i % 3);
- ch.Width = 150;
- ch.Top = 12 + 24 * (i / 3);
- _secondaryIndicatorGroup.Controls.Add(ch);
- _secondaryIndicatorBoxes[i] = ch;
- }
- _primaryIndicatorBox.SelectedIndex = 0;
- }
- */
- private void InitUI() {
- ScreeningOrder o = Env.Options.PrevScreeningOrder;
- if(o!=null) {
- FilteredBrandEnumerator fbe = o.BrandEnumerator as FilteredBrandEnumerator;
- FilterType filter = fbe==null? FilterType.Favorite : fbe.FilterType;
- _filterBox.SelectedIndex = (int)filter;
- _numberBox.SelectedIndex = (int)o.PreferredResultCountType;
- _datePicker.Value = Util.IntToDate(o.OriginDate);
- }
- else {
- DateTime ld = Util.GuessLatestTradeDate();
- if(ld==DateTime.Today && DateTime.Now.Hour<17) {
- ld = ld.AddDays(-1);
- while(!Util.IsMarketOpenDate(ld)) ld = ld.AddDays(-1); //市場が開いている日の17時以前はデータ取れない
- }
- _datePicker.Value = ld;
- }
- int si = 0;
- ScreeningItem[] target = Env.CurrentIndicators.GetScreeningItems();
- for(int i=0; i<target.Length; i++) {
- ScreeningItem item = target[i];
- _primaryIndicatorBox.Items.Add(item.Header);
- if(o!=null && o.PrimaryItem==target[i])
- si = i;
- }
- _primaryIndicatorBox.SelectedIndex = si;
- }
- private void OnOK(object sender, EventArgs args) {
- this.DialogResult = DialogResult.None;
- _order = CreateScreeningOrder();
- if(_order==null) return;
- _okButton.Enabled = false;
- _filterBox.Enabled = false;
- _numberBox.Enabled = false;
- _primaryIndicatorBox.Enabled = false;
- _datePicker.Enabled = false;
- /*
- foreach(CheckBox ch in _secondaryIndicatorBoxes)
- ch.Enabled = false;
- */
- _progressBar.Maximum = _order.BrandEnumerator.Count;
- _progressBar.Value = 0;
- _progressBar.Enabled = true;
- Env.Options.PrevScreeningOrder = _order;
- this.Cursor = Cursors.AppStarting;
- _order.AsyncExecute(this.Handle);
- }
- private void OnCancel(object sender, EventArgs args) {
- if(_order!=null) {
- _order.Abort();
- }
- }
- private void OnDateChanged(object sender, EventArgs args) {
- DateTime dt = _datePicker.Value;
- }
- private ScreeningOrder CreateScreeningOrder() {
- if(_datePicker.Value.CompareTo(DateTime.Today)>0) {
- Util.Warning(this, "基準日が未来です。");
- return null;
- }
- ScreeningItem[] items = Env.CurrentIndicators.GetScreeningItems();
- int pr = _primaryIndicatorBox.SelectedIndex;
- ScreeningOrder so = new ScreeningOrder(items[pr].Header, items[pr]);
- FilterType filter = (FilterType)_filterBox.SelectedIndex;
- so.OriginDate = Util.DateToInt(_datePicker.Value);
- if(filter == FilterType.Favorite){
- if(_bookmarkFolder==null){
- Util.Warning(this, "お気に入りのフォルダを指定してください。");
- return null;
- }
- so.BrandEnumerator = new BookmarkedBrandEnumerator(_bookmarkFolder);
- }
- //yu
- else if (filter == FilterType.LastResult)
- {
- SystemTradingResult tr = Env.LastScreeningResult;
- if (tr == null) return null;
- so.BrandEnumerator = new BookmarkedBrandEnumerator2();
- }
- else
- {
- so.BrandEnumerator = new FilteredBrandEnumerator(filter);
- }
- return so;
- }
- private void ExitSuccessFully() {
- this.DialogResult = DialogResult.OK;
- this.Cursor = Cursors.Default;
- ScreeningResult r = _order.Result as ScreeningResult;
- StringBuilder msg = new StringBuilder();
- if(r.DataErrorBrands.Count==0) {
- msg.AppendFormat("スクリーニングが完了しました。\n対象銘柄数は {0} でした。\n", r.CheckedBrandCount);
- if(_order.PrimaryItem.Filter!=null)
- msg.AppendFormat("ただしフィルタで除外された {0} 銘柄は除外されました。", r.FilteredCount);
- }
- else {
- msg.AppendFormat("スクリーニングが完了しました。\n対象銘柄数 {0} のうち、\n対象日付のデータがなかった {1} 銘柄", r.CheckedBrandCount, r.DataErrorBrands.Count);
- if(r.DataErrorBrands.Count <= 10) {
- for(int i=0; i<r.DataErrorBrands.Count; i++) {
- if(i > 0) msg.Append(", ");
- msg.Append((r.DataErrorBrands[i] as BasicBrand).Code.ToString());
- }
- }
- for(int i=0; i<r.DataErrorBrands.Count; i++) {
- Debug.WriteLine("DataError "+(r.DataErrorBrands[i] as BasicBrand).Code);
- }
- if(_order.PrimaryItem.Filter!=null)
- msg.AppendFormat("、\nフィルタで除外された {0} 銘柄", r.FilteredCount);
- msg.Append("は除外されました。");
- }
- Util.Information(this, msg.ToString());
- _order.PreferredResultCountType = (ResultCountType)_numberBox.SelectedIndex;
- Close();
- }
- protected override void WndProc(ref Message m) {
- base.WndProc (ref m);
- if(m.Msg==AsyncConst.WM_ASYNCPROCESS) {
- if(m.LParam.ToInt32()==AsyncConst.LPARAM_PROGRESS_SUCCESSFUL || m.LParam.ToInt32()==AsyncConst.LPARAM_PROGRESS_FAILURE) {
- if(_progressBar.Value<_progressBar.Maximum) _progressBar.Value++;
- }
- else if(m.LParam.ToInt32()==AsyncConst.LPARAM_FINISHED)
- ExitSuccessFully();
- else if(m.LParam.ToInt32()==AsyncConst.LPARAM_ERROR) {
- this.Cursor = Cursors.Default;
- _order.Abort();
- Util.Warning(this, _order.ErrorMessage);
- this.DialogResult = DialogResult.Abort;
- Close();
- }
- }
- }
- private void OnSelectBookmarkFolder(object sender, System.EventArgs e){
- SelectBookmarkFolder dlg = new SelectBookmarkFolder();
- if(dlg.ShowDialog(Env.Frame)==DialogResult.OK){
- _bookmarkFolder = dlg.ResultFolder;
- _bookmarkFolderTextBox.Text = _bookmarkFolder.Name;
- }
- }
- private void OnFilterBoxChanged(object sender, System.EventArgs e){
- bool en = ((FilterType)_filterBox.SelectedIndex == FilterType.Favorite);
- _bookmarkFolderTextBox.Enabled = en;
- _specBookmarkFolderButton.Enabled = en;
- }
- }
- }