Files
MarketWatch/MarketWatch.cs
2017-02-02 11:47:45 +09:00

258 lines
7.3 KiB
C#

using MaterialSkin;
using MaterialSkin.Controls;
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MarketWatchNS
{
public partial class MarketWatch : MaterialForm
{
CybosHelper m_CybosHelper = null;
class ITEM
{
public int m_iSeq;
public string m_strCode;
public string m_strCodeName;
public int m_iEventCode;
public DateTime m_RecevedTime;
public int m_iStartPrice = 0;
public int m_iLowPrice = 10000000;
public float m_fLowP = 0.0f;
public int m_iHighPrice = 0;
public float m_fHighP = 0.0f;
}
ConcurrentQueue<ITEM> m_ItemList = new ConcurrentQueue<ITEM>();
System.Timers.Timer m_PriceCheckTimer = new System.Timers.Timer();
System.Timers.Timer m_SystemTimer = new System.Timers.Timer();
public MarketWatch()
{
InitializeComponent();
lvItems.ListViewItemSorter = new ListViewItemComparer(chSeq.Index, SortOrder.Ascending);
lvItems.Sorting = SortOrder.Ascending;
Util.SetLogView(tbLog);
Config.Init();
m_CybosHelper = new CybosHelper(this);
var materialSkinManager = MaterialSkinManager.Instance;
materialSkinManager.AddFormToManage(this);
materialSkinManager.Theme = MaterialSkinManager.Themes.DARK;
materialSkinManager.ColorScheme = new ColorScheme(Primary.BlueGrey800, Primary.BlueGrey900, Primary.BlueGrey500, Accent.LightBlue200, TextShade.WHITE);
m_PriceCheckTimer.Interval = 500;
m_PriceCheckTimer.Elapsed += PriceCheckTimer_Elapsed;
m_PriceCheckTimer.Start();
m_SystemTimer.Interval = 100;
m_SystemTimer.Elapsed += SystemTimer_Elapsed;
;
m_SystemTimer.Start();
}
private void SystemTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(lbInfo.InvokeRequired)
{
lbInfo.Invoke(new Action(() => {
lbInfo.Text = string.Format("{0}|{1}",
m_CybosHelper.GetLimitRemainCountRQ(),
m_CybosHelper.GetLimitRemainCountSB());
}));
}
else
{
lbInfo.Text = string.Format("{0}|{1}",
m_CybosHelper.GetLimitRemainCountRQ(),
m_CybosHelper.GetLimitRemainCountSB());
}
}
private void PriceCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
foreach(ITEM Item in m_ItemList)
{
if(Item.m_iHighPrice > 0)
continue;
if((DateTime.Now-Item.m_RecevedTime).Seconds < 20)
continue;
m_CybosHelper.GetLowHighPrice(Item.m_strCode, Item.m_RecevedTime, 5, out Item.m_iLowPrice, out Item.m_iHighPrice);
Item.m_fLowP = (Item.m_iLowPrice-Item.m_iStartPrice)*100/(float)Item.m_iStartPrice;
Item.m_fHighP = (Item.m_iHighPrice-Item.m_iStartPrice)*100/(float)Item.m_iStartPrice;
if(Item.m_iHighPrice > 0)
{
if(lvItems.InvokeRequired)
{
lvItems.Invoke(new Action(() => {
ListViewItem item = lvItems.Items.Cast<ListViewItem>().FirstOrDefault(s => s.SubItems[chSeq.Index].Text == Item.m_iSeq.ToString());
item.SubItems[chLowPrice.Index].Text = string.Format("{0:n0}", Item.m_iLowPrice);
item.SubItems[chLowP.Index].Text = string.Format("{0:n2}", Item.m_fLowP);
if(Item.m_fLowP > 0)
item.SubItems[chLowP.Index].ForeColor = Color.Red;
else if(Item.m_fLowP < 0)
item.SubItems[chLowP.Index].ForeColor = Color.Blue;
item.SubItems[chHighPrice.Index].Text = string.Format("{0:n0}", Item.m_iHighPrice);
item.SubItems[chHighP.Index].Text = string.Format("{0:n2}", Item.m_fHighP);
if(Item.m_fHighP > 0)
item.SubItems[chHighP.Index].ForeColor = Color.Red;
else if(Item.m_fHighP < 0)
item.SubItems[chHighP.Index].ForeColor = Color.Blue;
}));
}
else
{
ListViewItem item = lvItems.Items.Cast<ListViewItem>().FirstOrDefault(s => s.SubItems[chSeq.Index].Text == Item.m_iSeq.ToString());
item.SubItems[chLowPrice.Index].Text = string.Format("{0:n0}", Item.m_iLowPrice);
item.SubItems[chLowP.Index].Text = string.Format("{0:n2}", Item.m_fLowP);
if(Item.m_fLowP > 0)
item.SubItems[chLowP.Index].ForeColor = Color.Red;
else if(Item.m_fLowP < 0)
item.SubItems[chLowP.Index].ForeColor = Color.Blue;
item.SubItems[chHighPrice.Index].Text = string.Format("{0:n0}", Item.m_iHighPrice);
item.SubItems[chHighP.Index].Text = string.Format("{0:n2}", Item.m_fHighP);
if(Item.m_fHighP > 0)
item.SubItems[chHighP.Index].ForeColor = Color.Red;
else if(Item.m_fHighP < 0)
item.SubItems[chHighP.Index].ForeColor = Color.Blue;
}
}
}
}
public void SetAccountList(string[] aAccountList)
{
}
private void btCybos_Click(object sender, EventArgs e)
{
m_CybosHelper.InitCybos();
btCybos.Primary = false;
btCybos.Enabled = false;
}
public void OnWatchReceived(int iTime, string strCode, string strCodeName, bool bNew, int iEventCode)
{
if(bNew == false)
return;
int iSeq = lvItems.Items.Count+1;
ITEM Item = new ITEM();
Item.m_iSeq = iSeq;
Item.m_strCode = strCode;
Item.m_strCodeName = strCodeName;
Item.m_iEventCode = iEventCode;
Item.m_RecevedTime = DateTime.Now;
Item.m_iStartPrice = m_CybosHelper.GetCurPrice(strCode);
m_ItemList.Enqueue(Item);
if(lvItems.InvokeRequired)
{
lvItems.Invoke(new Action(() => {
lvItems.Items.Add(new ListViewItem(new string[]
{
iSeq.ToString(),
string.Format("{0}:{1}", iTime/100, iTime%100),
DateTime.Now.ToString("hh:MM:ss:fff"),
strCode,
strCodeName,
m_CybosHelper.GetEventCodeStr(iEventCode),
string.Format("{0:n0}",
Item.m_iStartPrice),
"",
"",
"",
""
}));
lvItems.Items[lvItems.Items.Count-1].UseItemStyleForSubItems = false;
}));
}
else
{
lvItems.Items.Add(new ListViewItem(new string[]
{
iSeq.ToString(),
string.Format("{0}:{1}", iTime/100, iTime%100),
DateTime.Now.ToString("hh:MM:ss:fff"),
strCode,
strCodeName,
m_CybosHelper.GetEventCodeStr(iEventCode),
string.Format("{0:n0}",
Item.m_iStartPrice),
"",
"",
"",
""
}));
lvItems.Items[lvItems.Items.Count-1].UseItemStyleForSubItems = false;
}
}
private void lvItems_ColumnClick(object sender, ColumnClickEventArgs e)
{
SortOrder Order = (lvItems.Sorting == SortOrder.Descending || lvItems.Sorting == SortOrder.None) ? SortOrder.Ascending : SortOrder.Descending;
lvItems.ListViewItemSorter = new ListViewItemComparer(e.Column, Order);
lvItems.Sorting = Order;
lvItems.Sort();
}
}
class ListViewItemComparer : IComparer
{
int m_iColumn = 0;
SortOrder m_Order = SortOrder.Ascending;
public ListViewItemComparer(int column, SortOrder Order)
{
m_iColumn = column;
m_Order = Order;
}
public int Compare(object x, object y)
{
ListViewItem item1 = (ListViewItem)x;
ListViewItem item2 = (ListViewItem)y;
double num1;
double num2;
if(double.TryParse(item1.SubItems[m_iColumn].Text, out num1) &&
double.TryParse(item2.SubItems[m_iColumn].Text, out num2))
{
return (num1>num2) ? 1 : -1;
}
else
{
if(m_Order == SortOrder.Ascending)
return string.Compare(item1.SubItems[m_iColumn].Text, item2.SubItems[m_iColumn].Text);
else
return string.Compare(item2.SubItems[m_iColumn].Text, item1.SubItems[m_iColumn].Text);
}
}
}
}