示例#1
0
        /// <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);
        }
示例#2
0
 /// <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();
         }
     }
 }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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();
            }
        }
示例#5
0
 /// <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);
 }