Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 218

 
a196012a:

He completado tu código con el bloque para abrir la orden con el volumen 0.1 (justo después de la función void start())

Pero por alguna razón el programa no abre ninguna orden de mayor volumen (0,3 lotes cada uno) en respuesta al cierre de estas órdenes

LAS COSAS QUE NO ENTIENDO EN SU CÓDIGO

1. Si he entendido bien, usted está asignando МН=123 sólo a las órdenes con un volumen de 0,3 lotes.

En la función datetime SearTim (int s) se busca una orden con MH=123 pero con un volumen de 0,1.

Pero la orden con volumen 0.1 no puede tener МН=123, porque este MM se asigna sólo a las órdenes con volumen 0.1

En los cuerpos de las funciones datetime SearTim(int s) e int sear(), y concretamente en los comentarios, es necesario abrir una orden con un volumen de 0,3

No entiendo por qué tengo que abrir una orden con un volumen mayor en las mismas condiciones más de una vez.

Ya ha abierto órdenes con un volumen mayor en el primer bloque.



Te agradecería mucho que escribieras algún código que abriera una orden con volumen 0,3 después de cerrar cada orden 0,1 y que mantuviera el valor de 0,1.

En este caso, haré lo posible por encontrar todas las respuestas a mis preguntas en su código con la ayuda de la función Print (), mis modestos conocimientos y los libros de referencia.

NOTA:

Tengo el mismo tipo de órdenes con volumen de 0,1 y 0,3 - sólo SEL. Por eso, si no me equivoco, no hay que calcular el tipo de orden (BAY o SEL) en la función int sear().

Me gustaría recordar una vez más que el objetivo final de mi programa es memorizar el valor de la hora (no un minuto, no un segundo, sino sólo una hora) de la apertura de la orden 0.1 después de que se cerrara a su precio de cierre por una orden 0.3 que cerró al SL


Me disculpo por no poder explicarte mucho, ya que debes conocer el lenguaje de programación. Creo que ya eres un programador y estaba confiando en alguien que sabe de programación.

Primero hay que aprender a programar. Si te explico el qué y el cómo, será aprender un lenguaje de programación.

Mira ejemplos de EAs, cómo están escritos y trata de escribir programas desde el principio. Y estás intentando escribir un programa que ya es complicado.

Mira el tutorial y los ejemplos de cómo escribir comandos y módulos de ejemplo.

Archivos adjuntos:
MQL4.zip  2226 kb
 

Abordo esta pregunta sin complicaciones, aquí está el bloque de cierre.

Cuando la ganancia de una orden se vuelve positiva, cierra esa orden y sobre esa ganancia completa cuánto es posible de una posición perdedora. Si Perekr está activado.


Tenemos que cambiarlo para que cierre ambas posiciones sólo cuando el beneficio de una posición rentable cubra TODA la pérdida de una posición perdedora, es decir, para que el beneficio de una orden sea igual o mayor que la pérdida de la otra.

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

         for(int i=1; i<=OrdersTotal(); i++)

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

                     for(int f=OrdersTotal()-1;f>=0;f--)

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

Amigos, hola. Necesito ayuda de un novato.

Quiero ser notificado por correo electrónico sobre el cruce de algún indicador por el precio. He entendido cómo hacerlo, pero en cuanto se hace el cruce, me llegan cientos de correos electrónicos, y siguen enviándolos indefinidamente hasta que se cierra la vela actual. ¿Qué hacer para enviar un solo mensaje? He aquí un ejemplo:

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Señal de compra", "Señal de compra");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Señal de venta", "Señal de venta");

}

 
ev85:

Amigos, hola. Necesito ayuda de un novato.

Quiero ser notificado por correo electrónico sobre el cruce de algún indicador por el precio. He entendido cómo hacerlo, pero en cuanto se hace el cruce de precios, me llegan cientos de correos electrónicos, y siguen enviándolos indefinidamente hasta que se cierra la vela actual. ¿Qué hacer para enviar un solo mensaje? He aquí un ejemplo:

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))){

bool res = SendMail("Señal de compra", "Señal de compra");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2))){

SendMail("Señal de venta", "Señal de venta");

}

Es simple con la parabólica, poner una bandera en la condición. O una simple variable de tipo int y el valor cambia con cada señal.

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

Buenos días a todos, podrían por favor ayudarme con el Trailing Stop. He escrito un Trailing Stop con la condición de que inicialmente tengo SL = 100 y el Trailing Stop debe activarse cuando el precio está 30 pips por encima de la apertura de la posición. Pero se modifica inmediatamente después de abrir la posición y cambia el SL estándar a 30 y luego lo mueve.

void Trailing()

{

int SLoss = 1;

double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits);

double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits);

for (int i=TotalPedidos() - 1; i>=0; i--)

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

si (Oferta - StopL > TrailingStop*Punto)

{

if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

Print("¡Error de modificación del pedido!");

}

}

}

if (OrderType() = OP_SELL && OrderStopLoss() <= StopL2)

{

si (StopL2 - Ask > TrailingStop*Point)

{

si (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Punto)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

Print("¡Error de modificación del pedido!");

}

}

}

}

}

}

}

 
Alexey Viktorov:

Con la parabólica es sencillo, poner una bandera en la condición. O una simple variable de tipo int y el valor cambia con cada señal.

Olvídate de else - de lo contrario la variable estática se mantiene verdadera después de la primera señal
 
AlGuru:

Buenos días a todos, podrían por favor ayudarme con el Trailing Stop. He escrito un Trailing Stop con la condición de que inicialmente tengo SL = 100 y el Trailing Stop debe activarse cuando el precio está 30 pips por encima de la apertura de la posición. Lo modificará justo después de abrir la posición y cambiará la SL estándar a 30 y luego la moverá.

...
¿Cómo puede ayudar? He publicado allí una plantilla, a partir de la cual puedes hacer tú mismo lo que quieras.
 
Artyom Trishkin:
Sólo se olvidó de else - de lo contrario la variable estática se mantiene verdadera después de la primera señal

¿Qué sentido tiene la elza ahí? Creo que flag == true; o flag == false; que está en el código

if(flag && ****

if(! flag && ****

Si hay una intersección hacia un lado, esperamos una intersección hacia el otro... Y así se cierra el círculo. Pero cómo conectarlo correctamente al principio, que piense por sí mismo. O pregúntale después...

 
Alexey Viktorov:

¿Por qué hay una jelza ahí? Creo que flag == true; o flag == false; que está en el código

Al cruzar a un lado, esperamos el cruce al otro lado... ...y así se cierra el ciclo. Pero cómo conectarlo correctamente en la primera salida, que piense por sí mismo. O pregúntale después...

¿Si hay dos señales en barras diferentes en una dirección?

Sólo tienes swing.

Pero las señales deben enviarse siempre que haya una señal, pero la decisión de señalizar se toma por separado.

Me parece que para cada dirección sería óptimo tener su propia bandera, y cambiarla de un lado a otro. Pero no para que las señales de una dirección dependan de las señales de la dirección opuesta.

 
Artyom Trishkin:

¿Si las dos señales están en barras diferentes en la misma dirección?

Sólo tienes un golpe.

Pero las señales deben enviarse siempre que haya una señal, pero la decisión de señalizar se toma por separado.

Me parece que para cada dirección es óptimo tener su propia bandera, y cambiarla de un lado a otro. Pero no para que las señales de una dirección dependan de las señales de la dirección opuesta.

Artem, comencé mi respuesta con las siguientes palabras

La parabólica tiene una alternancia estricta, dos señales en una dirección son imposibles incluso en barras diferentes. Y no hace falta inventar nada para ello, no traquetea ni siquiera en barras cero como el MA.

Razón de la queja: