Обсуждение статьи "20 торговых сигналов на MQL5" - страница 4

 

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

ENUM_ORDER_TYPE ind_01()
  {
   ENUM_ORDER_TYPE sig=WRONG_VALUE;

   if(IND01_handle==INVALID_HANDLE || IND01_handle==0)
     {
      IND01_handle=iAC(_Symbol,TF_01);
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(IND01_handle,1,0,AC_shift+3,IND01_buffer1)<AC_shift+3) return(WRONG_VALUE);
      if(!ArraySetAsSeries(IND01_buffer1,true)) return(WRONG_VALUE);

      if(CopyBuffer(IND01_handle,0,0,AC_shift+1,IND01_buffer2)<AC_shift+1) return(WRONG_VALUE);
      if(!ArraySetAsSeries(IND01_buffer2,true)) return(WRONG_VALUE);
     }

   if(IND01_buffer2[AC_shift]>0.0 && IND01_buffer1[AC_shift]==0 && IND01_buffer1[AC_shift+1]==0)sig=ORDER_TYPE_BUY;
   else if(IND01_buffer2[AC_shift]<0.0 && IND01_buffer1[AC_shift]==0 && IND01_buffer1[AC_shift+1]==0 && IND01_buffer1[AC_shift+2]==0)sig=ORDER_TYPE_BUY;
   else if(IND01_buffer2[AC_shift]<0.0 && IND01_buffer1[AC_shift]==1 && IND01_buffer1[AC_shift+1]==1)sig=ORDER_TYPE_SELL;
   else if(IND01_buffer2[AC_shift]>0.0 && IND01_buffer1[AC_shift]==1 && IND01_buffer1[AC_shift+1]==1 && IND01_buffer1[AC_shift+2]==1)sig=ORDER_TYPE_SELL;
   else sig=WRONG_VALUE;

   return(sig);
  }
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
sergey1294:

Во первых в справке ясно написано

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

ДА верно визуальное но и ориентируемся мы на визуальное значение при входе в сделку а не на то как они лежат в памяти терминала по этому и нужно  это учитывать

Правильно будет так для аллигатора 13 на 8, 8 на 5, 5 на 3 (стандартные значения)

int TradeSignal_17()
  {
   int sig=0;

   if(h_al==INVALID_HANDLE)
     {
      h_al=iAlligator(Symbol(),Period(),13,0,8,0,5,0,MODE_SMMA,PRICE_MEDIAN);
      return(0);
     }
   else
     {
      if(CopyBuffer(h_al,0,8,2,al1_buffer)<2)
         return(0);
      if(CopyBuffer(h_al,1,5,2,al2_buffer)<2)
         return(0);
      if(CopyBuffer(h_al,2,3,2,al3_buffer)<2)
         return(0);
      if(!ArraySetAsSeries(al1_buffer,true))
         return(0);
      if(!ArraySetAsSeries(al2_buffer,true))
         return(0);
      if(!ArraySetAsSeries(al3_buffer,true))
         return(0);
     }
//--- проводим проверку условия и устанавливаем значение для sig
   if(al3_buffer[1]>al2_buffer[1] && al2_buffer[1]>al1_buffer[1])
      sig=1;
   else if(al3_buffer[1]<al2_buffer[1] && al2_buffer[1]<al1_buffer[1])
      sig=-1;
   else sig=0;

//--- возвращаем торговый сигнал
   return(sig);
  }
 
olyakish:

ДА верно визуальное но и ориентируемся мы на визуальное значение при входе в сделку а не на то как они лежат в памяти терминала по этому и нужно  это учитывать

Правильно будет так для аллигатора 13 на 8, 8 на 5, 5 на 3 (стандартные значения)

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

Справка...

Технический Индикатор Alligator — это комбинация Линий Баланса (Скользящих Средних, Moving Averages) , использующих фрактальную геометрию и нелинейную динамику.

  • Синяя линия (Челюсть Аллигатора) — это Линия Баланса для временного периода, который использовался для построения графика (13-периодное сглаженное скользящее среднее, сдвинутое на 8 баров в будущее);
  • Красная линия (Зубы Аллигатора) — это Линия Баланса для значимого временного периода на порядок ниже (8-периодное сглаженное скользящее среднее, сдвинутое на 5 баров в будущее);
  • Зеленая линия (Губы Аллигатора) — это Линия Баланса для значимого временного периода, который ниже еще на один порядок (5-периодное сглаженное скользящее среднее, сдвинутое на 3 бара в будущее).


Ключевые слова выделены жирным.

Итог Вашего кода это анализ средних

Итог мною предложенного кода это анализ линий аллигатора.

 
Спасибо! Статья супер
Только, нет кнопки Stochastic Osticllator в настройках. По-моему просто две кнопки на одно место настроены.
ObjectSetInteger(0,"PIPIndNameButtonSO",OBJPROP_YDISTANCE,100);
  ObjectSetInteger(0,"PIPIndNameButtonRSI",OBJPROP_YDISTANCE,110);
 

Приветствую. Вы пишите: "Как я и писал ранее, индикаторы загружаются в терминал один раз и создаются указатели (хэндлы) на эти индикаторы, поэтому в функции OnInit() пропишем их создание, так как эта функция запускается один раз при запуске программы".

Вопрос. В прикрепляемом файле "signaltrade.mqh" также производится работа с хэндлами индикаторов. Зачем тогда их создавать в OnInit()?

 
Ovsov_Nikita:
Спасибо! Статья супер
Только, нет кнопки Stochastic Osticllator в настройках. По-моему просто две кнопки на одно место настроены.
ObjectSetInteger(0,"PIPIndNameButtonSO",OBJPROP_YDISTANCE,100);
  ObjectSetInteger(0,"PIPIndNameButtonRSI",OBJPROP_YDISTANCE,110);
Точно, спасибо!
Причина обращения: