Стратегии и роботы > помогите написать робота EMA WMA

Обсуждение, описание стратегий и роботов, идеи для стратегий
sergrostov
Сообщения: 3
Зарегистрирован: 05 июн 2017, 19:39

помогите написать робота EMA WMA

Непрочитанное сообщение sergrostov » 05 июн 2017, 23:41

так и не смог написать стратегию трелинг стопа не к проценту учетной цене, а к проценту максимальному текущему(таймфрейм например одна минута)-двум последним баром, лонг p4 шорт p5
поясню не ждать пресечения EMA WMA, а закрывать позицию прежде чем потерю, от максимальной прибыль, например р4 лонг 0.3% р5 шорт 0.2% и ждать разворота
StopLoss тоже чтоб не переоткрывал позицию, а ждал разворота


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

 /**
В стратегии используются:
- индикатор EMA (exponential moving average) – линия экспоненциальной скользящей средней;
- индикатор WMA (weight moving average) – линия взвешенной скользящей средней.
Идея:
- классическая трендследящая стратегия, в которой выявляются моменты пересечения двух линий скользящих средних.
Сигналы:
- сигнал на открытие позиции ЛОНГ формируется в момент пересечения линий скользящих средних, после которого значения линии быстрой EMA становятся больше значений линии медленной WMA;
- сигнал на открытие позиции ШОРТ формируется в момент пересечения линий скользящих средних, после которого значения линии быстрой EMA становятся меньше значений линии медленной WMA;
Параметры:
PFast – период быстрой скользящей средней (EMA);
PSlow – период медленной скользящей средней (WMA);
Особенности:
- выполнена предварительная настройка параметров робота по результатам оценки качества торговой системы, проведённой в Мастере оптимизации стратегии;
- при тестировании цена сделки фиксируется как цена закрытия бара, на котором появился сигнал;
- в роботе заявка выставляется после закрытия бара, на котором появился сигнал.
Developed by Alfadirect;
Algorithm = ТРЕНД;

**/
function Initialize()
{
   StrategyName = "Alfa_MA_EW";
   AddParameter("Pfast", 4.4, "", 1);
   AddParameter("Pslow", 6, "", 1);
   AddParameter("P2", 0.3, "", 1);
   AddParameter("P3", 0.8, "", 1);
   AddInput("Input1", Inputs.Candle, 120, true, "RIM7=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (EMA(Input1.Close, Pfast) > WMA(Input1.Close, Pslow)) && (Pfast < Pslow) )
   {
      EnterLong();
      StopLoss(P2, SignalPriceType.DeltaInPercentFromAveragePrice);
   }

   /// ПРАВИЛО 2
   if ( (EMA(Input1.Close, Pfast) < WMA(Input1.Close, Pslow)) && (Pfast < Pslow) )
   {
      EnterShort();
      StopLoss(P3, SignalPriceType.DeltaInPercentFromAveragePrice);
   }

}

можно как-то использовать в с стратегиях привила с таймфреймом для одного правила с одним значением, для другого правила с другим таймфреймом ? что бы трелинг стоп выставлять чаще.

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

Re: помогите написать робота EMA WMA

Непрочитанное сообщение evge » 06 июн 2017, 08:17

sergrostov писал(а):поясню не ждать пресечения EMA WMA, а закрывать позицию прежде чем потерю, от максимальной прибыль, например р4 лонг 0.3% р5 шорт 0.2% и ждать разворота
StopLoss тоже чтоб не переоткрывал позицию, а ждал разворота


стоплосс можно перевыставлять после открытия позиции.
Т.е. когда позицию открыли, стоплосс установится от четной цены, в случае если выбрали тип сигнала стоплосса как Delta...

Если хотите конкретную цену, рассчитайте её, а тип стоп заявки установите в SignalPriceType.Price

Пример:

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

//перестановка стопа на каждом баре при открытой позиции, на % параметров p4, p5 от минимума и максимума последних 2х баров.
if (CurrentPosition() != 0)
{
CancelStopLoss();
//Если мы в long, то берем последние 2 бара, определяем минимум и ставим стоп на % ниже, указанный в параметре p4
//Если мы в short, то берем последние 2 бара, определяем максимум и ставим стоп на % выше, указанный в параметре p5
var Low = Math.Min(Input1.Low[0], Input1.Low[1]);
var High = Math.Max(Input1.High[0], Input1.High[1]);
var StopPrice = CurrentPosition() > 0 ?  Low - Low * 0.01 * p4 : High + High * 0.01 * p5;
StopLoss(StopPrice, SignalPriceType.Price);
}   


sergrostov писал(а):можно как-то использовать в с стратегиях привила с таймфреймом для одного правила с одним значением, для другого правила с другим таймфреймом ? что бы трелинг стоп выставлять чаще.


нет, пока так нельзя.
Можно в стратегии указать поменьше таймфрейм, а анализ (каким-то образом) проводить вышестоящего таймфрейма. Это конечно не совсем просто, но примеры получения данных вышестоящих таймфреймов на форуме есть, среди пользовательских индикаторов (например).

Конечно всё упростится, когда разработчики АД4 добавят возможность получения данных других таймфреймов (и инструментов) в стратегиях.
никогда такого не было и вот опять

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

Re: помогите написать робота EMA WMA

Непрочитанное сообщение evge » 06 июн 2017, 08:25

Чтобы робот не переоткрывал позицию, необходимо не простое условие > < в условиях на входы в позицию, а проверка на пересечение средних.

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

   /// ПРАВИЛО 1
   if ( CrossAbove(EMA(Input1.Close, Pfast), WMA(Input1.Close, Pslow)) && Pfast < Pslow )
   {
      EnterLong();
      StopLoss(P2, SignalPriceType.DeltaInPercentFromAveragePrice);
   }

   /// ПРАВИЛО 2
   if ( CrossBelow(EMA(Input1.Close, Pfast), WMA(Input1.Close, Pslow)) && Pfast < Pslow )
   {
      EnterShort();
      StopLoss(P3, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
никогда такого не было и вот опять

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

Re: помогите написать робота EMA WMA

Непрочитанное сообщение evge » 06 июн 2017, 08:55

как итог, код стратегии по вышесказанному

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

function Initialize()
{
   StrategyName = "MA_EW";
   AddParameter("Pfast", 6, "", 1); //EMA period
   AddParameter("Pslow", 58, "", 1); //WMA period
   AddParameter("P2", 0.3, "", 1); // Первоначальный стоплосс Long
   AddParameter("P3", 0.3, "", 1); // Первоначальный стоплосс Short
   AddParameter("p4", 0.3, "", 1); // Перестановка стоплосс Long
   AddParameter("p5", 0.3, "", 1); // Перестановка стоплосс Short
   AddInput("Input1", Inputs.Candle, 15, true, "RIM7=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
}

function OnUpdate()
{

   // evge 06.06.2017 http://alfadirect4.ru

   // Extended TrailingStop :)
   // Перестановка стопа на каждом баре при открытой позиции, на % параметров p4, p5 от минимума и максимума последних 2х баров.
   if (CurrentPosition() != 0)
   {
      CancelStopLoss();
      //Если мы в long, то берем последние 2 бара, определяем минимум и ставим стоп на % ниже, указанный в параметре p4
      //Если мы в short, то берем последние 2 бара, определяем максимум и ставим стоп на % выше, указанный в параметре p5
      var Low = Math.Min(Input1.Low[0], Input1.Low[1]);
      var High = Math.Max(Input1.High[0], Input1.High[1]);
      var StopPrice = CurrentPosition() > 0 ?  Low - Low * 0.01 * p4 : High + High * 0.01 * p5;
      StopLoss(StopPrice, SignalPriceType.Price);
   }   

   // Long
   if ( CrossAbove(EMA(Input1.Close, Pfast), WMA(Input1.Close, Pslow)) && Pfast < Pslow )
   {
      EnterLong();
      StopLoss(P2, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
   
   // Short
   if ( CrossBelow(EMA(Input1.Close, Pfast), WMA(Input1.Close, Pslow)) && Pfast < Pslow )
   {
      EnterShort();
      StopLoss(P3, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
   
}


параметры по умолчанию из стратегии Pfast = 6, Pslow = 58, ...

MA_EW-01.png
Сводный отчет
MA_EW-01.png (37.18 КБ) 18099 просмотров


MA_EW-02.png
Отработка переносимых стоплосс
MA_EW-02.png (40.18 КБ) 18099 просмотров
никогда такого не было и вот опять

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

Re: помогите написать робота EMA WMA

Непрочитанное сообщение evge » 06 июн 2017, 09:05

ещё пару скриншотов с параметрами Pfast = 33, Pslow = 59, все стоплосс параметры = 0.2

MA_EW-03.png
Сводный отчет
MA_EW-03.png (46.45 КБ) 18093 просмотра

MA_EW-04.png
Сигналы на графике
MA_EW-04.png (37 КБ) 18093 просмотра
никогда такого не было и вот опять

sergrostov
Сообщения: 3
Зарегистрирован: 05 июн 2017, 19:39

Re: помогите написать робота EMA WMA

Непрочитанное сообщение sergrostov » 24 июл 2017, 13:03

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

 /**
 CancelStopLoss();
      //Если мы в long, то берем последние 2 бара, определяем минимум и ставим стоп на % ниже, указанный в параметре p4
      //Если мы в short, то берем последние 2 бара, определяем максимум и ставим стоп на % выше, указанный в параметре p5
      var Low = Math.Min(Input1.Low[0], Input1.Low[0]);
      var High = Math.Max(Input1.High[0], Input1.High[0]);
      var StopPrice = CurrentPosition() > 0 ?  High - High * 0.01 * p4 : Low + Low * 0.01 * p5;
      StopLoss(StopPrice, SignalPriceType.Price);

}

не помню точно что я сделал, но так профитнее


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

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

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