[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 514

 
Jony5Proz:

Hola,

Por favor, tenga esta pregunta sobre el EA:

Tengo una orden de apertura en un swing, por ejemplo, si MA_1 > MA_2 entonces compramos. Pero cuando salgo de la operación esta regla se activa de nuevo.

¿Cómo puedo decirle al EA que abra una posición sólo si el precio se ha alejado no más de 4 barras de la MA_2?


Gracias.

Si algo está mal o en un lugar equivocado, no me patees. Este es mi primer mensaje en este enorme foro.

https://book.mql4.com/ru/samples/expert
 

Gracias, estoy en ese nivel de conocimiento. Hay el mismo problema con el script del ejemplo. Es un inconveniente cuando enciendes el guión y entra al final de la tendencia.

¿Cómo le digo al script que se active sólo si hay menos de 4 barras después del cruce de dos barras?

 
https://www.mql5.com/ru/code/10773 última vez que me baño
 
Jony5Proz:

Gracias, estoy en ese nivel de conocimiento. Hay el mismo problema con el script del ejemplo. Es un inconveniente cuando enciendes el guión y entra al final de la tendencia.

¿Cómo le digo al script que se active sólo si hay menos de 4 barras después del cruce de dos barras?

El guión no entiende de palabras. Está en tus manos - ejecuta el script a más tardar 4 barras después de que se hayan cruzado 2 MAs.
 

Gente, ya he preguntado aquí cómo hacer que una orden se abra sólo cuando aparezca una nueva vela. Estoy utilizando un marco temporal D1.

He decidido colocar órdenes pendientes en determinados niveles (buystop_lvl y sellstop_lvl), basándome en el análisis de las velas anteriores.

Quería colocarlas al principio del día y eliminarlas cuando llegara una nueva vela. No importa si las órdenes pendientes fueron activadas o no, si fueron activadas, entonces las órdenes de mercado también deberían ser cerradas. Como máximo 2 órdenes, buystop y sellstop.

Esto es lo que escribí:

1. Primero compruebo si las órdenes de mercado o las órdenes pendientes están activas, y si lo están, las borro/cierro.

int total=OrdersTotal();
   if (total!=0 && NewBar()==true){
                 for (int i=0; i<total; i++)
                    {
                     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
                     if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,10);
                     if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,10);
                     if(OrderType()==OP_BUYSTOP)  OrderDelete(OrderTicket());
                     if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
                    }
                }

2. Luego coloco órdenes pendientes por niveles calculados:

if(NewBar() == True && OrdersTotal()==0)
    {
     OrderSend(Symbol(),OP_BUYSTOP ,Lot,buystop_lvl ,10,buystop_SL ,buystop_TP,"Expert buystop\sellstop");
     Sleep(10000);
     OrderSend(Symbol(),OP_SELLSTOP,Lot,sellstop_lvl,10,sellstop_SL,sellstop_TP,"Expert buystop\sellstop");
     
    }

3. Mi función NewBar implementada (NewBar):

//Функция нового бара
bool NewBar()
{
  static datetime lastbar = 0;
  datetime curbar = iTime(Symbol(),1440,0);
  if(lastbar != curbar)
  {
    lastbar = curbar;
    return(true);
  }
  else return(false);
}

Como resultado, cuando se abre una nueva vela, las órdenes se colocan y se borran inmediatamente. Los pedidos se realizan y se eliminan inmediatamente.

Cuando comenté el código del punto (1) no conseguí que abriera las órdenes en el probador, pero las órdenes no se abrieron, es decir, las órdenes no se convirtieron en órdenes de mercado.

¿Puede decirme cuál puede ser el problema?

 

Esta función NewBar() no puede utilizarse dos veces seguidas

Algo como esto es mejor:

bool newBar = NewBar();

// y más adelante en el texto, sustituyendo NewBar() por newBar

 
Mierda, todavía no entiendo cómo hacerlo. Necesito el código para eliminar y cerrar órdenes sólo en la siguiente vela. Pero también habrá otros para abrir en él. Esto significa que el programa volverá a entrar en el borrado. Necesito alguna bandera, pero mi cerebro ya está sudando para entender cómo hacerlo :)
 
Noterday:
Y en general, se tira de NewBar, se mira la hora de la última apertura de la orden y se compara con Time[0]. Si es más que eso, es tu caso, puedes borrar todo.
 
trend_lab:
Y en general, se tira de NewBar, se mira la hora de la última apertura de la orden y se compara con Time[0]. Si es mayor, es tu caso, puedes borrar todo.

Sí, supongo que tendré que hacerlo. Gracias por ello :)
 
Noterday:
Hombre, todavía no entiendo cómo se hace. Necesito que el código con la eliminación y el cierre de las órdenes se active sólo en la siguiente vela. Pero otros candelabros deberían abrirse en este también. Esto significa que el programa volverá a entrar en el borrado. Necesito alguna bandera, pero mi cerebro ya está sudando para entender cómo hacerlo :)

Lea atentamente la función OrderSend(). Tiene un parámetro para las órdenes pendientes:

expiration - Срок истечения отложенного ордера.

Si abre una orden pendiente al principio del día actual = iTime (Symbol(), PERIOD_D1, 0), entonces añade a este tiempo un día más - 1440 * 60. Las órdenes pendientes que no se activen se eliminarán por sí solas al comienzo del día siguiente.

P.D. El final de la barra actual también puede ser controlado a través de la función iBarShift():

    if (iBarShift (Symbol(), PERIOD_D1, OrderOpenTime()) == 0) return(0);

o cualquier otro "movimiento del cuerpo" en esta condición rastreando el OrderTicket() de la última orden.

Razón de la queja: