Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 645

 

Taras, é possível fazer tal normalização gráfica para mudança de quadros por clique do mouse?

Às vezes, por hábito, clico quando o cursor está perto do botão, mas não gosto do resultado.

Não encontrei nada adequado na lista de tratamento de eventos, há apenasCHARTEVENT_CHART_CHANGE sem nenhuma descrição específica. Posso tentar amarrar um clique do mouse, mas até onde entendo o usuário não pode trabalhar com o menu do sistema, somente se ele criar seus próprios botões. Existe alguma solução simples?

 
psyman:

Taras, é possível fazer tal normalização gráfica para mudança de quadros por clique do mouse?

Às vezes, por hábito, clico quando o cursor está perto do botão, mas não gosto do resultado.

Não encontrei nada adequado na lista de tratamento de eventos, há apenasCHARTEVENT_CHART_CHANGE sem nenhuma descrição específica. Posso tentar ligar o clique do botão do mouse, mas até onde entendo o usuário não pode trabalhar com o menu do sistema, somente se ele criar seus próprios botões. Existe alguma solução simples?

Ou seja, para clicar em algumas "zonas de sapateado" no gráfico?
Você pode, você precisa manter o controle das coordenadas do cursor e dos cliques do botão do mouse.

CHARTEVENT_MOUSE_MOVE

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta para iniciantes sobre MQL4, ajuda e discussão sobre algoritmos e códigos

Taras Slobodyanik, 2018.10.04 09:37

Você pretende clicar com o mouse em algumas "zonas de sapateado" na tabela?
Você pode, você precisa manter o controle das coordenadas do cursor e dos cliques do botão do mouse.



O problema é que é um clique na tabela, não em um botão do menu do sistema. Como processar um evento desse tipo eu não sei.
 
psyman:

O problema é que é um clique em um gráfico, não um botão do menu do sistema. Eu não sei como processar tal evento.

lembre-se do período atual de caracteres e em"CHARTEVENT_CHART_CHANGE" verifique as mudanças e faça o que você precisa fazer

 
OK, obrigado novamente.
 

Por favor, me diga por que a mesma função do corpo da EA OnTick() não funciona (ou melhor, funciona, mas falha em todos os gráficos corretamente)

Mas a partir do procedimento OnInit() funciona bem e a partir de um roteiro comum também. O Expert Advisor está instalado em 80 gráficos ao mesmo tempo (20 moedas, cada uma com 4 janelas W1 D1 H4 H1) pode apenas meu computador não aguentar? Por favor, informe. O objetivo do robô é emitir as mensagens MessageBox na tela, se for detectado um sinal em um dos gráficos. Talvez o computador esteja lento no momento do início destas mensagens?
 

Estou tendo problemas para lembrar o período antes de um evento ser tratado, onde faço isso?

Decidido a rastrear por mensagem, acontece que CHARTEVENT_CHART_CHANGE é processado 2 vezes em um clique, a variável ctime é reinicializada.


#propriedade rigorosa

#janela_do_cartão_indicador de propriedade

int ctime;


nulo OnInit()

{

Print(" OnInit------------ 1 ", ChartPeriod(0));

Imprimir("OnInit ctime = ", ctime);

// ctime=ChartPeriod(0);

}


int OnCalculate(const int taxas_total,

const int prev_calculado,

const datetime &time[],

const double &open[],

const double &high[],

const double &low[],

const double &close[],

const long &tick_volume[],

const long &volume[],

const int &spread[])

{

ctime=ChartPeriod(0);

retorno(taxas_total);

}

nulo OnChartEvent(const int int id,

const long &lparam,

const double &dparam,

const string &sparam)


{


if(id===CHARTEVENT_CHART_CHANGE)

{

Imprimir("CHARTEVENT_CHART_CHANGE é iniciado ctime=", ctime);

if(ctime!=PeriodoCartão(0))

{

Print(ChartPeriod(0), " CHANGED!!!!!!!!!!!!!!! ctime", ctime);

}

}

}



Adicionando indicador de hora em hora, depois mudando para diário

2018.10.05 01:04:45.171 _t1 CADJPY,Diário: CHARTEVENT_CHART_CHART_CHANGE é iniciado ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: 1440 CHANGED 0

2018.10.05 01:04:45.156 _t1 CADJPY,Diário: CHARTEVENT_CHART_CHART_CHANGE é iniciado ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: inicializado

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily: OnInit 1 1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1: razão uninit 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHART_CHANGE é iniciado ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 60 CHANGED 0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHART_CHANGE é iniciado ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: inicializado

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit 1 60

2018.10.05 01:02:01.078 Indicador personalizado _t1 CADJPY,H1: carregado com sucesso





 
psyman:

Estou tendo problemas para lembrar o período antes do evento ser processado, onde isso precisa ser feito?

Decidido a rastrear por mensagem, acontece que CHARTEVENT_CHART_CHANGE é processado 2 vezes em um clique, a variável ctime é reinicializada.

Coloque o código na mensagem corretamente! É muito difícil de ler nesta forma. Deve ser parecido com isto.

#property strict
#property indicator_chart_window
int ctime;
void OnInit()
   {
     Print("  OnInit------------1  ", ChartPeriod(0));
     Print("OnInit ctime = ", ctime);
   //  ctime=ChartPeriod(0);   
   }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   ctime=ChartPeriod(0);         
   return(rates_total);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CHART_CHANGE)
      {
      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);
      if(ctime!=ChartPeriod(0))
      {
      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);
      }
      } 
}

Quando você muda os parâmetros de um gráfico, o indicador é forçado a ser recarregado, leia o documento para o motivo da desinicialização e sua variável de motivo.

Você pode usar variáveis terminais globais para salvar os parâmetros necessários.

 
Vitaly Gorbunov:

Insira o código corretamente na mensagem! É muito difícil lê-lo desta maneira. Deveria ser assim.

O indicador é forçado a reiniciar quando você muda os parâmetros do gráfico lê o documento pelo motivo da desinicialização e sua variável razão.

Você pode usar variáveis globais do terminal para salvar os parâmetros necessários.

Sim, você precisa salvar os valores na GlobalVariable, e então, na partida, verificar sua existência.

Ou seja, o número do gráfico, símbolo, período deve ser salvo.
E depois apagar variáveis desnecessárias, ou torná-las inicialmente como variáveis globais temporárias.

ps. você também pode armazenar informações em objetos no gráfico - desde que o gráfico exista, os objetos existem

 

Eu pensei que seria muito mais fácil :-)

Então uma pergunta bem infantil - meu código não envolve qualquer negociação ou gráfico, que tipo de programa devo usar?

Os roteiros são únicos, mas eles podem ser executados em loop? Eu declarei um indicador personalizado puramente por inércia, porque nunca usei Expert Advisors. Nunca os usei antes, mas eles reiniciam automaticamente, o que não preciso. precisarei de seu conselho.

ps

Os objetos podem ser de tamanho zero, para que visualmente não atrapalhem?