Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 977

 
Alexey Viktorov:

Si consiglia di iniziare a leggere dall'inizio per avere buoni consigli. Da dove era la prima domanda e il resto della discussione.

 
Kamilzhan:

Bene, per una risposta completa è sufficiente rispondere una volta, non quattro volte


TUTTI, assolutamente tutti gli indicatori colorati, in MT4 sono costruiti in modo che se il valore corrente è maggiore del valore sulla barra precedente, allora uno dei buffer viene riempito. Se il valore attuale è inferiore a quello della barra precedente, un altro buffer sarà riempito. E il tipo di visualizzazione, linea, istogramma o asterischi/punti, non importa...

 

C'è un EA completamente funzionante che invia due screenshot del grafico a telegram, il primo screenshot dalla finestra aperta nel terminale, e il secondo dallo stesso strumento ma con un timeframe diverso,

Per fare questo si apre una nuova finestra,si applica un modello, si fa uno screenshot e si cancella la finestra. Ma questo schema con la seconda schermata non è sempre stabile.

Voglio cambiarlo per non aprire una nuova finestra, e usare lo stesso tutto il tempo, ma sostituito lo strumento desiderato, aiutare a modificarlo nel codice.


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

Se il valore attuale è superiore al valore precedente, allora è verde e il buffer è diverso, in mql4, e se è vero il contrario, allora ... viceversa.))))

Grazie, tutto ha un senso.

 

Buona giornata a tutti. Faccio trading su 50 strumenti. Io tratto i livelli. Ho impostato il mio lavoro con i profili per evitare di aprire 50 grafici e caricare il terminale. Voglio scrivere un assistente che usi i livelli che ho disegnato a mano su tutti i simboli e mi dia un segnale sullo schermo, come "Guarda l'euro-dollaro, qualcosa di interessante si sta formando lì". Suppongo che dovrei scrivere una DLL, in cui tutti i livelli di tutti i simboli saranno copiati e il robot dovrebbe essere multicurrency.

Chi ha idea di come realizzare questo compito?

Come estrarre i dati dai profili nella dll?

PS. Guardando nelle cartelle degli strumenti ci sono file con l'estensione "chr". Ho aperto il blocco note e ho visto tutte le informazioni di cui ho bisogno. Come posso usarlo in questo modo?

 
Buon pomeriggio, sono un principiante e non sono bravo a programmare, ho bisogno che l'indicatore Parabolic SAR per MT5 sia visualizzato come una linea, non come punti, come posso farlo? Per favore, aiutatemi.
 
valeriikopp:
Buon pomeriggio, sono un principiante e non sono bravo a programmare, ho bisogno che l'indicatore Parabolic SAR per MT5 sia visualizzato come una linea, non come punti, come posso farlo? Per favore, aiutatemi.

+

File:
 

Ciao, sto cercando di scrivere uno script che disegni linee verticali su tutto il grafico dopo una serie di 4 barre con massimi crescenti. La sceneggiatura finisce per disegnare solo una linea all'inizio e basta. Qual è l'errore? Per favore, aiutatemi a correggerlo.

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:

Ciao, sto cercando di scrivere uno script che disegni linee verticali su tutto il grafico dopo una serie di 4 barre con massimi crescenti. La sceneggiatura finisce per disegnare solo una linea all'inizio e basta. Qual è l'errore? Per favore, aiutatemi a correggerlo.

il nome deve essere originale per ogni linea

avete un solo nome per tutti loro.

si può aggiungere al nome l'ora della sua creazione.

 
Iurii Tokman:

il nome deve essere originale per ogni linea

hai un solo nome per tutti loro

Puoi aggiungere al nome l'ora della sua creazione.

Grazie mille!

Motivazione: