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

 
vladmirad:

Obrigado pelo conselho, eu conheço essas funções.

Você sabe porque tantas pessoas, inclusive você, respondem àqueles que conhecem o mql como um machado. E eles ignoram os conselhos dos conhecedores? Se você não tiver nenhuma, verifique esta dica:

O fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos.

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

Artyom Trishkin, 2020.06.29 00:03

Olá.
Comece monitorando o estado do gráfico em OnChartEvent() https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Há alguns eventos que você precisa:
CHARTEVENT_OBJECT_CREATE Criar objeto gráfico
CHARTEVENT_OBJECT_CHANGE Alterar as propriedades do objeto gráfico através do diálogo de propriedades
CHARTEVENT_OBJECT_DELETE Excluir objeto gráfico

Registrar todos os parâmetros do manipulador OnChartEvent() e ver seus valores ao adicionar/modificar/eliminar objetos gráficos. Isto lhe dará direção para onde ir.

 
vladmirad:

Obrigado pela dica, eu conheço essas funções.
Mas como podemos usá-los para encontrar automaticamente um objeto no gráfico e ler seus parâmetros, se não soubermos seu nome a priori?
Ao desenhar um objeto em um gráfico com um mouse, o sistema dá seu nome.

Naturalmente, não é difícil organizar a entrada manual de todos os dados necessários do objeto a partir de sua tabela de propriedades, mas então por que a automação?
Mas como programar uma EA com o nome de um objeto e depois todas as funções que você mencionou podem ser usadas, ainda não está claro para mim...

Como observado acima, trabalhar com os eventos do gráfico:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool applyObject(const string _objName) {
  if(MessageBox("Сохранить параметры объекта \"" + _objName + "\" для эксперта?", "ObjChange", MB_YESNO) == IDYES) {
    objName = _objName; // Запись имени изменяемого объекта
    // Запись других параметров изменяемого объекта ...
    return true;
  }
  return false;
}

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam
) {
//---
  if(id == CHARTEVENT_OBJECT_CREATE || id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE) {
    applyObject(sparam);
  }
}
Arquivos anexados:
ObjChange.mq5  5 kb
 
Artyom Trishkin:
Olá.
Comece rastreando o estado do gráfico no OnChartEvent()
Há alguns eventos que você precisa:
CHARTEVENT_OBJECT_CREATE Criar um objeto gráfico
CHARTEVENT_OBJECT_CHANGE Alterar as propriedades de um objeto gráfico através do diálogo de propriedades
CHARTEVENT_OBJECT_DELETE Excluir um objeto gráfico
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Registrar todos os parâmetros do OnChartEvent() e ver seus valores quando você adicionar/modificar/apagar objetos gráficos. Isto lhe dará direção para onde ir.

Muito obrigado, já tomei seu conselho!

 
Mihail Matkovskij:

Você pode encontrar e registrar objetos de um determinado tipo com suas coordenadas como segue:

Você pode salvar qualquer dado em um arquivo. E no Expert Advisor faça um carregador que adicionará os objetos apropriados, e então carregue os dados do arquivo para dentro deles. Mas você pelo menos esboça um código fonte para sua tarefa específica e o publica aqui.

Obrigado também a você, Michael, por sua ajuda prática!
 
Mihail Matkovskij:

Como observado acima, trabalhe com os eventos do gráfico:

Michael, sua ajuda e@Artyom Trishkin foi muito útil!

Agora precisamos descobrir como encontrar o ponto de cruzamento entre a tabela de preços e o objeto encontrado, neste caso, a linha de tendência.

O algoritmo é o seguinte:
1. Usando as coordenadas lidas da linha de tendência, calculamos o coeficiente de aumento de tendência por 1 barra do TF selecionado.
2. Calcula a coordenada de preço da linha de tendência na barra atual e monitora o fato de cruzar pelo gráfico deste ponto durante a TF selecionada.
3. Se tiver, procedemos ao processamento deste evento, por exemplo, abrimos um pedido. Caso contrário, o procedimento é repetido para a próxima barra.

Mas talvez o MT4(5), devido às especificidades deste sistema, tenha uma solução muito mais simples?

 
Alexey Viktorov:

Você sabe porque tantas pessoas, inclusive você, respondem àqueles que conhecem o mql como um machado. E eles ignoram os conselhos daqueles que sabem. No seu caso, é este o conselho:


Meu caro Alexey, você está absolutamente certo sobre meu conhecimento da MQL. Entretanto, você está enganado ao dizer que eu não presto atenção aos conselhos de iniciados, porque meu primeiro contato foi com@Artyom Trishkin, que eu acredito ser um dos melhores profissionais da MQL e que você conhece bem.

Seus conselhos me permitiram compreender imediatamente como resolver meu problema e me abriram os olhos para novas ações. E@Mihail Matkovskij tornou minha vida ainda mais fácil!

 
vladmirad:

Michael, sua ajuda e@Artyom Trishkin foi muito útil!

Agora precisamos descobrir como encontrar o ponto de cruzamento entre a tabela de preços e o objeto encontrado, neste caso, a linha de tendência.

