Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1345

 
Vitaly Muzichenko #:

Mais uma vez, precisa de alterar o prefixo ao carregar a próxima cópia?

pode dizer por palavras qual é o objectivo?

botões podem ser criados e controlados do exterior da sua janela.


o que vai ser?

 
Igor Makanu #:

pode dizer por palavras qual é o objectivo?

Os botões também podem ser criados e controlados a partir do exterior da sua janela.


o que seria isso?

Não sei, mas deveria ser assim: crie na sua subjanela, e quando clicar, obtenha o número desta subjanela. Não precisa de desenhar nada, apenas um botão que, quando clicado, exibe informação em Alerta sobre o número da subjanela

 
Vitaly Muzichenko #:

Não sei, mas esta é a forma de o fazer: crie na sua subjanela, e quando clica nela, obtém o número da subjanela. Não precisa de desenhar nada, apenas um botão que, quando clicado, exibe informação em Alerta sobre o número da subjanela

verifiquei a minha primeira fonte:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


infelizmente, tudo é como escreveu - se executar várias cópias deste indicador com parâmetros padrão, o botão estará apenas no primeiro indicador numa subjanela

mas se alterar os parâmetros durante o início, tudo está bem


em geral, a situação é pouco clara

 
Igor Makanu #:

Verifiquei-o na minha primeira fonte:

infelizmente, tudo é como escreve - se executar várias cópias deste indicador com parâmetros padrão, o botão só estará no primeiro indicador na sub-janela

mas se alterar os parâmetros durante o início, tudo está bem

em geral, a situação é pouco clara

Portanto, eis uma questão: Como alterar os parâmetros automaticamente, sem entrar em definições?

Nada funciona até agora ...

---

P.S. Idealmente, mas, infelizmente

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

Até agora não está a funcionar ...

E não o fará:

acrescentado:

int OnInit()
{
   Print(__FUNCTION__);

Coloco um indicador - recebo OnInit no registo, mas o indicador seguinte já está em silêncio, ou seja, apenas uma cópia do indicador está realmente a correr, e os outros indicadores são apenas uma concha gráfica

 
Igor Makanu #:

e não vai funcionar:

acrescentado:

Coloquei o indicador - recebo OnInit no registo, mas o indicador seguinte já está em silêncio, ou seja, apenas uma cópia do indicador está realmente a correr, e os outros indicadores são apenas uma concha gráfica

É assim que é. Acho que a arquitectura do mt5 não é correcta. O terminal mt4 está a funcionar bem.

Se tiver decidido fazê-lo em mt5, proibiria a execução de cópias indicadoras com os mesmos parâmetros de entrada, porque parece estar presente mas ausente.

 
Vitaly Muzichenko #:

É assim que as coisas são. A arquitectura do mt5 deve ser uma confusão. Tudo funciona bem em mt4.

Se decidiu fazê-lo em mt5, deveria ter proibido o lançamento de cópias indicadoras com os mesmos parâmetros de entrada, porque parece estar lá, mas na realidade não está.

A parte de cálculo do indicador não é a mesma que a parte gráfica. Por conseguinte, a parte de cálculo é a mesma para todos eles. Há vários gráficos.

Não pode simplesmente procurar todas as sub-janelas num único indicador e colocar etiquetas com o número da sub-janela nelas? Ao mesmo tempo, para apanhar no temporizador o número de subjanelas do gráfico: quando aumentadas - adicionar a uma nova etiqueta de subjanela. Mas também procurar que indicador é colocado nele - se for diferente, então não acrescente...

Apenas uma ideia não testada.

ZS. Eu não concordo com a "curvatura". Uma parte de cálculo para 20 indicadores idênticos é melhor do que 20 partes de cálculo para 20 indicadores idênticos.

 
Artyom Trishkin #:

A parte de cálculo de um indicador não é a mesma que a parte gráfica. Por conseguinte, a parte de cálculo é a mesma para todos eles. Há vários gráficos.

Não pode simplesmente procurar todas as sub-janelas num único indicador, e colocar etiquetas com o número da sub-janela nelas? Ao mesmo tempo, para apanhar no temporizador o número de sub-janelas do gráfico: aumentado - adicionar a uma nova etiqueta de sub-janela. Mas também procurar que indicador é colocado nele - se for diferente, então não acrescente...

Apenas uma ideia não testada.

ZS. Eu não concordo com a "curvatura". Uma parte de cálculo para 20 indicadores idênticos é melhor do que 20 partes de cálculo para 20 indicadores idênticos.

Fez, sem resposta ao botão - OnChartEvent copy não activa e não compreende o número da subjanela.

De qualquer forma, eis o que não funciona e, juntamente com ele, o resto do código

Fórum sobre negociação, sistemas automatizados de negociação e testes estratégicos

FAQ de Iniciantes MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

não o faz:

acrescentado a:

int OnInit()
{
   Print(__FUNCTION__);

Coloco um indicador - recebo OnInit no registo, mas o indicador seguinte já está em silêncio, ou seja, apenas uma cópia do indicador está realmente a correr, e os outros indicadores são apenas uma concha gráfica


 
Vitaly Muzichenko #:

Fez, sem reacção ao botão - A cópia OnChartEvent não funciona e não compreende o número da subjanela.

De qualquer forma, eis o que não funciona e com ele o resto do código


MAS!!! Se eu fizer um modelo com 2-3 destes indicadores sob o nome "Debug.tpl" e começar a depurar o indicador, então o OnInit() funciona como deve ser.

Em geral, fiz uma tal experiência:

Transferi #propriedade ao seu máximo no OnInit() na esperança de que, embora não tenha sido criado o indicador, funcione OnInit() e faça um nome curto para indicador, dependendo do número de indicadores na janela.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Mas não ajudou:

Inicio a primeira cópia

Nome do indicador 2.........

Inicio a segunda cópia - o nome do indicador é ainda 2 para ambos os indicadores

Eu começo a depuração e o que vejo! O indicador ainda não carregado já está a imprimir... leia a segunda e terceira linhas...

como é que isto pode ser?


Mais depuração parou ao entrar no OnInit(), a variável windows_total contém lixo, o short_name ainda é uma string vazia...

Olá......... mas já está tudo impresso... como é que???

E o nome_curto já mudou.

Como resultado, após um carregamento completo do indicador no modo de depuração, o indicador tem os seguintes nomes

Talvez devêssemos chamar a atenção dos criadores para tais insectos.

 
Olá amigos, talvez eu esteja no lugar errado, mas vejo a secção chamada: "Perguntas de Iniciantes MQL5 MT5 MetaTrader 5". Então a minha pergunta é: eu costumava descarregar Demo EAs do Market para testar agora o que fiz MT5 não pode descarregar Demo. MT4 sem problemas, MT5 não qual é a razão?
Razão: