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

Рейтинг 2081



РЕКОМЕНДУЮ



Поправить индикатор.

Индикатор отсчёта оставшегося времени до закрытия свечи.

1. Таки не поёт, хотя вроде должен это делать.
2. Не понимает установки 0 в параметре My_Period(что по-моему разумению должно соответствовать текущему таймфрейму).
3. Исключить отображение часового нуля с двоеточием, когда до истечения остаётся менее одного часа, либо индикатор находится на таймфрейме 1 час и ниже.

4. Добавить параметр отправки пуш-сообщения.

#property indicator_chart_window

extern int     My_Period       = 15;                //Выбор тайм-фрейма
extern int     Seconds_Sound   = 20 ;               //Сигнал до закрытия бара в секундах
extern bool    Sound_ON  = true ;             //вкл.true / выкл.false сигнал
extern string  Sounds_Name     = "alert.wav";       //Мелодия сигнала
extern int     Ug_HMS          = 1;                 //положение Timer_Sound в окне графика (0,1,2,3)
extern int     X_HMS           = 10;                //координата Timer_Sound по оси X
extern int     Y_HMS           = 400;                //координата Timer_Sound по оси Y
extern color   Col_HMS         = Khaki;   //Цвет текста Timer_Sound
extern string  Font_HMS        = "Lucida Console";          //Шрифт для Timer_Sound
extern double  FontSize_HMS	 = 15;	             //Размер шрифта для Timer_Sound
//----
bool Sound = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
string vName;
       vName="Timer_Sound";
   ObjectDelete(vName);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
//вывести колличество секунд до окончания бара
//Cколько секунд вообще длится бар?
int KolSec;
    if ( My_Period == PERIOD_M1){ KolSec=1*60;}
    if ( My_Period == PERIOD_M5){ KolSec=5*60;}
    if ( My_Period == 10){ KolSec=10*60;}
    if ( My_Period == PERIOD_M15){ KolSec=15*60;}
    if ( My_Period == PERIOD_M30){ KolSec=30*60;}
    if ( My_Period == PERIOD_H1){ KolSec=60*60;}
    if ( My_Period == PERIOD_H4){ KolSec=4*60*60;}
    if ( My_Period == PERIOD_D1){ KolSec=24*60*60;}
    if ( My_Period == PERIOD_W1){ KolSec=5*24*60*60;}

//cколько секунд прошло с начала бара
int PrevSec;

// TimeCurrent( )  время прихода последней котировки в виде количества секунд, прошедших после 00:00 1 января 1970 года
PrevSec=MathMod( TimeCurrent( ), KolSec);

// сколько секунд осталось в формате 00:00:00 и 000000
string Last;
int Lasts;
int LastHour;
int LastMinute;
int LastSec;

    LastSec=MathMod( KolSec-PrevSec, 60);                                         //осталось полных секунд
    LastMinute=MathMod(((KolSec-PrevSec )-MathMod( KolSec-PrevSec, 60))/60,60);   //кол. полных минут в оставшееся время
    LastHour=((KolSec-PrevSec )-MathMod( KolSec-PrevSec, 3600))/3600;             //кол. полных часов в оставшееся время.

    Lasts = LastHour*60*60+LastMinute*60+LastSec;
    Last = LastHour+":"+LastMinute+":"+LastSec;

       if (Lasts < Seconds_Sound+1 && Sound)
         {
          Sound = False;
          //if (Sounds_ON) PlaySound (Sounds_Name);
         }
       if (!Sound && Lasts > Seconds_Sound+1) Sound = True;

string vName;
       vName="Timer_Sound";
       if (ObjectFind(vName)!=-1) ObjectDelete(vName);
       ObjectCreate (vName,OBJ_LABEL,0,0,0,0,0);
       ObjectSet(vName,OBJPROP_CORNER,Ug_HMS);
       ObjectSet(vName,OBJPROP_XDISTANCE,X_HMS);
       ObjectSet(vName,OBJPROP_YDISTANCE,Y_HMS);
       ObjectSetText(vName,Last,FontSize_HMS,Font_HMS,Col_HMS);
//-----
   return(0);
  }

