Indicadores: Setka (grade) - página 2

 
Prival:
postou uma nova versão 3.09 no Code Base, você pode baixá-la.

Você pode aprimorá-la um pouco mais.

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

Em tais construções, ObjectFind() é obviamente desnecessário. Ao criar por ObjectCreate(), será semelhante à pesquisa na lista por nome e à criação de um novo objeto ou à alteração dos parâmetros dos pontos de ancoragem do objeto existente.
.

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

Para objetos criados a partir do programa MQL, essa propriedade é forçada a ser falsa.

Da mesma forma, não faz sentido alterar o valor de OBJPROP_WIDTH, pois ele será igual a 1 de qualquer forma.

De acordo com minhas medições, essas edições reduzem o tempo de construção em cerca de 10%.

 

Obrigado, vou pensar nisso. Estou trabalhando em algo agora, mas há uma falha.

Tenho 8 gráficos abertos com apenas a grade neles.

Simulei a desconexão da rede por 5 minutos. Esta é a imagem depois de ligar a rede. 2 gráficos estão travando.

Anexei uma nova versão da grade, a versão 4.01.

Arquivos anexados:
setka__1.mq5  15 kb
 
Prival:

Obrigado, vou pensar nisso. Estou trabalhando em algo agora, mas há uma falha.

Tenho 8 gráficos abertos com apenas a grade neles.

Simulei a desconexão da rede por 5 minutos. Esta é a imagem depois de ligar a rede. 2 gráficos estão travando.

Anexei uma nova versão da grade, a versão 4.01.

Isso é uma consequência da arquitetura do terminal e do algoritmo do indicador. O indicador é executado no fluxo de símbolos, ou seja, durante seu cálculo, muitas operações com o histórico são impossíveis: processamento de ticks, cálculo de outros indicadores, sincronização do histórico com o servidor, criação ou carregamento do histórico por períodos de tempo de símbolo etc.

Como o indicador Grid é calculado por um longo período e usa dados de outros períodos de tempo do símbolo, é desejável interromper seu cálculo em caso de erro. Se for sério não reescrever o código, você pode fazer isso dessa forma:

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

e assim:

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

Arquivos anexados:
setka.mq5  15 kb
 
antt:

Isso é uma consequência da arquitetura do terminal e do algoritmo do indicador. O indicador é executado no fluxo de símbolos, ou seja, no processo de seu cálculo, muitas operações com o histórico são impossíveis: processamento de ticks, cálculo de outros indicadores, sincronização do histórico com o servidor, criação ou carregamento do histórico por períodos de tempo de símbolo etc.

Não consigo entender essa noção de fluxo, e já li a ajuda sobre acesso a dados 50 vezes (( o script é fornecido como exemplo. E ele leva cerca de um minuto para ser executado (muito tempo), mas parece que comecei a entender. Será que entendi corretamente que, enquanto o indicador está sendo calculado, ou seja, a função começou a ser executada

int OnCalculate () {
todos os recursos do computador (terminal) são dados a essa tarefa, e até que ela seja executada (concluída)

return(rates_total); }

Você não deve fazer nenhuma das ações a seguir:

- tentar ler o histórico por esse símbolo se ele estiver faltando

- solicitar um período de tempo diferente

- solicitar outro símbolo

Acho que entendi como refazer o programa, você precisa definir todas as linhas na primeira chamada e esquecê-las até if(prev_calculated==0).

Certo ?

S.Y.

  1. Comerciante - uma pessoa que pisa em rakes.
  2. Dummy - um operador iniciante que nunca pisou em um rake e, portanto, tem certeza de que não há rake.
  3. Otário - um operador que pisa regularmente em rakes, mas ainda tem certeza de que os rakes não existem.
  4. Especialista estreito - um operador que é fluente na tecnologia de pisar no mesmo rake.
  5. Especialista é um operador que pisa em mais de dois rakes em paralelo.
  6. Especialista em sistemas mecânicos - um operador que é capaz de automatizar os acertos de rake.

De acordo com a avaliação de Renat, tenho o nível 5 :-)) https://www.mql5.com/ru/forum/1165/page3 foi um passo além )))

 

reescrevi completamente o código. Não solicitamos outros prazos.

Se você não se importar. Defina as barras mac. na janela Unlimit e passe por M15, M5 e M1. Publique o resultado no registro aqui. Tenho algo errado em M1 - escrevi para o serviço. Só quero saber se é só comigo ou com todo mundo.

Aqui está o meu registro.

2010.06.17 11:39:55 Grid (EURUSD,M1) Falha ou primeira execução Tempo= 1,2 seg para 1293476 barras ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Falha ou primeira execução Tempo= 0.0 seg para 847192 barras ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Grid (EURUSD,M15) Falha ou primeira execução Time= 0.0 seg para 285186 barras ObjectsTotal= 962 _time= 2010.05.04 22:00:00

