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

 
admoon:



Ao verificar o indicador passo a passo, encontrei um salto na sub-rotina atrás do if{} e no qual não há W. Aqui está um código simplificado para esclarecer o ponto:

//--- parâmetros de entrada

input int w=10;

//---

{

int i;

//---

int co=0;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- valor de retorno de pré_cálculo para a próxima chamada

return(rates_total);

}

Resultado (arlets):

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... etc. a 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Regra: Se a expressão entre parênteses for verdadeira, então o operador1 é executado.

Em código: operator1 é executado SEMPRE.

Penso que se() deve funcionar apenas uma vez quando a condição entre parênteses é verdadeira. Mas na realidade ocorre em cada verificação, por isso todas as expressões em {} são executadas em cada passo e mastigam o tempo da máquina.

Perguntas: PORQUE é que a variável CO cresceu de 0 para 11 durante o loop? Porque é que o Alerta é accionado a cada passo?

Quantas vezes tenho de vos dizer?

Olhe: você tem w igual a 10,
Você verifica w para 10: "if(w===10){co++; Alert(co);}" Você acha que esta expressão é verdadeira?
Então porque é que tem a pergunta?

 
admoon:



Ao verificar o indicador passo a passo, encontrei um ressalto de gatilhos na sub-rotina atrás se {} e em que não há W. Aqui está um código simplificado para esclarecer a questão:

//--- parâmetros de entrada

input int w=10;

//---

{

int i;

//---

int co=0;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- valor de retorno de pré_cálculo para a próxima chamada

return(rates_total);

}

Resultado (arlet):

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... etc. a 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Regra: Se a expressão entre parênteses for verdadeira, então o operador1 é executado.

Em código: operator1 é executado SEMPRE.

Penso que se() deve funcionar apenas uma vez quando a condição entre parênteses é verdadeira. Mas na realidade ocorre em cada verificação, por isso todas as expressões em {} são executadas em cada passo e mastigam o tempo da máquina.

Perguntas: PORQUE é que a variável CO cresceu de 0 para 11 durante o loop? Porque é que o alerta é desencadeado a cada passo?

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

Andrey Barinov, 2016.05.30 10:38

Aparentemente, tem uma gralha no código, e queria escrever assim:

int i;
//---
   int co=0;
   for(i=0;i<=w;i++)
     {
      if(i==10)
        {
         co++; 
         Alert(co);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);

 
Olá Cavalheiros! Tenho um pequeno problema em escrever uma EA(( a EA abre as encomendas pendentes na maior parte das vezes bem, mas às vezes preciso de abrir as encomendas muito perto do preço actual, então como prescrever que as encomendas pendentes abririam o mais perto possível?
 
barudkinarseniy:
Olá Cavalheiros! Tenho um pequeno problema quando escrevo uma EA(( A EA abre ordens pendentes, na maioria das vezes está bem, mas às vezes preciso de abrir ordens muito perto do preço actual, então como prescrever que abriria ordens pendentes tão perto quanto possível?
Acho que percebi) Se alguém estiver interessado, eis como funciona
 double ilow = iLow(Symbol(),TimeFrames_3,1);
 double ihigh = iHigh(Symbol(),TimeFrames_3,1);
 
 double OpenPriceBuy = NormalizeDouble(MathMax(ihigh,Ask + Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 double OpenPriceSell = NormalizeDouble(MathMin(ilow,Bid - Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 
 int StepST = (int)MathMax(OpenPriceBuy - OpenPriceSell,SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
 double lots = LotsByRisk(StepST);
 
Artyom Trishkin:

Quantas vezes tenho de vos dizer?

Olhe: você tem w igual a 10,
Você verifica w igual a 10: "if(w===10){co++; Alert(co);}" Você acha que esta expressão é verdadeira?
Então porque é que tem a pergunta?

As minhas desculpas pela pergunta estúpida e obrigado pela vossa paciência e compreensão. Fui decepcionado ao mover mecanicamente a sonda if(w==10){ Alerta(I,"/",F); através do programa à procura de um erro nos passos. Acontece por vezes quando se atinge um muro da própria ignorância da razão, mas uma vez afastado do problema por algum tempo, ele resolve-o por si só. O que se percebe como "jarring" revela-se na realidade um pedido por explicar de outra parte do programa. Com agradecimentos, Vladimir.

 

Olá, pode ajudar-me com as matemáticas, por favor?

Como saber qual será o lote da quinta posição, se souber o lote da primeira e que o lote de cada nova posição aumenta na progressão aritmética.

A segunda opção é que o lote aumenta com a progressão geométrica.

 
mila.com:

Olá, pode ajudar-me com as matemáticas, por favor?

Como saber qual será o lote da quinta posição, se souber o lote da primeira e que o lote de cada nova posição aumenta na progressão aritmética.

A segunda opção é que o lote aumenta com a progressão geométrica.

Está banido do Google? Desculpe, porque é que é tão cruel? ))

A progressão aritmética é definida por uma fórmula.

aprogressão geométrica é dada pela fórmula

 

Não compreendo, em teoria para a primeira variante é suficiente multiplicar o primeiro lote por 5, se aumentar pelo lote inicial

Para a segunda opção: multiplicador do lote* da primeira posição*5 ...mas

 
mila.com:

Não percebo, em teoria para a primeira opção basta multiplicar o primeiro lote por 5

Para a segunda opção, o lote da primeira posição * coeficiente * 5 ...mas

Não faz mal, eu próprio já me esqueci da matemática desde a escola)) Cavei um livro sobre matemática, redigi novamente a definição de progressão aritmética.

-------------

Uma sequência de números, cada um dos quais, a partir do segundo, é obtido a partir do anterior, adicionando um número constante d, chamado a diferença de uma progressão aritmética.

Se o primeiro termo for a1, então o arith. prog. com comprimento n tem a forma:

a1, a1+d, a1+2*d, ...., a1 + n*d

O código no MQL é assim, eu criei um exemplo simples

#define  LEN 5 // задали длину последовательности

int start()
{
    int d = 4;    // это разность, любое значение
    int a[LEN];   // тут храним ариф. посл.
    a[0] = 3;     // любое стартовое значение, задаете сами
    Print(0, "  ", a[0]);

    for (int n = 1; n < 4; n++)
    {
       a[n] = a[0] + (n*d);
       Print(n, "  ", a[n]);
    }
}

2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 3  15
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 2  11
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 1  7
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 0  3
 
Alexey Volchanskiy:

Não faz mal, eu próprio já me esqueci da matemática desde a escola ))

Vou dar um passeio, depois vou escrever o código para o programa de geometria.
Razão: