Страница 2 из 3

Re: Установка беубыточного стопа с профитом

Добавлено: 11 июн 2017, 13:25
dkostiunin
а если написать

StopLoss(-1, SignalPriceType.DeltaInPercentFromAveragePrice);

тогда ведь он выставит на 1% выше учетной цены?

Учитывая более раннее условие заданное, что выставлять такой стоплосс только при достижении текущей цены выше на 3%, от учетной, должно сработать?

или отрицательные значения нельзя использовать?

Re: Установка беубыточного стопа с профитом

Добавлено: 11 июн 2017, 21:25
evge
Может быть сработает, надо пробовать

Re: Установка беубыточного стопа с профитом

Добавлено: 19 июн 2017, 16:30
vlad195050
Установил безубыточный стоп как Вы рекомендовали, не работает. что не так? Зто программа для Фьючерса нефти.

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

         function Initialize()
{
   StrategyName = "Нефть с профитом";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");                                                                        AddGlobalVariable("SLSet", Types.Boolean, false)
   LongLimit = 0;
   ShortLimit = 0;
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (Input1.Close > Input1.Close[1]) && (ADX(Input1, 14).GetValue("ADX", 0) > ADX(Input1, 14).GetValue("ADX", 1)) && (CrossAbove(Input1.Close, EMA(Input1.Close, P1)) == true) && (Input1.Close > MY.NRTR(Input1.Close, 0.2)) )
   {
      EnterLong();
      StopLoss(0.2, SignalPriceType.DeltaInPercentFromAveragePrice);
      SLSet = true;                                                                                                                }

   /// ПРАВИЛО 2
   if ( (Input1.Close < Input1.Close[1]) && (ADX(Input1, 14).GetValue("ADX", 0) > ADX(Input1, 14).GetValue("ADX", 1)) && (CrossBelow(Input1.Close, EMA(Input1.Close, P1)) == true) && (Input1.Close < MY.NRTR(Input1.Close, 0.2)) )
   {
      EnterShort();
      StopLoss(0.2, SignalPriceType.DeltaInPercentFromAveragePrice);                                                                                                                                          SLSet = true;
   }

   /// ПРАВИЛО 3
   if ( (CurrentPLper() > 0.2) )         
   {                                                                                                                                                                                                                                                          CancelStopLoss();
   StopLoss(AverPrice() + 2 * GetPriceStep() * CurrentPosition() > 0 ? 1 : -1, SignalPriceType.Price);
   SLSet = false;
   }

}

Re: Установка беубыточного стопа с профитом

Добавлено: 19 июн 2017, 16:50
evge
не проверяете в последнем правиле флаг на установку стопа, но это повлиять не должно было

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

   /// ПРАВИЛО 3
   if ( (CurrentPLper() > 0.2) ) 

заменить на

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

   /// ПРАВИЛО 3
   if ( CurrentPLper() > 0.2 && SLSet ) 

Re: Установка беубыточного стопа с профитом

Добавлено: 19 июн 2017, 17:10
evge

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

   StopLoss(AverPrice() + 2 * GetPriceStep() * CurrentPosition() > 0 ? 1 : -1, SignalPriceType.Price);

заменить на

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

   StopLoss(AverPrice() + 2 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), SignalPriceType.Price);


Ранее было с ошибкой, нужно взять в () CurrentPosition() > 0 ? 1 : -1.

Ранее в тексте тоже поправил.

Re: Установка беубыточного стопа с профитом

Добавлено: 19 июн 2017, 18:32
vlad195050
Спасибо, теперь заработало!

Re: Установка беубыточного стопа с профитом

Добавлено: 19 июн 2017, 19:13
vlad195050
Еще один вопрос. Если цена продолжает идти в мою сторону, то можно ли отменить предыдущий стоп с профитом и назначить другой. с более высоким профитом, например:

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

 /// ПРАВИЛО 3
        if ( CurrentPLper() > 0.1 && SLSet )       
   {                                                                                                                                                                                                                                                          CancelStopLoss();
    StopLoss(AverPrice() + 2 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), SignalPriceType.Price);
   SLSet = false;
   }
