¿Quién quiere una estrategia? Lotes y de forma gratuita) - página 61

 
Stellarator >> :

Mis amigos me llamaron para engañar al coche...

>> Bueno...

Y dicen que la crisis ;)

 

Parece que tenemos que empezar a comparar uno por uno hasta solucionar todos los problemas.

Aquí he comparado el oscilador del acelerador FSB con el iAC MT(...):



Cómo hacerlo:

1. Actualizar los tipos de cambio de la FSB con los actuales utilizados en la MT. (Desde la MT Ctrl+S y guardar el archivo xxxxxx.csv en el directorio FSB ./Data. Si sus datos están en una carpeta diferente - use Mercado -> Directorio de Datos desde FSB para apuntarlo).

2. Haga el script Indicator_Values.mq4 imprimiendo el indicador deseado. (El guión está en la página del foro anterior).

3. Configure este indicador en FSB. (Asegúrese de utilizar los mismos parámetros.) Exporte el indicador FSB mediante la función Exportar -> Indicadores.

4. Si ves alguna diferencia, por favor, infórmalo.


¡Que tengas buena suerte!


------------

Editar:

Por favor, utilice el último FSB v2.8.3.5 Beta

 
Miroslav_Popov >> :

La fórmula clásica es: Momentum(n) = Close - Close(n)

Esta es la fórmula que utiliza el FSB.

MT utiliza: Momentum(n) = 100 * Close / Close(n)

Lo sé. Me refería a los parámetros del indicador. Periodo de suavización. Método de alisado. Nosotros no lo fijamos. ¿Qué parámetros se toman por defecto: 0,0?

 

Hola zfs,


Puede ver los parámetros por defecto en la ventana de diálogo Parámetros del Indicador. (Presionar por defecto)



Obsérvese que el periodo de "Alisamiento adicional" es 0. Esto significa que no se aplica ningún suavizado.


El segundo lugar donde puedes ver los valores por defecto es en el código fuente:


        /// <summary>
        /// Sets the default parameters for the designated slot type
        /// </summary>
        public Momentum( SlotTypes slotType)
        {
            sIndicatorName  = "Momentum";
            parameters      = new IndicatorParam();
            component       = new IndicatorComp[] { };
            bSeparatedChart = true;
            bIsCalculated   = false;

            // The indicator name
            parameters. IndicatorName = sIndicatorName;

            // The slot type
            parameters. SlotType = slotType;

            // The ComboBox parameters
            parameters. ListParam[0]. Caption  = "Logic";
            parameters. ListParam[0]. ItemList = new string[]
            {
                "The Momentum rises",
                "The Momentum falls",
                "The Momentum is higher than the Level line",
                "The Momentum is lower than the Level line",
                "The Momentum crosses the Level line upward",
                "The Momentum crosses the Level line downward",
                "The Momentum changes its direction upward",
                "The Momentum changes its direction downward"
            };
            parameters. ListParam[0]. Index    = 0;
            parameters. ListParam[0]. Text     = parameters. ListParam[0]. ItemList[ parameters. ListParam[0]. Index];
            parameters. ListParam[0]. Enabled  = true;
            parameters. ListParam[0]. ToolTip  = "Logic of application of the indicator.";

            parameters. ListParam[1]. Caption  = "Smoothing method";
            parameters. ListParam[1]. ItemList = Enum. GetNames( typeof( MAMethod));
            parameters. ListParam[1]. Index    = 0;
            parameters. ListParam[1]. Text     = parameters. ListParam[1]. ItemList[ parameters. ListParam[1]. Index];
            parameters. ListParam[1]. Enabled  = true;
            parameters. ListParam[1]. ToolTip  = "The Moving Average method used for smoothing the Momentum value.";

            parameters. ListParam[2]. Caption  = "Base price";
            parameters. ListParam[2]. ItemList = Enum. GetNames( typeof( BasePrice));
            parameters. ListParam[2]. Index    = 3;
            parameters. ListParam[2]. Text     = parameters. ListParam[2]. ItemList[ parameters. ListParam[2]. Index];
            parameters. ListParam[2]. Enabled  = true;
            parameters. ListParam[2]. ToolTip  = "The price the Momentum is based on.";

            // The NumericUpDown parameters
            parameters. NumParam[0]. Caption = "Period";  <----- Parameter Name
            parameters. NumParam[0]. Value   = 10;        <----- Default Value
            parameters. NumParam[0]. Min     = 1;
            parameters. NumParam[0]. Max     = 200;
            parameters. NumParam[0]. Enabled = true;
            parameters. NumParam[0]. ToolTip = "The period of Momentum.";
 
            parameters. NumParam[1]. Caption = "Additional smoothing"; <----- Parameter Name 
            parameters. NumParam[1]. Value   = 0;        <----- Default Value
            parameters. NumParam[1]. Min     = 0;
            parameters. NumParam[1]. Max     = 200;
            parameters. NumParam[1]. Enabled = true;
            parameters. NumParam[1]. ToolTip = "The period of additional smoothing.";

            parameters. NumParam[2]. Caption = "Level";  <----- Parameter Name
            parameters. NumParam[2]. Value   = 0;        <----- Default Value
            parameters. NumParam[2]. Min     = -100;
            parameters. NumParam[2]. Max     = 100;
            parameters. NumParam[2].Point   = 4;
            parameters. NumParam[2]. Enabled = true;
            parameters. NumParam[2]. ToolTip = "A critical level (for the appropriate logic).";

            // The CheckBox parameters
            parameters. CheckParam[0]. Caption = "Use previous bar value";
            parameters. CheckParam[0]. Checked = Data. Strategy. PrepareUsePrevBarValueCheckBox( slotType);
            parameters. CheckParam[0]. Enabled = true;
            parameters. CheckParam[0]. ToolTip = "Use the indicator value from the previous bar.";
        }
 
