Обсуждение статьи "Торговые идеи на основе направления и скорости движения цен"

 

Опубликована статья Торговые идеи на основе направления и скорости движения цен:

В данной статье описывается идея, основанная на анализе направления движения цен и их скорости. Производится ее формализация на языке MQL4 в виде тестового торгового советника с целью выяснения жизнеспособности рассматриваемой стратегии. Также с помощью проверки, исследования и оптимизации определяются наилучшие параметры на предоставленном в статье примере.

Любое движение в нашем мире имеет такие характеристики как направление, ускорение, скорость. На ликвидных рынках оно также поддается этим характеристикам. Из этого следует важное правило - ни одно сильное направленное перемещение цены на рынках резко никогда не заканчивается, это как поезд, который при торможении на полном ходу с составом может иметь тормозной путь до километра.

Как же происходит начало тренда? Когда мнение большинства участников рынка меняется на противоположное по каким-либо причинам, будь то глобальная перемена курса, изменение важных факторов, влияющих на рынок или новости. После этого складывается твердое общее мнение и тренд начинается. Участник рынка все больше уверены в том, что движение набирает силу и продолжится, входят крупные игроки с большими позициями, поэтому движение имеет уже свою направленность, ускорение и определенную скорость развития. Вот тут и начинают зарабатывать те, кто вошли в начале этого движения, дали ему импульс и скорость. Позже уже по худшей цене входят остальные трейдеры, но отличие от первых, они лишь пытаются использовать само направление движения цены.

Когда же настают перемены, тренд завершается. Почему же движение еще некоторое время продолжается, а не резко меняется? Это происходит из-за того, что тот, кто разгонял и толкал цену в нужном им направлении, уже закрывают свои позиции и тормозят тренд, а те, кто лишь "ловил волну", продолжают верить, что ничего не изменилось и даже пытаются сами двигать цену. Но тут "поезд" не только останавливается, но и начинает двигаться в противоположном направлении, и для них все заканчивается.

3. Увеличение эффективности входа и выхода

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

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

Рис. 3. Состояние тренда на различных масштабах по сигналам индикаторов RSI и AC

Рис. 3. Состояние тренда на различных масштабах по сигналам индикаторов RSI и AC

Автор: Alexander Fedosov

 

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

Это все можно было сократить в разы:

//--- определение индекса на покупку
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)>60)
      index_rsi=1;
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)>70)
      index_rsi=2;
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)>80)
      index_rsi=3;
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)>90)
      index_rsi=4;

//--- определение индекса на продажу   
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)<40)
      index_rsi=-1;
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)<30)
      index_rsi=-2;
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)<20)
      index_rsi=-3;
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)<10)
      index_rsi=-4;
//--- определение зоны бокового движения
   if(iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)>=40 && iRSI(Symbol(),timeframe,period,PRICE_CLOSE,0)<=60.0)
      index_rsi=0;
   return index_rsi;
  }
//+------------------------------------------------------------------+
//| Функция определения скорости тренда                              |
//+------------------------------------------------------------------+
int speed_ac(int timeframe)
  {
   double ac_0,ac_1,ac_2,ac_3,ac_4;
//---
   ac_0 = iAC(Symbol(),timeframe,0);
   ac_1 = iAC(Symbol(),timeframe,1);
   ac_2 = iAC(Symbol(),timeframe,2);
   ac_3 = iAC(Symbol(),timeframe,3);
   ac_4 = iAC(Symbol(),timeframe,4);
//---
   index_ac=0;
//--- сигнал на покупку
   if(ac_0>ac_1)
      index_ac=1;
   if(ac_0>ac_1 && ac_1>ac_2)
      index_ac=2;
   if(ac_0>ac_1 && ac_1>ac_2 && ac_2>ac_3)
      index_ac=3;
   if(ac_0>ac_1 && ac_1>ac_2 && ac_2>ac_3 && ac_3>ac_4)
      index_ac=4;
//--- сигнал на продажу
   if(ac_0<ac_1)
      index_ac=-1;
   if(ac_0<ac_1 && ac_1<ac_2)
      index_ac=-2;
   if(ac_0<ac_1 && ac_1<ac_2 && ac_2<ac_3)
      index_ac=-3;
   if(ac_0<ac_1 && ac_1<ac_2 && ac_2<ac_3 && ac_3<ac_4)
      index_ac=-4;
   return index_ac;
 
Ну может и странный. Только задача была максимально подробно и просто описать. Да, RSI можно было загнать в переменную. Было бы компактней, но глядя какие вопросы задают на форумах...Я ориентировался на самого начинающего. Извиняюсь, если не слишком удобно вышло.
 
Alex2356:
Ну может и странный. Только задача была максимально подробно и просто описать. Да, RSI можно было загнать в переменную. Было бы компактней, но глядя какие вопросы задают на форумах...Я ориентировался на самого начинающего. Извиняюсь, если не слишком удобно вышло.

Извиняться не за что, у Вас все хорошо и понятно, просто было интересно почему такая разница в стиле написания кода.

Для новичка будет полезно посмотреть примеры реализации разными стилями....

 
VOLDEMAR:

Для новичка будет полезно посмотреть примеры реализации разными стилями....

Все новички с завидным постоянством и упорством задают один и тот же вопрос: "А как правильно?
Alex2356:
Я ориентировался на самого начинающего.

Новичок не значит бестолковый. И не стоит для новичков сводить простые примеры к неправильным или некорректным.

В данном случае:

double index_rsi;
//--- определение индекса на покупку
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)>60)
index_rsi=1;
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)>70)
index_rsi=2;
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)>80)
index_rsi=3;
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)>90)
index_rsi=4;

//--- определение индекса на продажу   
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)<40)
index_rsi=-1;
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)<30)
index_rsi=-2;
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)<20)
index_rsi=-3;
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)<10)
index_rsi=-4;

//--- определение зоны бокового движения
if(iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)>=40 && iRSI(Symbol(),NULL,8,PRICE_CLOSE,0)<=60.0)
index_rsi=0;

 Вы допустили ДВЕ грубые ошибки:

-- значение RSI надо было присвоить переменной и уж затем выполнять сравнение;

-- верно использовать оператор if-else (https://docs.mql4.com/ru/basis/operators/if).

Неверное использование (или точнее сознательное не использование) где нужно оператора if-else -- это Ваш стиль, судя по всему. И такой стиль Вы прививаете новичкам? Хорошо если они Вашу статью оставят без внимания, или же, прочитав, составят для себя правильные акценты. А ведь новички есть разные. Усвоят Ваши примеры и будут с умным видом нести в массы (со ссылкой на Вашу статью), что неправильное это правильное.

Странно что модерация пропускает статьи с такими примерами кодов для публикации.

p.s. Моё мнение -- надо в статью внести правки и выложить новую редакцию с корректными примерами.

 
abolk:
Все новички с завидным постоянством и упорством задают один и тот же вопрос: "А как правильно?

Новичок не значит бестолковый. И не стоит для новичков сводить простые примеры к неправильным или некорректным.

В данном случае:

 Вы допустили ДВЕ грубые ошибки:

-- значение RSI надо было присвоить переменной и уж затем выполнять сравнение;

-- верно использовать оператор if-else (https://docs.mql4.com/ru/basis/operators/if).

Неверное использование (или точнее сознательное не использование) где нужно оператора if-else -- это Ваш стиль, судя по всему. И такой стиль Вы прививаете новичкам? Хорошо если они Вашу статью оставят без внимания, или же, прочитав, составят для себя правильные акценты. А ведь новички есть разные. Усвоят Ваши примеры и будут с умным видом нести в массы (со ссылкой на Вашу статью), что неправильное это правильное.

Странно что модерация пропускает статьи с такими примерами кодов для публикации.

p.s. Моё мнение -- надо в статью внести правки и выложить новую редакцию с корректными примерами.

Покажите, пожалуйста, как бы Вы правильно записали оператор if-else в данном случае.
 
И такой стиль Вы прививаете новичкам?

Андрей, я уважаю ваше мнение. Тем не менее считаю, что стиль написания новичок должна формировать не эта статья. А на начальных этапах Учебник и Документация.

Хорошо если они Вашу статью оставят без внимания, или же, прочитав, составят для себя правильные акценты. А ведь новички есть разные. Усвоят Ваши примеры и будут с умным видом нести в массы (со ссылкой на Вашу статью), что неправильное это правильное.

Поэтому, с вашего позволения, я в помощи расстановки правильных акцентов буду рекомендовать вас. Тем более, что у вас в профиле прописаны предложения услуг обучения.

И не стоит для новичков сводить простые примеры к неправильным или некорректным.

Пример логически правильный. Некорректность очень размытое понятие.  Позвольте пример:

//+------------------------------------------------------------------+
bool func()
  {
   bool res=false;
   if(OrderSelect(...))
      res=true;
   return res;
  }
//+------------------------------------------------------------------+
bool func()
  {
   return(OrderSelect(...));
  }
//+------------------------------------------------------------------+


  Ответьте, пожалуйста, какой из примеров подходит под категорию Правильный, а какой Корректный?

 Вы допустили ДВЕ грубые ошибки

Не присвоил переменную. Не прописал else. Да я вас понял. Спасибо.

Учебник по MQL4
  • book.mql4.com
Учебник по MQL4
 
Tapochun:
Покажите, пожалуйста, как бы Вы правильно записали оператор if-else в данном случае.

Простой и наглядный пример есть в документации -- https://docs.mql4.com/ru/basis/operators/if.

А вот в данном случае -- сами и подумайте как правильно записать -- не такая уж и сложная задача.

 
Alex2356:

Пример логически правильный. Некорректность очень размытое понятие.

Если бы Ваш пример был логически правильный и корректный -- то он бы не вызывал сомнений и нареканий. А таковые есть.

Ваш пример в посте https://www.mql5.com/ru/forum/43217#comment_1514871 :

//+------------------------------------------------------------------+
bool func()
  {
   bool res=false;
   if(OrderSelect(...))
      res=true;
   return res;
  }
//+------------------------------------------------------------------+
bool func()
  {
   return(OrderSelect(...));
  }
//+------------------------------------------------------------------+

-- оба примера с грубой ошибкой -- функция OrderSend() возвращает int -- https://docs.mql4.com/ru/trading/ordersend 

-- с точки зрения работы с return() -- оба подхода правильные -- но только первый корректный.

 
abolk:

Если бы Ваш пример был логически правильный и корректный -- то он бы не вызывал сомнений и нареканий. А таковые есть.

Ваш пример в посте https://www.mql5.com/ru/forum/43217#comment_1514871 :

-- оба примера с грубой ошибкой -- функция OrderSend() возвращает int -- https://docs.mql4.com/ru/trading/ordersend 

-- с точки зрения работы с return() -- оба подхода и правильные -- но только первый корректный.

К сожалению функция OrderSelect возвращает bool
 
Alex2356:
К сожалению функция OrderSelect возвращает bool

да, прочитал как OrderSend()

OrderSelect() предполагает последующую работу с ордером -- поэтому Ваш пример с этой функцией бестолковый (уж извините за критику, но Вы сами спозиционировали себя как автор статьи для новичков)

Причина обращения: