private void ControlEvent() { //Контроль расхождения if (numericUpDownDiffPriceControll.Value < DataArb.diffPrice && DataArb.diffPrice > 0 && numericUpDownDiffPriceControll.Value > 0 && numericUpDownFutPos.Value > 0 && checkBoxEnableControl.Checked ) { CountEvent++; if (CountEvent >= 3) { var now = DateTime.Now; if (LastSignal.AddMinutes(PERIOD_SIGNAL) < now) { LastSignal = now; if (checkBoxEnableTrade.Enabled && DataArb.baseCurPos == 0 && DataArb.futCurPos == 0) { activeTrade(); } Form_MessageSignal.Show("Arbitration " + SecFut.ToString() + " <=> " + SecBase.ToString() + " diff: " + DataArb.diffPrice.ToString(), SecFut.ToString(), true); } } } else { //Если за 3 такта не сохранилось расхождение, то сбрасываем CountEvent = 0; } }
/// <summary> Переодически обновитель данных </summary> public void UpdaterDataFirst(DispatcherTimer timer) { if (ListPanels.Count == 0 || Parent.CheckKliring()) { return; } var stopOrders = Parent.Trader.Objects.tStopOrders.SearchAll(so => so.IsActive() && so.Comment.Contains(Define.STOP_LOSS)); foreach (var pan in ListPanels) { pan.LabelPosition.Text = "0"; if (pan.TrElement.NotIsNull() && pan.Position.NotIsNull()) { decimal StopLossValue = 0; pan.LabelPosition.Text = pan.Position.Data.CurrentNet.ToString(); var countPos = pan.Position.CurrentVolume; if (pan.TrElement.Security.LastPrice > 0) { if (stopOrders.Count() > 0) { var stOrdSec = stopOrders.Where(o => o.Sec == pan.TrElement.Security); if (stOrdSec.Count() == 1) { if (countPos != 0) { var lastOrd = stOrdSec.Last(); //Расчет предпологаемого убытка decimal StopValue = lastOrd.ConditionPrice - pan.TrElement.Security.LastPrice; StopValue = StopValue < 0 ? StopValue * -1 : StopValue; StopValue = (StopValue / pan.TrElement.Security.Params.MinPriceStep) * (pan.TrElement.Security.Params.StepPrice == 0 ? pan.TrElement.Security.Params.MinPriceStep : pan.TrElement.Security.Params.StepPrice); StopLossValue = Math.Round(countPos * StopValue, 2); } else { //если позиция ликвидирована, а стоп-заявки остались, то снимаем стопы Parent.Trader.CancelAllStopOrder(pan.TrElement.Security); } } else { //Перевыставляем стоп если больше одной заявки if (stOrdSec.Count() > 1) { //SendStopOrder(pan, true); Form_MessageSignal.Show("Double stop order " + pan.TrElement.Security, pan.TrElement.Security.ToString(), true); CancelAllStopOrders(pan); } } } } pan.LabelStopValue.BackColor = Color.Transparent; if (StopLossValue != 0) { pan.LabelStopValue.Text = "-" + StopLossValue.ToString(); } else { //Помечаем цветом, что надо выставить стоп pan.LabelStopValue.Text = "0"; if (countPos != 0) { pan.LabelStopValue.BackColor = Color.Red; } } } } }