[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 465

 
extralifes:

Ajude-me a entender o código. Eu não sei como descrever a condição corretamente.

Aqui está uma parte do EA.

if(total<1)

{

while (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2) //Пока это условие выполняется открывать только селл при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)<0.7)) -какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
}

while (d_pl_1>d_mn_1 && (d_pl_0-d_mn_0)>=2) // Пока это условие выполняется открывать только Бай при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)<0.3)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)>0.3)) - какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0, /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);

}
}
}
}
Algum tipo de horta....
 
butthead:

Entendo que o fator psicológico me impede... a ganância... o medo de perder até 300 centavos... O que devo fazer?... Esqueça que a conta real...


E se eu mudar minha mentalidade? Não "apontar para ganhar", mas "não apontar para perder".
 

Ajude a entender!

A essência da idéia: enquanto o iMACD está aumentando - continuamos COMPRADO, assim que começa a diminuir - fechamos COMPRA e abrimos VENDA. A comparação é feita utilizando os três últimos valores, excluindo o atual.

O código tem um problema: ele abre várias ordens em valores iMACD +-0, como eu vejo. Normalizedouble() não ajuda.

Aqui está o código:

int start()
  {

double MA1=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,1), 
       MA2=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,2),
       MA3=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,3);
       
       
       
if (MA1>MA2>MA3 && Napr==1)
    {Closeall();
    Napr=0;
    OrderSend (Symbol(), OP_BUY, Lot, Ask, 5, 0,0);}

if (MA1<MA2<MA3 && Napr==0)
    {Closeall();
    Napr=1;
    OrderSend (Symbol(), OP_SELL, Lot, Bid, 5, 0,0);}



   return(0);
  }
 
extralifes:

Ajude-me a entender o código. Eu não sei como descrever a condição corretamente.

Aqui está uma peça do Consultor Especialista.


total=OrdersTotal();

if(total<1)

{

while (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2) //Пока это условие выполняется открывать только селл при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)<0.7)) -какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
}

while (d_pl_1>d_mn_1 && (d_pl_0-d_mn_0)>=2) // Пока это условие выполняется открывать только Бай при таком условии (iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)<0.3)&&(iRSI(NULL,0,rsi_period,PRICE_CLOSE,0)>0.3)) - какой оператор использовать и как его оформить?
{
OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0, /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);

}
}
}
}
Você pode me dizer como fazer isso corretamente?


Não funciona assim?

total=OrdersTotal();
if(total<1)

{

  if (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7 &&  iRSI(NULL,0,rsi_period,PRICE_CLOSE,0<0.7)
        OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
   

  if (d_pl_1>d_mn_1 && (d_pl_0-d_mn_0)>=2 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)<0.3 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,0) > 0.3) 
       OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0, /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);

  }
 

não até se não funcionar.

Deve ser tão longo quanto a condição (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 está correta, para abrir apenas uma ordem de venda desde que iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,0<0.7)

É o mesmo no sentido inverso.

Pode ser feito enquanto ou bool? Estou em uma crise total na programação. Entendo a cadeia lógica, mas minhas mãos são lentas para convertê-la em código.

 
extralifes:

não até se não funcionar.

Deve sertão longo quanto a condição (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 está correta, para abrir apenas uma ordem de venda desde que iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,0<0.7)

É o mesmo no sentido inverso.

Pode ser escrito enquanto ou bool? Estou em uma crise total na programação. Entendo a cadeia lógica, mas minhas mãos são lentas para convertê-la em código.

aberto até o dinheiro acabar? ou aberto uma vez por bar? ou uma vez por carrapato?
 

Olá! não quero (e às vezes quero) ser pego pela StopOut. Decidi limitar o lote com um valor, que não pegaria o StopOut nas piores condições. Passando por tentativas e erros por muito tempo. Talvez alguém tenha uma solução?

Dados de entrada:

- par de moedas - não necessariamente EURUSD

- preço (preço de compra/venda)

- StopLoss especificado em pontos (assume-se que o pior cenário é não pegar um StopOut mesmo que o nível StopLoss seja alcançado)

- valor fixo do lote

- Todos os outros valores devem ser obtidos usando as funções MT4: tamanho 1 lote, alavancagem, taxa cruzada.

Um código seria desejável.

Em teoria eu entendo o que preciso: equilíbrio menos possível perda no nível StopLoss dividido pela margem. E este valor deve ser maior que o StopOut (em termos percentuais)

 
Cmu4:

Ajude a entender!

A essência da idéia: enquanto o iMACD está aumentando - continuamos COMPRAR, assim que começa a diminuir - fechamos COMPRAR e abrimos VENDER. A comparação é feita utilizando os três últimos valores, excluindo o atual.

O código tem um problema: ele abre várias ordens em valores iMACD +-0, como eu vejo. Normalizedouble() não ajuda.

Aqui está o código:


int start()
  {

double MA1=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,1), 
       MA2=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,2),
       MA3=iMACD(NULL,0,5,34,1,PRICE_CLOSE, MODE_MAIN,3);
       
       
       
if (MA1>MA2 &&  MA2>MA3 && Napr==1)
    {Closeall();
    Napr=0;
    OrderSend (Symbol(), OP_BUY, Lot, Ask, 5, 0,0);}

if (MA1<MA2 && MA2<MA3 && Napr==0)
    {Closeall();
    Napr=1;
    OrderSend (Symbol(), OP_SELL, Lot, Bid, 5, 0,0);}



   return(0);
  }
Talvez esse tenha sido o problema
 
ilunga:
aberto até o dinheiro acabar? ou aberto uma vez por bar? ou uma vez por carrapato?

A condição é verificada a cada nova barra. Neste caso, o cronograma é de hora em hora. Esta condição é verificada no início de cada hora.
 
Vinin:

Talvez este tenha sido o problema

Não... Eu fiz como você sugeriu - a mesma coisa permanece.

Também mudei o código, dividindo separadamente os blocos de abertura e fechamento por condições. É tudo a mesma coisa. Eu não sei o que fazer agora.

Aqui está um screenshot do testador, Conselheiro Especialista para o testador em reboque:

Arquivos anexados:
Razão: