Agora, não estou entendendo uma coisa: preciso criar dois buffers para que eles tenham os valores alto e baixo de outro período no indicador?
e no artigo
por que as funções funcionam incorretamente, por exemplo
//+------------------------------------------------------------------+
//| Get High for a given bar number|
//+------------------------------------------------------------------+
doubleiHigh(stringsymbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
intcopied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
O que significa "errado"? Você deve dar exemplos concretos em vez de declarações gerais "tudo é ruim".
Tente executar o exemplo da seção CopyHigh():
//+------------------------------------------------------------------+
//|HighAndLow.mq5
//| Copyright 2009, MetaQuotes Software Corp.
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property description "Exemplo de saída dos valores High[i] e Low[i]"
#property description "para barras selecionadas aleatoriamente".
double High[],Low[];
//+------------------------------------------------------------------+
//|| Obter o valor mínimo para um determinado número de barra
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+------------------------------------------------------------------+
//| Obter a máxima para um determinado número de barra
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
{
//--- exibir os valores Alto e Baixo para a barra com índice em cada tick,
//--- igual ao segundo da chegada do tique
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] =%G Low[%d] =%G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}
//+------------------------------------------------------------------+
Foi isso que obtive, ele mostra tudo corretamente.
O que significa "errado"? Você deve dar exemplos concretos em vez de declarações gerais "tudo é ruim".
Tente executar o exemplo da seção CopyHigh():
Isso é o que eu obtive, ele mostra tudo corretamente.
Peço desculpas pela inespecificidade das afirmações.
Parece-me que, se uma função é escrita, está implícito que ela funciona com parâmetros diferentes. Caso contrário, elas simplesmente não fazem sentido.
Vamos adicionar o parâmetro TimeFrame. E vamos testar o programa com um parâmetro diferente, por exemplo, igual ao atual, ou seja, por exemplo, defina-o como PERIOD_D1 em um gráfico diário.
//+------------------------------------------------------------------+ //|HighAndLow.mq5 //| Copyright 2009, MetaQuotes Software Corp. //| https://www.mql5.com //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property description "Exemplo de saída dos valores High[i] e Low[i]" #property description "para barras selecionadas aleatoriamente". double High[],Low[]; input ENUM_TIMEFRAMES TimeFrame; //+------------------------------------------------------------------+ //|| Obter o valor mínimo para um determinado número de barra //+------------------------------------------------------------------+ double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double low=0; ArraySetAsSeries(Low,true); int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low); if(copied>0 && index<copied) low=Low[index]; return(low); } //+------------------------------------------------------------------+ //| Obter a máxima para um determinado número de barra //+------------------------------------------------------------------+ double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double high=0; ArraySetAsSeries(High,true); int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High); if(copied>0 && index<copied) high=High[index]; return(high); } //+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { //--- exibir os valores Alto e Baixo para a barra com índice em cada tick, //--- igual ao segundo da chegada do tique datetime t=TimeCurrent(); int sec=t%60; printf("High[%d] =%G Low[%d] =%G", sec,iHigh(Symbol(),TimeFrame,sec), sec,iLow(Symbol(),TimeFrame,sec)); } //+------------------------------------------------------------------+
Peço desculpas pela falta de especificidade das afirmações.
Parece-me que, se você escreve uma função, está implícito que ela funciona com parâmetros diferentes. Caso contrário, elas simplesmente não fazem sentido.
Vamos adicionar o parâmetro TimeFrame. E vamos testar o programa com outro parâmetro, por exemplo, igual ao atual, ou seja, por exemplo, defina-o como PERIOD_D1 em um gráfico diário.
Verifiquei sua variante - ela também funciona corretamente. Executei-a como um script no período de tempo D1 com os parâmetros H1 e D1. Os valores estavam corretos (verifiquei as três últimas barras)
Verifiquei sua variante e ela também funciona corretamente. Executei-a como um script no período de tempo D1 com os parâmetros H1 e D1. Os valores estavam corretos (verifiquei as três últimas barras)
Acabei de começar a aprender. Fiz o download, coloquei-o na pasta D:/\MetaTrader 5/ MQL5/Indicators.
Compilei-o e coloquei-o no gráfico. Alguns indicadores não mostram nada ((.
Deveria ser assim ou fiz algo errado?
Os indicadores CrossMa.mq5, Toned_WPR.mq5 e HistogramSample.mq5 não são exibidos.
Os outros funcionam
O que significa "errado"? Você deve dar exemplos concretos em vez de declarações gerais "tudo é ruim".
Tente executar o exemplo da seção CopyHigh():
Isso é o que eu obtive, mostra tudo corretamente.
Copiar toda a matriz de dados????
Acho que é muito antieconômico copiar um elemento.
Prival:
É para ser assim ou eu fiz algo errado?
Olá, Sergei. Este artigo foi escrito no calor do momento, para as primeiras compilações públicas. Muita coisa mudou desde então, talvez alguns indicadores precisem ser aprimorados.
Vou revisá-lo assim que tiver tempo.

- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
Consegui corrigir esse problema definindo apenas um buffer sinalizado como INDICATOR_DATA e movendo todos os outros para INDICATOR_CALCULATIONS, dessa forma CopyBuffer/GetData retornam os itens copiados corretos para as matrizes de destino.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Caminhe em novos trilhos: Personalize indicadores no MQL5 foi publicado:
Vou agora listar todas as possibilidades novas e recursos do novo terminal e linguagem. Elas são várias, e algumas novidades valem a discussão em um artigo separado. Além disso, não há códigos aqui escritos com programação orientada ao objeto, é um tópico muito importante para ser simplesmente mencionado em um contexto como vantagens adicionais para os desenvolvedores. Neste artigo vamos considerar os indicadores, sua estrutura, desenho, tipos e seus detalhes de programação em comparação com o MQL4. Espero que este artigo seja útil tanto para desenvolvedores iniciantes quanto para experientes, talvez alguns deles encontrem algo novo.
Autor: Андрей