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

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

Добавлено: 03 июн 2017, 18:45
vlad195050
Здравствуйте. Прошу помочь как написать стратегию * Если НПУ% больше 3% от цены открытия, то отменить стоп и установить новый стоп на уровне больше цены открытия на 3 руб. , на 3 пункта , на 0,3 цента.*. Одним словом чтобы новый стоп устанавливался с небольшим профитом . Бедем я и моя жена очень Вам благодарны.

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

Добавлено: 03 июн 2017, 22:25
evge
В вашей стратегии нужно сделать примерно так

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

if (CurrentPLper() > 3)
{
CancelStopLoss();
StopLoss(AverPrice() + 3 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), SignalPriceType.Price);
}


Комментарий к коду

В первой строке это проверка прибыли больше чем 3%, можно заменить на параметр.
В строке StopLoss можно подставить константу или заменить на параметр число 3 - количество шагов цены торгуемого инструмента, добавляемое к учетной цене для стоплоса.

CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в процентах.

CancelStopLoss() – отменить (снять) стоп-заявку, выставленную для защиты текущей позиции робота. Функция используется для отмены или редактирования положения текущего стопа. Повторный вызов функции выставления стопа не снимает старый и не выставляет новый стоп. Поэтому необходимо использовать данную функцию для отмены ранее выставленной заявки.

StopLoss(ValueStop, SignalPriceType) – выставить защитную стоп¬-маркет заявку к текущей позиции робота (размер и направление позиции робот определяет сам).
SignalPriceType – тип задаваемого значения,
• Price – значения ValueStop и ValueTake задаются в абсолютных величинах (как цены стоп уровня и уровня тейк профита):
• DeltaFromAveragePrice – значения ValueStop и ValueTake задаются как отклонения от учетной цены позиции робота в валюте цены (значения задаются больше 0, робот сам определяет направление отклонения);
• DeltaInPercentFromAveragePrice – значения ValueStop и ValueTake задаются в виде отклонения от учетной цены открытия позиции робота в процентах (значения задаются больше 0, робот сам определяет направление отклонения).

AverPrice() – возвращает учетную цену открытой позиции
Учетная цена – средневзвешенная цена сделок, которые увеличивают текущую открытую позицию по роботу

GetPriceStep() – функция возвращает шаг цены по инструменту, используемому в стратегии.

CurrentPosition() – возвращение объем текущей позиции (штук), которые посчитаны по сделкам только данной стратегии (робота). Положительное количество – показывает объем позиции лонг, отрицательное количество – объем позиции шорт.

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

Добавлено: 03 июн 2017, 22:32
vlad195050
Спасибо, опробую в ближайшее время.

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

Добавлено: 03 июн 2017, 22:36
evge
чуть поправил код и описание выше

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

Добавлено: 04 июн 2017, 22:34
vlad195050
Свасибо

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

Добавлено: 07 июн 2017, 11:40
MaxMx2
Получается, что после достижения НПУ заданного значения и до срабатывания стопа, робот будет на каждом баре снимать стоп и ставить новый? Можно ли этого избежать? На младших ТФ эти может быть неудобно.

И еще вопрос - что означет вот этот кусок кода:

" *CurrentPosition() > 0 ? 1 : -1 "

при задании цены стоп-лосса?

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

Добавлено: 07 июн 2017, 12:55
evge
MaxMx2 писал(а):Получается, что после достижения НПУ заданного значения и до срабатывания стопа, робот будет на каждом баре снимать стоп и ставить новый? Можно ли этого избежать? На младших ТФ эти может быть неудобно.


Можно.
Завести флаг в виде глоб. переменной и ориентироваться на него, определяя его при открытии позиции и меняя после перестановки стопа.

в Initialize() {...} добавить

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

AddGlobalVariable("SLSet", Types.Boolean, false);


при открытии позиции делать

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

SLSet = true;


условие переноса в безубыток изменить на

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

if (CurrentPLper() > 3 && SLSet)
{
CancelStopLoss();
StopLoss(AverPrice() + 3 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), SignalPriceType.Price);
SLSet = false;
}



MaxMx2 писал(а):И еще вопрос - что означет вот этот кусок кода:

" *CurrentPosition() > 0 ? 1 : -1 "

при задании цены стоп-лосса?


Определяем направление открытой позиции.
Это нужно для определения куда ставить стоп от учетной в + или - от учетной, т.к. у нас будет указана конкретная цена, а не Delta

если long, то умножаем на 1
если short, то умножаем на -1

т.е. к учетной цене мы либо 3 шага прибавляем (* 1), либо отнимаем (* -1)

ещё проще объяснение

это определение знака (+ или -) для 3 * GetPriceStep()

если сама конструкция оператора ? непонятна, то вот выдержка из msdn

Условный оператор

t ? x : y — если тест t имеет значение true, вычисляет и возвращает x, в противном случае вычисляет и возвращает y.

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

Добавлено: 11 июн 2017, 11:38
dkostiunin
Хотел бы поинтересоваться, - я хочу чтобы стоп лосс переставлял на 1% выше учётной цены можно ли так упростить, при условии что работаю только в лонг?

Вместо
StopLoss(AverPrice() + 3 * GetPriceStep() * (CurrentPosition() > 0 ? 1 : -1), 

Просто написать

StopLoss(CurrentPLper() > 1)

Этого будет достаточно?

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

Добавлено: 11 июн 2017, 11:41
dkostiunin
Или надо написать

StopLoss(AverPrice() +CurrentPLper() = 1)

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

Добавлено: 11 июн 2017, 12:28
evge
dkostiunin писал(а):хочу чтобы стоп лосс переставлял на 1% выше учётной цены


у StopLoss есть второй параметр, который отвечает за тип цены

StopLoss(ValueStop, SignalPriceType)

SignalPriceType – тип задаваемого значения,
Price – значения ValueStop и ValueTake задаются в абсолютных величинах (как цены стоп уровня и уровня тейк профита):
DeltaFromAveragePrice – значения ValueStop и ValueTake задаются как отклонения от учетной цены позиции робота в валюте цены (значения задаются больше 0, робот сам определяет направление отклонения);
DeltaInPercentFromAveragePrice – значения ValueStop и ValueTake задаются в виде отклонения от учетной цены открытия позиции робота в процентах (значения задаются больше 0, робот сам определяет направление отклонения).

т.е. чтобы выставить стоп на 1% от учетной цены достаточно сделать так:

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

// выставить стоплосс на 1% от учетной цены
StopLoss(1, SignalPriceType.DeltaInPercentFromAveragePrice);


но это будет ниже учетной цены при позиции Long

если надо выше, опять же придётся читать конкретную цену и тип цены должен быть Price