/// ПРАВИЛО 4
        if ( CurrentPLper() > 0.3 && SLSet )       
   {                                                                                                                                                                                                                                                          CancelStopLoss();
    StopLoss(AverPrice() + 7 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), SignalPriceType.Price);
   SLSet = false;
   }
т . е получить ступенчатый треллинг- стоп .

Re: Установка беубыточного стопа с профитом

Добавлено: 19 июн 2017, 19:24
vlad195050
То что я написал не отменяет предыдущий стоп с профитом и не переносит на более высокий уровень, ПРАВИЛО 4 НЕ РАБОТАЕТ. Работает только правило 3

Re: Установка беубыточного стопа с профитом

Добавлено: 20 июн 2017, 00:04
oxi
Всегда срабатывает правило 3 . Его надо ограничить

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

/// ПРАВИЛО 3
if ( CurrentPLper() > 0.1 && CurrentPLper() <= 0.3 && SLSet )
{ CancelStopLoss();
StopLoss(AverPrice() + 2 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), SignalPriceType.Price);
SLSet = false;
}

Re: Установка беубыточного стопа с профитом

Добавлено: 20 июн 2017, 07:04
evge
oxi писал(а):Всегда срабатывает правило 3


помимо этого, ещё флаг SLSet установлен в false правилом 3 и в правиле 4 не выполнится условие SLSet (true)

лучше вообще переписать код перестановки стопа

Вот полный код с изменениями:

Здесь перенос стопа осуществляется от цены предыдущего стопа, т.е. на учетную цену не ориентируемся.

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

function Initialize()
{
   StrategyName = "BRProfit";
   AddParameter("P1", 30, "", 1);
   
   // % стоплосс при открытии позиции
   AddParameter("StopStart", 0.4, "", 1);
   
   // если текущая цена больше (меньше) на S % от текущей цены стоплосс, то переносим его.
   AddParameter("StopShift", 0.4, "", 1);

   // на какой % цены переносим стоплосс, должен быть не больше StopShift
   AddParameter("StopStep", 0.1, "", 1);
   
   AddInput("Input1", Inputs.Candle, 1, true, "");                                                                       
   
   //Здесь сохраняем цену текущего стоплосс
   AddGlobalVariable("SL", Types.Double, 0.0);
   
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{
   var isLong = (Input1.Close > Input1.Close[1]) && (ADX(Input1, 14).GetValue("ADX", 0) > ADX(Input1, 14).GetValue("ADX", 1)) && (CrossAbove(Input1.Close, EMA(Input1.Close, P1)) == true) && (Input1.Close > MY.NRTR(Input1.Close, 0.2));
   
   var isShort = (Input1.Close < Input1.Close[1]) && (ADX(Input1, 14).GetValue("ADX", 0) > ADX(Input1, 14).GetValue("ADX", 1)) && (CrossBelow(Input1.Close, EMA(Input1.Close, P1)) == true) && (Input1.Close < MY.NRTR(Input1.Close, 0.2));

   // Long
   if ( isLong )
   {
      EnterLong();
      StopLoss(StopStart, SignalPriceType.DeltaInPercentFromAveragePrice);
      SL = Input1.Close - Input1.Close * 0.01 * StopStart;
   }

   // Short
   if ( isShort )
   {
      EnterShort();
      StopLoss(StopStart, SignalPriceType.DeltaInPercentFromAveragePrice);                                                                                                                                         
      SL = Input1.Close + Input1.Close * 0.01 * StopStart;
   }

   // StopLoss
   if ( SL > 0.0 && CurrentPosition() != 0 && (Input1.Close / SL * 100 - 100) * (CurrentPosition() > 0 ? 1 : -1) > StopShift )
   {
   CancelStopLoss();
   var NS = SL + SL * 0.01 * StopStep * (CurrentPosition() > 0 ? 1 : -1);
   StopLoss(NS, SignalPriceType.Price);
   SL = NS;
   }
   
}