Em geral, leio diagonalmente e apenas as primeiras páginas (talvez no meio estivesse a cabeça brilhante de alguém? :) ), algo que todos tentam adicionar muletas à interface terminal terrivelmente inconveniente para aceder à história, é mais fácil escrever um bloco entre o terminal e as suas próprias coisas (em geral, deveria estar na biblioteca std). Além disso, como resultado, não é necessário escrever roteiros diferentes para 4/5. Eu já fiz tal coisa:
// comp.comp() returns true if the first argument is less than the second.// If failure, returns UINT_MAX.template<typename A, typename T, typename Comp>
uint alg_lower_bound(const A &ar[], uint minindex, uint maxindex,
const T &value, Comp &comp, bool rev=false)
{
uint count = maxindex - minindex + 1;
uint first = minindex;
if(rev)
first = maxindex;
while(count != 0)
{
uint it = first;
uint step = count / 2;
if(rev)
it -= step;
else
it += step;
if(comp.comp(ar[it], value))
{
if(rev)
first = --it;
else
first = ++it;
count -= step + 1;
}
else
count = step;
}
if(first < minindex || first > maxindex)
first = UINT_MAX;
return first;
}
class Chart
{
struct Bar_trend
{
double p1;
double p2;
datetime time;
};
Bar_trend bar_trend[];
upindex_t sz;
upindex_t curtain;
bool reverse_f;
void refresh_base(datetime min = 0, datetime max = 0);
public:
// Empty chart will be created.
Chart(): sz(0), curtain(UPINDEXT_MAX), reverse_f(false) {}
// Chart with points whose time is in interval min:max will be created.
Chart(datetime min, datetime max): sz(0), curtain(UPINDEXT_MAX), reverse_f(false) { refresh_base(min, max); }
// Reverse flag is not changed. For whole chart min and max are 0.void init(datetime min, datetime max);
My_point operator[](upindex_t i)const;
// If exact is true then time of point with returned index is equal to time.// If point is not found then function returns UPINDEXT_MAX.
upindex_t bar_shift(datetime time, bool exact=true)const;
upindex_t size()const {returnthis.curtain == UPINDEXT_MAX ? this.sz * 2 : this.curtain;}
// pos can not be greater than the size(). UPINDEXT_MAX for deletion of curtain.// It will be reset when refresh(). Returns true in case of success.bool set_curtainpos(upindex_t pos);
upindex_t get_curtainpos()const {returnthis.curtain;}
bool reverse_mode()const {returnthis.reverse_f;}
// Returns true in case of success.bool reverse_mode(bool mode);
// if chart size == 0 then lowest = highest == UPINDEXT_MAX.void extremums(upindex_t &lowest, upindex_t &highest)const;
// if chart is reverse then indexes will be invalidated.void refresh() { refresh_base(); }
};
upindex_t Chart::bar_shift(datetime time, bool exact)const
{
class Comp
{
public:
bool comp(const Bar_trend &bt, datetime time) {return bt.time > time;}
}comp;
uint res = alg_lower_bound(this.bar_trend, 0, this.sz-1, time, comp, true);
if(res != UINT_MAX)
{
uchar shift = this.bar_trend[res].time!=time ? 1 : 0;
if(exact && this.bar_trend[res].time+shift != time)
res = UINT_MAX;
else
res = this.reverse_f ?
((this.sz - 1 - res) * 2 + !shift) :
(res * 2 + shift);
}
return res == UINT_MAX ? UPINDEXT_MAX : res;
}
E um simples exemplo de utilização:
Chart chart();
chart.refresh();
for(int i = 0; i < chart.size(); ++i)
Print(chart[i].price, chart[i].time);
refresh() via define o seu próprio para 4/5. O gráfico tem apenas um período (M1 ou outro definido através da definição, porque é que isto se incomoda com a sua abundância?).
Também implementei algumas características úteis - indexação reverse_mode() de ambos os lados (se da esquerda para a direita, os índices permanecem válidos ao desdobrar o gráfico). Habilidade de definir e mover o limite do gráfico set_curtainpos(), análogo do testador - testar, mover limite, testar, mover. Operadores de comparação sobrecarregados na estrutura My_point (para comportamento válido em tais situações: 0,0000000009 == 1,00000000000000).
Se alguém agoniza, eu recomendo esta abordagem, pessoalmente não lamento.
Zy: e desisti dos castiçais clássicos com abertura/fecho/alto/baixo, e coloquei Point na base - um castiçal dá dois Point's de alto>baixo, alto-baixo-alto. é realmente muito conveniente.
Em geral, leio diagonalmente e apenas as primeiras páginas (talvez no meio estivesse a cabeça brilhante de alguém? :) ), algo que todos tentam adicionar muletas à interface terminal terrivelmente inconveniente para aceder à história, é mais fácil escrever um bloco entre o terminal e as suas próprias coisas (em geral, deveria estar na biblioteca std). Além disso, como resultado, não é necessário escrever roteiros diferentes para 4/5. Eu já fiz tal coisa:
E um simples exemplo de utilização:
refresh() via define o seu próprio para 4/5. O gráfico tem apenas um período (M1 ou outro definido através da definição, porque é que isto se incomoda com a sua abundância?).
Também implementei algumas características úteis - indexação reverse_mode() de ambos os lados (se da esquerda para a direita, os índices permanecem válidos ao desdobrar o gráfico). Habilidade de definir e mover o limite do gráfico set_curtainpos(), análogo do testador - testar, mover limite, testar, mover. Operadores de comparação sobrecarregados na estrutura My_point (para comportamento válido em tais situações: 0,0000000009 == 1,00000000000000).
Se alguém agoniza, eu recomendo esta abordagem, pessoalmente não lamento.
Zy: e desisti dos castiçais clássicos com abertura/fecho/alto/baixo, e coloquei Point na base - um castiçal dá dois Point's de alto>baixo, alto-baixo-alto. é realmente muito conveniente.
Vou esperar pelas correcções no formulário final, obrigado por responder.
Boa sorte com os exames!
Acabou por ser muito matizada.
Se eu soubesse como seria complicado, não me teria envolvido ))))
Esta opção deve funcionar correctamente.
Se alguém o encontrar a funcionar incorrectamente, ficaria grato se pudesse denunciar o problema.
Quanto é que o seu iBars() difere em desempenho das Barras padrão()?
Depende de como se utiliza.
Se cada chamada para o iBar mudar o TF ou símbolo, então o meu iBar será cerca de metade mais lento.
Mas esta não é de todo uma situação realista de um ponto de vista prático.
Se o usarmos assim, por exemplo:
então a vantagem do meu iBars sobre os bares normais será de cerca de 10 ou mais vezes.
Mas o principal é que não há nenhum bug de desligamento:
Fixou-o no código acima. Acrescentou uma linha:
Depende de como se utiliza.
Se cada chamada para o iBar irá mudar o TF ou símbolo, então o meu iBar irá trabalhar cerca do dobro da lentidão.
Mas esta não é de todo uma situação realista de um ponto de vista prático.
Se o usarmos assim, por exemplo:
então a vantagem das minhas barras iBars sobre as barras padrão seria cerca de 10 vezes ou mais.
Mas o principal é que não há nenhum bug de desligamento:
R-R-R-R-R-RESPEITO!
Depende de como se utiliza.
Se cada chamada para o iBar irá mudar o TF ou símbolo, então o meu iBar irá trabalhar cerca do dobro da lentidão.
Mas esta é uma situação completamente irrealista de um ponto de vista prático.
Se o usarmos assim, por exemplo:
então a vantagem das minhas barras iBars sobre as barras padrão seria cerca de 10 vezes ou mais.
Mas o principal é que não há nenhum bicho gelado:
Vá lá!
Onde estão os seus 10 segundos?
2018.05.05 17:45:36.860 ind EURUSD,M5: 2
2018.05.05 17:45:36.860 ind EURUSD,M5: 0
2018.05.05 17:45:36.860 ind EURUSD,M5: 1
Vá lá!
Onde estão os seus 10 segundos?
2018.05.05 17:45:36.860 ind EURUSD,M5: 2
2018.05.05 17:45:36.860 ind EURUSD,M5: 0
2018.05.05 17:45:36.860 ind EURUSD,M5: 1
Foi o MT5?
MT4
Experimente-o no MT5 e surpreenda-se.
Este insecto foi completamente descoberto por acidente graças ao posto de@Aleksey Vyazmikin, pelo qual tenho de lhe agradecer muito.
Tinha observado estas interrupções antes, mas não conseguia explicar a sua origem. Quem teria pensado...