Artyom Trishkin: De alguma forma (solução de @fxsaber):
//+------------------------------------------------------------------+ //| Возвращает смещение бара по времени | //+------------------------------------------------------------------+ int GetBarShift(conststring symbol_name, constENUM_TIMEFRAMES timeframe, constdatetime time) { int res=-1; datetime last_bar; if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) { if(time>last_bar) res=0; else { constint shift=Bars(symbol_name,timeframe,time,last_bar); if(shift>0) res=shift-1; } } return(res); } //+------------------------------------------------------------------+
Alguém escreveu algures que na linha seleccionada deve fazer isto: if (time>=last_bar) res=0;
Para ser honesto, ainda não a verifiquei - não estou sempre a recebê-la. Verifique e escreva o resultado, por favor.
Fui eu que o escrevi. E é lógico, porque se o tempo coincide com a hora de abertura da barra actual, o seu índice também será 0. Sim, a solução de fxsaber puro funcionará com erros.
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
Depois do que vi hoje, comecei de alguma forma a duvidar da correcção da minha decisão.
Pergunta: Que variante é melhor, porque estou apenas a aprender?
Neste caso a sua implementação deve funcionar mais rapidamente - uma vez que há menos chamadas a copiar - copia três valores de uma só vez em vez de um.
Embora ninguém o esteja a impedir de converter o código para obter um valor de cada vez:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=Period(); doubleClose[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); }
em código para obter múltiplos valores ao mesmo tempo. Eu sou apenas preguiçoso :)
Neste caso a sua implementação deve funcionar mais rapidamente - uma vez que há menos chamadas de cópia - copia três valores ao mesmo tempo em vez de um de cada vez.
Embora ninguém o esteja a impedir de converter o código para obter um valor de cada vez:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) }
em código para obter múltiplos valores ao mesmo tempo. Eu sou apenas preguiçoso :)
Obrigado pela resposta!
Então, é melhor aplicar a solução, que eu afixei? Há uma verificação suficiente, não haverá erros?
Então, é melhor aplicar a solução que afixei? Uma verificação é suficiente, não haverá erros?
A sua solução também não é óptima, porque inicializa um conjunto de variáveis com valores da matriz que já tem. A questão é: porquê? Quando só pode ser utilizado um array? Dê-lhe o nome de Bars e ficará feliz:
A sua solução também não é óptima, porque inicializa um conjunto de variáveis com valores de um array já derivado. A questão é: porquê? Quando só pode ser utilizado um array? Basta chamar-lhe Bars e ficará feliz:
Chama-seBars e o compilador dá-lhe uma bofetada no pulso. Já verificou esta construção ou apenas assumiu que deveria funcionar, ou estou a fazer algo de errado?
De alguma forma (solução de @fxsaber):
//| Возвращает смещение бара по времени |
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
int res=-1;
datetime last_bar;
if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
if(time>last_bar) res=0;
else {
const int shift=Bars(symbol_name,timeframe,time,last_bar);
if(shift>0) res=shift-1;
}
}
return(res);
}
//+------------------------------------------------------------------+
Para ser honesto, ainda não a verifiquei - não estou sempre a recebê-la. Verifique e escreva o resultado, por favor.
Não sei se a minha solução é "mais fácil", mas tente esta: https://www.mql5.com/ru/forum/160945#comment_4053382
Não existe uma função padrão na língua e cada um tem de construir a sua própria bicicleta e depois medir o seu desempenho?
Parece que encontrei tudo excepto este, mas depois de olhar para soluções diferentes, é óbvio que são "quem pode fazer o quê".
Não existe uma função padrão na língua e cada um tem de construir a sua própria bicicleta e depois medir o seu desempenho?
Parece que encontrei todas menos esta, mas depois de olhar para as diferentes soluções, é óbvio que são "quem pode fazer o quê".
Uma última pergunta. Hoje, na base de códigos, vi um código de um "mestre", por isso usa-o:
double open_2=iOpen(2);
double high_0=iHigh(0);
double high_1=iHigh(1);
double high_2=iHigh(2);
double high_3=iHigh(3);
double low_0=iLow(0);
double low_1=iLow(1);
double low_2=iLow(2);
double low_3=iLow(3);
double close_1=iClose(1);
double close_2=iClose(2);
Ainda ontem escrevi um semelhante, mas foi assim que o escrevi:
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
open1 = Tick[0].open; open2 = Tick[1].open; open3 = Tick[2].open;
high1 = Tick[0].high; high2 = Tick[1].high; high3 = Tick[2].high;
low1 = Tick[0].low; low2 = Tick[1].low; low3 = Tick[2].low;
close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;
Depois do que vi hoje, comecei de alguma forma a duvidar da correcção da minha decisão.
Pergunta: Que opção é melhor, porque estou apenas a aprender?
Uma última pergunta. Hoje, na base de códigos, vi um código de um "mestre", por isso usa-o:
double open_2=iOpen(2);
double high_0=iHigh(0);
double high_1=iHigh(1);
double high_2=iHigh(2);
double high_3=iHigh(3);
double low_0=iLow(0);
double low_1=iLow(1);
double low_2=iLow(2);
double low_3=iLow(3);
double close_1=iClose(1);
double close_2=iClose(2);
Ainda ontem escrevi uma coisa semelhante, mas escrevi-a desta forma:
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
open1 = Tick[0].open; open2 = Tick[1].open; open3 = Tick[2].open;
high1 = Tick[0].high; high2 = Tick[1].high; high3 = Tick[2].high;
low1 = Tick[0].low; low2 = Tick[1].low; low3 = Tick[2].low;
close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;
Depois do que vi hoje, comecei de alguma forma a duvidar da correcção da minha decisão.
Pergunta: Que variante é melhor, porque estou apenas a aprender?
Neste caso a sua implementação deve funcionar mais rapidamente - uma vez que há menos chamadas a copiar - copia três valores de uma só vez em vez de um.
Embora ninguém o esteja a impedir de converter o código para obter um valor de cada vez:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
double Close[1];
double close=0;
int copied=CopyClose(symbol,timeframe,index,1,Close);
if(copied>0) close=Close[0];
return(close);
}
em código para obter múltiplos valores ao mesmo tempo. Eu sou apenas preguiçoso :)
Neste caso a sua implementação deve funcionar mais rapidamente - uma vez que há menos chamadas de cópia - copia três valores ao mesmo tempo em vez de um de cada vez.
Embora ninguém o esteja a impedir de converter o código para obter um valor de cada vez:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
}
em código para obter múltiplos valores ao mesmo tempo. Eu sou apenas preguiçoso :)
Obrigado pela resposta!
Então, é melhor aplicar a solução, que eu afixei? Há uma verificação suficiente, não haverá erros?
Obrigado pela resposta!
Então, é melhor aplicar a solução que afixei? Uma verificação é suficiente, não haverá erros?
CopyRates precisa de pelo menos duas verificações:
Obrigado pela resposta!
Então, é melhor aplicar a solução que afixei? Uma verificação é suficiente, não haverá erros?
A sua solução também não é óptima, porque inicializa um conjunto de variáveis com valores da matriz que já tem. A questão é: porquê? Quando só pode ser utilizado um array? Dê-lhe o nome de Bars e ficará feliz:
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
A sua solução também não é óptima, porque inicializa um conjunto de variáveis com valores de um array já derivado. A questão é: porquê? Quando só pode ser utilizado um array? Basta chamar-lhe Bars e ficará feliz:
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
Chama-seBars e o compilador dá-lhe uma bofetada no pulso. Já verificou esta construção ou apenas assumiu que deveria funcionar, ou estou a fazer algo de errado?
ChamadoBars, o compilador é repreendido como um inferno. Já testou este desenho, ou apenas assumiu que deveria funcionar?