/// <summary> /// 获取目标K线的坐标 /// </summary> /// <param name="location">目标K线的坐标</param> /// <param name="destHighY">移动到目标K线最高点的Y坐标</param> private void GetDestPos(ref POINT location, ref float destHighY) { ChartA chart = m_chart.Chart; CTable dataSource = chart.DataSource; int rowIndex = dataSource.GetRowIndex(m_data.m_date); int insRowIndex = rowIndex; int size = dataSource.RowsCount; if (rowIndex == -1) { for (int i = 0; i < size; i++) { double pk = dataSource.GetXValue(i); if (pk > m_data.m_date) { insRowIndex = i; break; } } } if (insRowIndex == -1 || insRowIndex > chart.LastVisibleIndex) { insRowIndex = chart.LastVisibleIndex; } double insLow = dataSource.Get2(insRowIndex, KeyFields.LOW_INDEX); float xDest = chart.GetX(insRowIndex); List <CDiv> divs = chart.GetDivs(); float yDest = chart.GetY(divs[0], insLow, AttachVScale.Left); location.x = (int)(xDest); location.y = (int)(yDest); destHighY = chart.GetY(divs[0], m_data.m_high, AttachVScale.Left); }
/// <summary> /// 执行秒表方法 /// </summary> /// <param name="timerID">秒表ID</param> public void OnTimer(int timerID) { if (m_timerID == timerID) { INativeBase native = Native; ChartA chart = m_chart.Chart; CTable dataSource = chart.DataSource; int divsSize = m_divs.Count; bool painting = false; int cx = native.ClientX(m_window); int cy = native.ClientY(m_window); List <SandBoxCandleDiv> removeDivs = new List <SandBoxCandleDiv>(); for (int i = 0; i < divsSize; i++) { SandBoxCandleDiv div = m_divs[i]; //判断是否需要重绘 if (div.Moving) { painting = true; } //执行秒表 if (m_divs[i].OnTimer()) { SecurityData data = div.Data; int rowIndex = dataSource.GetRowIndex(data.m_date); int[] fields = new int[7]; fields[0] = KeyFields.CLOSE_INDEX; fields[1] = KeyFields.HIGH_INDEX; fields[2] = KeyFields.LOW_INDEX; fields[3] = KeyFields.OPEN_INDEX; fields[4] = KeyFields.VOL_INDEX; fields[5] = KeyFields.AMOUNT_INDEX; fields[6] = KeyFields.AVGPRICE_INDEX; //插入数据 SecurityDataHelper.InsertLatestData(m_chart.Chart, dataSource, m_chart.Indicators, fields, data); removeDivs.Add(div); } } //移除控件 int removeDivsSize = removeDivs.Count; if (removeDivsSize > 0) { for (int i = 0; i < removeDivsSize; i++) { SandBoxCandleDiv div = removeDivs[i]; m_native.RemoveControl(div); m_divs.Remove(div); div.Dispose(); } removeDivs.Clear(); m_chart.Chart.Update(); } //重绘 if (painting) { m_native.Invalidate(); } } }
/// <summary> /// 插入数据 /// </summary> /// <param name="chart">证券控件</param> /// <param name="dataSource">数据源</param> /// <param name="fields">字段</param> /// <param name="securityData">证券数据</param> /// <returns>索引</returns> public static int InsertData(ChartA chart, CTable dataSource, int[] fields, SecurityData securityData) { double close = securityData.m_close, high = securityData.m_high, low = securityData.m_low, open = securityData.m_open, avgPrice = securityData.m_avgPrice, volume = securityData.m_volume, amount = securityData.m_amount; if (volume > 0 || close > 0) { if (high == 0) { high = close; } if (low == 0) { low = close; } if (open == 0) { open = close; } if (avgPrice == 0) { avgPrice = double.NaN; } } else { close = double.NaN; high = double.NaN; low = double.NaN; open = double.NaN; volume = double.NaN; amount = double.NaN; avgPrice = double.NaN; } double date = securityData.m_date; dataSource.Set(date, fields[4], volume); int index = dataSource.GetRowIndex(date); dataSource.Set2(index, fields[0], close); dataSource.Set2(index, fields[1], high); dataSource.Set2(index, fields[2], low); dataSource.Set2(index, fields[3], open); dataSource.Set2(index, fields[5], amount); dataSource.Set2(index, fields[6], avgPrice); return(index); }
/// <summary> /// 把指定日期K线的高开低收数据设置到画面的数值控件上 /// </summary> /// <param name="date">日期</param> private void SetSpinValue(double date) { ChartA chart = m_chart.Chart; CTable dataSource = chart.DataSource; int rowsCount = dataSource.RowsCount; if (rowsCount > 0) { int index = dataSource.GetRowIndex(date); if (index < 1) { index = rowsCount - 1; } SpinA spinOpen = GetSpin("txtOpen"); SpinA spinClose = GetSpin("txtClose"); SpinA spinHigh = GetSpin("txtHigh"); SpinA spinLow = GetSpin("txtLow"); SpinA spinVolume = GetSpin("txtVolume"); SpinA spinAmount = GetSpin("txtAmount"); LabelA lblDate = GetLabel("lblDate"); spinOpen.Value = dataSource.Get2(index, KeyFields.OPEN_INDEX); spinClose.Value = dataSource.Get2(index, KeyFields.CLOSE_INDEX); spinHigh.Value = dataSource.Get2(index, KeyFields.HIGH_INDEX); spinLow.Value = dataSource.Get2(index, KeyFields.LOW_INDEX); spinVolume.Value = dataSource.Get2(index, KeyFields.VOL_INDEX); spinAmount.Value = dataSource.Get2(index, KeyFields.AMOUNT_INDEX); DateTime dateTime = m_chart.Chart.ConvertNumToDate(date); int m_cycle = m_chart.Cycle; if (m_cycle <= 60) { lblDate.Text = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); } else { lblDate.Text = dateTime.ToString("yyyy-MM-dd"); } m_window.Invalidate(); } }
/// <summary> /// 宏运行中 /// </summary> /// <param name="macro">宏</param> /// <returns>状态</returns> public virtual int OnMacroRunning(Macro macro) { if (OnMacroStart(macro) == 0) { return(0); } if (macro.m_script.Length > 0) { int endIndex = m_chart.Index; ChartA ct = m_chart.Chart; CTable dataSource = ct.DataSource; CTable newDataSource = SecurityDataHelper.CreateDataSource(ct); int interval = macro.m_interval; CIndicator indicator = SecurityDataHelper.CreateIndicator(ct, newDataSource, "", ""); //indicator.AddFunction(new CFunctionEx(indicator, 1000, "ALERT", m_mainFrame-)); //indicator.AddFunction(new CFunctionEx(indicator, 1001, "SETCYCLE", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1002, "SETLAYOUT", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1003, "SETCODE", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1004, "SHOWWINDOW", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1005, "SLEEP", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1006, "SCROLLLEFT", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1007, "SCROLLRIGHT", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1008, "ZOOMIN", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1009, "ZOOMOUT", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1010, "WIN_MOUSEEVENT", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1011, "WIN_SETTEXT", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1012, "WIN_EXECUTE", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1013, "WIN_SENDKEY", m_chart)); //indicator.AddFunction(new CFunctionEx(indicator, 1014, "WIN_GETVALUE", m_chart)); indicator.Script = macro.m_script; int[] fields = new int[] { KeyFields.CLOSE_INDEX, KeyFields.HIGH_INDEX, KeyFields.LOW_INDEX, KeyFields.OPEN_INDEX, KeyFields.VOL_INDEX, KeyFields.AMOUNT_INDEX }; int fieldsSize = fields.Length; int startIndex = endIndex - (interval - 1); if (startIndex < 0) { startIndex = 0; } if (startIndex > endIndex) { startIndex = endIndex; } if (macro.m_type == 0 || macro.m_type == 2 || endIndex == -1) { double date = 0; newDataSource.Set(date, KeyFields.VOL_INDEX, 0); int index = newDataSource.GetRowIndex(date); for (int j = 0; j < fieldsSize; j++) { if (fields[j] != KeyFields.VOL_INDEX) { newDataSource.Set2(index, fields[j], 0); } } } else { for (int i = startIndex; i <= endIndex; i++) { double date = dataSource.GetXValue(i); newDataSource.Set(date, KeyFields.VOL_INDEX, dataSource.Get2(i, KeyFields.VOL_INDEX)); int index = newDataSource.GetRowIndex(date); for (int j = 0; j < fieldsSize; j++) { if (fields[j] != KeyFields.VOL_INDEX) { newDataSource.Set2(index, fields[j], dataSource.Get2(i, fields[j])); } } } } if (macro.m_type == 1 || macro.m_type == 3) { indicator.OnCalculate(0); } else { for (int i = 0; i < interval; i++) { indicator.OnCalculate(0); } } indicator.Clear(); indicator.Dispose(); newDataSource.Dispose(); } OnMacroEnd(macro); return(1); }