TreeSoldiers (Contrtrend)

Контртрендовый робот на паттрнах: три белых солдата, три черных ворона

  1. Сергей Радченко Команда форума

    Регистрация:
    30.10.15
    Сообщения:
    162
    Был на сайте:
    26.03.24

    Контртрендовый робот на паттрнах: три белых солдата, три черных ворона


    Торговая логика робота
    Робот ищет паттерны: три белых солдата или три черных ворона.
    Робот является контртрендовым.

    Вход в лонг: если три предыдущих свечи удовлетворяют заданным параметрам. Свечи должны быть падающими, их тела должны быть не меньше
    заданного размера, общая высота паттерна от Open первой свечи паттерна до Close последней должны удовлетворять параметрам.
    Вход в шорт: если три предыдущих свечи удовлетворяют заданным параметрам. Свечи должны быть растущими, их тела должны быть не меньше заданного размера, общая высота паттерна от Open первой свечи паттерна до Close последней должны удовлетворять параметрам.

    Выход из позиции.
    Take-Profit – на уровне процента от размера паттерна заданного от точки входа
    Stop-Loss – на уровне процента от размера паттерна заданного от точки входа

    1) точка входа в шорт
    2) высота паттерна
    3) Take-Profit здесь меньше высоты паттерна на 20% так как в параметрах для тейка было указано 80%
    4) Stop-loss 50% высоты паттерна от точки входа

    Настройки стратегии


    В рамках настроек стратегии доступен стандартный функционал:


      • - Режим работы;
    • - Проскальзывание для входа в позицию и переворота;
    • - Объем входа в позицию;
    • - Высота паттерна – общая высота паттерна из трех свечей от Open первой свечи до Close последней;
    • - Мин. высота тела свечи – минимальный размер тела свечи в рамках паттерна;
    • - Процент для Take-Profit – процент, который будет браться от высоты паттерна построенного по телам для формирования высоты от Close для выставления заявки Take-Profit;
    • - Процент для Stop-Loss – процент, который будет браться от высоты паттерна построенного по телам для формирования высоты от Close для выставления заявки Stop-Loss;
    Сергей Радченко
    07.12.2016 09:53
    #1
  2. klerk

    Регистрация:
    20.05.22
    Сообщения:
    3
    Был на сайте:
    11.07.22

    При тестировании на свечах робот дает некорректный результат. Вызвано это тем что Stop-Loss и Take-Profit в Strateg_ClosePosition определяются по предыдущей свече (_lastPrice) и не учитывается возможность гэпа (а он может быть большим). А открытие позиции происходит по значению цены открытия следующей свечи и получается что при гэпе Stop-Loss и Take-Profit выставляются некорректно.

    Может быть имеет смысл сделать что-то типа такого варианта:

            private void Strateg_ClosePosition(Position position)
            {
                List<Position> openPositions = _tab.PositionsOpenAll;
                for (int i = 0; openPositions != null && i < openPositions.Count; i++)
                {

                    decimal pricePosition = openPositions[i].EntryPrice; // <<<------------------------------- !!!

                    if (openPositions[i].Direction == Side.Buy)
                    {
                        decimal heightPattern = Math.Abs(_tab.CandlesAll[_tab.CandlesAll.Count - 3].Open - _tab.CandlesAll[_tab.CandlesAll.Count - 1].Close);
                        decimal priceStop = pricePosition - (heightPattern * ProcHeightStop) / 100;
                        decimal priceTake = pricePosition + (heightPattern * ProcHeightTake) / 100;
                        _tab.CloseAtStop(openPositions[i], priceStop, priceStop - Slipage);
                        _tab.CloseAtProfit(openPositions[i], priceTake, priceTake - Slipage);
                    }
                    else
                    {
                        decimal heightPattern = Math.Abs(_tab.CandlesAll[_tab.CandlesAll.Count - 1].Close - _tab.CandlesAll[_tab.CandlesAll.Count - 3].Open);
                        decimal priceStop = pricePosition + (heightPattern * ProcHeightStop) / 100;
                        decimal priceTake = pricePosition - (heightPattern * ProcHeightTake) / 100;
                        _tab.CloseAtStop(openPositions[i], priceStop, priceStop + Slipage);
                        _tab.CloseAtProfit(openPositions[i], priceTake, priceTake + Slipage);
                    }
                }
            }

     

    klerk
    21.05.2022 10:39
    #2
  3. Алексей Ван Команда форума

    Регистрация:
    02.02.13
    Сообщения:
    1169
    Был на сайте:
    29.03.24
    Цитата: klerk

    При тестировании на свечах робот дает некорректный результат. Вызвано это тем что Stop-Loss и Take-Profit в Strateg_ClosePosition определяются по предыдущей свече (_lastPrice) и не учитывается возможность гэпа (а он может быть большим). А открытие позиции происходит по значению цены открытия следующей свечи и получается что при гэпе Stop-Loss и Take-Profit выставляются некорректно.

    Может быть имеет смысл сделать что-то типа такого варианта:

            private void Strateg_ClosePosition(Position position)
            {
                List<Position> openPositions = _tab.PositionsOpenAll;
                for (int i = 0; openPositions != null && i < openPositions.Count; i++)
                {

                    decimal pricePosition = openPositions[i].EntryPrice; // <<<------------------------------- !!!

                    if (openPositions[i].Direction == Side.Buy)
                    {
                        decimal heightPattern = Math.Abs(_tab.CandlesAll[_tab.CandlesAll.Count - 3].Open - _tab.CandlesAll[_tab.CandlesAll.Count - 1].Close);
                        decimal priceStop = pricePosition - (heightPattern * ProcHeightStop) / 100;
                        decimal priceTake = pricePosition + (heightPattern * ProcHeightTake) / 100;
                        _tab.CloseAtStop(openPositions[i], priceStop, priceStop - Slipage);
                        _tab.CloseAtProfit(openPositions[i], priceTake, priceTake - Slipage);
                    }
                    else
                    {
                        decimal heightPattern = Math.Abs(_tab.CandlesAll[_tab.CandlesAll.Count - 1].Close - _tab.CandlesAll[_tab.CandlesAll.Count - 3].Open);
                        decimal priceStop = pricePosition + (heightPattern * ProcHeightStop) / 100;
                        decimal priceTake = pricePosition - (heightPattern * ProcHeightTake) / 100;
                        _tab.CloseAtStop(openPositions[i], priceStop, priceStop + Slipage);
                        _tab.CloseAtProfit(openPositions[i], priceTake, priceTake + Slipage);
                    }
                }
            }

     

    Сложно сказать. Я бы не хотел это изменять. У нас было как ВелсЛабе раньше. Там - сильно оптимистично тестер работает. И мы сделали "ухудшайзинг" как мы его назвали. И сейчас открывается пессиместично.

    Алексей Ван
    25.05.2022 10:52
    #3
  4. klerk

    Регистрация:
    20.05.22
    Сообщения:
    3
    Был на сайте:
    11.07.22

    При сильном гэпе,  если он превышает стоп-лосс или тэйк-профит - получается, что позиция сразу-же закрывается. Как минимум платим лишнюю комиссию :)

    И еще вопрос: почему в настройках робота для параметров паттерна (высота паттерна и минимальная высота тела свечи) можно задавать только целочисленные значения? В самом алгоритме открытия позиций явных ограничений не нашел.

    klerk
    01.06.2022 17:33
    #4
  5. Алексей Ван Команда форума

    Регистрация:
    02.02.13
    Сообщения:
    1169
    Был на сайте:
    29.03.24
    Цитата: klerk

    При сильном гэпе,  если он превышает стоп-лосс или тэйк-профит - получается, что позиция сразу-же закрывается. Как минимум платим лишнюю комиссию :)

    И еще вопрос: почему в настройках робота для параметров паттерна (высота паттерна и минимальная высота тела свечи) можно задавать только целочисленные значения? В самом алгоритме открытия позиций явных ограничений не нашел.

    чёрт его знает если честно. Смените на decimal, я уже и не припомню почему это. 

    Алексей Ван
    06.06.2022 13:40
    #5