private void ListViewSecurity_SelectedIndexChanged(object sender, EventArgs e) { Point cursorPoint = this.ListViewSecurity.PointToClient(Cursor.Position); ListViewItem listViewItem = this.ListViewSecurity.GetItemAt(cursorPoint.X, cursorPoint.Y); if (listViewItem == null) { return; } else { this.ListViewPrice.VirtualListSize = 0; this.ListViewPrice.Items.Clear(); } IntPtr hSecurity = IntPtr.Zero; if (m_SecurityDictionary.TryGetValue(listViewItem, out hSecurity) == false) { return; } int iErr = MSFL.MSFL1_LockSecurity(hSecurity, MSFL.MSFL_LOCK_PREV_WRITE_LOCK); if (iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR) { return; } ushort wPriceRecCount = 0; iErr = MSFL.MSFL1_GetDataRecordCount(hSecurity, ref wPriceRecCount); if (iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR) { return; } if (wPriceRecCount > 0) { iErr = MSFL.MSFL1_SeekBeginData(hSecurity); if (iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR) { return; } MSFL.DateTime sDateTime = new MSFL.DateTime(); MSFL.MSFLPriceRecord[] pPriceRec = new MSFL.MSFLPriceRecord[wPriceRecCount]; iErr = MSFL.MSFL2_ReadMultipleRecs(hSecurity, pPriceRec, ref sDateTime, ref wPriceRecCount, (int)MSFL.MSFL_FIND.MSFL_FIND_USE_CURRENT_POS); if (iErr != (int)MSFL.MSFL_ERR.MSFL_NO_ERR) { return; } // Unlock the security (we're done using it) iErr = MSFL.MSFL1_UnlockSecurity(hSecurity); // numbers for summing price info float fOpenSum = 0.0f, fHighSum = 0.0f, fLowSum = 0.0f, fCloseSum = 0.0f, fVolumeSum = 0.0f, fOpenIntSum = 0.0f; List <ListViewItem> listViewItemList = new List <ListViewItem>(2048); StringBuilder szBuf = new StringBuilder(MSFL.MSFL_MAX_NAME_LENGTH + 1); for (int iIndex = 0; iIndex < pPriceRec.Length; iIndex++) { MSFL.MSFLPriceRecord msflPriceRecord = pPriceRec[iIndex]; listViewItem = new ListViewItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_DATE) == MSFL.MSFL_DATA_DATE) { MSFL.MSFL1_FormatDate(szBuf, (ushort)szBuf.Capacity, msflPriceRecord.lDate); listViewItem.Text = szBuf.ToString(); } else { listViewItem.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem1 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_TIME) == MSFL.MSFL_DATA_TIME) { MSFL.MSFL1_FormatTime(szBuf, (ushort)szBuf.Capacity, msflPriceRecord.lTime, true); subListViewItem1.Text = szBuf.ToString(); } else { subListViewItem1.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem2 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_OPEN) == MSFL.MSFL_DATA_OPEN) { fOpenSum += msflPriceRecord.fOpen; subListViewItem2.Text = msflPriceRecord.fOpen.ToString("0.00", CultureInfo.InvariantCulture); } else { subListViewItem2.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem3 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_HIGH) == MSFL.MSFL_DATA_HIGH) { fHighSum += msflPriceRecord.fHigh; subListViewItem3.Text = msflPriceRecord.fHigh.ToString("0.00", CultureInfo.InvariantCulture); } else { subListViewItem3.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem4 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_LOW) == MSFL.MSFL_DATA_LOW) { fLowSum += msflPriceRecord.fLow; subListViewItem4.Text = msflPriceRecord.fLow.ToString("0.00", CultureInfo.InvariantCulture); } else { subListViewItem4.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem5 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_CLOSE) == MSFL.MSFL_DATA_CLOSE) { fCloseSum += msflPriceRecord.fClose; subListViewItem5.Text = msflPriceRecord.fClose.ToString("0.00", CultureInfo.InvariantCulture); } else { subListViewItem5.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem6 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_VOLUME) == MSFL.MSFL_DATA_VOLUME) { fVolumeSum += msflPriceRecord.fVolume; subListViewItem6.Text = msflPriceRecord.fVolume.ToString("0.", CultureInfo.InvariantCulture); } else { subListViewItem6.Text = "N/A"; } ListViewItem.ListViewSubItem subListViewItem7 = new ListViewItem.ListViewSubItem(); if ((msflPriceRecord.wDataAvailable & MSFL.MSFL_DATA_OPENINT) == MSFL.MSFL_DATA_OPENINT) { fOpenIntSum += msflPriceRecord.fOpenInt; subListViewItem7.Text = msflPriceRecord.fOpenInt.ToString("0.00", CultureInfo.InvariantCulture); } else { subListViewItem7.Text = "N/A"; } listViewItem.SubItems.Add(subListViewItem1); listViewItem.SubItems.Add(subListViewItem2); listViewItem.SubItems.Add(subListViewItem3); listViewItem.SubItems.Add(subListViewItem4); listViewItem.SubItems.Add(subListViewItem5); listViewItem.SubItems.Add(subListViewItem6); listViewItem.SubItems.Add(subListViewItem7); //this.ListViewPrice.Items.Add( listViewItem ); listViewItemList.Add(listViewItem); } m_PriceArray = listViewItemList.ToArray(); this.ListViewPrice.VirtualListSize = m_PriceArray.Length; } }
private void FillData() { StringBuilder szBuf = new StringBuilder(MSFL.MSFL_MAX_NAME_LENGTH + 1); // The number of days for stock data int period = m_PriceRecordArray.Length > 60 ? 60 : m_PriceRecordArray.Length; // numbers for summing price info double fHigh = 0.0f, fLow = 0.0f; double fVolumeHigh = 0.0f, fVolumeLow = 0.0f; for (int iIndex = 0; iIndex < period; iIndex++) { MSFL.MSFLPriceRecord msflPriceRecord = m_PriceRecordArray[iIndex]; // The first High value double high = Math.Round(msflPriceRecord.fHigh, 2); if (high > fHigh) { fHigh = high; } // The first Close value double close = Math.Round(msflPriceRecord.fClose, 2); // The first Low value double low = Math.Round(msflPriceRecord.fLow, 2); if (fLow == 0.0f) { fLow = low; } else if (low < fLow) { fLow = low; } // The first Open value double open = Math.Round(msflPriceRecord.fOpen, 2); // The first Volume value double volume = Math.Truncate(msflPriceRecord.fVolume); if (volume > fVolumeHigh) { fVolumeHigh = volume; } if (volume == 0.0f) { fVolumeLow = volume; } else if (volume < fVolumeLow) { fVolumeLow = volume; } // Set data points values MSFL.MSFL1_FormatDate(szBuf, (ushort)szBuf.Capacity, msflPriceRecord.lDate); DateTime dateTime = DateTime.Parse(szBuf.ToString()); chart1.Series["PriceSeries"].Points.AddXY(dateTime, high); //chart1.Series["PriceSeries"].Points[iIndex].XValue = dateTime; if ((iIndex % 7) == 0) { chart1.Series["CurveAtPriceSeries"].Points.AddXY(dateTime, high); } double isUpOrDown = open <= close ? UP : DOWN; chart1.Series["PriceSeries"].Points[iIndex].YValues[1] = low; chart1.Series["PriceSeries"].Points[iIndex].YValues[2] = isUpOrDown == UP ? open : close; // open chart1.Series["PriceSeries"].Points[iIndex].YValues[3] = isUpOrDown == UP ? close : open; // close //chart1.Series["PriceSeries"].Points[iIndex].YValues[4] = isUpOrDown; if (isUpOrDown == UP) { chart1.Series["PriceSeries"].Points[iIndex].Color = Color.Green; chart1.Series["PriceSeries"].Points[iIndex].BackGradientEndColor = Color.White; chart1.Series["PriceSeries"].Points[iIndex].BackGradientType = GradientType.VerticalCenter; chart1.Series["PriceSeries"].Points[iIndex].BorderWidth = 1; chart1.Series["PriceSeries"].Points[iIndex].BorderColor = Color.Green; chart1.Series["PriceSeries"].Points[iIndex].BorderStyle = ChartDashStyle.Solid; } else { chart1.Series["PriceSeries"].Points[iIndex].Color = Color.Red; chart1.Series["PriceSeries"].Points[iIndex].BackGradientEndColor = Color.White; chart1.Series["PriceSeries"].Points[iIndex].BackGradientType = GradientType.VerticalCenter; chart1.Series["PriceSeries"].Points[iIndex].BorderWidth = 1; chart1.Series["PriceSeries"].Points[iIndex].BorderColor = Color.Red; chart1.Series["PriceSeries"].Points[iIndex].BorderStyle = ChartDashStyle.Solid; } // Set volume values chart1.Series["VolumeSeries"].Points.AddXY(dateTime, volume); if (isUpOrDown == UP) { chart1.Series["VolumeSeries"].Points[iIndex].Color = Color.Green; chart1.Series["VolumeSeries"].Points[iIndex].BackGradientEndColor = Color.White; chart1.Series["VolumeSeries"].Points[iIndex].BackGradientType = GradientType.VerticalCenter; chart1.Series["VolumeSeries"].Points[iIndex].BorderColor = Color.Green; } else { chart1.Series["VolumeSeries"].Points[iIndex].Color = Color.Red; chart1.Series["VolumeSeries"].Points[iIndex].BackGradientEndColor = Color.White; chart1.Series["VolumeSeries"].Points[iIndex].BackGradientType = GradientType.VerticalCenter; chart1.Series["VolumeSeries"].Points[iIndex].BorderColor = Color.Red; } } double fSun = fHigh - fLow; chart1.ChartAreas["PriceArea"].AxisY.Interval = fSun / 10; //fSun = fVolumeHigh - fVolumeLow; //chart1.ChartAreas["VolumeArea"].AxisY2.Interval = Math.Truncate( fSun ) / 5; }