O algoritmo é o seguinte:
1. Usando as coordenadas lidas da linha de tendência, calculamos o coeficiente de aumento de tendência por 1 barra do TF selecionado.
2. Calcula a coordenada de preço da linha de tendência na barra atual e monitora o fato de cruzar pelo gráfico deste ponto durante a TF selecionada.
3. Se tiver, procedemos ao processamento deste evento, por exemplo, abrimos um pedido. Caso contrário, o procedimento é repetido para a próxima barra.

Mas talvez o MT4(5), devido às especificidades deste sistema, tenha uma solução muito mais simples?

Como eu disse acima, esboçar um código fonte para ter algo com que começar. Além disso, você já tem algum conhecimento sobre como obter os dados do objeto no gráfico. Ninguém quer fazer tudo por você a partir do zero. E desta forma, o que falta para o trabalho do especialista pode ser complementado...

 
vladmirad:

Michael, sua ajuda e@Artyom Trishkin foi muito útil!

Agora precisamos descobrir como encontrar o ponto de cruzamento entre a tabela de preços e o objeto encontrado, neste caso, a linha de tendência.

O algoritmo é o seguinte:
1. Usando as coordenadas lidas da linha de tendência, calculamos o coeficiente de aumento de tendência por 1 barra do TF selecionado.
2. Calcula a coordenada de preço da linha de tendência na barra atual e monitora o fato de cruzar pelo gráfico deste ponto durante a TF selecionada.
3. Se tiver, procedemos ao processamento deste evento, por exemplo, abrimos um pedido. Caso contrário, o procedimento é repetido para a próxima barra.

Talvez a solução no MT4(5), devido às características específicas deste sistema, seja muito mais simples?

Não está muito claro o que você quer encontrar. Você quer encontrar o ponto de cruzar a linha de tendência pelo preço em algum bar? Para isso existem funções para obter o valor da linha em uma barra. Mas eu usaria a equação da linha reta:

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

FAQ de Iniciantes MQL5 MT5 MetaTrader 5

Artyom Trishkin, 2020.05.02 12:27

Use uma equação em linha reta:

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+

Especifique o número da barra e o preço do ponto à esquerda, especifique o número da barra e o preço do ponto à direita (uma linha virtual é desenhada sobre estes pontos) e especifique a barra que você está procurando.
A função devolverá o preço do bar que você está procurando.


Não requer a presença de um objeto real.
 
Artyom Trishkin:

..... Existem funções para obter o valor da linha na barra. Mas eu usaria a equação da linha reta:

.....

Artyom, mais detalhes aqui, por favor.

Ou eu não estava muito atento antes, ou a documentação estava afinada. Eu não sei.

Mas eu sempre pensei que a ObjectGetDouble devolvia o preço da linha em uma determinada barra (quero dizer o preço exato). E aqui eu decidi fazer um pequeno roteiro para verificá-lo, e o que eu vi?

1. Não há número de barra nos parâmetros, nos quais o valor deve ser lido.

2. Identificador de propriedade:

OBJPROP_PREÇO

Coordenada de preço

modificador=número de pontos de ancoragem


é apenas o ponto de ancoragem!

Sim, basicamente, se eu traçar esta linha no código, eu já tenho estes pontos! Por que eu preciso conhecê-los? Na verdade, qual é o objetivo?

Como posso obter o valor do preço desta linha em outro lugar?


Acontece que este é

prop_modificador

[em] Modificador de propriedade especificada. Para a primeira opção, o valor padrão do modificador é 0. A maioria das propriedades não requer um modificador. Denota um número de nível nasferramentas Fibonacci e no objeto gráfico Pitchfork da Andrews. A numeração dos níveis começa de zero.

Isso não faz sentido algum? Está à procura de pontos de fixação de QUALQUER linha de ventilador? Isso é um absurdo. Perdão.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Сергей Таболин:

Artyom, você poderia entrar um pouco mais em detalhes aqui, por favor?

Ou eu não estava muito atento antes, ou a documentação foi mexida. Eu não sei.

Mas eu sempre pensei que a ObjectGetDouble devolvia o preço da linha em um determinado bar (quero dizer, o preço). E aqui eu decidi fazer um pequeno roteiro para verificá-lo, e o que eu vi?

1. Não há número de barra nos parâmetros, nos quais o valor deve ser lido.

2. Identificador de propriedade:

OBJPROP_PREÇO

Coordenada de preço

modificador=número de pontos de ancoragem


é apenas o ponto de ancoragem!

Sim, basicamente, se eu traçar esta linha no código, eu já tenho estes pontos! Por que eu preciso conhecê-los? Na verdade, qual é o objetivo?

Como posso obter o valor do preço desta linha em outro lugar?


Acontece que este é

prop_modificador

[em] Modificador de propriedade especificada. Para a primeira opção, o valor padrão do modificador é 0. A maioria das propriedades não requer um modificador. Denota um número de nível nasferramentas Fibonacci e no objeto gráfico Pitchfork da Andrews. A numeração dos níveis começa de zero.

Isso não faz sentido algum? Está à procura de pontos de fixação de QUALQUER linha de ventilador? Isso é um absurdo. Perdoe-me.

Eu não tenho trabalhado muito com tais objetos. O que esta função retornará para a tendência de acordo com o tempo de barra especificado? Não tenho tempo para verificá-lo. Mesmo que seja um pequeno roteiro...

ObjectGetValueByTime()

Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду...
Razão: