Стратегии и роботы > Как останавливать торговлю при достижении дохода за день

Обсуждение, описание стратегий и роботов, идеи для стратегий
Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение evge » 10 фев 2022, 23:19

Задача:

При достижении определенного в параметре стратегии дохода за день, останавливать торговлю до следующего дня.

Решение:

1. Добавить параметр для задания дохода
2. Завести счетчик в глоб. переменой и сохранять в нём на начало дня
RealizedPL() – возвращает текущий реализованный доход по закрытым сделкам робота (стратегии).
или
RealizedPLAfterCommission() – возвращает текущий реализованный доход по закрытым сделкам робота после вычета всех комиссий (стратегии).
3. Сравнивать в течение дня эту глоб. переменную с текущим значением перечисленных выше функций и при превышении значения из параметра завершать торговлю.

Код:

function Initialize() добавляем

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

function Initialize()
{
AddParameter("DayPL", 100, "ограничение дневного дохода", 0);
AddGlobalVariable("StartDayPL", Types.Double, 0);


В function OnUpdate()

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

function OnUpdate()
{

if (BarDate(0) != BarDate(1))
{
//Здесь (при необходимости) инициализируем начало торговли в новом дне
//...
StartDayPL = RealizedPL();
//Если требуется учет комиссий то заменяем RealizedPL() на RealizedPLAfterCommission()
}

if (RealizedPL() - StartDayPL >= DayPL)
{
//Здесь (при необходимости) действия для завершения торгов текущего дня
//...
return;
}
никогда такого не было и вот опять

Asp
Сообщения: 59
Зарегистрирован: 20 янв 2020, 11:17
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение Asp » 12 фев 2022, 08:17

А на следующий день стратегия запустится сама? Или нужно пересоздавать робота?
Мусор в твоём глазу больше уродует картину мироздания чем пятна на солнце

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

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение BugsDigger » 12 фев 2022, 09:55

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

В данной реализации:
1) в начале дня (первый оператор "if"), т.е. на первом баре дня, запоминаем текущую (накопленную ранее) прибыль;
2) далее (второй оператор "if") проверяем, набралась ли нужная норма прибыли. Если да, то оператор return не даст выполнить остаток кода (где, очевидно, должен быть собственно торговый код, в примере не показан); робот формально продолжает работу, но в текущий день фактически ничего делать не будет, поскольку при каждом очередном вызове условие всегда будет выполнено.

"Пересоздавать", естественно, ничего не нужно, достаточно запустить робота в окне диспетчера.

Надеюсь, понятно объяснил.

Asp
Сообщения: 59
Зарегистрирован: 20 янв 2020, 11:17
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение Asp » 13 фев 2022, 13:21

В примере торговые действия идут сразу за первым if. это не правильно? то есть торговые действия должны начинаться после оператора return?
Мусор в твоём глазу больше уродует картину мироздания чем пятна на солнце

Asp
Сообщения: 59
Зарегистрирован: 20 янв 2020, 11:17
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение Asp » 13 фев 2022, 13:36

BugsDigger писал(а):Робот всегда работает непрерывно, пока он запущен; неважно, оставляли ли вы на ночь терминал включенным с запущенным роботом или запустили терминал заново на следующий день и после этого запустили робота (состояние робота при перезапуске будет восстановлено точно таким же, как в момент его останова).

В данной реализации:
1) в начале дня (первый оператор "if"), т.е. на первом баре дня, запоминаем текущую (накопленную ранее) прибыль;
2) далее (второй оператор "if") проверяем, набралась ли нужная норма прибыли. Если да, то оператор return не даст выполнить остаток кода (где, очевидно, должен быть собственно торговый код, в примере не показан); робот формально продолжает работу, но в текущий день фактически ничего делать не будет, поскольку при каждом очередном вызове условие всегда будет выполнено.

"Пересоздавать", естественно, ничего не нужно, достаточно запустить робота в окне диспетчера.

Надеюсь, понятно объяснил.

До оператора return команды ClosePosition и CancelActiveOrders() остановят работу робота после достижение прибыли?
if (BarDate(0) != BarDate(1)) StartDayPL = RealizedPL();
if (RealizedPL() - int StartDayPL >= 300) {ClosePosition(); CancelActiveOrders(false); return;}
и дальше идут торговые действия
if a>b EnterLong.....
Так код будет работать? Всмысле если за сегодняшний день набрали прибыль 300 не торгует и на следующий день вновь торугет пока не наберет 300....
Мусор в твоём глазу больше уродует картину мироздания чем пятна на солнце

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

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение BugsDigger » 13 фев 2022, 20:24

Да, должно (да не обязано, см. ниже).

Учитывайте, что согласно документации:
RealizedPL() - возвращает текущий реализованный доход по закрытым сделкам робота
CurrentPL() – возвращает текущий доход по открытой позиции в валюте инструмента (рубли или пункты).
CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в
процентах.

Чтобы убедиться в правильности достаточно запустить на тестирование на периоде в несколько дней что-то вроде этого и просмотреть лог (сам не тестировал):

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

function OnUpdate()
{
 if (BarDate(0) != BarDate(1)) StartDayPL = RealizedPL();
 if (RealizedPL() - StartDayPL >= 300) // по закрытым
 {
  WriteLine(@"D:\ADdebug\Log.txt", String.Format("{0} {1} На сегодня хватит", BarDate(), BarTime()));
  return;
 }
 
 // дальше идет имитация действий:
 WriteLine(@"D:\ADdebug\Log.txt", String.Format("{0} {1} Торгуем ...", BarDate(), BarTime()));

 // имитация роста прибыли;
 // поскольку команд открытия позиций не было, RealizedPL=0;
 // при формальном уменьшении StartDayPL
 // разность RealizedPL()-StartDayPL будет увеличиваться
 // и после 300 баров достигнет искомой величины
 StartDayPL=StartDayPL-1;
}


Да вот, написал, а теперь подумал: если (пере)запустить робота до начала дня (до 7:00 мск), условие проверки перескока даты сработает, а вот если в середине дня, то нет (ведь предыдущий бар будет в том же дне). Надо как-то извернуться, но мне теперь спать пора. :)

Asp
Сообщения: 59
Зарегистрирован: 20 янв 2020, 11:17
Благодарил (а): 10 раз
Поблагодарили: 1 раз

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение Asp » 14 фев 2022, 14:48

Я в начале сделал в точности как в примере у меня стратегия выставлять заявки на вход отказалась.
Мусор в твоём глазу больше уродует картину мироздания чем пятна на солнце

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

Re: Как останавливать торговлю при достижении дохода за день

Непрочитанное сообщение BugsDigger » 14 фев 2022, 19:12

Как-то так получилось, поотлаживал с логом - вроде ОК:

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

function Initialize()
{
 StrategyName = "_Test";
 AddInput("Input1", Inputs.Candle, 5, true, "SBER=МБ ЦК");

 AddGlobalVariable("Cnt", Types.Int, 0);                 // шаг работы
 AddGlobalVariable("LastBar", Types.DateTime, new DateTime()); // дата последнего отработанного бара

 AddGlobalVariable("DayProfit", Types.Double, 0.0);      // счетчик дневной прибыли
   
 AddGlobalVariable("LogFile", Types.String, "");
}

function OnUpdate()
{
 //--------------------------------------------------------------------------------------------
 Action<string> Logg=(string Message_) =>
 {
  WriteLine(LogFile, String.Format("{0} {1}", GetTime(0), Message_));
 };
 //--------------------------------------------------------------------------------------------

 if(Cnt==0)
 {
  LastBar=BarDate();

  LogFile=String.Format("D:\\ADdebug\\{0}.txt", StrategyName);
  ClearFile(LogFile);
  Logg("Старт");
 }

 if(Cnt==0 ||                  // первый запуск робота
    BarDate(0)>BarDate(-1) ||  // наступил новый день
    LastBar<BarDate(0))        // робота остановили как минимум вчера, а запустили сегодня среди дня
 { // новый день
  DayProfit=0.0;
  Logg("Новый день ---------------");
 }

 // проверка плановой прибыли
 bool DayDone=(DayProfit>=10);

 if(DayDone)
 {
  Logg("День закрыт");
  return;
 }

 Logg("Новый бар");

 // имитация торговли
 DayProfit++;   
 
 Logg("Профит: "+(int)DayProfit);

 Cnt++;
 LastBar=BarDate(); // запомнить последний обработанный бар
}


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

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

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