Agradecemos antecipadamente. versão 4.11 da grade

 
Prival:

Não consigo entender esse conceito de thread, e já li a ajuda 50 vezes sobre acesso a dados (( o script é fornecido como exemplo. E ele leva cerca de um minuto para ser executado (muito tempo), mas acho que estou começando a entender. Entendi corretamente que, enquanto o cálculo do indicador está em andamento, ou seja, a função começou a ser executada

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
todos os recursos do computador (terminal) são dados a essa tarefa e até que ela seja executada (concluída)

return(rates_total); }

Nem todos os recursos. Mas a maioria dos cálculos relacionados a esse símbolo aguardará até que OnCalculate() seja concluído.


Você não deve fazer nenhuma das ações a seguir:

- tentar ler o histórico desse símbolo se ele estiver faltando

Sim. Se não houver histórico suficiente para o símbolo atual, a execução de OnCalculate() definitivamente não melhorará.


- solicitar outro período de tempo

Você pode solicitá-lo, mas se os dados estiverem faltando ou forem insuficientes, não faz sentido esperar em OnCalculate(). Da mesma forma, com os dados de outros indicadores para o símbolo atual.

- Solicitar outro símbolo

Você pode solicitar e, teoricamente, pode até esperar no loop que todos os dados necessários apareçam, pois o processamento dos dados de outro símbolo (histórico, indicadores) é feito em outro thread. Mas é melhor não fazer isso, pois o loop de espera em OnCalculate() interromperá o processamento dos dados do símbolo atual.

.

Acho que entendi como refazer o programa: você precisa definir todas as linhas na primeira chamada e esquecê-las se (prev_calculated==0).

A recomendação geral ao escrever indicadores personalizados: se for detectado qualquer erro, qualquer falta de dados, interrompa imediatamente a execução de OnCalculate() com return(0). No próximo tick, faça uma nova tentativa de cálculo em if(prev_calculated==0).
 
Prival:

se não for muito trabalhoso. Defina as barras mac. na janela Unlimit e passe por M15, M5 e M1. O resultado que estará no registro, poste aqui. Tenho algo errado em M1 - escrevi para o serviço. Só quero ver se é comigo ou com todo mundo.

2010.06.17 11:58:59 6op0k (EURUSD,M1) Falha ou primeira execução Time=0.1sec para 4009008 barras ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Falha ou primeira execução Time=0.0sec para 847196 barras ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Falha ou primeira execução Time=0.0sec para 285187 barras ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) Falha ou primeira execução Tempo=0,1sec para 4009008 barras ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Falha ou primeira execução Time=0.0sec para 847196 barras ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Falha ou primeira execução Time=0.0sec para 285187 barras ObjectsTotal=1108_time=2010.05.04 22:15:00

Obrigado. Isso significa que finalmente escrevi tudo corretamente e que o "indicador" realmente funciona como eu pretendia. A falha que tive é um problema do terminal (você tem tudo normal). _time=2010.06.15 07:45:00). é uma pena que os desenvolvedores sejam omissos no dex do serviço. pelo menos eles escreveriam algumas palavras (( como

problema reproduzido... achamos que... obrigado

 
Prival:

Obrigado. isso significa que finalmente escrevi tudo corretamente e o "indicador" realmente funciona como eu pretendia. a falha que tive foi um problema com o terminal (você está indo bem. _time=2010.06.15 07:45:00). é uma pena que os desenvolvedores sejam omissos no dex do serviço. pelo menos eles escreveriam algumas palavras (( como

problema reproduzido... achamos que... obrigado.

e pode ser corrigido:

Se o gravador H1 carregar uma linha vertical ou horizontal e depois mudar para outro intervalo de tempo, as linhas não relacionadas ao indicador serão excluídas.

Esse é um indicador muito conveniente para verificar o histórico e determinar visualmente a etapa do preço, mas, devido ao fato de que as marcas (linhas verticais e horizontais) colocadas nos intervalos de tempo mais antigos desaparecem quando se muda para um intervalo de tempo menor, ele se torna desconfortável.

 

O indicador resolveu perfeitamente o problema da exibição utilizável da escala de preços nas janelas do terminal.

A compilação em compilações até 3021, inclusive, não mostra erros e tudo é desenhado corretamente (e mesmo se você jogar a versão compilada anteriormente em uma nova compilação do terminal).

A compilação em compilações subsequentes não mostra nenhum erro, mas, no terminal, o somador não desenha a marcação vertical e, nos registros, escreve: 1 leaked strings left

Depois de comentar a linha:

StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":":":",IntegerToString(str.min,2,'0'),"_N",line_counter);

o erro nos registros do terminal desaparece (embora as linhas não sejam desenhadas).

Para que lado cavar? Como reanimar uma ótima ferramenta?