Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 977

 
Alexey Viktorov:

Только для полноценного совета желательно начать прочтение с самого начала. Оттуда где был первый вопрос и дальше всё обсуждение.

 
Kamilzhan:

Ну, а для полноценного ответа достаточно ответить один раз, а не четыре


ВСЕ, абсолютно все цветные индикаторы, в МТ4 построены так, что если текущее значение больше значения на предыдущем баре, то заполняется один из буферов. А если текущее значение меньше значения на предыдущем баре, то заполняется другой буфер. И мало важен тип отображения, линия, гистограмма или звёздочки\точки...

 

Есть полностью рабочий советник, который отправляет два скрина графика в телеграм, первый скрин с открытого окна в терминале, а второй с этим же инструментом но с другим тайм фреймом,

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

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


//+------------------------------------------------------------------+
//|                                                          777.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Telegram.mqh>
string Token="7417:AAH54X9HyFIbecqq1U1-R18tU";
int ChannelID=33722;
CCustomBot bot;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct TSignalInfo
  {
   string            symbol;
   ENUM_TIMEFRAMES   timeframe;
   datetime          time_last;
   //---   
   static datetime GetMinute()
     {
      MqlDateTime dt;
      TimeCurrent(dt);
      dt.sec=0;
      return(StructToTime(dt));
     }
  };
TSignalInfo signal[];
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
bool SignalIsAllowed(const string _symbol,
                     const ENUM_TIMEFRAMES _timeframe)
  {
//--- find
   int total=ArraySize(signal);
   for(int i=0;i<total;i++)
     {
      if(signal[i].symbol==_symbol && 
         signal[i].timeframe==_timeframe)
        {
         //Print("found");
         if(signal[i].time_last<TSignalInfo::GetMinute())
           {
            signal[i].time_last=TSignalInfo::GetMinute();
            return(true);
           }
         
         return(false);
        }
     }

//--- add
   ArrayResize(signal,total+1);
   signal[total].symbol=_symbol;
   signal[total].timeframe = _timeframe;
   signal[total].time_last = TSignalInfo::GetMinute();
   //Print("add");
   return(true);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bot.Token(Token);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if(id==CHARTEVENT_CUSTOM+234)
     {
      if(!SignalIsAllowed(ChartSymbol(lparam),ChartPeriod(lparam)))
         return;
      //Print("Custom: ",lparam," ",dparam," ",sparam);   
      ChartScreenShot(lparam,"chart.gif");

      //--- первый скриншот
      string _photo_id;
      int err=bot.SendPhoto(_photo_id,ChannelID,"chart.gif",sparam);
      ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam));

      if(ChartPeriod(lparam)!=PERIOD_H4)
        {
         string _symbol=ChartSymbol(lparam);
         ChartScreenShot(_symbol,PERIOD_H4,"chart.gif","BollingerBands");
         string _photo_id2;
         int err2=bot.SendPhoto(_photo_id2,ChannelID,"chart.gif",sparam);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ChartScreenShot(long chart_id,const string file_name)
  {
//--- создать скриншот
   const int chart_width=1280;
   const int chart_height=623;

   FileDelete(file_name);
//---
   if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT))
     {
      //---
      ChartRedraw(chart_id);
      Sleep(500);
      //--- waitng 30 sec for save screenshot
      int wait=30;
      while(!FileIsExist(file_name) && --wait>0)
        {
         printf("Waiting %d sec ...",wait);
         Sleep(1000);
         ChartRedraw(chart_id);
        }

      //--- check file
      if(!FileIsExist(file_name))
         printf("Failed to create a screenshot '%s'.",file_name);
     }
   else
     {
      Print("ChartScreenShot error ",_LastError);
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ChartScreenShot(const string _symbol,
                     const ENUM_TIMEFRAMES _tf,
                     const string file_name,
                     const string _template)
  {

//---
   long chart_id=ChartOpen(_symbol,_tf);
   ChartRedraw(chart_id);
   Sleep(155);
//---     
   if(StringLen(_template)>0)
      if(!ChartApplyTemplate(chart_id,_template))
         Print("Apply Template error: ",_LastError);

//--- создать скриншот
   const int chart_width=1280;
   const int chart_height=623;

   FileDelete(file_name);
//---
   if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT))
     {
      //---
      ChartRedraw(chart_id);
      Sleep(500);

      //--- waitng 30 sec for save screenshot
      int wait=30;
      while(!FileIsExist(file_name) && --wait>0)
        {
         printf("Waiting %d sec ...",wait);
         Sleep(1000);
         ChartRedraw(chart_id);
        }

      //--- check file
      if(!FileIsExist(file_name))
         printf("Failed to create a screenshot '%s'.",file_name);
     }
   else
     {
      Print("ChartScreenShot error ",_LastError);
      ChartClose(chart_id);
      return(false);
     }

   ChartClose(chart_id);
   return(true);
  }
//+------------------------------------------------------------------+ 
 
Alexey Viktorov:

Если текущее значение выше предыдущего, значит зелёная и буфер другой, в mql4, а если наоборот, то ... наоборот.))))

Спасибо, все понятно.

 

Доброго времени суток всем. Я торгую 50 инструментов. Торгую уровни. Работу наладил через настроенные профили чтобы не открывать 50 графиков и не грузить терминал. Так вот, хочу написать помощника, который будет использовать прорисованные уровни мной от руки на всех инструментах и при определенных условиях выдавать мне сигнал на экран, типа "Посмотрите Евро-доллар, там что-то интересное формируется". Предполагаю, что нужно написать ДЛЛ, в которую будут копироваться все уровни со всех инструментов и робот должен быть мультивалютный.

У кого какие мысли, как реализовать данную задачу???

Как вытащить данные с профелей в ДЛЛ?

PS. Заглянул в папку profiles там в папках инструментов лежат вайлы с расширением "chr". Открыл блокнотом и увидел всю необходимую мне информацию. Вот как бы так использовать ее???

 
Добрый день, я новичек и не разбираюсь в програмировании , нужно чтобы индикатор Parabolic SAR  для МТ5 отображался линией, а не точками, как это сделать? Помогите пожалуйста . 
 
valeriikopp:
Добрый день, я новичек и не разбираюсь в програмировании , нужно чтобы индикатор Parabolic SAR  для МТ5 отображался линией, а не точками, как это сделать? Помогите пожалуйста . 

+

Файлы:
 

Здравствуйте! Пытаюсь написать скрипт, который бы рисовал вертикальные линии на всём графике после серий из 4-х баров с повышающимися максимумами. В итоге скрипт рисует только одну линию вначале и всё. В чем ошибка? Помогите исправить

void OnStart()
 {
double bbup0,
       bbup1,
       bbup2,
       bbup3;
       int a=0;
for(;a<Bars;a++)
{
bbup0=High[a];
bbup1=High[a+1];
bbup2=High[a+2];
bbup3=High[a+3];

if((bbup0<bbup1)&&(bbup1<bbup2)&&(bbup2<bbup3)) 
ObjectCreate(0,"Line",OBJ_VLINE,0,Time[a],0);
 } 
}
 
pvba:

Здравствуйте! Пытаюсь написать скрипт, который бы рисовал вертикальные линии на всём графике после серий из 4-х баров с повышающимися максимумами. В итоге скрипт рисует только одну линию вначале и всё. В чем ошибка? Помогите исправить

имя должно быть оригинальное для каждой линии

у вас одно имя на всех

можно к названию добавлять время ее создания

 
Iurii Tokman:

имя должно быть оригинальное для каждой линии

у вас одно имя на всех

можно к названию добавлять время ее создания

Спасибо большое!

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