Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 640

 

Olá camaradas!

O MT5 tem ferramentas tão maravilhosas e muito úteis "Impulse Elliott Wave" e "Corrigir Elliott Wave".

A pergunta é: Posso integrar estas ferramentas do MT5 no MT4?

Eu negocio no MT4. Não é muito conveniente mudar para o MT5 para análise.

Ou: Quais são as outras maneiras de resolver o problema?

 
Boa tarde, o idioma tem um parâmetro de mercado como MarketInfo(Symbol(), MODE_TICKVALUE). Você pode descrever em termos gerais como este valor é calculado?
 
mql_writer:
Boa tarde, o idioma tem um parâmetro de mercado como MarketInfo(Symbol(), MODE_TICKVALUE). Você pode descrever em termos gerais como este valor é calculado?

Este é o valor da mudança mínima de preço (1 pip) na moeda do depósito a 1,00 lote! O cálculo é muito fácil: 1,00(lote)/1,36030(cotação atual de Euro) = 0,7351 em Euro.
 
borilunad:

Este é o valor da mudança mínima de preço (1 pip) na moeda do depósito a 1,00 lote! Calculado muito simplesmente: 1,00(lote)/1,36030(cotação atual do Euro) = 0,7351 em Euro.

Exceto que um pedido via marketinfo retorna de alguma forma 10 para todos os pares, exceto pares de ienes ))))


De onde você tirou esta fórmula?

 
evillive:

exceto que uma consulta através do marketinfo retorna de alguma forma 10 para todos os pares, exceto pares de ienes ))))


De onde você tirou esta fórmula?


Eu mesmo faço todas as fórmulas e agora as tirei do meu gráfico.

E esta é da Doki:

MODE_TICKVALUE.

16

Tamanho da mudança mínima do preço do símbolo na moeda do depósito

Os cálculos não são compartilhados.

 
borilunad:


Eu mesmo faço todas as fórmulas e agora as obtive de minha tabela.

E isto é das Docas:

MODE_TICKVALUE

16

Tamanho da alteração do preço mínimo do instrumento na moeda do depósito

Os cálculos não são compartilhados.


Embora por 1 eurodólar o lote 1 pip custe realmente 10 dólares, então não há problema.

E os cálculos não devem ser compartilhados somente com aqueles que têm vergonha de mostrá-los.

Neste caso a fórmula deve ser correta - MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - para Euro, a fórmula para cruzes e Yen é um pouco diferente

 
Top2n:


Para ser honesto, ainda não descobri como aplicá-lo. Falta um milímetro, é uma pena parar quando está quase pronto.

Tarefa, não escreva preço para array se o tempo do objeto(2º parâmetro+3600sec>current)||(1º parâmetro tempo - 2º parâmetro tempo)<3600sec )

Por que emular um erro?

Um erro é sinalizar que, por alguma razão relacionada às limitações/falhas do sistema, o algoritmo não conseguiu executar e obter um resultado com algumas (naturalmente limitadas, mas - ) garantias. A função FillAndPrint() mostra de forma eloqüente o que significa uma situação de erro e o que não significa. Quando ocorre um erro, ele não tenta sequer imprimir o resultado. Se não houver erro, o resultado pode ser confiável. É assim que a lógica "erro/ nenhum erro" deve ser construída.

Mas aqui precisamos modificar o algoritmo: também precisamos aplicar um filtro adicional.

É assim que deve ser feito:

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

Primeiro "filtramos" por tipos de objetos e parâmetros, selecionando apenas os objetos necessários de todos os disponíveis, e depois aplicamos um filtro adicional. É mais ou menos como uma pessoa o faria. Isso é o que uma pessoa faria, certo?

Para cada uma dessas pequenas subtarefas, precisamos de uma função separada.

Os números não devem estar em expressões, exceto em casos muito especiais, por exemplo, se for necessário dobrar, e esta duplicação está na natureza do algoritmo. Então o número 2 pode ser usado diretamente em expressões. E em outros casos muito raros como este.

Em outros casos, a mnemônica deve ser utilizada. Primeiro, eles melhoram muito a compreensão do que está acontecendo em um determinado lugar e, portanto, ajudam a reduzir a probabilidade de se cometer um erro. Em segundo lugar, o valor em si é fixado em um lugar e é fácil mudá-lo se necessário, e será impossível cometer um erro em comparação com o caso em que o número é usado repetidamente no algoritmo, e sem usar a mnemônica tem que corrigir os números em vários lugares no algoritmo.

Resultado da corrida:

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

Não é encontrado um único objeto. Aumentar os valores de ambos os mnemônicos 10 vezes para 36000 (10 horas), e executar novamente:

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

Uma tendência já "passou" a filtragem. Agora restauramos o valor da primeira mnemônica para 3600 e a executamos:

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

Podemos ver que agora ambas as linhas de tendência têm uma filtragem "passada". A propósito, recomendo depurar todos os ramos (partes) do programa de tal forma, e não apenas um ramo.

Para ajudá-los de alguma forma a formalizá-lo, tentarei explicar desta forma. Um programa é aparentemente como um plano.

Cada item principal do plano pode ser decomposto em itens de um subplano menor. Os mais pequenos em ainda menores. Os pontos dos menores sub-planos são executados diretamente.

Cada plano, sub-plano e até mesmo os pontos dos menores sub-planos correspondem às funções do programa. Os itens nos menores sub-planos correspondem a funções "finais" que apenas chamam funções do sistema, ou mesmo não as chamam de modo algum, por exemplo, AddValue() ou DiffInSecs() são exemplos na discussão acima. Os itens do subplano acima correspondem às funções que chamam as funções que implementam os itens do subplano abaixo. Nos discutidos acima, estes são MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered(). Funções de "baixo nível" não devem chamar funções de "alto nível", e funções de "alto nível" basicamente não devem saltar vários níveis abaixo, ou seja, só devem chamar funções basicamente no nível abaixo. Esta regra é muito mais estrita para "baixo nível" do que para "alto nível".

Tente construir seus programas, organizando as ações neles como (curtas) funções ligadas por este tipo de estrutura em árvore, no sentido de quem chama quem.

Este programa tem uma árvore degenerada: um ramo que "ramifica" várias vezes. E "ramos" não em dois pequenos ramos, mas em um só. Mas o ponto que as funções de "alto nível" chamam consistentemente de "baixo nível" pode ser visto. Nesta modificação, inseri mais um nível nesta estrutura, outro "ramo não ramificado" - AddValueIfFiltered().

 
Desculpe por não ter visto o fio imediatamente.
https://www.mql5.com/ru/forum/152102 Eutenho uma pergunta
 
borilunad:

Tudo está correto! Com uma citação de 4 dígitos era sempre 1, e comuma citação de 5 dígitos é agora 10, porque há 10 vezes mais pips (e mais rasos). E o valor de um tick min. deve ser calculado a partir do preço atual!

Tenho agora 4 dígitos, no ewoldollar a 1 ponto do lote 1 custa $10 e sempre foi assim. Para os cruzamentos o custo será de 8 a 16, a fórmula é um pouco mais complicada lá.

Por exemplo, para o mercado da libra esterlina, a taxa de câmbio libra-dólar = 1,6984, ou seja, 1 ponto da libra esterlina vale 1 libra, multiplicado pelo valor do ponto libra-dólar, que é sempre 10,0 (100000 * 0,0001 = 10,0 ou 100000 * 0,00010 = 10,0 - o que quiserem).


Todos estes cálculos estão corretos somente se sua conta estiver em dólares:

Neste caso, para xUSD (EURUSD, GBPUSD etc.) tickvalue = lote*ponto = 100000*0,0001 = 10,0

para USDx (USDCHF, USDJPY etc.) tickvalue = lote*ponto/Bid = 100000*0.01/101.93 = 9.8107

para xUSD/yUSD (EURGBP) tickvalue = Bid(yUSD)*lot*point = 1,6980*100000*0,0001 = 16,98

para cruzamentos xUSD/USDy (EURJPY) tickvalue = lote*ponto/Bid(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

Tenho agora 4 dígitos, no ewoldollar a 1 ponto do lote 1 custa $10 e sempre o fez. Para os cruzamentos o custo será de 8 a 16, a fórmula é um pouco mais complicada lá.

Por exemplo, para o mercado da libra esterlina, a taxa de câmbio de evodollar = 1,3604, a taxa de câmbio libra-dólar = 1,6984, ou seja, 1 pip da libra esterlina vale 1 libra, multiplicado pelo valor em pontos da libra esterlina, que é sempre 10,0 (100000*0,0001 = 10,0 ou 100000*0,00010 = 10,0 - o que quiserem).




O meu é simples e prático! E na época em que havia uma citação de 4 dígitos, eu ainda não tinha escrito programas, portanto, não posso julgar. :)

Boa noite!