Miroslav_Popov >> :

Hola zfs,

En principio, no dudé de su impecabilidad. El caso es que, a pesar de todo esto, los valores finales de los indicadores no me cuadran. ¿O no? No tengo tiempo para comprobarlo ahora, por desgracia.

 

Zfs,

Con la ayuda de Stellarator arreglé muchos problemas en el FSB. También he cambiado los parámetros por defecto del FSB para que sea así en MT. Espero que la mayoría de las diferencias ya estén arregladas.


Por favor, no dudes en informar de cualquier posible fallo. Se agradecen todos los comentarios y las críticas.

 
Stellarator >> :

¡Tengo que disuadirte! El matiz clave es el "límite de una iteración del EA". Así que, dentro de estos límites, el indicador se calcula UNA vez (en su primera llamada). Lo declaro con un 100% de confianza. Todas las llamadas posteriores no inician() en absoluto, sino que sólo toman los valores necesarios de los buffers necesarios. La condición es del 100% cuando los parámetros de entrada no cambian (excepto el buffer y el offset). La regla funciona cuando los cálculos se realizan dentro de un solo instrumento. Pero creo que el principio se mantiene incluso cuando iCustom se refiere a otros TFs y herramientas.


Estoy interesado en escribir un Asesor Experto que aplique al indicador el valor del indicador en el minuto actual en la barra 0 240 veces. Es decir, ¿resulta que la salida siempre tiene el primer valor? Confirma por favor, porque esto es nuevo para mí.

 
zfs >> :

Pregunta fuera de tema, me acabo de meter a escribir un Asesor Experto, que en la barra 0 accede 240 veces al indicador por el valor del indicador en el minuto actual. Es decir, ¿resulta que la salida es siempre el primer valor? Confirma por favor, porque esto es nuevo para mí.

>>El Asesor Experto se reinicia en cada nuevo tick y se trata de una iteración diferente, por lo que los valores del indicador serán diferentes.

 
rider >> :

El EA se reiniciará en cada nuevo tick, y esta es una iteración diferente, y por lo tanto los valores del indicador serán diferentes.

Si utiliza correctamente el parámetro "Usar el valor de la barra anterior" no necesita el valor de la barra actual del indicador.

Digamos que usted utiliza MA(simple, 12, cerrar) en un gráfico diario. Para calcular correctamente esta MA se necesitan los precios de cierre de 12 barras.

Si ahora son las 3PM, el precio de "cierre" actual no es el precio de cierre real de la barra. Se va a cambiar hasta las 12PM. Así que el uso de MA para la barra actual no incluye el precio de cierre real, sino uno temporal. Al mismo tiempo, la prueba retrospectiva utiliza el precio de cierre real (ya fijado) de las barras históricas. Esta práctica aportará diferencias entre el backtest y la operación real.


Incluso peor:

Veamos la regla lógica "Una MA rápida va por encima de una MA lenta" donde ambas MAs se basan en el precio de cierre.

Si durante el día el mercado sube rápidamente, el FastMa puede cruzar por encima del SlowMA, lo que hará subir una señal de compra. Comprará siguiendo la señal. Que después del acuerdo el mercado baje y cierre tan abajo, que moverá el FastMA por debajo del Slow. ¿Ves el problema? Ya has comprado antes del cierre del bar. Si usted hace un backtest de esta estrategia más tarde, verá que no hay tal señal de compra para dentro de esta barra. ¿Y qué? Culparás al backtester, pero el problema está en la lógica de la estrategia equivocada.


El Constructor de Estrategias Forex le protege de tales errores lógicos estableciendo automáticamente el parámetro "Usar el valor de la barra anterior". FSB nunca utiliza indicadores cambiantes (aún no fijos) para el backtesting. Y en esa lógica por qué un EA tiene que calcular un indicador para cada tick si la estrategia no lo usa. Un cálculo por barra es suficiente:

- si el indicador utiliza el precio de apertura - el cálculo tiene que ser en la apertura de la barra;

- si el indicador utiliza el Cierre, el Máximo, el Mínimo o cualquier combinación de los precios - el cálculo tiene que ser al cierre de la barra.






 

Buenas noches a todos.


Estoy sin ordenador el fin de semana :(. Y hoy no tenía nada que hacer por el trabajo, así que... de alguna manera...

Sin embargo, tuve tiempo para pensar. Y (ojalá) se decida estratégicamente (en términos de marco de indicadores).

En general, la estructura interna de los indicadores a partir de ahora será similar (lo describiré más adelante, quizás mañana). Lo que "sobresale" hacia el exterior (parámetros) - lo más cerca posible del FSB. Es decir, su número, sus valores (y sus límites) y la funcionalidad definida por ellos... bueno. casi uno a uno :). Quedan micro matices, pero lo decidiremos sobre la marcha.


Muy brevemente por ahora (me voy a la cama ahora, no estaré aquí mañana o pasado, probablemente, tengo un montón de cosas que hacer en el trabajo) (por el ejemplo de "nuestro encantador" RSI :D):

1. Parámetros:

// -------- Indicator parameters
extern int     slotType = SLOT_TYPE_OPENFILTER; // SLOT_TYPE_LC
extern int     indLogic = INDICATOR_RISES;      // INDICATOR_RISES <= indLogic <= INDICATOR_CHANGES_DIR_DOWNWARD
extern int     maMethod = MA_METHOD_SMOOTHED;   // MA_METHOD_SIMPLE <= maMethod <= MA_METHOD_SMOOTHED
extern int     basePrice= BASE_PRICE_CLOSE;     // BASE_PRICE_OPEN <= basePrice <= BASE_PRICE_WEIGHTED
extern int     iPeriod  = 14;                   // 1 <= iPeriod <= 200
extern int     dLevel   = 30;                   // 0 <= dLevel <= 100
extern bool    iPrvs    = True;                 // True / False




Creo que está más o menos claro en la foto como está. La única cosa que puede causar dificultad: slotType, sus respectivos valores (que tal vez difieren de FSB, pero en este caso no es un punto importante):

// Slot Types
#define  SLOT_TYPE_OPEN                   0  // Point of the Position
#define  SLOT_TYPE_CLOSE                  1  // Point of the Position
#define  SLOT_TYPE_OPENFILTER             2  // Logic Condition
#define  SLOT_TYPE_CLOSEFILTER            3  // Logic Condition

El resto es sencillo. Los valores numéricos se establecen tal cual. Los valores en los ComboBoxes se numeran empezando por 0 (como las matrices).

Losvalores numéricos de los métodos de suavización y las constantes de precio son DIFERENTES de los de MT (he estado pensando mucho tiempo, pero decidí salirme del estereotipo en aras de la compatibilidad con FSB :) ). Todo esto, de hecho, se hace para que en el futuro los Asesores Expertos (o lo que los usuarios escribirán ellos mismos) puedan "mover" los indicadores fácilmente y sin forzar :) (lo que vieron en FSB es lo que pusieron ("lo que veo es lo que canto")). Más o menos:

double dRSI = iCustom(NULL, 0, "-FSB- RSI", 2, 0, 3, 3, 3, 14, 30, 1, 0, 0);

para el ejemplo anterior.


2. Valores devueltos:

Las dos primeras memorias intermedias de cada indicador se reservan para los precios de apertura de la posición (larga/corta, respectivamente), o para las condiciones lógicas (1,0 - sí / cualquier otro valor - no). Además, tenemos los valores de los indicadores en sí (en caso de que sean interesantes para alguien):


El contenido de los dos primeros búferes se determina por la lógica del indicador(slotType y indLogic) (es decir, una vez más - hay precios o 1 / 0 (recomiendo comprobarlo con "1", porque otros valores pueden ser no sólo cero (en general - como el indicador no tiene valor puede ser EMPTY_VALUE)).


Todos los indicadores han sido optimizados teniendo en cuenta IndicatorCounted() (este es el principal cambio del código original, en general) (Miroslav tiene razón, en el caso general - usted debe recalcular los valores de los indicadores una vez por barra (de nuevo - en el caso general... ;)). Pero para una correcta visualización, y en general (buen tono)... En general, no debería ralentizarse mucho.


Para la representación de indicadores de color y similares ("especialmente dotados" :)) se utilizan objetos gráficos (para no ocupar búferes adicionales). Yo mismo lo he probado y funciona bien (cuando se muestra visualmente, es más lento que los búferes de los indicadores, pero no es demasiado crítico, y cuando se llama a iCustom, las funciones gráficas no se llaman en absoluto, por lo que los "excesos" no afectarán a la velocidad).


Eso es todo por ahora, tengo un par de preguntas para Miroslav, pero ya estoy agotado :), intentaré hacerlas mañana (pero lo haré, como dije antes - con prisa)...


p.s. Antes de mover los ficheros del archivo - borre los ficheros fsb*.mq4 en la carpeta Experts\Indicators\. El resto sólo tiene que ser sobrescrito sobre el antiguo. A partir de ahora, las convenciones de denominación de los archivos no cambiarán (todos los indicadores tendrán el prefijo "-FSB- " ).

Archivos adjuntos:
experts_1.rar  148 kb
Razón de la queja: