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

 

Então, você já tentou tornar as variáveis globais?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

Queríamos verificar as condições para encontrar uma entrada EA não a cada tic, mas somente quando outra ordem é aberta ou fechada por outra EA ou manualmente (para que o processador não esteja sobrecarregado). É por isso que precisamos verificar se o número de pedidos corresponde a cada carrapato.

Podemos usar uma variável estática ? O programa funcionará de tal forma?

Alternativamente, a condição mais simples e mais fácil

OnTrade() é um análogo para mt4 com mt5

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

Obrigado por sua resposta. Eu entendi tudo o que você escreveu. Mas eu não entendi o significado do que você escreveu em termos do meu problema.

Por matriz bidimensional horizontal em meu código quero dizer quando há 2 linhas sob o índice 0 ou 1 e colunas sob os índices de 0 a 30. A primeira dimensão é designada como[0][0],[0][1],[0][2], ...[0][30] A segunda dimensão é designada por[1][0],[1][1] [ 1],[1][2], ...[1][30]

Por matriz bidimensional vertical em meu código quero dizer quando há 31 linhas indexadas de 0 a 30 e 2 colunas indexadas de 0 e 1. A primeira dimensão é designada como[0][0],[1[0],[2][0], ...[30][0] A segunda dimensão é designada por[0][1],[1][1],[2][1], ...[30][1]

Se você executar meu código, a matriz será preenchida verticalmente. E a função ArraySort() irá ordenar a matriz como deve ser.

PERGUNTA Por que a função ArrayFill() não funcionará neste caso ? Afinal, eu pedi para preencher a primeira dimensão da matriz (31 itens) com os mesmos valores 0,5555.
Obrigado pela ajuda.

A MQL4 pode trabalhar com não mais do que matrizes tridimensionais. Portanto, arr[31][31] é um erro. Uma matriz não pode ser maior do que arr[][4]. E a primeira dimensão é limitada não pela MQL, mas pelo que, não sei exatamente. Talvez alguém possa explicar.

Função ArrayFill() funcionará, mas precisamos entender que o número de elementos na matriz arr[3][2] será 6, e precisamos escrever 6 nesta função, não 3 pelo tamanho da primeira dimensão.

 

Dimensão tetradimensional: arr[][][][] ou arr[,,,].

As dimensões das três últimas dimensões devem ser especificadas na declaração e fixadas, enquanto a primeira pode ser deixada por especificar e alterada posteriormente:

int arr[,100,200,500];

No exemplo de uma matriz bidimensional, os dados da matriz estão dispostos da seguinte forma:

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

A ordenação move toda a horizontal, classificando pela primeira dimensão,

e ArrayFill() preenche de um elemento a outro, por exemplo, de 3 a 8. Isto resulta em uma bagunça.

Se você quiser preencher alguns valores na horizontal pela primeira dimensão, você deve controlar o início e o fim do preenchimento, sabendo como os dados são dispostos.

Por exemplo, a régua inteira do elemento zero da primeira dimensão:

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

Se apenas um elemento zero, então é assim:

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

Se muitos elementos zero, então através de looping e atribuição simples.


Não devo ter explicado muito claramente... Use a impressora, imprima tudo no laço, desta e daquela maneira, e você pegará o jeito. Dessa forma, você aprenderá mais rápido.

printf é meu amigo!

 
Alexey Viktorov:

A MQL4 não pode manusear mais do que matrizes de 4 dimensões. Portanto, arr[31][31] é um erro. Uma matriz não pode ser maior do que arr[][4]. E a primeira dimensão é limitada não pela MQL, mas pelo que, não sei exatamente. Talvez alguém possa explicar.


E a primeira dimensão (ou seja, o número de cordas) é limitada por quantos? Não mais do que o número de filas na matriz multidimensional permitido pela MQL4 ?

 

Acho que as quatro dimensões têm um limite:INT_MAX

Sobre a estrutura.

bidimensional:

Por estrutura representa uma matriz unidimensional na qual os elementos estão dispostos da seguinte forma: primeiro a primeira linha, depois a segunda, depois a terceira.

tridimensional:

Em tridimensional, também. É uma matriz unidimensional, onde as primeiras filas são uma após a outra, depois a segunda,.....

Por que unidimensional? Porque várias células em uma linha são alocadas para a matriz na memória do computador, então elas escrevem tudo em ordem: linha00+linha01+linha02+linha10+linha11....


E também é possível acrescentar uma quarta dimensão - pilhas de folhas de matriz tridimensional.

Somente o número de filas pode ser alterado no decorrer do programa. Todas as filas, colunas, folhas e pilhas são apenas uma convenção para entender a estrutura. As dimensões não estão realmente em nosso espaço, elas são apenas medidas.

Como diz Alexei:

Alexey Viktorov:

... coluna ... é ... horizontalmente porque estou olhando para ele deitado no sofá.........

 
Alexey Viktorov:

Você notoua seguinte nota

ArrayFill

A matrizmultidimensional ao processar com ArrayFill()aparece como unidimensional, por exemplo, a matriz[2][4] é processada como matriz[8], portanto, ao trabalhar com esta matriz é aceitável especificar um índice de elemento inicial igual a 5. Então, chame ArrayFill(array, 5, 2, 3.14) para array[2][4] irá preencher array[1][1] e array[1][2] elementos com valor 3.14.


Já descobrimos tudo, exceto o ArrayFill().

1. Quando declaro uma tabela dupla LoY[31][31]; estou essencialmente criando uma tabela de 31 filas por 31 colunas. Criei uma matriz bidimensional (ao invés de quatro dimensões), mas ainda não a preenchi.

2. Em seguida, no código, preencho cada elemento individual da matriz com um valor de Licitação. Posso preenchê-lo com 2 opções
a) LoY[31][0]=Bid; - Preencho a linha 31 e a primeira coluna da matriz com valores de Bid. E a segunda dimensão (coluna sob o índice 1, é preenchida com 0 por padrão, porque eu não a preencho. Portanto, nesta variante eu tenhoa primeira dimensão com 31 elementos preenchidos e a segunda dimensão com 1.

b) LoY[0][31]=Bid - Preencho a coluna 31 e a primeira linha da matriz com valores de Bid. E a segunda dimensão (linha sob o índice 1, é preenchida com 0 por padrão, porque eu não a preencho. Assim, nesta variante, a segunda dimensão consiste em 31 elementos preenchidos, a segunda dimensão consiste em 1.

ArraySort() classifica a matriz bidimensional apenas pela primeira dimensão. Por conseguinte, classificará a opção a) A primeira dimensão tem 31 fileiras e não ordenará a opção b), na qual a primeira dimensão tem apenas 1 fileira, porque não é possível ordenar 1 fileira.
AgoraArrayFill() Ele puxa a matriz bidimensional em uma única linha antes de atribuir os valores necessários aos elementos da matriz bidimensional. Ou seja, terá que puxar minha matriz LoY[31][31] em uma única linha de elementos de tamanho 961. É um fio muito longo e a maioria dos elementos será desnecessária.

Então vamos fazer uma matriz LoY[31][2] (variante a))ou LoY[2][31] (variante b))

É claro comoArrayFill() desenhará em 1 linha na variante b) . A segunda linha simplesmente unirá a primeira e após o último elemento da primeira linha LoY[0][31] a primeira linha da matriz em ArrayFill() continuará comLoY[0][32] e terminará comLoY[0][62] E os valores dos elementos da matriz em ArrayFill() irão na seguinte ordem do índice 0 ao 31 os elementos da matriz serão preenchidos com valores de preço e do índice 32 até o final serão preenchidos com 0 .

PERGUNTA: Como oArrayFill() desenha a opção a) em 1 linha? Afinal, há 28 filas nesta variante. E se for uma linha, em que ordem conterá os valores dos elementos da matriz? E, posso usar Print() para imprimir os elementos da minha matriz bidimensional após o ArrayFill() convertê-los em uma matriz unidimensional? Esta função em si não retorna nenhum valor, portanto Imprimir() não a imprimirá se estiver inserida nela.

Obrigado pela ajuda.

 

Eu estraguei um pouco aqui... Tenho vergonha de mim mesmo.

elemento individual da matriz com um valor de Licitação. Posso preenchê-lo com 2 opções
a) LoY[31][0]=Bid; - Preencho a linha 31 e a primeira coluna da matriz com valores de Bid. E a segunda dimensão (coluna sob o índice 1, é preenchida com 0 por padrão, porque eu não a preencho. Portanto, nesta variante eu tenhoa primeira dimensão com 31 elementos preenchidos e a segunda dimensão com 1.

b) LoY[0][31]=Bid - Preencho a coluna 31 e a primeira linha da matriz com valores de Bid. E a segunda dimensão (linha sob o índice 1, é preenchida com 0 por padrão, porque eu não a preencho. Assim, nesta variante, a segunda dimensão consiste em 31 elementos preenchidos, a segunda dimensão consiste em 1.

ArraySort() classifica a matriz bidimensional apenas pela primeira dimensão. Por conseguinte, classificará a opção a) A primeira dimensão tem 31 fileiras e não ordenará a opção b), na qual a primeira dimensão tem apenas 1 fileira, porque não é possível ordenar 1 fileira.
AgoraArrayFill() Ele puxa a matriz bidimensional em uma única linha antes de atribuir os valores necessários aos elementos da matriz bidimensional. Ou seja, terá que puxar minha matriz LoY[31][31] em uma única linha de elementos de tamanho 961. É um fio muito longo e a maioria dos elementos será desnecessária.

Então vamos fazer uma matriz LoY[31][2] (variante a))ou LoY[2][31] (variante b))

É claro comoArrayFill() desenhará em 1 linha na variante b) . A segunda linha simplesmente unirá a primeira e após o último elemento da primeira linha LoY[0][31] a primeira linha da matriz em ArrayFill() continuará comLoY[0][32] e terminará comLoY[0][62] E os valores dos elementos da matriz em ArrayFill() irão na seguinte ordem do índice 0 ao 31 os elementos da matriz serão preenchidos com valores de preço e do índice 32 até o final serão preenchidos com 0 .

PERGUNTA: Como oArrayFill() desenha a opção a) em 1 linha? Afinal, há 28 filas nesta variante. E se for uma linha, em que ordem conterá valores dos elementos da matriz? E, posso usar Print() para imprimir os elementos da minha matriz bidimensional após o ArrayFill() convertê-los em uma matriz unidimensional? Esta função em si não retorna nenhum valor, portanto Imprimir() não a imprimirá se estiver inserida nela.

Obrigado por sua ajuda.

Estou tendo dificuldade para entender você. Talvez seja por isso que eu não consiga entender direito. Repita a pergunta com LoY[5][3] array, ou seja, 5 linhas e 3 colunas.

O ArrayFill não converte a matriz inicial de forma alguma. Ele só processa a matriz como se fosse uma matriz unidimensional. A função realiza as ações necessárias na matriz e recua sem afetar a dimensionalidade.

De acordo com a documentação, a funçãoArrayFill (LoY, 3, 6, 12) preencherá apenas linhas com índices 1 e 2 na matriz LoY com valor 12.

LoY[1][0] será preenchido com 12.

LoY[1][1] terá valor 12.

LoY[1][2] terá o valor 12.

LoY[2][0] terá valor 12.

LoY[2][1] terá o valor 12 .

LoY[2][2] será ajustado para 12 .

Todos os outros serão deixados intocados.

Experimente um pequeno conjunto e números que sejam fáceis de entender. Por exemplo, 12 e 8, você facilmente notará que é maior. E 1.123654 e 1.123583 é mais complicado

 
Alexey Viktorov:

O ArrayFill não converte a matriz original de forma alguma. Ele só processa a matriz como se fosse uma matriz unidimensional. A função realizou as ações necessárias sobre a matriz e a jogou fora sem perturbar a dimensionalidade.


Isto reduziu muito meu mal-entendido e aumentou minha compreensão. Agora vou reanalisar tudo o que escrevi levando em conta a circunstância recentemente descoberta....

 
Alexey Viktorov:


De acordo com a documentação, a funçãoArrayFill (LoY, 3, 6, 12) preencherá apenas as linhas com os índices 1 e 2 na matriz LoY com o valor 12.

LoY[1][0] terá um valor de 12.

LoY[1][1] terá valor 12.

LoY[1][2] terá o valor 12.

LoY[2][0] terá valor 12.

LoY[2][1] terá um valor de 12 .

LoY[2][2] será ajustado para 12 .


PERGUNTA
Como e que valores devo inserir noArrayFill() se eu precisar preencher os elementos amarelos da mesma matriz com o valor 12?

OPÇÃO N 1

OPÇÃO N 2


Obrigado por sua ajuda.