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

 
Artyom Trishkin #:

Dobro. Deixe-me colocá-lo em termos russos simples.

Você vai pescar.

  1. Você abre a despensa em casa, arranha a cabeça e a fecha.
  2. Você vai pescar e precisa de uma cana de pesca.
  3. Você vai para casa, no armazém, para pegar uma cana de pesca.
  4. Foi pescar, colocou sua cana de pesca e pescou um peixe, e você precisa de uma rede
  5. Voltou para o depósito para a rede
  6. Foi pescar, pegou o peixe que você pescou e flutuou no anzol com a rede, e você precisava de um recipiente para armazenar o peixe que você havia pescado
  7. Volte para casa para ..... Devo continuar?

Ou você pode levar tudo o que precisa da despensa (OnInit) imediatamente, pescar sem correr e, quando chegar em casa, colocar tudo na despensa e no refrigerador (OnDeinit).

Você deve ter sabido disso aqui no fórum. Você só precisa ouvir e ouvir o que lhe é dito às vezes.

Caso contrário, você recebe uma pergunta, recebe uma resposta, diz "besteira" e faz o que você pensa.

Você deve primeiro pensar na pergunta, fazer perguntas e depois começar a editar.

Você sabe que a coisa mais simples na programação é imprimir código? E a maior parte do desenvolvimento é pensar sobre a lógica.

Essa é uma analogia ridícula. Nesse caso, vamos tornar todas as variáveis, objetos de classe etc. globais e não criá-los sob demanda ou talvez um objeto gráfico seja algo mais (certamente não uma cana de pesca ou uma rede :)) ? Portanto, minha abordagem é bastante racional e justificada, é apenas que o mql ou metatrader faz asneira.

 
MakarFX #:
Desta forma, o sinal será perdido

Ou estou sendo obtuso, ou não há condição se houver ordens em aberto E há um sinal e a barra já é nova.

Se os sinais forem longos, mais do que uma barra múltipla, também funcionará no primeiro tick da barra.

A única pergunta é quando abrir uma ordem, quando o sinal aparece ou no primeiro tique da próxima barra.
 
Valeriy Yastremskiy #:

Ou estou sendo obtuso, ou não há condição se houver ordens em aberto E há um sinal e a barra já é nova.

Se os sinais forem longos, mais do que uma barra múltipla, também funcionará no primeiro tick da barra.

A única questão é quando a ordem deve ser aberta, no momento do sinal ou no primeiro tique da próxima barra.
Peço que abram um pedido por bar
 
законопослушный гражданин Sleep(), mas Makar disse que seria melhor não parar o processo.


O código agora é parecido com este:

Antes de abrir, verifique se há uma posição aberta nesta vela. Caso contrário, abra-a.

 
законопослушный гражданин #:

Em princípio, uma ordem aberta normalmente fecharia sobre os carrapatos de um bar já aberto. A MakarFX e a Artem observaram corretamente. Portanto, a coisa certa a se fazer seria fazer isto:

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

Em princípio, uma ordem aberta normalmente fecharia sobre os carrapatos de um bar já aberto. A MakarFX e a Artem observaram corretamente. Portanto, a coisa certa a fazer é isto:

A Artem tem razão, deveria ser assim

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

Você está certo, Artem, deveria ser assim.

O resultado será o mesmo aqui. Somente o código é mais complicado. Você está escrevendo o mesmo código em duas funções diferentes. E ele será menos legível. Embora todos escrevam como quiser ou se sintam à vontade...

 

Há muita coisa acontecendo aqui.

Uma posição aberta tem um tempo de abertura. O tempo de abertura pode ser comparado ao tempo de uma vela - para descobrir se o tempo de abertura da posição está dentro da vela (e esta é a vela atual).

E por que você sempre descobre o número de pedidos em todos os exemplos? E se não houver pedidos, então você os abre. Isto limita muito as possibilidades.

Geralmente, devemos nos concentrar apenas no número de pedidos/posições para uma direção estratégica muito estreita.

 
Mihail Matkovskij #:

O resultado aqui será o mesmo. Somente o código é mais confuso. Você está escrevendo o mesmo código em duas funções diferentes. E ele será menos legível. Embora todos escrevam como quiser ou se sintam à vontade...

Seu código

  if (time != cTime && nOrders == 0)
    time = cTime;

(Um bar foi aberto e nenhum pedido foi colocado)

verificado para um sinal - sem sinal

... esperamos pelo próximo bar.

Você repetiu o mesmo erro da última vez

P.S.

isto é

 time = cTime;
deve ser realizado após a abertura do pedido
 
MakarFX #:

Você está certo, Artem, deveria ser assim

Em seu código, se uma posição estiver aberta, outra não será aberta pelo sinal oposto. Isto é, antes de tudo, quando o sinal chega, é preciso verificar se existe uma posição oposta e fechá-la.

Mas, mais uma vez, tudo isso limita muito as possibilidades de melhorar as estratégias.

Devemos evitar a vinculação à presença/ausência de ordens (especialmente em quatro - ordens pendentes (o que é correto) e posições (o que é errado))).

Não, é correto e necessário ter em mãos o número de pedidos e posições de acordo com seus tipos. Mas é errado confiar na ausência de qualquer ordem apenas para os sinais.

Em geral, a maneira correta é ter funções para contar ordens e posições (uma função que preenche a estrutura quando o número de ordens e posições muda), funções para abrir/fechar posições, funções para definir ordens e funções de alarme. Funções de várias redes de arrasto e obtenção de dados a partir de indicadores. Além disso - capacidade de comparar os dados de uma posição (aberta ou fechada) com alguns valores.

Qualquer estratégia pode ser construída a partir deste conjunto.