Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 122

 
skyjet:

Hola! Buscando errores en esta función.

La idea es que las órdenes pendientes que no se han abierto se eliminen dos días después de su colocación.

min=1440;

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
         {  if(TimeCurrent()-OrderOpenTime()>=min)
            {  OrderDelete(OrderTicket());
               return;
         }  }
}  }  }
 
skyjet:

Hola! Buscando errores en esta función.

La idea es que las órdenes pendientes que no se han abierto se eliminen dos días después de su colocación.

min=1440;


¿Por qué quiere seguir y eliminar los pedidos pendientes? Deberías establecer su fecha de expiración=TimeCurrent()+min*60+seg; se borrarán ellos mismos después de min*60+seg.
 
Sepulca:

¿Por qué hay que controlar y eliminar las órdenes pendientes? Es necesario establecer datetime expiration=TimeCurrent()+min*60+seg; se borrarán solos después de min*60+seg.
Tal vez, la orden pendiente se cerrará de acuerdo con algún algoritmo, por lo que se cerrará en 1 día si hay otra condición, por ejemplo, 2 días. 2 días.
 
Sepulca paladin80 ¡Gracias! la caducidad de la fecha es justo lo que necesitamos :)
 

paladin80:

OrderOpenTime() devuelve la hora de apertura de la orden.

Para una orden pendiente, esta función devuelve cero.

 
PapaYozh:

OrderOpenTime() devuelve la hora de apertura de la orden.

Para una orden pendiente, esta función devuelve cero.

Hmm, he retocado rápidamente el código sin comprobar las funciones en sí. Correcto, OrderOpenTime() muestra la hora de apertura de la posición por el corredor, pero no la hora de aceptación de la orden pendiente por el corredor. Es decir, probablemente, sería mejor especificar la hora de cierre inmediatamente en la orden, o registrar la hora de envío de la orden en el número mágico (si no se utiliza de todos modos) y comparar TimeCurrent() con OrderMagicNumber( ).
 

Buenas tardes. Ayúdame a lidiar con el indicador personalizado.

Estoy resolviendo el problema de determinar la distancia a la línea de tendencia. Necesito obtener la distancia a la línea de tendencia exactamente en el marco de tiempo donde se traza (independientemente del marco de tiempo que se abre en el terminal). El valor actual de la línea de tendencia puede obtenerse mediante la función ObjectGetValueByShift. Como los cálculos se pueden hacer sólo por el tiempo de apertura, escribí un pequeño indicador. Me ha llamado la atención que la función iCustom tenga el parámetro timeframe, pero me pregunto hasta qué punto se tiene en cuenta este parámetro a la hora de llamar al indicador.

Este es el indicador:


#property indicator_chart_window
#property indicator_buffers 1
//--------------------------------------------------------------------   
extern string TL_name = "TL_1";
//--------------------------------------------------------------------   
double valueBuf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   //---- indicators
   SetIndexBuffer(0,valueBuf);
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, White);
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   //----
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int i;
   int    counted_bars = IndicatorCounted();
   //----
   i = Bars - counted_bars - 1;           // Индекс первого непосчитанного
   
   // Цикл по непосчитанным барам
   while(i>=0) {
      valueBuf[i] = NormalizeDouble(ObjectGetValueByShift(TL_name,i), Digits);
      i--;
   }     
   //----
   return(0);
}

El indicador considera el valor actual de la tendencia.
Llamo al propio indicador:

TL_price_now = iCustom(NULL,PERIOD_D1,"TL_value",TL_name,0,0);

Aquí, por ejemplo, se pasa al indicador el tiempo PERIOD_D1 como parámetro, sobre el que se traza la tendencia, y para el que se debe calcular la distancia.

Calculo la distancia a la tendencia de forma sencilla:

dist = NormalizeDouble(TL_price_now - Bid, Digits);
Parece que sí, pero no es así: al cambiar a otros timings (diferentes a D1), el indicador devuelve otros valores (correctos para los timings a los que cambio).
Aquí tenemos una pregunta: ¿hasta qué punto se tiene en cuenta un periodo cuando se llama a la función iCustom?
¿O tal vez he confundido el indicador?
 
pako:


t = PedidosTotal();

¿por qué cuenta?????


Así que lo hice para pasar el valor por referencia. La lógica es sencilla.
 
artmedia70:

En mi versión, la función es más corta... :)



Sí, por cierto, esta forma de aplicación es más inteligente. Sólo en el arranque hubo más espacio ocupado por funciones adicionales. Resultó así:

void FindOrders(int& massive[])
{
   int oType;
   ArrayInitialize(massiveOfOrders, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massiveOfOrders[oType] = massiveOfOrders[oType] + 1;
   }
}

int start()
{
   int i, oTotal = 0, oPending = 0;
   
   FindOrders(massiveOfOrders);
   
   for (i=0; i<=7; i++)
   {
       if (i > 1 && i < 6)
       {
           oPending += massiveOfOrders[i];
       }
       if (i < 6)
       {
          oTotal += massiveOfOrders[i];
       }
   }
   pr ("FindOrders(): " + "oTotal = " + oTotal);
   pr ("FindOrders(): " + "oPending = " + oPending);

No hay nada que optimizar, ¿verdad?

Es mucho más conveniente, cuando no hay nada en el inicio. Y todo se llama puramente por funciones. Y la última vez resultó que el inicio tiene un montón de todo tipo de sobrecrecimiento en las funciones principales y sobrecrecimiento de las adicionales...

 

¡Buenos días!

Por favor, ayude y explique por qué el Asesor Experto no funciona o no comercia?