//Только для CrossMA public void ChangeStrategyState(Strategy CStrategy, InternalStrategyStateMA State, int NState, bool WithImplem, bool WithStop, bool FromSignal) { try { if (FromSignal == false) //вызвалось НЕ при срабатывании сигнала (с form1) { if (WithImplem == true) //нужно выставлять ордер { if (WithStop == true) //выполнить не сейчас, а при сраб. сигнала { State.FuturePos = NState; //требуемая позиция State.FutureStop = true; //флаг остановки } else //выполнить сейчас { State.FutureStop = false; //отменить флаг остановки ExposeOrder(State, NState); //ставим ордера } } else //смена позиции без ордеров { ExposeOrder(State, NState); //false } } else //вызвалось на сигнале { if (State.FutureStop == true) //есть флаг остановки { ExposeOrder(State, State.FuturePos); //меняем на указанную CStrategy.Stop(); //останавливаем стратегию } else { ExposeOrder(State, NState); //действия по сигналу } } } catch (Exception ex) { System.Media.SystemSounds.Beep.Play(); Print(string.Format("Ошибка при изменении позиции: {0}", ex.Message), true); } }
//Только для CrossMA /// <summary> /// Запланировать какие ордера выставлять в завис. от текущ. позиц. и указанного направления /// </summary> /// <param name="pdir"></param> private async void ExposeOrder(InternalStrategyStateMA State, int NewState) { if (NewState == 1) { Print("Сигнал на покупку.", true); if (State.PosDirection == 1) { System.Media.SystemSounds.Beep.Play(); Print("С позиции лонг еще не вышли."); } else { TradeResult tresult = await ExecuteByMarket(true); decimal quantity1 = tresult.BaseQty; if (quantity1 > 0) { State.PurchasedAmount += quantity1; } else { Print("Не удалось исполнить ордер на покупку."); } State.PosDirection = 1; } } if (NewState == -1) { Print("Сигнал на продажу.", true); if (State.PosDirection == -1) { System.Media.SystemSounds.Beep.Play(); Print("С позиции шорт еще не вышли."); } else { TradeResult tresult = await ExecuteByMarket(false); decimal quantity1 = tresult.BaseQty; if (quantity1 > 0) { State.PurchasedAmount -= quantity1; } else { Print("Не удалось исполнить ордер на продажу."); } State.PosDirection = -1; } } if (NewState == 0) { Print("Закрытие позиции.", true); if (State.PosDirection == 0) { System.Media.SystemSounds.Beep.Play(); Print("Позиция не открыта."); } else { if (State.PosDirection == 1) { TradeResult tresult = await ExecuteByMarket(false); decimal quantity1 = tresult.BaseQty; if (quantity1 > 0) { State.PurchasedAmount -= quantity1; } else { Print("Не удалось исполнить ордер на продажу."); } } State.PosDirection = 0; } } }