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

 
andrey46:
Não sei por que o Consultor Especialista no Teste de Estratégia funciona bem, faz pedidos, etc., mas na conta real, embora o robô esteja ativo, os pedidos não são feitos

Você precisa ler a revista, pode haver uma resposta

 

Você pode me dizer como conseguir isso -

double w = 18.2

entenda isto -

int w = 18
 
TrederMT5:

Você pode me dizer como conseguir isso -

entenda isto -

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

Uma conversão do tipo explícita.

Você também pode arredondar um número inteiro de um não-inteiro, mas o dobro será 18,0

 
scomoroh:

Então vou repetir a pergunta.

A expressão

if (izmb>b ||izmb<b || izms>s || izms<s)

é idêntico a este:

if (izmb!=b || izms!=s)

E se você quiser armazenar algo, faça-o em uma variável global.

Este é o que é declarado fora do corpo da função.

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


Obrigado
 

Bom dia a todos vocês!

Pergunta sobre a MQL4. Aqui está um código simples

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Горизонтально ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
Print("----LoY[1][0]-- Вертикалььно ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

Ele cria uma matriz bidimensional e a preenche com valores. Há duas funções no código que me interessam - ArrayFill(LoY,0,31,0.5555); e ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); De acordo com o Manual de Referência, ambas as funções funcionam com arrays bidimensionais.ArrayFill() trabalha estritamente em matrizes preenchidas horizontalmente, o livro de referência especifica que ele preenche a matriz com valores estritamente da esquerda para a direita (não de cima para baixo ou de baixo para cima). ArraySort() classifica uma matriz bidimensional pela primeira dimensão. A Referência não diz se ela ordena matrizes preenchidas horizontalmente ou verticalmente. A julgar pela execução do meu código, ArraySort() classifica apenas as matrizes preenchidas verticalmente . Parece que estas duas funções não podem lidar com uma e a mesma matriz em um programa.

P. É importante para mim, que a função ArraySort() funcione corretamente . Então, o ArraySort() pode ser configurado para classificar matrizes preenchidas horizontalmente, com as quais o ArrayFill() funciona? Ou a função de triagem da MQL5, que funciona na MQL4, pode me ajudar em vez disso? Ou existe uma função que converte uma matriz preenchida horizontalmente com todos os seus valores para uma matriz vertical, em uma palavra, como fazer meu programa ordenar uma matriz horizontalmente

Nota. Usar um loop ao invés de ArrayFill() não funciona para mim.

Obrigado pela ajuda.

 
ANDREY:

Bom dia a todos vocês!

Pergunta sobre a MQL4. Aqui está um código simples

Ele cria uma matriz bidimensional e a preenche com valores. Há duas funções no código que me interessam - ArrayFill(LoY,0,31,0.5555); e ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); De acordo com o Manual de Referência, ambas as funções funcionam com arrays bidimensionais.ArrayFill() trabalha estritamente em matrizes preenchidas horizontalmente, o livro de referência especifica que ele preenche a matriz com valores estritamente da esquerda para a direita (não de cima para baixo ou de baixo para cima). ArraySort() classifica uma matriz bidimensional pela primeira dimensão. A Referência não diz se ela ordena matrizes preenchidas horizontalmente ou verticalmente. A julgar pela execução do meu código, ArraySort() classifica apenas as matrizes preenchidas verticalmente . Parece que estas duas funções não podem lidar com uma e a mesma matriz em um programa.

P. É importante para mim, que a função ArraySort() funcione corretamente . Então, o ArraySort() pode ser configurado para classificar matrizes preenchidas horizontalmente, com as quais o ArrayFill() funciona? Ou a função de triagem da MQL5, que funciona na MQL4, pode me ajudar em vez disso? Ou existe uma função que converte uma matriz preenchida horizontalmente com todos os seus valores para uma matriz vertical, em poucas palavras, como fazer meu programa classificar uma matriz horizontalmente?

Nota. Usar um loop ao invés de ArrayFill() não funciona para mim.

Obrigado por sua ajuda.

Você notou o

nota

ArrayFill

Amatriz multidimensional 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. Assim, chamar ArrayFill(array, 5, 2, 3.14) para array[2][4] irá preencher os elementos de array[1][1] e array[1][2] com 3.14.


Esta seqüência

ArrayFill(LoY,0,31,0.5555);

irá preencher a matriz com exatamente uma linha.

Quanto à verticalidade/horizontalidade, é assim que você manteria sua cabeça olhando para a entrada. Olhe para a mesa de excelência e tudo se tornará claro. Se a coluna "A" for preenchida com valores, você obtém uma matriz unidimensional. Como é organizado? Certo... horizontalmente, porque estou olhando para ele deitado no sofá.........

 
Alexey Viktorov:

Você já notou o

nota

Esta linha

irá preencher a matriz com exatamente uma linha.

Quanto à verticalidade/horizontalidade, é assim que você manterá sua cabeça olhando para a entrada. Olhe para a mesa de excelência e tudo se tornará claro. Se a coluna "A" for preenchida com valores, você obtém uma matriz unidimensional. Como é organizado? Certo... horizontalmente, porque estou olhando para ele deitado no sofá.........

Obrigado pela resposta. Tem tudo o que você escreveu. Mas 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 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 no vigésimo minuto.
Obrigado por sua ajuda.

 
MakarFX:

Eu tentaria isso.

Obrigado por sua ajuda. Vou tentar.

 
Aleksei Stepanenko:

a expressão

é idêntico a este:

E se você quiser armazenar algo, faça-o em uma variável global.

Este é o que é declarado fora do corpo da função.

Queríamos verificar as condições de busca para entrar na EA não a cada tic, mas somente se outra ordem for aberta ou fechada por outra EA ou manualmente (a fim de evitar carga desnecessária no processador). É 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?

    double LB=0,LS=0;
    int b=0,s=0;
    static int izmb, izms; // статическая переменная
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
            {  
               LB  += OrderLots();
               b++; 
            }                                         
            if (tip==OP_SELL)        
            {
               LS  += OrderLots();
               s++;
            } 
         }
     }
     
   }
    if (izmb!=b || izms!=s){ 
    izmb=b;
    izms=s 
           // далее идут условия для открытия ордера.
     }
Razão: