Каталог файлов форума

Список вложений в сообщениях, оставленных на этой конференции.

Все файлы форума: 1233

Добавлено: evge » 23 мар 2016, 07:57

Тема: Re: Пересечение EMA и SMA с трейлинг стопом (TRS)

Текст сообщения:

Ипонамама писал(а):программный стоп и по-моему трейлинг стоп

Ипонамама писал(а):помогите написать


Это не проблема. Просто код будет уже открыт, в конструктор уже такой код не вернешь и все манипуляции с кодом только в исходнике.

Написал. Есть ньюансы:

  • стоплосс задается в шагах цены
  • после срабатывания стоплосса позиция в том же направлении не переоткрывается и ожидается сигнал в другую сторону

Провел оптимизацию и тестирование для SBER 1H (см. ниже) на 2000 баров, для других ТФ нужно смотреть :)

Вообщем вот код

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

/**Стратегия основана на определении моментов пересечения быстрой экспоненциальной скользящей средней и медленной экспоненциальной скользящей средней (система "ES"). Особенности:
- сигнал на покупку выдается, если быстрая EMA пересекает медленную SMA снизу вверх;
- сигнал на продажу выдается, если быстрая EMA  пересекает медленную SMA  сверху вниз;
- при тестировании цена сделки фиксируется как цена закрытия бара, на котором появился сигнал.
- в роботе заявка выставляется после закрытия бара, на котором появился сигнал.
- стоплосс задается в шагах цены
- после срабатывания стоплосса позиция в том же направлении не переоткрывается и ожидается сигнал в другую сторону
Developed by evge;
Algorithm = ТРЕНД;**/

function Initialize()
{
   StrategyName = "evge_ES_TRS";
   AddParameter("Pfast", 3, "", 1);
   AddParameter("Pslow", 75, "", 0);
   AddParameter("TRS", 0.5, "", 0);  //трейлинг стоп в шагах цены
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   LongLimit = 0;
   ShortLimit = 0;
   AddGlobalVariable("StopLoss", Types.Double, 0.0); //StopLoss цена
   AddGlobalVariable("P", Types.Int, 0); //позиция 0 - нет, 1 - long, 2 - short
   AddGlobalVariable("NP", Types.Int, 0); //запрет открытия позиции 0 - нет запрета, 1 - long, 2 - short
}

function OnUpdate()
{

   // Определяем стоп
   if (CurrentPosition() > 0 && P != 1) { P = 1; StopLoss = 0; }
   if (CurrentPosition() < 0 && P != 2) { P = 2; StopLoss = 0; }
   if (CurrentPosition() == 0) P = 0;

   if (P == 1 && ((Input1.Close[0] - TRS) > StopLoss || StopLoss == 0)) StopLoss = Input1.Close[0] - TRS;
   if (P == 2 && ((Input1.Close[0] + TRS) < StopLoss || StopLoss == 0)) StopLoss = Input1.Close[0] + TRS;
   //

   /// ПРАВИЛО 1
   if ( NP != 1 && (EMA(Input1.Close, Pfast) > SMA(Input1.Close, Pslow)) )
   {
      NP = 1;
      EnterLong();
   }

   else

   /// ПРАВИЛО 2
   if ( NP != 2 && (EMA(Input1.Close, Pfast) < SMA(Input1.Close, Pslow)) )
   {
      NP = 2;
      EnterShort();
   }

   else

   // закрываем Long по StopLoss
   if ( (P == 1) && (Input1.Close[0] < StopLoss)) {
      CloseLong();
   }

   else

   // закрываем Short по StopLoss
   if ( (P == 2) && (Input1.Close[0] > StopLoss)) {
      CloseShort();
   }

}


evge_ES_TRS-04.png
Стоп на графике
evge_ES_TRS-04.png (38.72 КБ) 26970 просмотров

evge_ES_TRS-03.png
Тестирование при Pslow = 74, Pfast = 54

evge_ES_TRS-02.png
SBER, ТФ=1H. Все тепловые карты при оптимизации параметров Pslow, Pfast от 1 до 100 с шагом 1, при TRS = 0.5

evge_ES_TRS-01.png
SBER, ТФ=1H. Доходность при оптимизации параметров Pslow, Pfast от 1 до 100 с шагом 1, при TRS = 0.5
evge_ES_TRS-01.png (49.92 КБ) 26985 просмотров