[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 347

 

Hola, aquí hay una pregunta. ¿Cómo puedo escribir en el código que sólo se realice una operación en un fractal fijo?

Si el fractal es fijo, es ....

mi fractal

int start()
  {
//----
    double CenBuy = High[isFractalUp()];
     double CenSell = Low[isFractalDn()];

   return(0);
}

int isFractalUp()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
 }
 return(-1);
}
 
int isFractalDn()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
 }
 return(-1);
}
 
hoz:

Sí, no hay problema en encontrar la orden pendiente apropiada de esta manera, si el número de órdenes pendientes en cada dirección es el mismo. Y si es diferente, entonces esto no funcionará como yo lo entiendo.

A continuación, determine el hecho de la activación de una orden pendiente y elimine la opuesta más lejana.

Todo esto se hace sólo para un hecho y una orden pendiente en un momento dado. No es necesario crear un número de activados y un número de eliminados, como usted está tratando de hacer. Usted captará el hecho de la transformación de las órdenes pendientes en un solo tick. Todos los demás activadores (si los hay) se determinarán en el siguiente tick.

 
¿Puede decirme quién lo sabe? ¿Por qué el resultado de la prueba es diferente en un día laborable que en un fin de semana? Alpari
 

berezhnuy por la difusión, que es varias veces mayor los fines de semana.

 

Estimados programadores, aquí está el código para contar las órdenes de compra y venta para abrir sólo una orden de compra o venta:

int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
count++;
}

}
return(count)
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
count++;
}

}
return(count);
}

Y todo parece funcionar, pero en mi EA, hay condiciones para comprar y vender en algunos patrones de velas utilizando TP y SL. Pero cuando se cumple esta condición y se activa el TP, entonces en la formación de la vela 0 las condiciones para la apertura de órdenes siguen siendo ciertas y se abren nuevas órdenes, lo que no debería hacerse en ese momento. ¿Podría decirnos qué código utilizar para desactivar la apertura de nuevos pedidos? Se adjunta el propio EA.

Archivos adjuntos:
expert.mq4  4 kb
 
artmedia70:

A continuación, determine el hecho de una orden pendiente disparada y elimine la más opuesta.

Todo esto se hace sólo por un hecho y por una vez. No es necesario crear un número de activados y un número de eliminados, como usted está tratando de hacer. Usted captará el hecho de la transformación de las órdenes pendientes en un solo tick. Todos los demás activadores (si los hay) se determinarán en el siguiente tick.



¿Y si hay más pases por garrapata? Si, por ejemplo, el paso entre las órdenes es muy pequeño, entonces puede activarse más de una orden. Por supuesto, no podremos realizar todas las acciones necesarias a tiempo.
 
hoz:

¿Y si pasa más en una garrapata? Si, por ejemplo, el paso entre las órdenes es muy pequeño, entonces se puede activar más de una orden. Por supuesto, no podremos realizar las acciones requeridas a tiempo.
Un bucle sobre las posiciones abiertas en busca de órdenes disparadas en la barra actual y eliminar las órdenes pendientes en el mismo bucle
 
artmedia70:
El bucle sobre las posiciones abiertas en busca de órdenes activadas en la barra actual y la eliminación de posiciones en el mismo bucle.


Pues bien, este bucle se repetirá y todo se borrará de nuevo. También tengo una condición en la variante que tengo en este momento:

 while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }

Es decir, debe eliminar hasta queordersToDelete sea cero. Pero lo destruye todo. Parece elemental, pero alguna barbaridad ocurre. No hay nada de esos momentos en un tutorial sin valor. Ya lo probé de las dos formas y lo reescribí de diferentes maneras, no funcionó como debería.

 

Reescrito de forma diferente:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = -1,                                 // Тикет искомого ордера
       np = -1;                                       // Номер позиции искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                 // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);               // Если ничего удалять не нужно, выйдем из функции

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          np = i;
      }
   }
   if (OrderSelect(np,SELECT_BY_POS))
   {
      s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      OrderDelete(s_ticket,Black);
   }
   
   return (0);
}

Kim, también buscando el mismo camino. Encontró una orden con un precio de apertura mínimo, definió su posición, y seleccionó esta orden, definió su ticket y la eliminó. Pero no se borra.

 
¿Por qué no se recuerda el ticket de la orden y no su posición. y qué ocurre en una transferencia directa si no existe dicha orden? ¿se elimina la orden cero?