Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 1063

 
mould:
mas como você habilita este modo?

Marque a caixa na janela do testador, no canto inferior esquerdo:

 

Olá Guru.

Você pode me dizer se eu estou no caminho certo?

Objetivo: introduzir um tamanho de lote variável, dependendo da distância do MA.

Nos parâmetros de entrada:

lote duplo externo1 = 0,01; // primeira variante do lote
lote duplo externo2 = 0.03; // segunda variante do lote
externo int Distan = 20; // distância do SlowMA

Ma foi definida no corpo de Consultores Especialistas:

duplo SlowMA = iMA(NULL,60,períodoSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Além disso, precisamos de uma condição: se o preço atual (Bid ou Ask, dependendo da direção) for até o tamanho Distante, usamos o primeiro tamanho de lote, se for mais, usamos o segundo.

A primeira coisa que me veio à mente:

if (Ask-SlowMA<Distan) Lote == Lote1;
if (SlowMA-Bid<Distan) Lote == Lote1;
if (Ask-SlowMA>Distan) Lote == Lote2;
if (SlowMA-Bid>Distan) Lote == Lote2;

Mas não funciona. O erro está tanto nas conexões de lote quanto na lógica geral.

Obrigado de antemão.

 
delf699:

Olá Guru.

Você pode me dizer se eu estou no caminho certo?

Objetivo: introduzir um tamanho de lote variável, dependendo da distância do MA.

Nos parâmetros de entrada:

lote duplo externo1 = 0,01; // tamanho do primeiro lote
Lote duplo externo2 = 0,03; // variante de segundo lote.
distância interna externa = 20; // distância do SlowMA

No corpo do Expert Advisor definiu Ma:

duplo SlowMA = iMA(NULL,60,períodoSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Então precisamos de uma condição: se o preço atual (Bid ou Ask dependendo da direção) for até o tamanho Distante, usamos o primeiro tamanho de lote, se for maior, usamos o segundo.

A primeira coisa que me veio à mente:

se (Ask-SlowMA<Distan) Lote == Lote1;
if (SlowMA-Bid<Distan) Lote == Lote1;;
se (Ask-SlowMA>Distan) Lote == Lote2;
if (SlowMA-Bid>Distan) Lote == Lote2;

Mas não funciona. É ou um erro em conjunto com o Lot, ou em lógica geral.

Agradecemos antecipadamente.

O que importa Ask, Bid e SlowMA quando Ask-SlowMA pode ser maior do que Distan??
 

Bid and Ask são as últimas licitações e preços de compra conhecidos, ou seja, o preço atual.

SlowMA é meu nome alterado para Ma

(duplo SlowMA = iMA(NULL,60,períodoSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

O desvio do preço atual (Bid ou Ask) do Ma (SlowMA) pode ser maior ou menor do que Distans. De acordo com isto, você deve definir o primeiro ou o segundo lote.

Encontrei variantes de mudar o lote com base no depósito ou no número de pedidos em aberto, mas não consigo obter nenhuma resposta de um termo tão linear.

Algo me diz que precisamos de uma função que devolva um valor absoluto. Isto é, se o aplicarmos a um número negativo, o resultado será positivo.

 
delf699:

Bid and Ask são as últimas licitações e preços de compra conhecidos, ou seja, o preço atual.

SlowMA é meu nome alterado para Ma

(duplo SlowMA = iMA(NULL,60,períodoSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

O desvio do preço atual (Bid ou Ask) do Ma (SlowMA) pode ser maior ou menor do que Distans. De acordo com isto, você deve definir o primeiro ou o segundo lote.

Encontrei variantes de mudar o lote com base no depósito ou no número de pedidos em aberto, mas não consigo obter nenhuma resposta de um termo tão linear.

Algo me diz que precisamos de uma função que devolva um valor absoluto. Isto é, se o aplicarmos a um número negativo, o resultado será positivo.


O valor absoluto da diferença de Licitação e Mestrado pode ser necessário um pouco mais tarde; agora, como você não tem a dica, vamos calcular juntos

Licitação = 1.12730;

MA = 1.12530;

Distancias = 20;

Pergunta:

Quando e se de 1.1273 a 1.1253 serão mais de 20???

Por alguma razão, minha calculadora mostra apenas 0,002. Mas isso é um longo caminho a partir de 20...

 

Obrigado, estou vendo. Ou você poderia fazer assim:

dist=Distan*Point;

if (Ask-SlowMA<dist) Lote == Lote1;
if (SlowMA-Bid<dist) Lote == Lote1;
if (Ask-SlowMA>dist) Lote == Lote2;
if (SlowMA-Bid>dist) Lote == Lote2;

Então, como faço isso corretamente?

 
delf699:

Obrigado, estou vendo. Ou você poderia fazer assim:

dist=Distan*Point;

if (Ask-SlowMA<dist) Lote == Lote1;
if (SlowMA-Bid<dist) Lote == Lote1;
if (Ask-SlowMA>dist) Lote == Lote2;
if (SlowMA-Bid>dist) Lote == Lote2;

Então, como faço isso corretamente?

E agora podemos usar MathAbs() para não repensar nossa cabeça, mantendo o controle do que está sendo subtraído do que está sendo subtraído. E há outro operador condicional interessante

Lot = MathAbs(Ask-SlowMA) < dist ? Lot1 : Lot2;


O que significa: à variável Lote será atribuído o valor do Lote1 se Ask- SlowMA for menor que distante, caso contrário, o valor do Lote2 será atribuído.

Mais uma recomendação: Esqueça a variável Ponto. Use _Ponto ou a função Ponto()

 
Obrigado, uma bela solução.
 
Já quebrei os olhos, não consigo encontrar onde faltam parênteses, recebo erros como '(' - teste de parênteses esquerdo desequilibrado.mq4 31 8 (começando pela linha onde se chama TrendDetection())

Preciso de ajuda, ainda estou apenas aprendendo...


#define BULL 1;
#define BEAR 2;

//--------------------------------------------------------------------
externo int SL = 200;
externo int TP = 200;
Lotes duplos externos = 0,01;
SarStep duplo externo = 0,02;
duplo SarMaximum externo = 0,2;
escorregamento interno externo = 5;
magia int externa = 1;
externo int MaxOrder = 1;
string OrderComments = "Bargain 1.0;
int Cnt=0;
data/hora Barra anterior;

int start()
{
Cnt=OrdensTotal();
{
se (Cnt<MaxOrder)
{
if(NewBar() == verdadeiro)
{
if(TrendDetection() == BULL){
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slippage,NormalizeDouble(Ask,Digits)-(SL*Point),NormalizeDouble(Ask,Digits)+(TP*Point),OrderComments,Magic,0,CLR_NONE);}
if(TrendDetection() == BEAR){
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slippage,NormalizeDouble(Bid,Digits)+(SL*Point),NormalizeDouble(Bid,Digits)-(TP*Point),OrderComments,Magic,0,CLR_NONE);}
}
}
senão
{retorno(0);}
}
retorno(0);
}

int TrendDetection()
{
duplo Sar = iSAR(NULL,0,SarStep,SarMaximum,1);
if(Close[1] > Sar) {retorno(BULL);}
if(Close[1] < Sar) {retorno(BEAR);}
retorno(0);}
bool NewBar()
{
if(PreviousBar<Time[0])
{
Barra Anterior = Tempo[0];
retorno(true);
}
senão
{
retorno(falso);
}
retorno(falso);
}
 
AlexeyVik:

E agora você pode aplicar MathAbs() para que você não tenha que manter o controle do que subtrair do quê. E outro operador condicional interessante


O que significa: A variável Lote será atribuída o valor do Lote1 no caso de Ask- SlowMA ser inferior à distância, caso contrário, o valor do Lote2 será atribuído.

Mais uma recomendação: Esqueça a variável Ponto. Use _Ponto ou a função Ponto()

E a Point, tudo parece funcionar?
Razão: