![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Bem pessoal, a primeira parte está feita ( ler todas as taxas de pares ).
Agora preciso usar as taxas de todos os paris copiados com a função ArrayCopyRates para colocar alguns indicadores gráficos como um RSI... como eu desenho na imagem abaixo:
Em minha pergunta inicial pretendo saber como fazer isso... e não sobre as taxas de leitura. Acho que não precisarei copiar taxas antes para desenhá-la, mas foi bom saber como fazer... agora só preciso descobrir uma maneira de dividir a área do indicador para traçar todos os pares...
Não há como dividir a área indicadora. Tudo deve ser desenhado separadamente, sem tampões, sem escalonamento automático. Ver
Você viu uma foto assim? (MetaQuotes Software Corp.) - Fórum MQL4 - Página 12
Você viu uma foto assim? (MetaQuotes Software Corp.) - Fórum MQL4 - Página 14
Você viu uma foto assim? (MetaQuotes Software Corp.) - Fórum MQL4 - Página 36
Não há como dividir a área indicadora. Tudo deve ser desenhado separadamente, sem tampões, sem escalonamento automático. Ver
Você viu uma foto assim? (MetaQuotes Software Corp.) - Fórum MQL4 - Página 12
Você viu uma foto assim? (MetaQuotes Software Corp.) - Fórum MQL4 - Página 14
Você viu uma foto assim? (MetaQuotes Software Corp.) - Fórum MQL4 - Página 36
Este é um Indicador que peguei em algum lugar, nunca tentei decifrá-lo. Eu mostro uma representação de 3 períodos de tempo do gráfico atual. O mais louco é que as velas são desenhadas com Histogramas. Bastante arrumado, mas não no que estou me metendo agora.
Melhores Desejos
Uma atualização para aqueles que seguem esta linha!
Tenho ajudado o OP via PM a corrigir seu código, pois ele tem dificuldade com o inglês e nós dois falamos português. Em nossos testes, nos deparamos com outro "engraçado" que está acontecendo com a função"ArrayCopyRates()". Ao usar um array MqlRates com"ArrayCopyRates()" em um EA, o array de dados é um array virtual que sempre relata o status atual das coisas, portanto, os dados estão sempre frescos.
Entretanto, em um Indicador, este não parece ser o caso. O array não é uma cópia virtual, mas uma cópia estática definida no tempo no momento em que o"ArrayCopyRates()" foi chamado. Os dados não são atualizados quando o Símbolo é diferente do símbolo do gráfico. Quando é o mesmo símbolo que o gráfico, então os dados do array são "ao vivo" e são atualizados como esperado, mas quando é de outro símbolo, é uma cópia estática.
Assim, para que funcione em um indicador, deve-se chamar a função "ArrayCopyRates()" em cada chamada ao evento OnCalculate() se forem necessários novos dados.
Apenas para expandir suas descobertas Fernando - mesmo que o símbolo seja o mesmo que o símbolo do gráfico, se o cronograma for diferente, então o array é estático.
Assim, para ter uma cópia virtual, em um indicador, ela deve ser o mesmo símbolo E o mesmo período de tempo. Qualquer outra coisa é estática.
Assumindo que é meio da semana para encontrar o alto e o baixo do dia anterior que eu simplesmente uso:
Lo = iLow(NULL, PERIOD_D1, 1);
Tudo bem, mas agora preciso encontrar no dia anterior qual foi a hora alta e a hora baixa. Decidi aproximar o tempo da vela de 1h no alto e no baixo usando iHighest e iLowest. E foi aí que os problemas começaram.
PrevDayEnd = iBarShift(NULL, PERIOD_H1, iTime(NULL, PERIOD_D1, 0)-1);
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1);
ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1);
ArrayCopyRates(mqlrates_array,NULL,0);
OnInit();
:
isHistoryLoading = true;
:
OnCalculate( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if(isHistoryLoading)
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_D1,0) > 0) && (iTime(NULL,PERIOD_D1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_H1,0) > 0) && (iTime(NULL,PERIOD_H1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array,NULL,0)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,0,0) > 0) && (iTime(NULL,0,1) > 0))
{
isHistoryLoading = false;
if(DebugLog)
Print("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if(isHistoryLoading)
{
if(DebugLog)
Print("Waiting for chart to update!");
return(rates_total);
}
:
:
if(ObjectFind(Trend2Name) != -1) // Check whether mid range line exists
{
if((TimeDay(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeDay(TimeCurrent()))
&& (TimeMonth(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeMonth(TimeCurrent()))
&& (TimeYear(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeYear(TimeCurrent()))) // Indicator has already been ploted today
{
return(rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if(DebugLog)
Print("Indicator in a past date! Deleting it and creating it today!");
if(ObjectFind(FibName) != -1)
FiboLevelsDelete(0,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if(DebugLog)
Print("Indicator doesn't exist! Creating it.");
CreateIndicator();
}
:
Após alguns tiques, os dados são parcialmente carregados e o pedaço de código acima detectará que as linhas foram traçadas em um dia anterior, apagará a fibra e desencadeará um recálculo dos intervalos e redesenho dos objetos (isto é, fibra, linhas de tendência, etc.).
CurrDayBegin = iTime(NULL, PERIOD_D1, 0);
while(TimeDayOfWeek(iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, CurrDayBegin))) != TimeDayOfWeek(TimeCurrent()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600; // Move 1h until you find the 1st candle of today.Estas são screenshots do indicador:
(1) Calculadas usando histórico incompleto (por favor, note que as linhas horizontais não começam no início do dia)
(2) Recalculado utilizando o histórico completo (linhas horizontais a partir do início do dia)