Стратегии и роботы > Частичное исполнение заявки

Обсуждение, описание стратегий и роботов, идеи для стратегий
nordseven
Сообщения: 39
Зарегистрирован: 05 мар 2016, 19:39
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: Частичное исполнение заявки

Непрочитанное сообщение nordseven » 13 апр 2018, 12:52

У вас в логе похоже стояла заявка на 3 контракта она исполнилась, потом ещё 1 контракт, после которого был выставлен Cтоп как и говорил Дмитрий (oxi). И стоп посчитал количество контрактов?
В своем последнем сообщении я говорю уже о том, что дальше происходит. К примеру о закрытии этих 4 контрактов по частям и о том, что стоп не уменьшается и его нужно перевыставлять в соответствии с СurrentPosition().

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Частичное исполнение заявки

Непрочитанное сообщение Владимир » 13 апр 2018, 14:22

Контроль открытой позиции актуален только при открытии позиции по лимитным ордерам т.к. цена может уйти от лимита и выполниться частично. При открытии позиции маркетом или стоп заявкой это неактуально так как позиция откроется по рыночной цене. Приведу сокращенный код который позволяет контролировать позицию.

Код: Выделить всё

/**
function Initialize()
{
   StrategyName = "groal_sma_V2.3";
   //другая часть кода    //      
   AddParameter("GO", 2004, "Размер гарантийного обеспечения");
   AddParameter("Percent", 100, "Процент используемого счёта разрешённый для открытия позиции");                  
   AddParameter("AvtoManual", 0, "Расчёт числа контрактов автомат/ручное");
   AddParameter("NumberContrManual", 3, "Число контрактов", 1);
   AddParameter("Rstop", 0.6, "Размер стопа", 1);
   AddParameter("RPbu", 0.3, "Разрешение переноса в безубыток", 1);
   AddParameter("stop_lossl", 5, "Размер безубытка, сдвиг учётной цены в пунктах", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "GZM8=ФОРТС");
   LongLimit = 100;
   ShortLimit = -100;
   AddGlobalVariable("money", Types.Double);         //    баланс по рынку
   AddGlobalVariable("NumberCont", Types.Int);         //    Разрезанное число контрактов
   AddGlobalVariable("NumberContOpen", Types.Int);      //    Число открытых контрактов
   AddGlobalVariable("Istop", Types.Int, 0);
   //Разрешение на перенос стопов: 0-стоп не выставлен, 1- Разрешение на выставления безубытка
}

function OnUpdate()
{
   


///Узнаём баланс по счёту   
     money = GetCurrencyPosition(RazdelGroupType.FORTS);
      /*RazdelGroupType– тип рынка,
      • MICEX – Рынок ценных бумаг
      • FORTS – ФОРТС
      • SELT – Валютный рынок*/
/// Задаём колличество торгуемых контраетов
/// (заданное пользователем ручное задание/автоматический расчёт количества контрактов по балансу счета и проценту используемого капитала)       
   if (AvtoManual==0)
   {NumberCont=(int)NumberContrManual;}
   else
   {NumberCont=((int)((money*(int)Percent)/(GO*100))-1);}
/// Запрашиваем число открытых позиций
   NumberContOpen=(int)CurrentPosition();


/// Открытие позиции
   if ( /*условие открытия позиции*/ && CurrentPosition() != NumberCont)
   {
      EnterLong(NumberCont-NumberContOpen);
      //LogData (Convert.ToString(BarDate()) + " " + Convert.ToString(BarTime()) +  " Цена открытой позиции лонг "  + Convert.ToString(AverPrice())    , Name);
      //StopLoss(0.2, SignalPriceType.DeltaInPercentFromAveragePrice);  //Выставление стопа на уровне 0.5% от цены открытия позиции
      //StopLoss((SMA(Input1.Close, SMASlow1)), SignalPriceType.Price);   //Выставление стопа на уровне значения SMASlow1 на данный момент
      //BreakingStop(0.25, 2.5, SignalPriceType.DeltaInPercentFromAveragePrice);
      TrailingStopLoss(Rstop, SignalPriceType.DeltaInPercentFromAveragePrice);
      Istop=1;
   }
   if ( /*условие открытия позиции*/ && CurrentPosition() != NumberCont*(-1))
   {
      EnterShort(NumberCont+NumberContOpen);
      //LogData (Convert.ToString(BarDate()) + " " + Convert.ToString(BarTime()) +  " Цена открытой позиции шорт "  + Convert.ToString(AverPrice())   , Name);
      //StopLoss(0.2, SignalPriceType.DeltaInPercentFromAveragePrice);
      //StopLoss((SMA(Input1.Close, SMASlow1)), SignalPriceType.Price);   //Выставление стопа на уровне значения SMASlow1 на данный момент
      //BreakingStop(0.25, 2.5, SignalPriceType.DeltaInPercentFromAveragePrice);
      TrailingStopLoss(Rstop, SignalPriceType.DeltaInPercentFromAveragePrice);
      Istop=1;
   }
///Перенос в безубыток
   if ( (CurrentPLper() > RPbu) && (CurrentPosition() != 0) && (Istop==1))
   {
      CancelStopLoss();
      //StopLoss(stop_lossl, SignalPriceType.DeltaFromAveragePrice);
      if (CurrentPosition()>0)
      {StopLoss((AverPrice()+stop_lossl), SignalPriceType.Price);}   //при лонге
         else
      {StopLoss((AverPrice()-stop_lossl), SignalPriceType.Price);}   //при шорте
   Istop=0; //Выставили stop loss
   }
   
/// Закрытие позиции шорт
   if ( (CrossAbove( Input1.Close , SMA(Input1.Close, SMASlow1)) == true)  && CurrentPosition()<0  )
   {
      ClosePosition();
      CancelStopLoss();
   }
///   Закрытие позиции лонг
   if ( (CrossBelow(Input1.Close , SMA(Input1.Close,SMASlow1 )) == true) && CurrentPosition()>0  )
   {
      ClosePosition();
      CancelStopLoss();
      
   }

}

nordseven
Сообщения: 39
Зарегистрирован: 05 мар 2016, 19:39
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: Частичное исполнение заявки

Непрочитанное сообщение nordseven » 13 апр 2018, 16:27

Владимир, спасибо за пример!

Контроль открытой позиции актуален только при открытии позиции по лимитным ордерам т.к. цена может уйти от лимита и выполниться частично. При открытии позиции маркетом или стоп заявкой это неактуально так как позиция откроется по рыночной цене. Приведу сокращенный код который позволяет контролировать позицию.


По по поводу открытия РОБОТОМ позиции с помощью стопа я не знаю, а вот по поводу открытия РОБОТОМ через EnterLong и EnterShort здесь пишут что это всё равно лимитные заявки. Да и мне кажется что AverPrice() должна показывать среднюю цену открытых позиций при использовании, как маркетного так и лимитного ордеров.

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Частичное исполнение заявки

Непрочитанное сообщение Владимир » 13 апр 2018, 21:17

nordseven Скачайте документацию с https://www.alfadirect.ru/obuchenie "СКРИПТЫ ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ И СТРАТЕГИЙ" на 18 странице описано как можно открывать позиции.
AverPrice() – возвращает учетную цену открытой позиции
Учетная цена – средневзвешенная цена сделок, которые увеличивают текущую открытую позицию по роботу
17 страница


Вернуться в «Стратегии и роботы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей