/// <summary> /// 创建数据源 /// </summary> /// <param name="chart">股票控件</param> /// <returns>数据源</returns> public static FCDataTable createDataSource(FCChart chart) { FCDataTable dataSource = new FCDataTable(); dataSource.addColumn(KeyFields.CLOSE_INDEX); dataSource.addColumn(KeyFields.HIGH_INDEX); dataSource.addColumn(KeyFields.LOW_INDEX); dataSource.addColumn(KeyFields.OPEN_INDEX); dataSource.addColumn(KeyFields.VOL_INDEX); dataSource.addColumn(KeyFields.AMOUNT_INDEX); return(dataSource); }
/// <summary> /// 添加指标 /// </summary> /// <param name="chart">股票控件</param> /// <param name="dataSource">数据源</param> /// <param name="text">文本</param> /// <param name="parameters">参数</param> public static FCScript createIndicator(FCChart chart, FCDataTable dataSource, String text, String parameters) { FCScript indicator = new FCScript(); indicator.DataSource = dataSource; indicator.Name = ""; //indicator.FullName = ""; if (dataSource != null) { indicator.setSourceField(KeyFields.CLOSE, KeyFields.CLOSE_INDEX); indicator.setSourceField(KeyFields.HIGH, KeyFields.HIGH_INDEX); indicator.setSourceField(KeyFields.LOW, KeyFields.LOW_INDEX); indicator.setSourceField(KeyFields.OPEN, KeyFields.OPEN_INDEX); indicator.setSourceField(KeyFields.VOL, KeyFields.VOL_INDEX); indicator.setSourceField(KeyFields.AMOUNT, KeyFields.AMOUNT_INDEX); indicator.setSourceField(KeyFields.CLOSE.Substring(0, 1), KeyFields.CLOSE_INDEX); indicator.setSourceField(KeyFields.HIGH.Substring(0, 1), KeyFields.HIGH_INDEX); indicator.setSourceField(KeyFields.LOW.Substring(0, 1), KeyFields.LOW_INDEX); indicator.setSourceField(KeyFields.OPEN.Substring(0, 1), KeyFields.OPEN_INDEX); indicator.setSourceField(KeyFields.VOL.Substring(0, 1), KeyFields.VOL_INDEX); indicator.setSourceField(KeyFields.AMOUNT.Substring(0, 1), KeyFields.AMOUNT_INDEX); } IndicatorData indicatorData = new IndicatorData(); indicatorData.m_parameters = parameters; indicatorData.m_script = text; indicator.Tag = indicatorData; String constValue = ""; if (parameters != null && parameters.Length > 0) { String[] strs = parameters.Split(new String[] { ";" }, StringSplitOptions.RemoveEmptyEntries); int strsSize = strs.Length; for (int i = 0; i < strsSize; i++) { String str = strs[i]; String[] strs2 = str.Split(new String[] { "," }, StringSplitOptions.RemoveEmptyEntries); constValue += "const " + strs2[0] + ":" + strs2[3] + ";"; } } if (text != null && text.Length > 0) { indicator.Script = constValue + text; } return(indicator); }
/// <summary> /// 插入最新数据 /// </summary> /// <param name="chart">股票控件</param> /// <param name="dataSource">数据源</param> /// <param name="indicators">指标</param> /// <param name="fields">字段</param> /// <param name="historyDatas">最近的历史数据</param> /// <param name="latestData">实时数据</param> /// <returns>索引</returns> public static int insertLatestData(FCChart chart, FCDataTable dataSource, List <FCScript> indicators, int[] fields, SecurityData latestData) { if (latestData.m_close > 0 && latestData.m_volume > 0) { int indicatorsSize = indicators.Count; int index = insertData(chart, dataSource, fields, latestData); for (int i = 0; i < indicatorsSize; i++) { indicators[i].onCalculate(index); } return(index); } else { return(-1); } }
/// <summary> /// 插入数据 /// </summary> /// <param name="chart">证券控件</param> /// <param name="dataSource">数据源</param> /// <param name="fields">字段</param> /// <param name="securityData">证券数据</param> /// <returns>索引</returns> public static int insertData(FCChart chart, FCDataTable 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], volume); dataSource.set2(index, fields[6], avgPrice); return(index); }
/// <summary> /// 创建指标 /// </summary> /// <param name="text">脚本</param> /// <param name="parameters">参数</param> /// <returns>指标ID</returns> public static int createIndicatorExtern(String text, String parameters, StringBuilder fields) { try { if (m_native == null) { m_native = new FCNative(); } if (m_chart == null) { m_chart = new FCChart(); m_chart.Native = m_native; } m_serialNumber++; FCDataTable dataSource = new FCDataTable(); dataSource.addColumn(KeyFields.CLOSE_INDEX); dataSource.addColumn(KeyFields.HIGH_INDEX); dataSource.addColumn(KeyFields.LOW_INDEX); dataSource.addColumn(KeyFields.OPEN_INDEX); dataSource.addColumn(KeyFields.VOL_INDEX); dataSource.addColumn(KeyFields.AMOUNT_INDEX); FCScript indicator = SecurityDataHelper.createIndicator(m_chart, dataSource, text, parameters); m_indicators[m_serialNumber] = indicator; indicator.onCalculate(0); int pos = 0; int variablesSize = indicator.MainVariables.Count; foreach (String field in indicator.MainVariables.Keys) { fields.Append(field); if (pos != variablesSize - 1) { fields.Append(","); } pos++; } } catch (Exception ex) { Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace); } return(m_serialNumber); }
/// <summary> /// 绑定历史数据 /// </summary> /// <param name="chart">股票控件</param> /// <param name="dataSource">数据源</param> /// <param name="indicators">指标</param> /// <param name="fields">字段</param> /// <param name="historyDatas">历史数据</param> public static void bindHistoryDatas(FCChart chart, FCDataTable dataSource, List <FCScript> indicators, int[] fields, List <SecurityData> historyDatas) { dataSource.clear(); int size = historyDatas.Count; dataSource.setRowsCapacity(size + 10); dataSource.setRowsGrowStep(100); int columnsCount = dataSource.ColumnsCount; for (int i = 0; i < size; i++) { SecurityData securityData = historyDatas[i]; if (dataSource == chart.DataSource) { insertData(chart, dataSource, fields, securityData); } else { double[] ary = new double[columnsCount]; ary[0] = securityData.m_close; ary[1] = securityData.m_high; ary[2] = securityData.m_low; ary[3] = securityData.m_open; ary[4] = securityData.m_volume; for (int j = 5; j < columnsCount; j++) { ary[j] = double.NaN; } dataSource.AddRow(securityData.m_date, ary, columnsCount); } } int indicatorsSize = indicators.Count; for (int i = 0; i < indicatorsSize; i++) { indicators[i].onCalculate(0); } }
/// <summary> /// 创建图形控件属性 /// </summary> /// <param name="node">节点</param> /// <param name="chart">图形控件</param> protected virtual void createChartSubProperty(XmlNode node, FCChart chart) { foreach (XmlNode node2 in node.ChildNodes) { String nodeName2 = node2.Name.ToLower(); if (nodeName2 == "div") { ChartDiv div = chart.addDiv(); setAttributesBefore(node2, div); foreach (XmlNode node3 in node2.ChildNodes) { String nodeName3 = node3.Name.ToLower(); if (nodeName3 == "titlebar") { ChartTitleBar titleBar = div.TitleBar; setAttributesBefore(node3, titleBar); setAttributesAfter(node3, titleBar); } } setAttributesAfter(node2, div); } } }