Заранее благодарен.
  • 0
  • Просмотров: 2416
  • 30 мая 2016, 15:15
  • Anatoly74
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Сейчас гляну, код вроде бы простой.
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 30 мая 2016, 16:21
+
0
Посмотрел, надо с нуля писать а так сколько времени уйдет на расшифровку. Попробую сейчас набросать подобный.
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 30 мая 2016, 16:40
+
0
Спасибо, буду ждать.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 30 мая 2016, 17:16
+
0
Переделал под твои нужды один свой вариант. Пиликает, пуш есть, а п.3. это подольше нужно репу чесать.



//+------------------------------------------------------------------+
//|                                                  CloseCandle.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int SecondsSound=20;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
   ObjectsDeleteAll(0,OBJ_LABEL);
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string name,string text,int x,int y,color clr)
  {
   ObjectDelete(name);
//--- создадим текстовую метку
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   PutLabel("TimeLabel","Время до закрытия свечи: "+TimeToString(Time[0]+Period()*60-TimeCurrent(),TIME_SECONDS),350,20,Red);
   PutLabel("TimeLabel2","Время закрытия свечи: "+TimeToString(Time[0]+Period()*60,TIME_SECONDS),320,45,Yellow);
   PutLabel("TimeLabel3","Текущее Время: "+TimeToString(TimeCurrent(),TIME_SECONDS),260,70,Lime);
   if((int)(Time[0]+Period()*60-TimeCurrent())<=SecondsSound)
     {
      PlaySound("News.wav");
      SendNotification((string)"Меньше " +SecondsSound+" осталось до закрытия!");
     }
  }
//+------------------------------------------------------------------+
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 30 мая 2016, 17:31
+
0
Сейчас с учетом периодов:



Ничего себе конструкция получилась с периодами *shock*  *crazy*  <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; 
PutLabel("TimeLabel","Время до закрытия свечи: "+(string)(int)((Time[0]+Period()*60-TimeCurrent())/60)+":"+(string)MathMod(Time[0]+Period()*60-TimeCurrent(),60),350,20,Red);



//+------------------------------------------------------------------+
//|                                                  CloseCandle.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int SecondsSound=20;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
   ObjectsDeleteAll(0,OBJ_LABEL);
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string name,string text,int x,int y,color clr)
  {
   ObjectDelete(name);
//--- создадим текстовую метку
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   int delta=(int)(Time[0]+Period()*60-TimeCurrent());

   if(Period()<60 || delta<3600)
     {
      PutLabel("TimeLabel","Время до закрытия свечи: "+(string)(int)((Time[0]+Period()*60-TimeCurrent())/60)+":"+(string)MathMod(Time[0]+Period()*60-TimeCurrent(),60),350,20,Red);
     }
   else
     {
      PutLabel("TimeLabel","Время до закрытия свечи: "+TimeToString(Time[0]+Period()*60-TimeCurrent(),TIME_SECONDS),350,20,Red);
     }
   PutLabel("TimeLabel2","Время закрытия свечи: "+TimeToString(Time[0]+Period()*60,TIME_SECONDS),320,45,Yellow);
   PutLabel("TimeLabel3","Текущее Время: "+TimeToString(TimeCurrent(),TIME_SECONDS),260,70,Lime);

   if(delta<=SecondsSound)
     {
      PlaySound("News.wav");
      SendNotification((string)"Меньше "+(string)SecondsSound+" осталось до закрытия!");
     }
  }
//+------------------------------------------------------------------+


Редактирован: 30 мая 2016, 18:06
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 30 мая 2016, 18:05
+
0
Ничего себе конструкция получилась с периодами

Да уж… Доберусь до банки, спробую сам удалить излишества в виде текста… Чем лаконичнее — тем лучшЕе… Если с пиликанием и пушем вышло — уже благодарствую.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 30 мая 2016, 18:46
+
0
Там просто вот эти 2 строчки коментаришь или убираешь и входные переменные можешь поставить какие надо или сразу в коде поправить.


   PutLabel("TimeLabel2","Время закрытия свечи: "+TimeToString(Time[0]+Period()*60,TIME_SECONDS),320,45,Yellow);
   PutLabel("TimeLabel3","Текущее Время: "+TimeToString(TimeCurrent(),TIME_SECONDS),260,70,Lime);


Редактирован: 30 мая 2016, 19:03
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 30 мая 2016, 19:03
+
0
Как-то так получилось:


