Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 977

 
Alexey Viktorov:

Il est conseillé de commencer à lire depuis le début pour obtenir de bons conseils. D'où la première question et le reste de la discussion.

 
Kamilzhan:

Pour une réponse complète, il suffit de répondre une fois, pas quatre fois.


TOUS, absolument tous les indicateurs colorés, dans MT4 sont construits de telle sorte que si la valeur actuelle est supérieure à la valeur de la barre précédente, alors un des tampons est rempli. Si la valeur actuelle est inférieure à la valeur de la barre précédente, un autre tampon sera rempli. Et le type d'affichage, ligne, histogramme ou astérisques/points, n'a pas d'importance...

 

Il existe un EA entièrement fonctionnel qui envoie deux captures d'écran du graphique à telegram, la première provenant de la fenêtre ouverte dans le terminal, et la seconde du même outil mais avec un délai différent,

Pour ce faire, une nouvelle fenêtre est ouverte,un modèle est appliqué, une capture d'écran est réalisée et la fenêtre est supprimée. Mais ce schéma avec la deuxième capture d'écran n'est pas toujours stable.

Je veux le changer pour ne pas ouvrir une nouvelle fenêtre, et utiliser le même tout le temps, mais substitué l'outil désiré, aider à le modifier dans le code.


//+------------------------------------------------------------------+
//|                                                          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 la valeur actuelle est supérieure à la valeur précédente, alors elle est verte et le tampon est différent, en mql4, et si le contraire est vrai, alors ... et vice versa. ))))

Merci, tout cela a du sens.

 

Bonne journée à tous. Je négocie 50 instruments. J'échange des niveaux. J'ai configuré mon travail avec des profils pour éviter d'ouvrir 50 graphiques et de charger le terminal. Je veux écrire un assistant qui utilisera les niveaux que j'ai dessinés à la main sur tous les symboles et me donnera un signal sur l'écran, comme "Regardez l'euro-dollar, quelque chose d'intéressant est en train de se former là". Je suppose que je devrais écrire une DLL, dans laquelle tous les niveaux de tous les symboles seront copiés et le robot devrait être multidevise.

Qui a une idée de la manière de mettre en œuvre cette tâche ?

Comment extraire les données des profils dans la dll ?

PS. J'ai regardé dans les dossiers d'outils, il y a des fichiers avec l'extension "chr". J'ai ouvert le bloc-notes et j'ai vu toutes les informations dont j'ai besoin. Comment puis-je l'utiliser de cette manière ?

 
Bonjour, je suis débutant et pas doué pour la programmation, j'ai besoin que l'indicateur SAR parabolique pour MT5 soit affiché sous forme de ligne, et non de points, comment puis-je le faire ? Aidez-moi, s'il vous plaît.
 
valeriikopp:
Bonjour, je suis débutant et pas doué pour la programmation, j'ai besoin que l'indicateur SAR parabolique pour MT5 soit affiché sous forme de ligne, et non de points, comment puis-je le faire ? Aidez-moi, s'il vous plaît.

+

Dossiers :
 

Bonjour, J'essaie d'écrire un script qui dessine des lignes verticales sur l'ensemble du graphique après une série de 4 barres avec des hauts croissants. Le script finit par ne dessiner qu'une seule ligne au début et c'est tout. Quelle est l'erreur ? Veuillez m'aider à le corriger.

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:

Bonjour, J'essaie d'écrire un script qui dessine des lignes verticales sur l'ensemble du graphique après une série de 4 barres avec des hauts croissants. Le script finit par ne dessiner qu'une seule ligne au début et c'est tout. Quelle est l'erreur ? Veuillez m'aider à le corriger.

le nom doit être original pour chaque ligne

vous avez un nom pour chacun d'entre eux.

vous pouvez ajouter au nom l'heure de sa création.

 
Iurii Tokman:

le nom doit être original pour chaque ligne

vous avez un seul nom pour chacun d'entre eux

Vous pouvez ajouter au nom l'heure de sa création.

Merci beaucoup !

Raison: