Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 977

 
Alexey Viktorov:

É aconselhável começar a ler desde o início para obter bons conselhos. De onde surgiu a primeira pergunta e o resto da discussão.

 
Kamilzhan:

Bem, para uma resposta completa é suficiente responder uma vez, não quatro vezes.


TODOS, absolutamente todos os indicadores coloridos, em MT4 são construídos de modo que se o valor atual for maior que o valor da barra anterior, então um dos amortecedores é preenchido. Se o valor atual for menor que o valor da barra anterior, outro buffer será preenchido. E o tipo de display, linha, histograma ou asteriscos/pontos, não importa...

 

Há uma EA totalmente funcional que envia duas capturas de tela do gráfico para telegrama, a primeira da janela aberta no terminal, e a segunda da mesma ferramenta, mas com um cronograma diferente,

Para isso, uma nova janela é aberta,um modelo é aplicado, uma captura de tela é tirada e a janela é apagada. Mas este esquema com a segunda captura de tela nem sempre é estável.

Quero mudá-lo para não abrir uma nova janela e usar o mesmo o tempo todo, mas substituindo a ferramenta desejada, ajude a ajustá-lo no 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:

Se o valor atual é maior que o valor anterior, então é verde e o buffer é diferente, em mql4, e se o oposto é verdadeiro, então ... vice versa.))))

Obrigado, tudo isso faz sentido.

 

Bom dia para todos. Eu negocio 50 instrumentos. Eu negocio níveis. Configurei meu trabalho com perfis para evitar abrir 50 cartas e carregar o terminal. Quero escrever um assistente que usará níveis que desenhei à mão em todos os símbolos e me dará um sinal na tela, como "Olhe para o euro-dólar, algo interessante está se formando ali". Suponho que eu deveria escrever uma DLL, na qual todos os níveis de todos os símbolos seriam copiados e o robô deveria ser multimoedas.

Quem tem alguma idéia de como implementar esta tarefa?

Como extrair os dados dos perfis na dll?

PS. Olhadas nas pastas de ferramentas, há arquivos com a extensão "chr". Abri o bloco de notas e vi todas as informações de que precisava. Como posso utilizá-lo desta forma?

 
Boa tarde, sou um iniciante e não sou bom em programação, preciso que o indicador Parabólico SAR para MT5 seja exibido como uma linha, não como pontos, como posso fazê-lo? Por favor, me ajude.
 
valeriikopp:
Boa tarde, sou um iniciante e não sou bom em programação, preciso que o indicador Parabólico SAR para MT5 seja exibido como uma linha, não como pontos, como posso fazê-lo? Por favor, me ajude.

+

Arquivos anexados:
 

Olá, estou tentando escrever um roteiro que desenha linhas verticais em todo o gráfico, após uma série de 4 barras com picos crescentes. O roteiro acaba traçando apenas uma linha no início e é só isso. Qual é o erro? Por favor, ajude-me a corrigi-lo.

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:

Olá, estou tentando escrever um roteiro que desenha linhas verticais em todo o gráfico, após uma série de 4 barras com picos crescentes. O roteiro acaba traçando apenas uma linha no início e é só isso. Qual é o erro? Por favor, ajude-me a corrigi-lo.

o nome tem que ser original para cada linha

você tem um nome para todos eles.

você pode adicionar o tempo de sua criação ao nome.

 
Iurii Tokman:

o nome deve ser original para cada linha

você tem um nome para todos eles

Você pode adicionar o tempo de sua criação ao nome.

Muito obrigado!