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

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 30 июл 2018, 11:10
m4Dmitry
Simonov писал(а):Кто-то уже хвастается данным "граалем" на Смарт-Лабе. Здесь. :D


Да да да))) смешная ветка была))) скрин зашел в тему))))

там еще вот такой скрин был)) https://smart-lab.ru/blog/484379.php#comment8704540

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 29 апр 2019, 18:14
Orange2000
Привет всем. Я так понимаю,надо вот так? что бы робот не дурил нас

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

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.SuperTrend(Input1, PeriodATR, PeriodCCI, K).GetValue("U", 1) > 0) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( (MY.SuperTrend(Input1, PeriodATR, PeriodCCI, K).GetValue("D", 1) > 0) )
   {
      EnterShort();
   }

}


Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 30 апр 2019, 07:08
BugsDigger
Orange2000 писал:

> чтобы робот не дурил нас

Всё дело в том, что в серии исправляются прошлые точки (довольно и одной) по текущей точке.

Это не будет "дурить нас" в реале, но будет дурить в тестировании/оптимизации. Дело в том, что при тестировании значения индикаторов вычисляются на весь период тестирования, а затем уже по этим данным делается имитация торговли. Т.о., если в индикаторе проверить, как изменилась цена в текущей точке и исправить предыдущую точку, то симулятор торговли по этому индикатору будет как бы видеть на 1 точку в будущее, и этого уже оказывается вполне достаточно для "грааля" (зная прикуп, живу даже не в Сочи, а в на Лазурном берегу).

Не уверен, есть ли выигрыш в производительности тестирования при такой его организации. Но что точно могу сказать, так это то, что тестирование оказывается некорректным в случае правки в индикаторе точек "прошлого".

А мораль одна: если хотите правильного тестирования, в индикаторе всегда добавляйте только новые точки, старые править нельзя.

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 07 окт 2019, 14:56
State
Доброго дня.

Не силен я в програмировании и создании роботов. Возможно ли к данному роботу из этой ветки добавить два параметра: тейк профит и стоп лосс (чтобы просто закрывал позицию при достижении, без разворота) и добавить отключение разворота как такового (т.е. оставить например только лонг).
Поясню немного: робот зашел в лонг, достиг профита предположим в 0,15-1 п (задается ручками) и просто закрыл позицию. Повторно не входит в лонг при продолжении тренда лонгового. Ждет спокойно сигнала на шорт и заходит в шорт. После чего достигает ТП и закрывает шорт. Ждет сигнала на лонг. Без разворотов.

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 08 окт 2019, 07:42
evge
Приветствую!

Здесь изменения небольшие:

параметры SL и TP - стоп и тейк в % для отправки BRS заявки после открытия позиции
глоб. перем. N разрешенное направление торговли, если N >= 0 - можно в long, если N <= 0 можно в шорт.

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

/**

Hash code 82E7948763EE510C8DF0B3C48F17727D
**/

function Initialize()
{
   StrategyName = "SuperTrend";
   AddParameter("PeriodATR", 5, "", 1);
   AddParameter("PeriodCCI", 50, "", 1);
   AddParameter("K", 1, "", 1);
   AddParameter("SL", 1.1, "StopLoss", 1);
   AddParameter("TP", 1.6, "TakeProfit", 1);
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   LongLimit = 4750;
   ShortLimit = -4750;
   AddChartIndicator("MY.SuperTrend", new Dictionary <string, string>{{"PeriodATR", "PeriodATR"},{"PeriodCCI", "PeriodCCI"},{"K", "K"}});
   AddGlobalVariable("N", Types.Int, 0);
}

function OnUpdate()
{
   // evge 08.10.2019 https://alfadirect4.ru

   var I = Input1;
   var ST = MY.SuperTrend(Input1, PeriodATR, PeriodCCI, K);
   
   /// ПРАВИЛО 1
   if ( ST["U"][1] > 0 && N >= 0)
   {
      EnterLong();
      BreakingStop(SL, TP, SignalPriceType.DeltaInPercentFromAveragePrice);
      N = -1;
   }

   /// ПРАВИЛО 2
   if ( ST["D"][1] > 0 && N <= 0)
   {
      EnterShort();
      BreakingStop(SL, TP, SignalPriceType.DeltaInPercentFromAveragePrice);
      N = 1;
   }

}

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 08 окт 2019, 08:06
nikkrav
Евгений, привет! Добавь сюда частичное закрытие если возможно.

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 08 окт 2019, 08:59
evge
Могу быстрый вариант реализовать, с закрытием частями, определенным в параметрах шагом.

Но тогда убрать нужно будет BRS.

Стоп конечно можно выставлять отдельно и каждое частичное закрытие перевыставлять его на тоже место или иное условие.

Как нужно?

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 08 окт 2019, 09:09
nikkrav
Допустим половину закрыть +1%, а вторую уже в б/у или по перевороту.

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 08 окт 2019, 09:18
evge
Вариант с закрытием частями:

в параметрах
TP = % для закрытия части
TPLot = частичное закрытие шт.

без стопа, переворот.

SuperTrendParts-01.png
SuperTrendParts-01.png (23.37 КБ) 20582 просмотра


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

function Initialize()
{
   StrategyName = "SuperTrendParts";
   AddParameter("PeriodATR", 4, "", 1);
   AddParameter("PeriodCCI", 39, "", 1);
   AddParameter("K", 1, "", 1);
   AddParameter("TP", 0.5, "TakeProfit %", 1);
   AddParameter("TPLot", 1000, "Lot TakeProfit", 1);
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   LongLimit = 5000;
   ShortLimit = -5000;
   AddChartIndicator("MY.SuperTrend", new Dictionary <string, string>{{"PeriodATR", "PeriodATR"},{"PeriodCCI", "PeriodCCI"},{"K", "K"}});
   AddGlobalVariable("N", Types.Int, 0);
   AddGlobalVariable("Last", Types.Double, 0);
}

function OnUpdate()
{
   // evge 08.10.2019 https://alfadirect4.ru

   var I = Input1;
   var ST = MY.SuperTrend(Input1, PeriodATR, PeriodCCI, K);
   var CP = CurrentPosition();
   
   /// ПРАВИЛО 1
   if ( ST["U"][1] > 0 && N >= 0)
   {
      EnterLong();
      Last = I.Close[0];
      N = -1;
   }

   /// ПРАВИЛО 2
   if ( ST["D"][1] > 0 && N <= 0)
   {
      EnterShort();
      Last = I.Close[0];
      N = 1;
   }
   
   if (CP > 0 && I.Close[0] > Last * (1 + TP * 0.01)) { CloseLong(TPLot); Last = I.Close[0]; }
   if (CP < 0 && I.Close[0] < Last * (1 - TP * 0.01)) { CloseShort(TPLot); Last = I.Close[0]; }

}

Re: SuperTrend - трендовый индикатор, созданный на основе индикаторов ATR и CCI

Добавлено: 08 окт 2019, 09:49
evge
А вот ещё один интересный вариант:

Здесь позиция будет закрываться с шагом даже если цена ходит в обратную сторону от последнего шага, но при этом есть условие, что это частичное закрытие будет только при положительном CurrentPL()

SuperTrendParts-02.png
SuperTrendParts-02.png (25.8 КБ) 20574 просмотра


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

function Initialize()
{
   StrategyName = "SuperTrendParts2";
   AddParameter("PeriodATR", 4, "", 1);
   AddParameter("PeriodCCI", 39, "", 1);
   AddParameter("K", 1, "", 1);
   AddParameter("TP", 1, "TakeProfit %", 1);
   AddParameter("TPLot", 500, "Lot TakeProfit", 1);
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   LongLimit = 5000;
   ShortLimit = -5000;
   AddChartIndicator("MY.SuperTrend", new Dictionary <string, string>{{"PeriodATR", "PeriodATR"},{"PeriodCCI", "PeriodCCI"},{"K", "K"}});
   AddGlobalVariable("N", Types.Int, 0);
   AddGlobalVariable("Last", Types.Double, 0);
}

function OnUpdate()
{
   // evge 08.10.2019 https://alfadirect4.ru

   var I = Input1;
   var ST = MY.SuperTrend(Input1, PeriodATR, PeriodCCI, K);
   var CP = CurrentPosition();
   
   /// ПРАВИЛО 1
   if ( ST["U"][1] > 0 && N >= 0)
   {
      EnterLong();
      Last = I.Close[0];
      N = -1;
   }

   /// ПРАВИЛО 2
   if ( ST["D"][1] > 0 && N <= 0)
   {
      EnterShort();
      Last = I.Close[0];
      N = 1;
   }
   
   if (CP > 0 && I.Close[0] > Last * (1 + TP * 0.01)) { CloseLong(TPLot); Last = I.Close[0]; }
   if (CP > 0 && I.Close[0] < Last * (1 - TP * 0.01) && CurrentPLper() > 0) { CloseLong(TPLot); Last = I.Close[0]; }
   if (CP < 0 && I.Close[0] < Last * (1 - TP * 0.01)) { CloseShort(TPLot); Last = I.Close[0]; }
   if (CP < 0 && I.Close[0] > Last * (1 + TP * 0.01) && CurrentPLper() > 0) { CloseShort(TPLot); Last = I.Close[0]; }

}