Но на 4х-часовиках и выше убегает с окна правее. Нельзя ли как-то поправить?

И чёт он все 20 сек при текущем параметре input int SecondsSound=20 пиликает. Если также и пуши отправляет, то как-то не айс. Я до них ещё не добрался, если пуш отправляет одноразово, то это будет замечательно.
P. S. Время закрытия свечи — тут секунды не нужны вообще. Пытался удалить сам — мозгов не хватает.
Редактирован: 30 мая 2016, 20:14
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 30 мая 2016, 20:05
+
0
Пушами тоже заваливает всё заявленное время)))

Отображение переделал таки под себя.

//+------------------------------------------------------------------+
//|                                                  CloseCandle.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int SecondsSound=20;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
   ObjectsDeleteAll(0,OBJ_LABEL);
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string name,string text,int x,int y,color clr)
  {
   ObjectDelete(name);
//--- создадим текстовую метку
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   int delta=(int)(Time[0]+Period()*60-TimeCurrent());

   if(Period()<60 || delta<3600)
     {
      PutLabel("TimeLabel",(string)(int)((Time[0]+Period()*60-TimeCurrent())/60)+":"+(string)MathMod(Time[0]+Period()*60-TimeCurrent(),60),50,400,Red);
     }
   else
     {
      PutLabel("TimeLabel",TimeToString(Time[0]+Period()*60-TimeCurrent(),TIME_SECONDS),20,400,Red);
     }
   PutLabel("TimeLabel2",TimeToString(Time[0]+Period()*60,TIME_MINUTES),50,420,Yellow);
   PutLabel("TimeLabel3",TimeToString(TimeCurrent(),TIME_MINUTES),50,440,Lime);
   
   if(delta<=SecondsSound)
     {
      PlaySound("News.wav");
      SendNotification((string)"Меньше "+(string)SecondsSound+" осталось до закрытия!");
     }
  }

Как-то хотелось бы решить, чтобы пушами не закидывал, а одноразово только.
Звуковой пусть наверное так и остаётся на весь период.
Выдернуть во внешние выключалки алертов.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 31 мая 2016, 07:38
+
0
У меня твой вариант не запустился. поэтому правил свой. Вывел в настройки отключение алерта и пиликает теперь один раз.
www.opentraders.ru/downloads/1191/


//+------------------------------------------------------------------+
//|                                                  CloseCandle.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int SecondsSound=20;
input bool AlertOn=true;

bool one=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
   ObjectsDeleteAll(0,OBJ_LABEL);
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string name,string text,int x,int y,color clr)
  {
   ObjectDelete(name);
//--- создадим текстовую метку
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   int delta=(int)(Time[0]+Period()*60-TimeCurrent());

   if(Period()<60 || delta<3600)
     {
      PutLabel("TimeLabel","Время до закрытия свечи: "+(string)(int)((Time[0]+Period()*60-TimeCurrent())/60)+":"+(string)MathMod(Time[0]+Period()*60-TimeCurrent(),60),350,20,Red);
     }
   else
     {
      PutLabel("TimeLabel","Время до закрытия свечи: "+TimeToString(Time[0]+Period()*60-TimeCurrent(),TIME_SECONDS),350,20,Red);
     }
     
   PutLabel("TimeLabel2","Время закрытия свечи: "+TimeToString(Time[0]+Period()*60,TIME_SECONDS),320,45,Yellow);
   PutLabel("TimeLabel3","Текущее Время: "+TimeToString(TimeCurrent(),TIME_SECONDS),260,70,White);

   if(delta>SecondsSound) one=true;
   if(delta<=SecondsSound && one && AlertOn)
     {
      PlaySound("News.wav");
      SendNotification("Меньше "+(string)SecondsSound+" секунд осталось до закрытия!");
      SendMail("Сигнал индикатора","Меньше "+(string)SecondsSound+" секунд осталось до закрытия!");      
      one=false;      
     }
  }
//+------------------------------------------------------------------+


Редактирован: 1 июня 2016, 08:42
avatar

  34  AM2 Сообщений: 15869 - Андрей

  • 31 мая 2016, 08:32
+
0
Спасибо.
avatar

  20  Anatoly74 Автор Сообщений: 3710 - Анатолий

  • 31 мая 2016, 09:09

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