[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 465

 
extralifes:

Ayúdame a entender el código. No sé cómo describir correctamente la condición.

Aquí está una parte del 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);

}
}
}
}
Algún tipo de huerto....
 
butthead:

Entiendo que el factor psicológico me impide... la codicia... el miedo a perder incluso 300 p... ¿Qué debo hacer? Olvida que la cuenta real...


¿Y si cambio de mentalidad? No "apuntar a ganar", sino "apuntar a no perder".
 

Ayuda a la comprensión

La esencia de la idea: mientras el iMACD está aumentando - mantenemos la COMPRA, tan pronto como comienza a disminuir - cerramos la COMPRA y abrimos la VENTA. La comparación se realiza utilizando los tres últimos valores, excluyendo el actual.

El código tiene un problema: abre múltiples órdenes con valores iMACD +-0, según veo. Normalizedouble() no ayuda.

Aquí está el 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:

Ayúdame a entender el código. No sé cómo describir correctamente la condición.

Aquí hay un trozo del Asesor Experto.


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);

}
}
}
}
¿Puede decirme cómo hacerlo correctamente?


¿No funciona así?

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);

  }
 

no a través de si no funciona.

Debería ser siempre que la condición (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 sea correcta, para abrir sólo una orden de venta siempre que iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,0<0.7)

Lo mismo ocurre a la inversa.

¿Se puede hacer a través de while o bool? Estoy en un completo aprieto en la programación. Entiendo la cadena lógica, pero mis manos son lentas para convertirla en código.

 
extralifes:

no a través de si no funciona.

Debería sersiempre que la condición (d_mn_1>d_pl_1 && (d_mn_0-d_pl_0)>=2 sea correcta, para abrir sólo una orden de venta si iRSI(NULL,0,rsi_period,PRICE_CLOSE,2)>0.7 && iRSI(NULL,0,rsi_period,PRICE_CLOSE,0<0.7)

Lo mismo ocurre a la inversa.

¿Se puede hacer a través de while o bool? Estoy en un completo aprieto en la programación. Entiendo la cadena lógica, pero mis manos son lentas para convertirla en código.

¿se abre hasta que se acaba el dinero? o ¿se abre una vez por barra? o una vez por tick?
 

¡Hola! No quiero (y a veces lo hago) que me pillen con el StopOut. Decidí limitar el lote con un valor, que no cogiera el StopOut en las peores condiciones. Pasando por ensayo y error durante mucho tiempo. ¿Tal vez alguien tenga una solución?

Datos de entrada:

- par de divisas - no necesariamente EURUSD

- precio (precio de compra/venta)

- StopLoss especificado en puntos (se supone que en el peor de los casos no se produce un StopOut aunque se alcance el nivel de StopLoss)

- fijar el valor del lote

- Todos los demás valores deben obtenerse utilizando las funciones de MT4: Tamaño de 1 lote, apalancamiento, tasa de cruce.

Sería deseable un código.

En teoría entiendo lo que necesito: el saldo menos la posible pérdida en el nivel de StopLoss dividido por el margen. Y este valor debe ser mayor que StopOut (en términos porcentuales)

 
Cmu4:

Ayuda a la comprensión

La esencia de la idea: mientras el iMACD está aumentando - mantenemos la COMPRA, tan pronto como comienza a disminuir - cerramos la COMPRA y abrimos la VENTA. La comparación se realiza utilizando los tres últimos valores, excluyendo el actual.

El código tiene un problema: abre múltiples órdenes con valores iMACD +-0, según veo. Normalizedouble() no ayuda.

Aquí está el 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);
  }
Tal vez ese era el problema
 
ilunga:
¿Abrir hasta que se acabe el dinero? ¿O abrir una vez por barra? ¿O una vez por tick?

La condición se comprueba cada nueva barra. En este caso, el marco temporal es horario. Esta condición se comprueba al principio de cada hora.
 
Vinin:

Tal vez este era el problema

No... Hice lo que me sugeriste - lo mismo queda.

Además, he cambiado el código, dividiendo por separado en bloques de apertura y cierre por condiciones. Es todo lo mismo. No sé qué hacer ahora.

Aquí hay una captura de pantalla del probador, Asesor Experto para el probador en el remolque:

Archivos adjuntos: