Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересуешься социальным трейдингом? Прочти соответствующую статью!
Василий
20
Василий 2010.07.07 13:03 

Ребят, прошу, не закидывайте камнями за дилетанство, я только неделю назад прочитал учебник по MQL4, прочитал полностью но понял не все. Вот первая моя практическая работа. Хочу написать индикатор на основе Accelerator и Awesome. Сут такая: Когда совпадают цвета столбцов на гистограмме, то нужно чтоб свечка перекрашивалась в какой-н. яркий цвет на графике. 

Не могу никак понять, как совместить эти два индикатора в одном. В общем, если не трудно, то прошу помочь.

С уважением, Василий. 

o_O
Модератор
23324
o_O 2010.07.07 13:05  

используйте анализ индикаторов через iAO и iAC

а затем на основном графике (indicator_chart_window) рисуйте через два буфера со свойством DRAW_HISTOGRAM

посмотрите принцип как это реализовано в индикатор Heiken Ashi

Василий
20
Василий 2010.07.07 13:47  

Я проанализировал индикаторы iAO и iAC из них нужно вынуть переменные up, назвать их по особенному, потом сравнить, если они соответствуют друг другу, то закрашивать свечку в свой цвет, если нет то не трогать и тд. Но вот как рисовать со свойством DRAW_HISTOGRAM? и как те две переменные запихнуть в один индикатор? 

Надеюсь на понимание и отсутствие опыта :)

Василий
20
Василий 2010.07.07 13:48  
sergeev:

используйте анализ индикаторов через iAO и iAC

а затем на основном графике (indicator_chart_window) рисуйте через два буфера со свойством DRAW_HISTOGRAM

посмотрите принцип как это реализовано в индикатор Heiken Ashi


Я проанализировал индикаторы iAO и iAC из них нужно вынуть переменные up, назвать их по особенному, потом сравнить, если они соответствуют друг другу, то закрашивать свечку в свой цвет, если нет то не трогать и тд. Но вот как рисовать со свойством DRAW_HISTOGRAM? и как те две переменные запихнуть в один индикатор? 

Надеюсь на понимание и отсутствие опыта :)
Анатолий
199
Анатолий 2010.07.07 13:57  
alternativagod:

Но вот как рисовать со свойством DRAW_HISTOGRAM?

Вы ссылку выше видели?

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

Василий
20
Василий 2010.07.07 14:09  
ToLik_SRGV:

Вы ссылку выше видели?

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


Спасибо, прочитал.  А как вытащить переменные с других индикаторов?
o_O
Модератор
23324
o_O 2010.07.07 19:08  
alternativagod:

Спасибо, прочитал. А как вытащить переменные с других индикаторов?
вопрос конкретнее поставьте.
Анатолий
199
Анатолий 2010.07.07 19:54  
alternativagod:

Спасибо, прочитал.  А как вытащить переменные с других индикаторов?

Переменные из других индикаторов нельзя «вытащить».
Из индикаторов можно получать только значения индикаторных массивов, с помощью специальных функций i…(), или iCustom(). Для того чтобы решить вашу задачу, вам нужно узнать в какой цвет окрашены столбики индикаторов AC и AO в данный момент. К сожалению функции iAC и iAO извлекают данные из линий с индексом 0, которые хранят текущее значение этих индикаторов. Информации о цвете в них нет. В этом случае предпочтительней использовать функцию iCustom() которая в отличии от iAC и iAO, дает возможность выбрать, данные какого индикаторного массива следует считать, делается это в параметре MODE. В выше названных индикаторах информация о цвете «хранится» в линиях с индексами 1 для зеленых столбиков, и 2 для красных, соответственно если значение этих линий не равно 0.0 то рисуется столбик заданного цвета. Именно это условие и положено в основу ниже представленного кода:

//+------------------------------------------------------------------+
//|                                               AC_AO_Synchron.mq4 |
//|                               Copyright © 2010, Анатолий Сергеев |
//|                                            mql.sergeev@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Анатолий Сергеев"
#property link      "mql.sergeev@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_width1 2
#property indicator_color2 Green
#property indicator_width2 2
#property indicator_color3 Red
#property indicator_width3 2
#property indicator_color4 Red
#property indicator_width4 2
double Green_home[];
double Green_end[];
double Red_home[];
double Red_end[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, Green_home);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, Green_end);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2, Red_home);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3, Red_end);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){
   for(int shift = Bars-IndicatorCounted()-1; shift >= 0; shift--){
   
      if(iCustom(NULL, 0, "Accelerator", 1, shift) != 0 && iCustom(NULL, 0, "Awesome", 1, shift) != 0){  //ЕСЛИ ОБА ЗЕЛЕНЫЕ
         Green_home[shift] = Open[shift];
         Green_end[shift] = Close[shift];
      }
      
      if(iCustom(NULL, 0, "Accelerator", 2, shift) != 0 && iCustom(NULL, 0, "Awesome", 2, shift) != 0){  //ЕСЛИ ОБА КРАСНЫЕ
         Red_home[shift] = Open[shift];
         Red_end[shift] = Close[shift];
      }
   }
   
}
//+------------------------------------------------------------------+

Nikolaj
305
Nikolaj 2010.07.07 19:54  
alternativagod:

Спасибо, прочитал. А как вытащить переменные с других индикаторов?
Это то же,вы можете легко переделать
Файлы:
Василий
20
Василий 2010.07.07 20:51  

ToLik_SRGV Большое спасибо за самое полнейшее разъяснение вопроса! Я сам думал думал весь день над этим индикатором. В общем вот что надумал. получилось почти как у тебя

 //+------------------------------------------------------------------+
//| пробный.mq4 |
//| Vasily Titov |
//| alternativagod@bk.ru |
//+------------------------------------------------------------------+
#property copyright "Vasily Titov"
#property link "alternativagod@bk.ru"
//----
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_width1 2
#property indicator_color2 Blue
#property indicator_width2 2
#property indicator_color3 Pink
#property indicator_width3 2
#property indicator_color4 Pink
#property indicator_width4 2
double Blue_home[];
double Blue_end[];
double Pink_home[];
double Pink_end[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init(){
  SetIndexStyle(0,DRAW_HISTOGRAM);
  SetIndexBuffer(0, Blue_home);
  SetIndexStyle(1,DRAW_HISTOGRAM);
  SetIndexBuffer(1, Blue_end);
  SetIndexStyle(2,DRAW_HISTOGRAM);
  SetIndexBuffer(2, Pink_home);
  SetIndexStyle(3,DRAW_HISTOGRAM);
  SetIndexBuffer(3, Pink_end);
   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start(){

int Counted_bars = IndicatorCounted();
  int limit,i,History;
   
  History=4000;
   
   
  limit=Bars-Counted_bars-1; // Индекс первого непосчитанного
  if (limit>History-1) // Если много баров то ..
  limit=History-1;


   
  for(i=limit; i>=0; i--)
   
  {
   
  double CurrIAO = iAO(NULL,0,i);
  double PrevIAO = iAO(NULL,0,i+1);
   
  double CurrIAC= iAC(NULL,0,i);
  double PrevIAC= iAC(NULL,0,i+1);
   
  if (CurrIAO>PrevIAO && CurrIAC>PrevIAC) {Blue_home[i] = Open[i]; Blue_end[i] = Close[i];}
  if (CurrIAO<PrevIAO && CurrIAC<PrevIAC) {Pink_home[i] = Open[i]; Pink_end[i] = Close[i];}
   
  }
   
   
}
//+------------------------------------------------------------------+

 

Только чуть проще. но твой вариант, я думаю, будет более правильным. Всем ребятам большое спасибо за отзывчивость! 

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий