Контртрендовый робот на паттрнах: три белых солдата, три черных ворона
Контртрендовый робот на паттрнах: три белых солдата, три черных ворона
Торговая логика робота
Робот ищет паттерны: три белых солдата или три черных ворона.
Робот является контртрендовым.
Вход в лонг: если три предыдущих свечи удовлетворяют заданным параметрам. Свечи должны быть падающими, их тела должны быть не меньше
заданного размера, общая высота паттерна от Open первой свечи паттерна до Close последней должны удовлетворять параметрам.
Вход в шорт: если три предыдущих свечи удовлетворяют заданным параметрам. Свечи должны быть растущими, их тела должны быть не меньше заданного размера, общая высота паттерна от Open первой свечи паттерна до Close последней должны удовлетворять параметрам.
Выход из позиции.
Take-Profit – на уровне процента от размера паттерна заданного от точки входа
Stop-Loss – на уровне процента от размера паттерна заданного от точки входа
1) точка входа в шорт
2) высота паттерна
3) Take-Profit здесь меньше высоты паттерна на 20% так как в параметрах для тейка было указано 80%
4) Stop-loss 50% высоты паттерна от точки входа
При тестировании на свечах робот дает некорректный результат. Вызвано это тем что 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
При тестировании на свечах робот дает некорректный результат. Вызвано это тем что 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
При сильном гэпе, если он превышает стоп-лосс или тэйк-профит - получается, что позиция сразу-же закрывается. Как минимум платим лишнюю комиссию :)
И еще вопрос: почему в настройках робота для параметров паттерна (высота паттерна и минимальная высота тела свечи) можно задавать только целочисленные значения? В самом алгоритме открытия позиций явных ограничений не нашел.
чёрт его знает если честно. Смените на decimal, я уже и не припомню почему это.
ООО «ВАН ТЕХНОЛОГИИ»т: +7 953 769 56 45
* Торговля на финансовых рынках связана с риском, который лежит на Вас.
* Ничто из написанного на сайте o-s-a.net не является рекомендацией.
* Если Вы этого не понимаете, не читайте этот сайт, ничего не покупайте.