Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 977

 
Alexey Viktorov:

Es ist ratsam, von Anfang an zu lesen, um gute Ratschläge zu erhalten. Von wo aus die erste Frage gestellt wurde und wie die Diskussion weiterging.

 
Kamilzhan:

Nun, für eine vollständige Antwort reicht es, einmal zu antworten, nicht viermal


ALLE, wirklich alle farbigen Indikatoren im MT4 sind so konstruiert, dass einer der Puffer gefüllt wird, wenn der aktuelle Wert größer ist als der Wert des vorherigen Balkens. Wenn der aktuelle Wert niedriger ist als der Wert des vorherigen Balkens, wird ein weiterer Puffer gefüllt. Und die Art der Anzeige, Linie, Histogramm oder Sternchen/Punkte, spielt keine Rolle...

 

Es gibt einen voll funktionsfähigen EA, der zwei Screenshots des Charts an Telegram sendet, den ersten Screenshot aus dem offenen Fenster im Terminal und den zweiten aus dem gleichen Tool, aber mit einem anderen Zeitrahmen,

Dazu wird ein neues Fenster geöffnet,eine Vorlage angewendet, ein Bildschirmfoto gemacht und das Fenster gelöscht. Aber dieses Schema mit dem zweiten Screenshot ist nicht immer stabil.

Ich möchte es ändern, um nicht ein neues Fenster zu öffnen, und verwenden Sie die gleiche die ganze Zeit, sondern ersetzt das gewünschte Werkzeug, helfen zwicken es in den 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:

Wenn der aktuelle Wert höher ist als der vorherige Wert, dann ist er grün und der Puffer ist anders, in mql4, und wenn das Gegenteil wahr ist, dann ... und umgekehrt.))))

Danke, das macht alles Sinn.

 

Guten Tag an alle. Ich handele mit 50 Instrumenten. Ich handele mit Werten. Ich habe meine Arbeit mit Profilen eingerichtet, um das Öffnen von 50 Charts und das Laden des Terminals zu vermeiden. Ich möchte einen Assistenten schreiben, der die von mir von Hand gezeichneten Niveaus aller Symbole verwendet und mir ein Signal auf dem Bildschirm gibt, z. B. "Schau auf den Euro-Dollar, dort bildet sich etwas Interessantes". Ich nehme an, ich sollte eine DLL schreiben, in der alle Ebenen aller Symbole kopiert werden und der Roboter sollte mehrwährungsfähig sein.

Wer hat eine Idee, wie man diese Aufgabe umsetzen kann?

Wie kann man die Daten aus den Profilen in der DLL abrufen?

PS. In den Werkzeugordnern gibt es Dateien mit der Erweiterung "chr". Ich öffnete den Notizblock und sah alle Informationen, die ich brauchte. Wie kann ich sie auf diese Weise nutzen?

 
Guten Tag, ich bin ein Anfänger und nicht gut in der Programmierung, ich brauche die Parabolic SAR Indikator für MT5 als eine Linie angezeigt werden, nicht Punkte, wie kann ich es tun? Bitte helfen Sie mir.
 
valeriikopp:
Guten Tag, ich bin ein Anfänger und nicht gut in der Programmierung, ich brauche die Parabolic SAR Indikator für MT5 als eine Linie angezeigt werden, nicht Punkte, wie kann ich es tun? Bitte helfen Sie mir.

+

Dateien:
 

Hallo, ich versuche, ein Skript zu schreiben, das nach einer Serie von 4 Balken mit ansteigenden Höchstständen vertikale Linien auf dem gesamten Chart zeichnet. Das Skript endet damit, dass am Anfang nur eine Linie gezeichnet wird und das war's. Worin besteht der Fehler? Bitte helfen Sie mir, dies zu korrigieren.

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:

Hallo, ich versuche, ein Skript zu schreiben, das nach einer Serie von 4 Balken mit ansteigenden Höchstständen vertikale Linien auf dem gesamten Chart zeichnet. Das Skript endet damit, dass am Anfang nur eine Linie gezeichnet wird und das war's. Worin besteht der Fehler? Bitte helfen Sie mir, dies zu korrigieren.

der Name muss für jede Zeile original sein

Sie haben einen Namen für alle.

können Sie dem Namen den Zeitpunkt der Erstellung hinzufügen.

 
Iurii Tokman:

der Name muss für jede Zeile original sein

Sie haben einen Namen für alle von ihnen

Sie können dem Namen den Zeitpunkt der Erstellung hinzufügen.

Herzlichen Dank!

Grund der Beschwerde: