Andrju81
Андрей

 
Уровень 18

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Добавить алерт в индикатор и по возможности немного модифицировать...

Здравствуйте, уважаемые программисты!

Просьба прикрутить алерт, отправку push сообщения на мобильный и email к индикатору BetterVolume 1.4 при появлении красной или зеленой сигнальной гистограммы(столбика).
И по возможности, модифицировать или написать другой индикатор(советник сигнализатор) на его основе, а именно: при появлении красного или зеленого сигнального столбика(гистограммы) рисовать горизонтальные линии по ценам открытия и закрытия соответствующих им свечам(барам), пример на скрине.
Настраиваемые параметры должны быть: цвета линий, минимальное количество пунктов между ценой открытия и закрытия свечи(бара), т.е. минимальная величина тела свечи(бара) в пунктах, количество уровней, таймфрейм. Ну как-то так!?.. Если кто-нибудь возьмется за данную просьбу, обсудим детали уже в теме или в личке.
Буду очень признателен за любую помощь.BetterVolume 1.4.mq4 (5 Kb)
  • 0
  • Просмотров: 11185
  • 2 мая 2015, 18:19
  • Andrju81
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
01 мая 2015
03 мая 2015

Брокер для ваших роботов, 15 лет на рынке

Комментарии (14)

+
0
Начну завтра делать. Для отправки пуш сообщения нужен будет MetaQuotes ID
Редактирован: 2 мая 2015, 21:14
avatar

  35  AM2 Сообщений: 16282 - Андрей

  • 2 мая 2015, 21:14
+
0
Можно уточнить, что именно начнете — алерты или модификацию с отрисовкой уровней?!.. Хотя, на Ваше усмотрение, если сложно с уровнями, то буду продолжать вручную устанавливать, только для семи пар не всегда успеваю, на малых таймфреймах, уловить сигналы, а соответственно — потеря енного количества пунктов, приходиться пропускать основное движение и снимать остатки на откатах, т.к. торгую внутри дня, это(Forex) сейчас для меня основная работа…
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 2 мая 2015, 22:10
+
0
Данный код строит все линии на указанное количество баров назад:





#property copyright ""
#property link      ""

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Gold
#property indicator_color4 Lime
#property indicator_color5 Green
#property indicator_color6 Magenta
#property indicator_color7 Brown

#property indicator_width1 3
#property indicator_width2 2
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 3
#property indicator_width6 2


extern int     NumberOfBars = 100;
extern string  Note = "0 means Display all bars";
extern int     MAPeriod = 100;
extern int     LookBack = 20;


double red[],blue[],yellow[],green[],white[],magenta[],v4[];
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
} 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexBuffer(0,red);
      SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexLabel(0,"Climax High ");
      
      SetIndexBuffer(1,blue);
      SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexLabel(1,"Neutral");
      
      SetIndexBuffer(2,yellow);
      SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexLabel(2,"Low ");
      
      SetIndexBuffer(3,green);
      SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexLabel(3,"HighChurn ");
      
      SetIndexBuffer(4,white);
      SetIndexStyle(4,DRAW_HISTOGRAM);
      SetIndexLabel(4,"Climax Low ");
      
      SetIndexBuffer(5,magenta);
      SetIndexStyle(5,DRAW_HISTOGRAM);
      SetIndexLabel(5,"ClimaxChurn ");
      
      SetIndexBuffer(6,v4);
      SetIndexStyle(6,DRAW_LINE,0,2);
      SetIndexLabel(6,"Average("+MAPeriod+")");
      
      IndicatorShortName("Better Volume 1.4" );
      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  
   double VolLowest,Range,Value2,Value3,HiValue2,HiValue3,LoValue3,tempv2,tempv3,tempv;
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   if ( NumberOfBars == 0 ) 
      NumberOfBars = Bars-counted_bars;
   limit=NumberOfBars; //Bars-counted_bars;
   
      
   for(int i=0; i<limit; i++)   
      {
         red[i] = 0; blue[i] = Volume[i]; yellow[i] = 0; green[i] = 0; white[i] = 0; magenta[i] = 0;
         Value2=0;Value3=0;HiValue2=0;HiValue3=0;LoValue3=99999999;tempv2=0;tempv3=0;tempv=0;
         
         // -- определяем самый низкий объем за 20 свечек и рисуем столбик
         VolLowest = Volume[iLowest(NULL,0,MODE_VOLUME,20,i)];
         if (Volume[i] == VolLowest)
            {
               yellow[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
            }
         // -- определяем волатильность      
         Range = (High[i]-Low[i]);
         Value2 = Volume[i]*Range;
         
         if (  Range != 0 )
            Value3 = Volume[i]/Range;
            
         
         for ( int n=i;n<i+MAPeriod;n++ )
            {
               tempv= Volume[n] + tempv; 
            } 
          v4[i] = NormalizeDouble(tempv/MAPeriod,0);
         
          
          for ( n=i;n<i+LookBack;n++)
            {
               tempv2 = Volume[n]*((High[n]-Low[n])); 
               if ( tempv2 >= HiValue2 )
                  HiValue2 = tempv2;
                    
               if ( Volume[n]*((High[n]-Low[n])) != 0 )
                  {           
                     tempv3 = Volume[n] / ((High[n]-Low[n]));
                     if ( tempv3 > HiValue3 ) 
                        HiValue3 = tempv3; 
                     if ( tempv3 < LoValue3 )
                        LoValue3 = tempv3;
                  } 
            }
                                      
          if ( Value2 == HiValue2  && Close[i] > (High[i] + Low[i]) / 2 )
            {
               red[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
               yellow[i]=0;
            }   
            
          if ( Value3 == HiValue3 )
            {
               green[i] = NormalizeDouble(Volume[i],0);                             
               blue[i] =0;
               yellow[i]=0;
               red[i]=0;
            }
          if ( Value2 == HiValue2 && Value3 == HiValue3 )
            {
               magenta[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
         if ( Value2 == HiValue2  && Close[i] <= (High[i] + Low[i]) / 2 )
            {
               white[i] = NormalizeDouble(Volume[i],0);
               magenta[i]=0;
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
              
         if(red[i]!=0)
          {
           //ObjectsDeleteAll(); 
           SetHLine(clrRed,"RedOpen "+TimeToString(Time[i],TIME_DATE),Open[i],0,2);
           SetHLine(clrRed,"RedClose "+TimeToString(Time[i],TIME_DATE),Close[i],0,2);            
          }  
          
         if(green[i]!=0)
          {
           //ObjectsDeleteAll(); 
           SetHLine(clrGreen,"GreenOpen "+TimeToString(Time[i],TIME_DATE),Open[i],0,2);
           SetHLine(clrGreen,"GreenClose "+TimeToString(Time[i],TIME_DATE),Close[i],0,2);            
          }                          
      }
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
         


Мод с сообщениями начну сегодня а отлаживать буду когда будут котировки.
Редактирован: 3 мая 2015, 09:55
avatar

  35  AM2 Сообщений: 16282 - Андрей

  • 3 мая 2015, 09:53
+
0
Индикатор с алертом, сообщениями и отрисовкой:

www.opentraders.ru/downloads/704/
avatar

  35  AM2 Сообщений: 16282 - Андрей

  • 3 мая 2015, 10:27
+
0
Проверил модификацию индикатора::
1. Для отрисовки линии по зеленому столбику нужно брать данные из массива white[i] — там изначально стоял белый цвет столбика, но я для себя изменил на зеленый, т.к. на светлой теме этого столбика не было видно.
2. С сообщениями пока не все гладко — как только присоединяешь индикатор к графику, он отправляет сразу 40 сообщений на email, а потом продолжает отправлять с энной периодичностью. Тоже и с алертами — выдает сообщения из истории, а надо только при появлении этих столбиков и на закрытом баре(свече).
3. На некоторых сигнальных барах(свечах) не рисует линии!!!
А в общем — Вы меня правильно поняли, только желательно вынести настройки алертов и отрисовки уровней отдельно от настроек индикатора.
Что-нибудь типа такого:
<code>extern string _1_LineLevels    = "Настройки отображения уровней"
extern int    MaxOfBars        = 100;        // Максимум баров для отрисовки
extern int    MinCandleBody    = 21;         // Минимальная величина тела свечи
extern color BullLineColore    = Blue;       // Цвет линий красного столбика
extern color BearLineColore    = Red;        // Цвет линий зеленого столбика
extern string _P_WhereOutput   = "---------- Куда выводить";
extern bool   UseAlert         = True;       // Использовать диалоговое окно
extern bool   UseComment       = False;      // Выводить комментарий
extern bool   UsePrint         = False;      // Записывать в журнал
extern bool   UseSendMail      = False;      // Посылать электронное письмо
extern bool   UseSendPush      = False;      // Посылать Push-уведомление на                  мобильные терминалы
extern bool   UseSound         = True;       // Использовать звук
extern string sotFileName      = "news.wav"; // Наименование звукового файла
extern int    AlertInterval    = 60;         // Интервал подачи сигнала</code>

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

Редактирован: 3 мая 2015, 16:51
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 3 мая 2015, 15:32
+
0
На мой взгляд у вас достаточный уровень чтобы все сделать самостоятельно. Я видел ваши коды, не нужно скромничать :)  У меня на альпах сейчас нет котировок чтобы все отладить
avatar

  35  AM2 Сообщений: 16282 - Андрей

  • 3 мая 2015, 16:34
+
0
Что касается написания простых советников, так это для меня особых трудностей не составляет, т.к. просто добавляю условие на открытие позиций в шаблон(заготовку), но с алертами и графическими объектами у меня не получается работать, еще на понял по какому принципу их вставлять в код индикатора или советника, и как это сделать, чтобы сигналы(алерты) не выдавались бесконечно. Я же самоучка, компьютер освоил только года три четыре назад, каждый раз нахожу что-то новое для себя.
Буду пробовать своими силами, тем более пример Вы мне уже показали!?.. Но еще вопрос — как ограничить число повторений сигналов(сообщений) и сделать так, чтобы они выдавались только при закрытии бара(свечи), а не из истории…
Редактирован: 3 мая 2015, 17:18
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 3 мая 2015, 17:04
+
0
Когда пойдут котировки буду все отлаживать. Пример отправки сообщения на почту здесь: www.opentraders.ru/downloads/531/
avatar

  35  AM2 Сообщений: 16282 - Андрей

  • 3 мая 2015, 20:05
+
0
Я тут немного поправил и исправил кое-какие ошибки кода, но не могу разделить отображение гистограммы и линий(уровней) на разное количество баров, и перерисовку уровней при изменении этого количества, т.е. если уровни нарисованы допустим на 500 барах, то при изменении на 100 остаются лишние от 400!?..

#property copyright ""
#property link      ""
#property strict

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Gold
#property indicator_color4 Lime
#property indicator_color5 Green
#property indicator_color6 Magenta
#property indicator_color7 Brown

#property indicator_width1 3
#property indicator_width2 2
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 3
#property indicator_width6 2


extern int     NumberOfBars      = 500;
extern string  Note              = "0 means Display all bars";
extern int     MAPeriod          = 100;
extern int     LookBack          = 20;
extern string  _1_LineLevels     = "Настройки отображения уровней";
extern int     MaxOfBars         = 100;        // Максимум баров для отрисовки
extern int     MinCandleBody     = 21;         // Минимальная величина тела свечи
extern color   BullLineColore    = Blue;       // Цвет линий красного столбика
extern color   BearLineColore    = Red;        // Цвет линий зеленого столбика


double red[],blue[],yellow[],green[],white[],magenta[],v4[];
bool mail,push;
int send=0;
double mincandle=MinCandleBody*MarketInfo(Symbol(),MODE_POINT);
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) 
{
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
} 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
      SetIndexBuffer(0,red);
      SetIndexStyle(0,DRAW_HISTOGRAM);
      SetIndexLabel(0,"Climax High ");
      
      SetIndexBuffer(1,blue);
      SetIndexStyle(1,DRAW_HISTOGRAM);
      SetIndexLabel(1,"Neutral");
      
      SetIndexBuffer(2,yellow);
      SetIndexStyle(2,DRAW_HISTOGRAM);
      SetIndexLabel(2,"Low ");
      
      SetIndexBuffer(3,green);
      SetIndexStyle(3,DRAW_HISTOGRAM);
      SetIndexLabel(3,"HighChurn ");
      
      SetIndexBuffer(4,white);
      SetIndexStyle(4,DRAW_HISTOGRAM);
      SetIndexLabel(4,"Climax Low ");
      
      SetIndexBuffer(5,magenta);
      SetIndexStyle(5,DRAW_HISTOGRAM);
      SetIndexLabel(5,"ClimaxChurn ");
      
      SetIndexBuffer(6,v4);
      SetIndexStyle(6,DRAW_LINE,0,2);
      SetIndexLabel(6,"Average("+IntegerToString(MAPeriod)+")");
      
      IndicatorShortName("Better Volume 1.4" );
      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  
   double VolLowest,Range,Value2,Value3,HiValue2,HiValue3,LoValue3,tempv2,tempv3,tempv;
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   if ( NumberOfBars == 0 ) 
      NumberOfBars = Bars-counted_bars;
   limit=NumberOfBars; //Bars-counted_bars;
   
      
   for(int i=0; i<limit; i++)   
      {
         red[i] = 0; blue[i] =(double) Volume[i]; yellow[i] = 0; green[i] = 0; white[i] = 0; magenta[i] = 0;
         Value2=0;Value3=0;HiValue2=0;HiValue3=0;LoValue3=99999999;tempv2=0;tempv3=0;tempv=0;
         
         // -- определяем самый низкий объем за 20 свечек и рисуем столбик
         VolLowest =(double) Volume[iLowest(NULL,0,MODE_VOLUME,20,i)];
         if (Volume[i] == VolLowest)
            {
               yellow[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
            }
         // -- определяем волатильность      
         Range = (High[i]-Low[i]);
         Value2 = Volume[i]*Range;
         
         if (  Range != 0 )
            Value3 = Volume[i]/Range;
            
         
         for ( int n=i;n<i+MAPeriod;n++ )
            {
               tempv= Volume[n] + tempv; 
            } 
          v4[i] = NormalizeDouble(tempv/MAPeriod,0);
         
          
          for (int n=i;n<i+LookBack;n++)
            {
               tempv2 = Volume[n]*((High[n]-Low[n])); 
               if ( tempv2 >= HiValue2 )
                  HiValue2 = tempv2;
                    
               if ( Volume[n]*((High[n]-Low[n])) != 0 )
                  {           
                     tempv3 = Volume[n] / ((High[n]-Low[n]));
                     if ( tempv3 > HiValue3 ) 
                        HiValue3 = tempv3; 
                     if ( tempv3 < LoValue3 )
                        LoValue3 = tempv3;
                  } 
            }
                                      
          if ( Value2 == HiValue2  && Close[i] > (High[i] + Low[i]) / 2 )
            {
               red[i] = NormalizeDouble(Volume[i],0);
               
             //  Alert("Столбик красный!");
             //  push=SendNotification("Столбик красный!");
             //  mail=SendMail("Сообщение из терминала MetaTrader 4 ", "Столбик красный!");
             //  Sleep(1000);
             //  send++; 
                                              
               blue[i]=0;
               yellow[i]=0;
            }   
            
          if ( Value3 == HiValue3 )
            {
               green[i] = NormalizeDouble(Volume[i],0);
               blue[i] =0;
               yellow[i]=0;
               red[i]=0;
            }
          if ( Value2 == HiValue2 && Value3 == HiValue3 )
            {
               magenta[i] = NormalizeDouble(Volume[i],0);
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
         if ( Value2 == HiValue2  && Close[i] <= (High[i] + Low[i]) / 2 )
            {
               white[i] = NormalizeDouble(Volume[i],0);
               
             //  Alert("Столбик зеленый!");
             //  push=SendNotification("Столбик зеленый!");
             //  mail=SendMail("Сообщение из терминала MetaTrader 4 ", "Столбик зеленый!");
             //  Sleep(1000);
             //  send++; 
                                           
               magenta[i]=0;
               blue[i]=0;
               red[i]=0;
               green[i]=0;
               yellow[i]=0;
            } 
//------------------------------Отрисовка уровней-----------------------------//

         if(red[i]!=0 && Open[i]<Close[i] && (Close[i]-Open[i])>mincandle)
          {
           //ObjectsDeleteAll(); 
           SetHLine(BullLineColore,"RedOpen "+TimeToString(Time[i],TIME_DATE),Open[i],0,1);
           SetHLine(BullLineColore,"RedClose "+TimeToString(Time[i],TIME_DATE),Close[i],0,1);            
          }  
          
         if(white[i]!=0 && Open[i]>Close[i] && (Open[i]-Close[i])>mincandle)
          {
           //ObjectsDeleteAll(); 
           SetHLine(BearLineColore,"GreenOpen "+TimeToString(Time[i],TIME_DATE),Open[i],0,1);
           SetHLine(BearLineColore,"GreenClose "+TimeToString(Time[i],TIME_DATE),Close[i],0,1);            
          }            
      }         


   return(0);
  }
//+------------------------------------------------------------------+
         
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 3 мая 2015, 21:01
+
0
Подробный разбор как вставить алерт в индикатор: mql.opentraders.ru/25021.html
avatar

  35  AM2 Сообщений: 16282 - Андрей

  • 4 мая 2015, 14:17
+
0
Спасибо! Я уже просмотрел данную статью и взял на заметку…
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 4 мая 2015, 14:30
+
0
С алертами разобрался, а вот с отрисовкой уровней туговато, не могу понять как это лучше сделать, не нашел подходящего примера в десятках индикаторах, или я еще не готов для таких манипуляций!?...*pardon* *help* 
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 4 мая 2015, 18:48
+
0
продолжается тест торговой системы, ссылка в моем профиле
avatar

  0  tradeinflat Сообщений: 2 - забанен: спаммер

  • 3 мая 2015, 11:27
+
+2
Ты оставил 6 подряд одинаковых сообщений в чужих темах. В следующий раз это будет приравнено к спаму со всеми вытекающими.

— Обновлено: забанен, так как по другому было уже не остановить.
Редактирован: 3 мая 2015, 11:49
avatar

  45  Bishop Сообщений: 5802 - АЛЬФАХАМЕЦ-Машковод

  • 3 мая 2015, 11:36

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