Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 977

 
Alexey Viktorov:

Es aconsejable empezar a leer desde el principio para obtener buenos consejos. De donde fue la primera pregunta y el resto de la discusión.

 
Kamilzhan:

Bueno, para una respuesta completa basta con responder una vez, no cuatro veces


TODOS, absolutamente todos los indicadores de color, en MT4 están construidos de manera que si el valor actual es mayor que el valor de la barra anterior, entonces se llena uno de los buffers. Si el valor actual es inferior al de la barra anterior, se llenará otro búfer. Y el tipo de visualización, línea, histograma o asteriscos/puntos, no importa...

 

Hay un EA que funciona perfectamente y que envía dos capturas de pantalla del gráfico a telegram, la primera captura desde la ventana abierta en el terminal, y la segunda desde la misma herramienta pero con un marco temporal diferente,

para ello se abre una nueva ventana, seaplica una plantilla, se hace una captura de pantalla y se borra la ventana. Pero este esquema con la segunda captura de pantalla no es siempre estable.

Quiero cambiarlo para que no se abra una nueva ventana, y utilizar el mismo todo el tiempo, pero sustituyó la herramienta deseada, ayudar a ajustar en el código.


//+------------------------------------------------------------------+
//|                                                          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:

Si el valor actual es mayor que el valor anterior, entonces es verde y el buffer es diferente, en mql4, y si es lo contrario, entonces ... viceversa.))))

Gracias, todo tiene sentido.

 

Buenos días a todos. Opero con 50 instrumentos. Yo comercio niveles. He configurado mi trabajo con perfiles para evitar abrir 50 gráficos y cargar el terminal. Quiero escribir un asistente que utilice los niveles que he dibujado a mano en todos los símbolos y me dé una señal en la pantalla, como "Mira el euro-dólar, algo interesante se está formando allí". Supongo que debería escribir una DLL, en la que se copien todos los niveles de todos los símbolos y el robot sea multidivisa.

¿Quién tiene idea de cómo llevar a cabo esta tarea?

¿Cómo extraer los datos de los perfiles en la dll?

PS. Buscando en las carpetas de herramientas hay archivos con la extensión "chr". Abrí el bloc de notas y vi toda la información que necesitaba. ¿Cómo puedo utilizarlo de esta manera?

 
Buenas tardes, soy principiante y no se me da bien la programación, necesito que el indicador SAR Parabólico para MT5 se muestre como una línea, no como puntos, ¿cómo puedo hacerlo? Por favor, ayúdame.
 
valeriikopp:
Buenas tardes, soy principiante y no se me da bien la programación, necesito que el indicador SAR Parabólico para MT5 se muestre como una línea, no como puntos, ¿cómo puedo hacerlo? Por favor, ayúdame.

+

Archivos adjuntos:
 

Hola, estoy intentando escribir un script que dibuje líneas verticales en todo el gráfico tras una serie de 4 barras con máximos crecientes. El guión termina dibujando sólo una línea al principio y eso es todo. ¿Cuál es el error? Por favor, ayúdenme a corregirlo.

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:

Hola, estoy intentando escribir un script que dibuje líneas verticales en todo el gráfico tras una serie de 4 barras con máximos crecientes. El guión termina dibujando sólo una línea al principio y eso es todo. ¿Cuál es el error? Por favor, ayúdenme a corregirlo.

el nombre tiene que ser original para cada línea

tienes un nombre para todos ellos.

puedes añadir al nombre la hora de su creación.

 
Iurii Tokman:

el nombre debe ser original para cada línea

tienes un nombre para todos ellos

Puedes añadir al nombre la hora de su creación.

¡Muchas gracias!

Razón de la queja: