コード例 #1
0
        public override double Process(DateTime time)
        {
            bool   flag = true;
            double mean;
            double spread, spread_midle, spread_howmuch;

            if (filt_spread)
            {
                if (GapWorker.spread_worker(ref spread_col_call, ref spread_count_call, koef, inputs[Call], out spread, out spread_midle, out spread_howmuch))
                {
                    //logger.LogEvent(time, "Спред опционна Call " + spread + " вырос более чем в " + spread_howmuch + " раза от среднего спреда " + spread_midle);
                    flag = false;
                }
                if (GapWorker.spread_worker(ref spread_col_put, ref spread_count_put, koef, inputs[Put], out spread, out spread_midle, out spread_howmuch))
                {
                    //logger.LogEvent(time, "Спред опционна Put " + spread + " вырос более чем в " + spread_howmuch + " раза от среднего спреда " + spread_midle);
                    flag = false;
                }
            }
            if (flag)
            {
                midle_opt_price_put  = (inputs[Put].Ask + inputs[Put].Bid) / 2;
                midle_opt_price_call = (inputs[Call].Ask + inputs[Call].Bid) / 2;
            }
            if (midle_opt_price_put > inputs[Put].Ask || midle_opt_price_put < inputs[Put].Bid)
            {
                midle_opt_price_put = (inputs[Put].Ask + inputs[Put].Bid) / 2;
                Array.Clear(spread_col_put, 0, spread_col_put.Length);
            }
            if (midle_opt_price_call > inputs[Call].Ask || midle_opt_price_call < inputs[Call].Bid)
            {
                midle_opt_price_call = (inputs[Call].Ask + inputs[Call].Bid) / 2;
                Array.Clear(spread_col_call, 0, spread_col_call.Length);
            }
            double pt = inputs[Fut].Point;

            if (pt <= 0)
            {
                pt = 1.0;
            }
            double gap = (Strike - midle_opt_price_put + midle_opt_price_call - (inputs[Fut].Bid + inputs[Fut].Ask) / 2) / pt;
            double midle_gap;
            bool   flag2 = GapWorker.new_gap(ref x, ref pos, ref ready, gap, out midle_gap);

            gap -= midle_gap;
            flag = flag & flag2;
            ProcessorAction?.Invoke(new object[] { gap, inputs[Fut].Ask, inputs[Fut].Bid, time });
            return(gap);
        }
コード例 #2
0
        public override double Process(DateTime time)
        {
            double temp_value = Model.Project.Outputs[gap_position].Value;

            if (next_value_to_change == 0)
            {
                if (temp_value > min_node)
                {
                    next_peak            = temp_value;
                    peak_time            = time;
                    next_value_to_change = -min_node;
                    fut_ask = inputs[Fut].Ask;
                }
                if (temp_value < -min_node)
                {
                    next_peak            = temp_value;
                    peak_time            = time;
                    next_value_to_change = min_node;
                    fut_bid = inputs[Fut].Bid;
                }
            }
            if (next_value_to_change < 0)
            {
                if (temp_value > next_peak)
                {
                    next_peak = temp_value;
                    peak_time = time;
                    fut_ask   = inputs[Fut].Ask;
                }
                if (temp_value < -min_node)
                {
                    Value      = next_peak;
                    ValueTime  = peak_time;
                    IsNewValue = true;
                    ProcessorAction?.Invoke(new object[] { "Max", Value, fut_ask, ValueTime });
                    next_value_to_change   = min_node;
                    dealprice[dealcounter] = fut_ask;
                    dealtime[dealcounter]  = ValueTime;
                    dealcounter++;
                    if (dealtype == DealType.NONE)
                    {
                        dealtype = DealType.LONG;
                    }
                    next_peak = temp_value;
                    peak_time = time;
                    fut_ask   = inputs[Fut].Ask;
                }
            }
            if (next_value_to_change > 0)
            {
                if (temp_value < next_peak)
                {
                    next_peak = temp_value;
                    peak_time = time;
                    fut_bid   = inputs[Fut].Bid;
                }
                if (temp_value > min_node)
                {
                    Value      = next_peak;
                    ValueTime  = peak_time;
                    IsNewValue = true;
                    ProcessorAction?.Invoke(new object[] { "Min", Value, fut_bid, ValueTime });
                    next_value_to_change = -min_node;
                    //next_value_to_change = min_node;
                    dealprice[dealcounter] = fut_bid;
                    dealtime[dealcounter]  = ValueTime;
                    dealcounter++;
                    if (dealtype == DealType.NONE)
                    {
                        dealtype = DealType.SHORT;
                    }
                    next_peak = temp_value;
                    peak_time = time;
                    fut_bid   = inputs[Fut].Bid;
                }
            }
            if (dealcounter == 2)
            {
                double profit = 0;
                if (dealtype == DealType.SHORT)
                {
                    profit = dealprice[0] - dealprice[1];
                }
                else
                {
                    profit = dealprice[1] - dealprice[0];
                }
                if (profit > 0)
                {
                    global_profit += profit;
                    Deal(file_name_profit, dealtime[0], dealtime[1], profit, dealprice, global_profit, dealtype);
                }
                else
                {
                    global_lose += profit;
                    Deal(file_name_lose, dealtime[0], dealtime[1], profit, dealprice, global_lose, dealtype);
                }
                dealtime[0]  = dealtime[1];
                dealprice[0] = dealprice[1];
                dealcounter  = 1;
                if (dealtype == DealType.LONG)
                {
                    dealtype = DealType.SHORT;
                }
                else
                {
                    dealtype = DealType.LONG;
                }
            }
            return(Value);
            //throw new NotImplementedException();
        }