Советники: Moving Average Trade System

 

Moving Average Trade System:

Стратегия базируется на индикаторе скользящее среднее (Moving Average с периодами 5/20/40/60).

Author: Юрий

 
Как можно тестировать советник по ценам открытия если в коде нет контроля открытия бара?
 
Valy:
Как можно тестировать советник по ценам открытия если в коде нет контроля открытия бара?

Самый простой способ проверить сравнить результаты на этой модели и точной. А вообще смотреть нужно внимательней.

  SMA5 = iMA(NULL,PERIOD_M30,per_SMA5,0,MODE_SMA,PRICE_MEDIAN,1);
  SMA20 = iMA(NULL,PERIOD_M30,per_SMA20,0,MODE_SMA,PRICE_MEDIAN,1);
  SMA40_prew = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_SMA,PRICE_MEDIAN,2);
  SMA40 = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_SMA,PRICE_MEDIAN,1);
  SMA60 = iMA(NULL,PERIOD_M30,per_SMA60,0,MODE_SMA,PRICE_MEDIAN,1);

В течение всего тика значения переменных не изменяются, т.к. берутся за прошлый тик. Засада может быть только если условия подходят и под условия открытия и закрытия. Тогда за 1 тик советник поставит что-то около сотни ордеров ). Так что будьте внимательны при тестировании и переделывании.

Удачи.


ЗЫЖ: лучше таки ввести контроль:

int start()
{
   if (Volume[0] > 1) return(0);
   
   // code
}

1. Разницу в скорости будет отлично видно в тестере.

2. Даже в случае перехлеста  условий (что довольно маловероятно) за один тик будет торговаться максимум одна ставка.

 
Вставил в код volume[0]>1 и уже не открывает много ордеров,так лучше.Но есть вопрос еще:каким образом можно по одному сигналу входа открыть два независимых ордера по рынку,пример-в место одной продажи 0,2 сделать две продажи по 0,1 с задержкой секунд на 10 для надежности срабатывания?
 
Valy:
Вставил в код volume[0]>1 и уже не открывает много ордеров,так лучше.Но есть вопрос еще:каким образом можно по одному сигналу входа открыть два независимых ордера по рынку,пример-в место одной продажи 0,2 сделать две продажи по 0,1 с задержкой секунд на 10 для надежности срабатывания?

Ищем строчку:

            OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Покупаем",16384,0,Green);

Заменяем ее на код:

            OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Покупаем",16384,0,Green);
            Sleep(10000);//10 секунд
            RefreshRates();
            OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Покупаем",16384,0,Green);

Делаем то же самое для SELL. И выставляем переменную Lots в 2 раза меньше. Вообще по хорошему это в отдельную функцию вынести надо. Код культурнее смотреться будет.

Сейчас в коде вроде закрываются все ордера, но при модификации осторожно.

Удачи.

 
gosadmin:
Прикольный советник, вот только плохо, что он закрывает сделки при повторном пересечении, с одной стороны это неплохо, но когда линии налаживается, то тут убыточная сделка. И судя по результатам, цена идёт в нужном направлении, а сделки закрываются :( . Пытался сам разобраться как отключить или изменить его, но опыта в скриптах нет...А было бы неплохо чтоб он как то давал задерку после открытия и не закрывался сразу если линии налаживаются, или отключить эту функцию закрытия при повторном пересечении. Может кто подскажет где-что заменить-добавить что-бы дать задержку, или если это не поможет при тестировании, как отключить закрытие при пересечении ? Спасибо. Надеюсь поймёте что я тут хотел сказать :)

В эксперте закрытием сделки по обратному пересечению ведают следующие строчки:

Покупку закрывает
           if(SMA40<=SMA60)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
Buy=0;
// return(0); // exit
}

Продажу закрывает

           if(SMA40>=SMA60)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
Sell=0;
// return(0); // exit
}
Вы можете либо убрать эти строчки из своего советника, либо закоментировать их.
 

 КАКОЙ КОД БУДЕТ ДЛЯ MOVING AVERAGE   С ПЕРИОДАМИ LWMA5  LWMA8  EMA18  EMA28?? ЭТОТ ЯЗЫК ДЛЯ ПРОСТЫХ ЛЮДЕЙ СЛИШКОМ СЛОЖНЫЙ!!!!!

 
rusa:

 КАКОЙ КОД БУДЕТ ДЛЯ MOVING AVERAGE   С ПЕРИОДАМИ LWMA5  LWMA8  EMA18  EMA28?? ЭТОТ ЯЗЫК ДЛЯ ПРОСТЫХ ЛЮДЕЙ СЛИШКОМ СЛОЖНЫЙ!!!!!

Периоды MOVING AVERAGE можно поменять в тестере в свойствах эксперта при тестировании, или к коде программы  напротив соответствующих параметров

extern int       per_SMA5 = 5;
extern int per_SMA20 = 20;
extern int per_SMA40 = 40;
extern int per_SMA60 = 60;

