Esempio n. 1
0
 //Только для 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);
     }
 }
Esempio n. 2
0
        //Только для 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;
                }
            }
        }