¿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 :)
¿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
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
// 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 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
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.
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_SELL ORDER_TYPE_SELL_STOP // ponerlo al principio del EA, si es necesario rechazar operaciones de VENTA
Otro ejemplo de la utilidad del preprocesador
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.
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, 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.
{
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
Creo que es bonito. Si no, también deberíamos renunciar a las plantillas.
No estoy de acuerdo
{
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.
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.
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Price_Compare:
Una comparación delicada y vivaz de los valores double del "precio".
Autor: fxsaber