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

 
Roman Sharanov:

Eu também encontrei um sério inconveniente, muitas chamadas para CopyClose()

Você pode me dizer como copiar citações de uma série de pares de moedas em um loop?

Isso parece ser uma matriz dupla, é por isso que a MQL não a suporta, como %.

A MQL4 parece trabalhar com matrizes dinâmicas bidimensionais. Você deve mudar a primeira dimensão com ArayResize(), e passar a segunda paraCopyClose()

Ou uma solução universal dos desenvolvedores, porque as matrizes dinâmicas bidimensionais não funcionam em MQL5, envolvem uma matriz unidimensional em uma estrutura e criam uma matriz de tais estruturas.... Se você pegar o jeito, considere que você quase criou uma classe, e é mais ideal - uma classe com métodos que carregam os dados e os armazenam nas propriedades da classe (campos)
 
Igor Makanu:

A MQL4 parece trabalhar com matrizes dinâmicas bidimensionais, use ArayResize() para mudar a primeira dimensão eCopyClose() para mudar a segunda.

ou uma solução universal dos desenvolvedores, porque as matrizes dinâmicas bidimensionais não funcionam em MQL5, envolvem uma matriz unidimensional em uma estrutura e criam uma matriz de tais estruturas.... Se você pegar o jeito, considere que você quase criou uma classe, e é mais ideal - a classe com o método que carrega os dados em si e os armazena nas propriedades da classe (campos)

Obrigado e vou tentar

 

Outra pergunta sobre o indicador, não sei o que mais fazer aqui

Preciso imprimir a diferença entre o fechamento dos pares entrados e a média móvel dos mesmos.

Não sei mais o que fazer.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD";
input string active_2 = "USDJPY";
input ENUM_TIMEFRAMES timeframe = PERIOD_H1;
input int ma_period = 30;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, dataBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, maBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---

   CopyClose(active_1,timeframe,0,rates_total,firstBuffer);
   CopyClose(active_2,timeframe,0,rates_total,secondBuffer);

   int first, bar;
   if(prev_calculated == 0) first = begin; else first = prev_calculated - 1;

   for(bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

As ordens devem ser enumeradas em loop, não em cada tick. Para ser mais preciso, um tick chegou e todos os seus pedidos foram contados no loop: for(j=0;j<OrderTotal;j++)

OrdensTotal() mostra quantas ordens estão abertas (incluindo ordens pendentes, incluindo ordens em todos os símbolos... no total... Aqui está o número de pedidos abertos no terminal - este é o número de )))).

A numeração do pedido é como nas matrizes, de 0 a OrderTotal()-1 - este é o último pedido, e você provavelmente tem um número de bilhete inexistente [OrdersTotal()] ou alguma outra informação no diário em cada tick, o que é difícil de adivinhar.

Sim, eu quero - e quero que passe por todas as encomendas. A função era um pouco diferente no início, mas simplifiquei o máximo possível na esperança de encontrar a causa e consertá-la. O retrocesso consecutivo completo só acontece quando os carrapatos são raros ou depois de eu remover o EA do gráfico e nenhum carrapato novo entrar.

Sempre pensei que se a EA entrou no corpo de uma função, ela não deveria reagir a outros tiques até sair do loop, mas parece que não é esse o caso. Como posso contornar esta situação?

int test()
{
int total;
total = EncomendasTotal();
log("total = " + total +"; ");

para (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
retorno(0);
}

 
Андрей:
Por que precisamos de informações sobre todos os pedidos a cada tique? Não seria melhor introduzir restrições na visualização de pedidos, por exemplo, a cada novo minuto, cinco minutos, ..., hora?

O problema nem mesmo é que eu preciso de informações para cada tick, mas que, se eu entendi corretamente, o loop não tem tempo para terminar antes que um novo tick chegue e o novo tick, de alguma forma, quebre a conta. Aqui está outra captura de tela, para que você não tenha que procurar a anterior. Ele mostra que a EA contou até 52 e depois pulou para 93. Tive dificuldade em acreditar que isto se deva a novos carrapatos, mas não consigo encontrar outra razão, porque quando os carrapatos são raros, a conta termina bem, assim como o último ciclo após a EA ter sido removida do gráfico.

Eu já simplifiquei o código o máximo possível:

int test()
{
int total;
total = EncomendasTotal();
log("total = " + total +"; ");

para (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
retorno(0);
}

Arquivos anexados:
test.jpg  82 kb
 
Artyom Trishkin:

Como você sabe disso? Não tem.

Até que todos os cálculos que começaram com a chegada do tique estejam concluídos, todos os tiquetaques subseqüentes são pulados.

Como escrevi logo acima, tenho a mesma situação, só que já a simplifiquei até certo ponto e cheguei à conclusão de que não só não posso normalmente fazer nenhum cálculo, mas apenas passar os pedidos um a um e imprimir seus números no registro.

Eu também sempre acreditei que "até que todos os cálculos que começaram com a chegada de um tique tenham sido concluídos, todos os tiquetaques subseqüentes são pulados". Gostaria que fosse assim, mas ainda não consigo encontrar nenhum outro motivo, a não ser carrapatos novos.

 
Artyom Trishkin:

Ninguém vai dizer sem o código.

Aqui está um código extremamente simplificado, que tem o mesmo problema - novos tiquetaques lançam fora a saída sucessiva de números de pedidos.

int test()
{
int total;
total = OrderTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

 
Algotrader18:

Aqui está um código extremamente simplificado que tem o mesmo problema - novos tiquetaques lançam fora a saída seqüencial de números de ordem.

int test()
{
int total;
total = EncomendasTotal();
log("total = " + total +"; ");

para (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
retorno(0);
}

Será que este código realmente se compila sem erros? Eu não acredito...
 
Roman Sharanov:

Outra pergunta sobre o indicador, não sei o que mais fazer aqui

Preciso imprimir a diferença entre o fechamento dos pares entrados e a média móvel dos mesmos.

No final, ele apenas mostra a diferença sem MA, qual é o problema?

Isso é legal!

Romano!

Eu, por exemplo, sou um comerciante de sucesso com 20 anos de experiência.

Não entendo porque você precisa "da diferença entre os fechamentos dos pares entrados, euma média móvel deles ".

Além disso, você sabe como construir uma média móvel dessas diferenças? - Fantástico!

Você pode simplesmente tirar a média móvel das citações? - Também não?

Então, qual é o problema?

 
Algotrader18:

Aqui está um código extremamente simplificado que tem o mesmo problema - novos tiquetaques lançam fora a saída seqüencial de números de ordem.

int test()
{
int total;
total = EncomendasTotal();
log("total = " + total +"; ");

para (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
retorno(0);
}

este código funciona, faça-o por analogia:

int NumberOfOrders(int magic_)
  {
   int i,res=0,k=OrdersTotal(); string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++;
        }
     }
   return(res);
  }
Razão: