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); }
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(); }