Bibliotecas: Price_Compare

 

Price_Compare:

Una comparación delicada y vivaz de los valores double del "precio".

Autor: fxsaber

 
Automated-Trading:

Comparar precios:

Autor: fxsaber

¿Por qué te gustan tanto las instrucciones de preprocesador? Las tienes en todos los códigos que he visto. El tema es interesante sobre la normalización en sí, pero se puede implementar sin instrucciones de preprocesador, el lenguaje te permite hacerlo.

Y en su estilo de comunicación - dar un ejemplo en el que el uso de su biblioteca mostrará una velocidad superior a la normalización habitual :)

 
coderex:

¿Por qué te gustan tanto las instrucciones del preprocesador? Las tienes en todos los códigos que he visto. El tema es interesante en cuanto a la normalización en sí, pero se puede implementar sin instrucciones de preprocesador, el lenguaje te lo permite.

El código repetitivo es molesto. Me gusta la brevedad, la eficiencia y la lógica. Por ejemplo

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Probar 'CopyTicks

fxsaber, 2016.10.19 07:59

Eso es lo que hará date-to-date. CopyTicks tratando de ajustar la sintaxis a Copy-funciones sólo por la presencia de Copy en el nombre no traerá conveniencia. Es conveniente y justificado cuando puedes hacer cosas de preprocesador como esta

// Permite, como en MT4, trabajar con series temporales: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// También establece las funciones habituales de MT4: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Y para CopyTicks no puedes hacer tal cosa, porque hay dos hilos físicos diferentes (TRADE e INFO) y un hilo sintético (ALL) - banderas.

Y en su estilo de comunicación - dar un ejemplo donde el uso de su biblioteca mostrará la velocidad superior a la normalización :)

Depende mucho de la tasa de bits del terminal. En MT4 las diferencias de velocidad deberían ser especialmente notables. Renat hizo una comparación en este hilo.

Альтернативные реализации стандартных функций/подходов
Альтернативные реализации стандартных функций/подходов
  • www.mql5.com
NormalizeDouble Результат 1123275 и 1666643 в пользу MyNormalizeDouble (Optimize=1). Без оптимизации - быстрее раза в четыре (на память...
 
fxsaber:

Código repetitivo y molesto. Me gusta la brevedad, la eficacia y la lógica. Por ejemplo


Depende mucho de la velocidad de bits del terminal. En MT4 las diferencias de velocidad deberían ser especialmente notables. Renat hizo una comparación en este hilo.

gracias )))) Tengo un montón de información útil
 
coderex:
Otro ejemplo de la utilidad del preprocesador

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

Preguntas de los principiantes

fxsaber, 2016.10.19 15:23

#define ORDER_TYPE_BUY ORDER_TYPE_BUY_STOP   // ponlo al principio del Asesor Experto, si quieres rechazar operaciones de COMPRA
#define ORDER_TYPE_SELL ORDER_TYPE_SELL_STOP // ponerlo al principio del EA, si es necesario rechazar operaciones de VENTA
 
fxsaber:
Otro ejemplo de la utilidad del preprocesador
A veces es imposible rechazar completamente el preprocesador, pero su código se escribe simplemente con instrucciones del preprocesador. Tal código se vuelve difícil de leer.
 
coderex:
A veces es imposible rechazar por completo el preprocesador, pero su código se escribe simplemente con instrucciones del preprocesador. Dicho código se vuelve difícil de leer.

Pongo los nombres de variables, tipos, clases, funciones/métodos y macros de forma clara. Si ves abusos, muéstramelos.

El mayor obstáculo para mí en la lectura de kodobase es el estilo forzado. Casi todo mi código en kodobase ha sido sometido a este procedimiento. Y apenas puedo leer mi propio código después de eso.

 
fxsaber:

Los nombres de variables, tipos, clases, funciones/métodos y macros están establecidos de forma clara. Si ves abusos, por favor muéstramelos.

El mayor obstáculo para mí en la lectura de kodobase es el estilo forzado. Casi todo mi código en kodobase ha sido sometido a este procedimiento. Y apenas puedo leer mi propio código después de eso.

No hablo de mí, cualquier código que esté lleno de macros se leerá mal, además es muy difícil de depurar, así que siempre intento usar el preprocesador al mínimo y sólo cuando es absolutamente necesario. Las macros presentes en el código indican un algoritmo mal pensado, no recuerdo exactamente a quién pertenecen estas palabras, creo que a Straustrup, pero reflejan la esencia: el código debe estar limpio.
 
coderex:
No hablo de mí, cualquier código que esté lleno de macros se leerá mal, además es muy difícil de depurar, por eso siempre intento usar el preprocesador al mínimo y sólo cuando es absolutamente necesario. Las macros presentes en el código hablan de un algoritmo mal pensado, no recuerdo exactamente a quien pertenecen estas palabras, creo que a Straustrup, pero reflejan la esencia - el código debe ser limpio.
No estoy de acuerdo
string GetTickFlag( uint tickflag )
{
  string flag = "";

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
    
  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    Print(TickToString(Tick));
}

Resultado

2016.10.19 18:14:51.604 Test (GBPUSD,M1)         time = 2016.10.19 18:15:58.649 bid = 1.23008 ask = 1.23018 last = 0.0 volume = 0 TICK_FLAG_ASK

Creo que es bonito. Si no, también deberíamos renunciar a las plantillas.

 
fxsaber:
No estoy de acuerdo
string GetTickFlag( uint tickflag )
{
  string flag = "";

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
    
  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    Print(TickToString(Tick));
}

Resultado.

2016.10.19 18:14:51.604 Test (GBPUSD,M1)         time = 2016.10.19 18:15:58.649 bid = 1.23008 ask = 1.23018 last = 0.0 volume = 0 TICK_FLAG_ASK

Muy bonito. Si no, también tienes que renunciar a las plantillas.

El hecho de que te guste es comprensible )))) pero TickToString podría implementarse en un lenguaje puro en mi opinión.

La cuestión es que las macros vienen de C y se diseñaron para otros fines. Es como una microcalculadora - el propósito de su creación era el mismo, pero en su momento la gente empezó a jugar en MK-62 (incluido yo), pero luego se forzó por la falta de PC, y ahora parecerá o nostalgia con perversión o pura perversión :). Lo mismo con macros.... Por supuesto, tú escribe el código como quieras, yo sólo he dicho lo que te llama la atención.

 
coderex:
TickToString, en mi opinión, podría implementarse en un lenguaje puro

¡Claro que se podría! ¿Pero qué feo sería?

En la librería TypeToBytes sin macros no sólo daría miedo, sino que además no sería conveniente. Es decir, la librería podría ser simplemente desechada.

Creo que todo tiene que ver con el dominio del lenguaje. Cuando no sabía/entendía OOP - no lo usaba. Todo ha cambiado.