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

 
Vladimir Karputov #:

No OnDeinit deve fazerObjectsDeleteAll- apagar por prefixo (no seu caso o prefixo é "HLine")

Em que linha deve ser escrito "HLine"?

 
Green handsome #:

Em que linha deve ser escrito "HLine"?

O que é que não está claro?

Fórum sobre Comércio, Sistemas de Comércio Automatizados e Testes de Estratégia

FAQ de Iniciantes MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2021.09.10 15:53

Tem de fazerObjectsDeleteAll in OnDeinit - apagar por prefixo(no seu caso, o prefixo é "HLine")

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );


 
Vladimir Karputov #:

O que é que não é exactamente claro?


int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string      HLine,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   
   );

Aqui já o fiz, ainda não o apagará.

 
void OnDeinit(const int reason)
  {
     {
      ObjectsDeleteAll(0,prefix,0);
     }
//---
   //ChartRedraw();
  }

o prefixo contém os nomes das etiquetas gráficas

sabe o que significa prefixo?

 
Fast235 #:

o prefixo contém os nomes das etiquetas gráficas

sabe o que significa prefixo?

Eu não conheço MQL de todo.... Pensei em arranjar apenas algumas linhas e mais nada.

 
Green handsome #:

Não sei nada sobre MQLs em absoluto.... Pensei em arranjar apenas algumas linhas e mais nada.

o código acima deve ajudar, caso contrário, olhar para o prefixo com que os objectos são criados

 

Qual é a razão para não mostrar o nome curto na subjanela no canto superior esquerdo?


Além disso, se carregar um indicador no gráfico, a segunda cópia já não funciona - OnInit() = nada é accionado e não se imprime. Mas se eu mudar "Parâmetros de entrada" para outros - funciona

#property indicator_separate_window

#property indicator_plots 0

input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА

//+------------------------------------------------------------------+
string prog_name,short_name;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
{
  prog_name=MQLInfoString(MQL_PROGRAM_NAME);
  short_name="=Set ("+(string)MASlow+"/"+(string)MAFast+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  Print("INIT_SUCCEEDED");
  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[])
{
//---

//--- return value of prev_calculated for next call
  return(rates_total);
}

---

O que está errado, em mt4 este código funciona.

 
Vitaly Muzichenko #:

Qual é a razão para não mostrar o nome curto na subjanela no canto superior esquerdo?


Além disso, se carregar um indicador no gráfico, a segunda cópia já não funciona - OnInit() = nada é accionado e não se imprime. Mas se eu mudar "Parâmetros de entrada" para outros - funciona

---

O que está errado, este código funciona em mt4.

Talvez seja só porque é demasiado curto? Sem mapeamento, sem buffers... Porquê fazer uma segunda cópia de tal indicador, para que o terminal fique arbitrário...

 
Vitaly Muzichenko #:

Qual é a razão para não mostrar o nome curto na subjanela no canto superior esquerdo?


Além disso, se carregar um indicador no gráfico, a segunda cópia já não funciona - OnInit() = nada é accionado e não se imprime. Mas se eu mudar "Parâmetros de entrada" para outros - funciona

---

O que está errado, este código funciona em mt4.

Também tive um problema com isso, mas construí o indicador, está tudo bem.

#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#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;  // Период быстрой МА
//+------------------------------------------------------------------+
//| 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);
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

Posso comentá-lo para saber quando deixar de escrever o nome do indicador na sub-janela ... mas demasiado preguiçoso

 
Igor Makanu #:

falta alguma coisa - provavelmente algum tipo de propriedade, também confrontado com isto, mas aqui esbocei o indicador, está tudo bem

pode comentá-lo para procurar quando deixar de escrever o nome indicador na sub-janela... mas preguiçoso

Os dados são exibidos, mas de onde, se a funçãoOnInit() não tiver funcionado? Atiramos uma cópia na carta e o OnInit() pode ser accionado por acidente, mas se for outra cópia, é só isso, não há sequer uma impressão. Mas se alterarmos os parâmetros de entrada - então funciona.

#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#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


input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА

//+------------------------------------------------------------------+
int wndNum;
string short_name;
double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  short_name="Set ("+(string)MASlow+"/"+(string)MAFast+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  wndNum=ChartWindowFind();
  Print("INIT SUCCEEDED: "+(string)wndNum);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
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);
}

---

Qual é a solução, porque é que o OnInit não funciona?

Razão: