Asesores Expertos: Diff_TF_MA_EA - página 3

 
Rashid Umarov:
Los códigos han sido actualizados.

Al parecer, es una especie de escuela de pensamiento cuando lo escriben así

   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      ulong ticket=PositionGetTicket(i);
      if(ticket==0) continue;
      if(PositionGetInteger(POSITION_MAGIC)!=InpMagic)   continue;
      if(PositionGetString(POSITION_SYMBOL)!=symb)       continue;
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(type==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else if(type==POSITION_TYPE_SELL)
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
     }
¿Por qué no así?
  for(int i=PositionsTotal()-1; i>=0; i--)
    if (PositionGetTicket(i) &&
        (PositionGetInteger(POSITION_MAGIC)==InpMagic) &&
        (PositionGetString(POSITION_SYMBOL)==symb))  
    {
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
    }


ZY

CorrectStopLoss(POSITION_TYPE_BUY,InpStopLoss)
 
fxsaber:

Aparentemente es una especie de escuela de pensamiento escribirlo así

¿Por qué no así?
¿Quizás porque los códigos son necesarios en la base no para deducciones lógicas y anidamientos centuplicados, sino para que lo entiendan los principiantes?
 
fxsaber:
...

ZY

CorrectStopLoss(POSITION_TYPE_BUY,InpStopLoss)

¿Cuál es la diferencia? No he mirado el código, ¿es una errata o es tu pregunta?

 
Artyom Trishkin:
¿Quizás porque los códigos son necesarios en la base no para deducciones lógicas y anidamientos centuplicados, sino para que los entiendan los principiantes?

¿Dónde está la inversión? Si una posición satisface las condiciones, trabajamos con ella. continuar - salida.

 
Artyom Trishkin:

¿Hay alguna diferencia? No miré el código - ¿es que tal error tipográfico allí, o es que su pregunta?

//+------------------------------------------------------------------+
//| Devuelve el StopLoss correcto relativo al StopLevel ||
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_POSITION_TYPE position_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt = _Point;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID));
   int lv=StopLevel();
   return(NormalizeDouble((position_type==POSITION_TYPE_BUY) ? fmin(price-lv*pt,price-stop_loss*pt)
                                                             : fmax(price+lv*pt,price+stop_loss*pt),_Digits));
  }     
 
fxsaber:

¿Dónde está el giro? Si una posición cumple las condiciones, trabajamos con ella. Es una distracción.

Ah... Así que es sólo las preferencias de alguien.

Por ejemplo, los códigos de Igor Kim tienen tal anidamiento. Ese código se puede escribir de forma más compacta (es extraño que tú, con tu apego a la brevedad, sugieras el anidamiento múltiple de bloques de código que se puede evitar fácilmente limpiando el código y haciéndolo más ilustrativo):

Propones esta lógica:

  • Comprueba la condición 1, encaja
    • Comprueba la condición 2, cumple
      • Comprobar condición 3, cumple
        • Comprueba la condición 4, cumple
          • Trabaja en
        • Fin del bloque de comprobación de la condición 4
      • Fin del bloque de comprobación de la condición 3
    • Fin del bloque de comprobación de la condición 2
  • Fin del bloque de comprobación de la condición 1

O puede hacerlo de esta manera

  • la condición 1 no encaja - no es necesario
  • la condición 2 no encaja - no es necesario
  • la condición 3 no es adecuada - no se necesita
  • la condición 4 no encaja - no se necesita
  • todas las condiciones encajan - funcionamos.

El segundo código es más claro y corto

 

fxsaber:

//+------------------------------------------------------------------+
//| Devuelve el StopLoss correcto relativo al StopLevel ||
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_POSITION_TYPE position_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt = _Point;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID));
   int lv=StopLevel();
   return(NormalizeDouble((position_type==POSITION_TYPE_BUY) ? fmin(price-lv*pt,price-stop_loss*pt)
                                                             : fmax(price+lv*pt,price+stop_loss*pt),_Digits));
  }     

¿Qué ha pasado? Bueno, supongo que decidieron arreglarlo para que no hubiera preguntas como las que tenías antes.

Pero ahora, si alguien decide modificar el Asesor Experto para trabajar con órdenes pendientes, tendrá que cambiar de un lado a otro, porque habrá un error en la enumeración de entrada.

Y ORDER_TYPE_BUY == POSITION_TYPE_BUY y ORDER_TYPE_SELL == POSITION_TYPE_SELL son 0 y 1. Por lo tanto, no hay diferencia. Pero la entrada ENUM_ORDER_TYPE facilita la modificación para otros tipos de órdenes.

 
Artyom Trishkin:

Ahhhh. Eso es sólo la preferencia de alguien.

Por ejemplo, los códigos de Igor Kim tienen ese tipo de anidamiento. Ese código puede escribirse de forma más compacta (es extraño que tú, con tu apego a la brevedad, sugieras el anidamiento múltiple de bloques de código, que puede evitarse fácilmente limpiando el código y haciéndolo más ilustrativo):

Tú propones esta lógica:

  • Comprueba la condición 1, encaja
    • Comprueba la condición 2, cumple
      • Comprueba la condición 3, encaja.
        • Comprueba la condición 4, cumple.
          • Trabajando
        • Fin del bloque de comprobación de la condición 4
      • Bloque de comprobación de fin de condición 3
    • Fin del bloque de comprobación de la condición 2
  • Fin de condición comprobar bloque 1

No mostró nada de esto. Kim se vio obligado a hacerlo por la falta de una directiva estricta en aquel momento.

Sugirió esta opción:

Puedes hacerlo así:

  • la condición 1 no encaja - no hace falta
  • la condición 2 no encaja - no la necesito
  • la condición 3 no encaja - no hace falta
  • la condición 4 no encaja - no hace falta
  • todas las condiciones encajan - funcionamos.

El segundo código es más claro y corto

 
fxsaber:

No mostró nada de eso. Kim se vio obligado a hacerlo porque no había ninguna directiva en ese momento.

Eso es lo que sugirió:

¿Y esto?

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading.

Asesores Expertos: Diff_TF_MA_EA

fxsaber, 2018.02.02 09:36 pm.

Dónde está la reversión? Si la posición cumple las condiciones, a trabajar con ella. Si la posición cumple las condiciones, trabajamos con ella.


 
fxsaber:

No mostró nada de eso. Kim se vio obligado a hacerlo porque no había ninguna directiva en ese momento.


Extraño, ¿cómo me las arreglé para trabajar con continuar sin estricta en aquel entonces? Y no fui el único: Vitya Nikolaev (Vinin) me dijo que lo hiciera en aquella época.

Por lo tanto, no entiendo su queja sobre el código y el programador que lo escribió en algunas de sus preferencias.