Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1426

 
vitaliy zamkovoy atual e o compararmos com uma determinada constante para a abertura subsequente de uma ordem, como isso pode ser escrito no Expert Advisor?

Veja este código:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//ВХОДНОЙ ПАРАМЕТР
input ushort Constanta=50; //Константа

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(20);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   double open_0=iOpen(_Symbol,PERIOD_CURRENT,0);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
  }
//+------------------------------------------------------------------+
Atenciosamente, Vladimir.
 
MrBrooklin #:

Dê uma olhada neste código:

Atenciosamente, Vladimir.
Infelizmente, nos próximos dois dias não poderei verificá-lo, mas, por favor, aceite meus agradecimentos!
 
vitaliy zamkovoy #:
Infelizmente, não poderei verificá-lo nos próximos dois dias, mas aceite meus agradecimentos!

Obrigado, mas observe que esse não é um código pronto, mas apenas a direção do meu pensamento. Ele pode estar errado. Você precisa verificá-lo. Você pode considerar outra opção - remover OnTimer e tentar o mesmo código em OnTick(). Em resumo, tente.

Saudações, Vladimir.

 
vitaliy zamkovoy atual e compará-lo com alguma constante com a abertura subsequente de uma ordem, como você registra isso?

Registre o preço e a hora atuais. Compare o tempo com o tempo atual em cada tick; se for mais de 20 segundos, lembre-se do segundo preço. Calcule a diferença entre o primeiro preço e o segundo preço. Compare o resultado obtido com uma constante e tome a decisão de abrir uma ordem.

 
Valeriy Yastremskiy #:

Lembrar o preço e a hora atuais. Compare a hora com a hora atual em cada tick; se houver mais de 20 segundos, lembre-se do segundo preço. Calcule a diferença entre o primeiro preço e o segundo. Compare o resultado obtido com uma constante e tome a decisão de abrir uma ordem.

Entendi corretamente: você precisa lembrar o preço atual a cada segundo para compará-lo com o preço atual quando cada valor dessa série for removido por 20 segundos?

A comparação deve ser contínua.

 
vitaliy zamkovoy #:

Entendi corretamente: você precisa lembrar o preço atual a cada segundo, de modo que, quando cada valor dessa série for excluído por 20 segundos, você possa compará-lo com o atual?

A comparação deve ser contínua.

Se for necessário verificar todos os ticks, então todos os ticks devem ser memorizados e comparados. Se for possível fazer isso com menos frequência, de acordo com o algoritmo, use um cronômetro e, após um segundo, lembre-se do preço e, após 20 segundos, lembre-se também e compare. Ou melhor, você deve lembrar todos os preços ou preços em um segundo dentro de 20 segundos e comparar com um novo tick.
Pode haver 1 tick por segundo, pode haver um em 5 segundos e pode haver 100 em um segundo. Você precisa decidir como agir quando houver um tick a cada 5 segundos e quando houver 100 ticks por segundo.

 
Valeriy Yastremskiy #:

Os ticks não são uniformes, a questão está no algoritmo, então, se você precisa verificar todos os ticks, todos eles devem ser memorizados e comparados. Se for possível ser menos frequente de acordo com o algoritmo, então um cronômetro e, após um segundo, lembrar o preço e, após 20 segundos, também lembrar e comparar. Ou melhor, você deve lembrar todos os preços ou preços em um segundo dentro de 20 segundos e comparar com um novo tick.
Pode haver 1 tick por segundo, pode haver um em 5 segundos e pode haver 100 em um segundo. Você precisa decidir como agir quando houver um tick a cada 5 segundos e quando houver 100 ticks por segundo.

Não é uma questão de escolher uma opção, é uma questão de dificuldade para que eu a escreva.... Estou aqui pela primeira vez hoje. Sou totalmente amador.

Só quero testar minha ideia...

 
vitaliy zamkovoy #:

Não é uma questão de escolher uma opção, é uma questão de dificuldade para eu escrevê-la..... Esta é minha primeira vez aqui hoje. Totalmente amador.

Só quero testar minha ideia.

O algoritmo deve ser preciso e compreender as condições de sua aplicação. Não é possível escrever código de outra forma. O código é a realização de um algoritmo de ações, ele não pode ser impreciso.

E aqui é melhor escrever você mesmo primeiro, e talvez você corrija os erros.

Você entende os sinais de igual, mais é menos.

 

Buffer de anel:

Pegue um buffer - uma matriz estática grande o suficiente de estruturas "price, time" (ou duas matrizes separadas).

Pegamos duas variáveis - "ponteiros" (índices) para a cabeça e a cauda do buffer.

Em cada tick, adicionamos um elemento à cabeça e avançamos o ponteiro.

Comparamos o tempo com o elemento na cauda e, se necessário, movemos o ponteiro.

Compare o preço com o elemento na cauda.

Se algum ponteiro tiver chegado ao final da matriz, redefinimos esse ponteiro para zero.

 
JRandomTrader matriz estática grande o suficiente de estruturas "price, time" (ou duas matrizes separadas).

Pegamos duas variáveis - "ponteiros" (índices) para a cabeça e a cauda do buffer.

Em cada tick, adicionamos um elemento à cabeça e movemos o ponteiro.

Compare o tempo com o elemento na cauda e, se necessário, mova o ponteiro.

Compare o preço com o elemento na cauda.

Se algum ponteiro tiver chegado ao final da matriz, redefina esse ponteiro para zero.

👍
Razão: