Bucles y cierre o eliminación de pedidos - página 2

 

¿Qué ocurre si el OrderSelect no selecciona el pedido?
La condición OrderMagicNumber==MagicNo nunca sería verdadera. Así que no es necesario comprobar el resultado de OrderSelect y continuar si es falid.

Es mejor si quiere comprobar OrderSelect para disminuir la variable del bucle. Ejemplo:

for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++)  
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }
 
  1. Si el orderSelect falla, es posible que obtenga el número mágico del último pedido seleccionado o algo que quede en la memoria y que pueda coincidir. Comprueba siempre.
  2. Debes contar SIEMPRE hacia abajo. Supongamos que mientras estabas trabajando en la posición 3 la posición 0 se cerró. La siguiente orden en la que querías trabajar era la posición 4, pero estará en la posición 3 cuando hagas el bucle e incrementes positionIndex hasta la 4. Ahora has perdido una. Contando hacia abajo puedes procesar la misma orden una segunda vez pero no te perderás ninguna.
 
WHRoeder:
  1. Si el orderSelect falla, es posible que obtenga el número mágico del último pedido seleccionado o algo que quede en la memoria y que pueda coincidir. Comprueba siempre.
  2. Debes contar SIEMPRE hacia abajo. Supongamos que mientras estabas trabajando en la posición 3 se cerró la posición 0. La siguiente orden en la que querías trabajar era la posición 4 pero estará en la posición 3 cuando hagas el bucle e incrementes positionIndex a 4. Ahora has perdido una. Contando hacia abajo puedes procesar la misma orden una segunda vez pero no te perderás ninguna.

1- ¿Quién te ha dicho eso? ¿Y de qué memoria hablas?


2- No mencioné la cuenta regresiva o ascendente. el código provisto en sí mismo no es de cuenta regresiva.

 
  1. OrderMagicNumber() y las otras devuelven SIEMPRE algo. Si OrderSelect() falla, se obtiene basura al azar, restos, tal vez de la selección anterior con éxito, tal vez para el valor de la última orden cerrada, tal vez lo que sea en un registro. ¿Alguna vez has intentado desreferenciar un puntero de un objeto eliminado? La memoria, es el pequeño chip negro en la placa de circuito. Intenta esto
    int start(){    Print(Whatever()); }
    double Whatever(){
       for(i=0; i<10; i++) double tmp=Close[i];
       // no value returned
    }
    y publica algún resultado.
  2. Sé que "el código proporcionado por sí mismo no está contando". Ese es el problema. ¡Siempre cuente hacia abajo! Tu decremento NO FUNCIONARÁ y es un potencial bucle infinito.
    if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }

 

¿Hay alguna razón específica por la que haya codificado :

if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;

en lugar de (?)

if( OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) )
{
  // statements if true
}

Sé que algunas normas de codificación lo consideran inadecuado. ¿Da un mejor rendimiento o es sólo una preferencia?

 
burgie:

¿Hay alguna razón específica por la que haya codificado :

en lugar de (?)

Sé que algunas normas de codificación lo consideran inadecuado. ¿Da un mejor rendimiento o es sólo una preferencia?

No hay ninguna razón específica que recuerde... Realmente no sé qué es lo lógico, ¿por qué debería fallar OrderSelect()? y si falla, ¿qué debería hacerse?
 
burgie:

¿Hay alguna razón específica por la que haya codificado :

en lugar de (?)

Sé que algunas normas de codificación lo consideran inadecuado. ¿Da un mejor rendimiento o es sólo una preferencia?


Dentro de un bucle, esto es exactamente lo mismo, elige lo que prefieras.
 
burgie:

¿Hay alguna razón específica por la que haya codificado :

en lugar de (?)

Sé que algunas normas de codificación lo consideran inadecuado. ¿Da un mejor rendimiento o es sólo una preferencia?

 

if(orderselect(......)) ejecuta esto //---no hay vuelta atrás

if(!orderselect(.......))continue //volver atrás y comprobar

 
MirTD:

if(orderselect(......)) ejecuta esto //---no hay vuelta atrás

if(!orderselect(.......))continue //volver atrás y comprobar