Стратегии и роботы > Купить по цене не выше цены открытия

Обсуждение, описание стратегий и роботов, идеи для стратегий
Макс5
Сообщения: 6
Зарегистрирован: 30 ноя 2021, 09:34
Благодарил (а): 4 раза

Купить по цене не выше цены открытия

Непрочитанное сообщение Макс5 » 28 дек 2021, 15:30

Всем добрый день.

Подскажите, пожалуйста, как реализовать следующие условия в коде (на форуме и в документации подобного не нашел):
1. Если предыдущая свеча растущая (Input1.Close > Input1.Open), то на текущей свече покупаем 100 лотов по цене не выше цены открытия. По цене открытия может купиться не все 100 лотов, а меньше, например, 40 лотов, дальше цена может уйти вверх. А нужно, чтобы по цене открытия купились все 100 лотов. То есть, я предполагаю, в роботе надо как-то зафиксировать цену открытия этой свечи и ждать пока цена опустится до этой "фиксированной" цены.
2. Если цена становится на 1% больше цены, по которой мы купили (если успели), то сделку закрываем (продаем то количество лотов, которое успели купить по цене открытия).

С уважением,
Максим.

Maks
Сообщения: 52
Зарегистрирован: 15 июн 2020, 15:29
Благодарил (а): 8 раз
Поблагодарили: 27 раз

Re: Купить по цене не выше цены открытия

Непрочитанное сообщение Maks » 28 дек 2021, 16:33

В первом приближении можно так попробовать:

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

function Initialize()
{
   StrategyName = "strateg";
   AddParameter("Delta", 3.0, "", 1); // в %%
   AddInput("Input1", Inputs.Candle, 1, true, "GAZP=МБ ЦК");
   LongLimit = 100;
   ShortLimit = 0;
}

function OnUpdate()
{
   if (GetActiveOrders().LastOrDefault() == null && Input1.Close[0] > Input1.Open[0]) EnterLongLimit(Input1.Close[0]);
   if (CurrentPosition() > 0 && Input1.Close[0] > AverPrice() * (1.0 + Delta/100.0)) ClosePosition();
}

BugsDigger
Сообщения: 533
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 91 раз

Re: Купить по цене не выше цены открытия

Непрочитанное сообщение BugsDigger » 28 дек 2021, 16:53

Учитывайте, что "стандартно" код робота вызывается однократно в момент закрытия бара, в этот момент цена открытия следующего бара (если вы собираетесь ориентироваться на нее) еще недоступна.

Вызов на еще не законченном ("живом") баре регулируется флагами UseClosedBar и OneSignalOnBar, см. "СКРИПТЫ ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ И СТРАТЕГИЙ", раздел "Флаги" на стр. 19.

Макс5
Сообщения: 6
Зарегистрирован: 30 ноя 2021, 09:34
Благодарил (а): 4 раза

Re: Купить по цене не выше цены открытия

Непрочитанное сообщение Макс5 » 29 дек 2021, 14:42

Maks, BugsDigger,

Благодарю за ответы. Получился такой код.

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

function Initialize()
{
   StrategyName = "strateg";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "TATN=МБ ЦК");
   LongLimit = 100;
   ShortLimit = 0;
   
   UseClosedBar = false;
   LiveBarTimeout = 1;
}
function OnUpdate()
{
   if (Input1.Close[1] > Input1.Open[1]) EnterLongLimit(Input1.Open[0]);
   if (CurrentPosition() > 0 && Input1.High[0] >= AverPrice() * 1.01) ClosePosition();
   if (CurrentPosition() < 1 && Input1.High[0] >= Input1.Open[0] * 1.01) CancelActiveOrders(true);
}

Пока работает так, как надо, если тестировать с 1 лотом на ликвидных инструментах. Однако, предполагаю, что возможны ситуации, когда 2 и 3 условия будут срабатывать не так, как мы хотим.
1 условие. Здесь вопросов нет, покупаем 100 лотов по цене открытия, если предыдущая свеча "зеленая":

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

   if (Input1.Close[1] > Input1.Open[1]) EnterLongLimit(Input1.Open[0]);

2 условие. Логика: продать купленное количество по цене = средняя цена * 1.01.
В коде я решил использовать High текущего бара, то есть, когда High >= средней цены позиции * 1.01, то продаем. Код ниже.

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

   if (CurrentPosition() > 0 && Input1.High[0] >= AverPrice() * 1.01) ClosePosition();

Здесь у меня вопрос. Например, мы купили 100 лотов, но по цене High успели продать 30 лотов, дальше цена снизилась. Что произойдет с оставшимися 70 лотами? Они продадутся по рыночной цене (меньше средней цены позиции * 1.01) в момент, когда наступит High, или будут дожидаться, когда средняя цена опять станет больше на 1%?

3 условие. Логика: если мы не успеваем купить ни одного лота по цене открытия, цена уходит вверх и становится больше цены открытия на 1%, мы отменяем заявку.
Придумал такой код, однако сомневаюсь, корректен ли он.

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

   if (CurrentPosition() < 1 && Input1.High[0] >= Input1.Open[0] * 1.01) CancelActiveOrders(true);

Вы не могли бы подсказать, как правильно задать 2 и 3 условия в коде.
С уважением,
Максим.


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

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

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