Чтобы изменить метод вычисления скользящего среднего (Moving Average) с текущего SMA на LWMA и EMA надо заменить вот эти строки кода:

// Вычисляем начальные параметры индикаторов для поиска условий входа

SMA5 = iMA(NULL,PERIOD_M30,per_SMA5,0,MODE_SMA,PRICE_MEDIAN,1);
SMA20 = iMA(NULL,PERIOD_M30,per_SMA20,0,MODE_SMA,PRICE_MEDIAN,1);
SMA40_prew = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_SMA,PRICE_MEDIAN,2);
SMA40 = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_SMA,PRICE_MEDIAN,1);
SMA60 = iMA(NULL,PERIOD_M30,per_SMA60,0,MODE_SMA,PRICE_MEDIAN,1);

на эти:

// Вычисляем начальные параметры индикаторов для поиска условий входа
 
SMA5 = iMA(NULL,PERIOD_M30,per_SMA5,0,MODE_LWMA,PRICE_MEDIAN,1);
SMA20 = iMA(NULL,PERIOD_M30,per_SMA20,0,MODE_LWMA,PRICE_MEDIAN,1);
SMA40_prew = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_EMA,PRICE_MEDIAN,2);
SMA40 = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_EMA,PRICE_MEDIAN,1);
SMA60 = iMA(NULL,PERIOD_M30,per_SMA60,0,MODE_EMA,PRICE_MEDIAN,1);

Не забудьте откомпилировать эксперта, после всех изменений.

 

Спасибо.Ещё есть вопрос по тестированию Moving Average с периодами lwma5 lwma8 ema18 ema28. Почему sell и buy на графике происходят непонятно когда? Можно ли сделать код, чтобы sell и buy были только в точке чуть выше или ниже пересечения линий?

 
fortrader.ru писал(а):
rusa:

 КАКОЙ КОД БУДЕТ ДЛЯ MOVING AVERAGE   С ПЕРИОДАМИ LWMA5  LWMA8  EMA18  EMA28?? ЭТОТ ЯЗЫК ДЛЯ ПРОСТЫХ ЛЮДЕЙ СЛИШКОМ СЛОЖНЫЙ!!!!!

Периоды MOVING AVERAGE можно поменять в тестере в свойствах эксперта при тестировании, или к коде программы  напротив соответствующих параметров

extern int       per_SMA5 = 5;
extern int per_SMA20 = 20;
extern int per_SMA40 = 40;
extern int per_SMA60 = 60;

Чтобы изменить метод вычисления скользящего среднего (Moving Average) с текущего SMA на LWMA и EMA надо заменить вот эти строки кода:

// Вычисляем начальные параметры индикаторов для поиска условий входа

SMA5 = iMA(NULL,PERIOD_M30,per_SMA5,0,MODE_SMA,PRICE_MEDIAN,1);
SMA20 = iMA(NULL,PERIOD_M30,per_SMA20,0,MODE_SMA,PRICE_MEDIAN,1);
SMA40_prew = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_SMA,PRICE_MEDIAN,2);
SMA40 = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_SMA,PRICE_MEDIAN,1);
SMA60 = iMA(NULL,PERIOD_M30,per_SMA60,0,MODE_SMA,PRICE_MEDIAN,1);

на эти:

// Вычисляем начальные параметры индикаторов для поиска условий входа
 
SMA5 = iMA(NULL,PERIOD_M30,per_SMA5,0,MODE_LWMA,PRICE_MEDIAN,1);
SMA20 = iMA(NULL,PERIOD_M30,per_SMA20,0,MODE_LWMA,PRICE_MEDIAN,1);
SMA40_prew = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_EMA,PRICE_MEDIAN,2);
SMA40 = iMA(NULL,PERIOD_M30,per_SMA40,0,MODE_EMA,PRICE_MEDIAN,1);
SMA60 = iMA(NULL,PERIOD_M30,per_SMA60,0,MODE_EMA,PRICE_MEDIAN,1);

Не забудьте откомпилировать эксперта, после всех изменений.

Спасибо.Ещё есть вопрос по тестированию Moving Average с периодами lwma5 lwma8 ema18 ema28. Почему sell и buy на графике происходят непонятно когда? Можно ли сделать код, чтобы sell и buy были только в точке чуть выше или ниже пересечения линий?

 
rusa:

Спасибо.Ещё есть вопрос по тестированию Moving Average с периодами lwma5 lwma8 ema18 ema28. Почему sell и buy на графике происходят непонятно когда? Можно ли сделать код, чтобы sell и buy были только в точке чуть выше или ниже пересечения линий?

Отредактировать моменты совершения сделок Вы сможете здесь:
  // Проверка условий для совершения сделки
if(Buy<1 && SMA5>SMA20 && SMA20>SMA40 && (SMA40-SMA60)>=0.0001 && SMA40_prew<=SMA60)
{
...
 }

if(Sell<1 && SMA5<SMA20 && SMA20<SMA40 && (SMA60-SMA40)>=0.0001 && SMA40_prew>=SMA60)
{
...
}
выставив нужные Вам условия.
Причина обращения: