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

 
Stellarator >> :

¿ha habido alguna vez discrepancias entre los valores originales y los "posteriormente desplegados"? todavía doble...)

aún no.... todos los problemas provienen de la dejadez :)

¡Obligado a disuadir! El matiz clave: "el límite de una iteración del EA". Pues bien, 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% si los parámetros de entrada no cambian (excepto el buffer y el offset). La regla es válida para los cálculos dentro de los límites de una herramienta. Pero creo que el principio se mantiene incluso cuando iCustom se refiere a otros TFs y herramientas.

Habría que "forzar" ..... de una vez. Gracias por otra función no documentada :)


 

FSB__Bar_Opening_Bar_Closing.mql4 v0 .0.2 Beta


Entrada al mercado en la apertura del bar;

Salir al cierre de la barra (10 seg. hasta el cierre o en la siguiente apertura)


** Esto es sólo una demostración para probar los puntos de entrada/salida. **


Fragmentos de código:


bool bIsFirstTick;// It is used to catch the Bar Opening.
datetime dtCurrentBarOpeningTime;

int init()
{
   bIsFirstTick = false;
   dtCurrentBarOpeningTime = Time[0];
   return(0);
}

int start()
{
   // Is this the first tick for the bar
   bIsFirstTick = ( dtCurrentBarOpeningTime != Time[0]);
   if( bIsFirstTick)
   {
      dtCurrentBarOpeningTime = Time[0];
   }

...
...



///
/// Exit at a Bar Closing price (almost).
///
/// MetaTrader does not provide an onBarClose event so we are not able to close a position
/// exactly at Bar Closing. We workaround the problem by closing the position within a time span
/// near to the bar closing time. In the cases when there is no any ticks within this period,
/// we close the position att he next bar opening price.
///
int ClosePositionsAtBarClosing(bool bCloseLong, bool bCloseShort, datetime dtClosingTimeSpan)
{
   int  iOrders = OrdersTotal();
   bool bIsOpen = false;

   for(int iOrder = 0; iOrder < iOrders; iOrder++)
   {
      OrderSelect( iOrder, SELECT_BY_POS, MODE_TRADES);
      
      if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {  // There is an open position for this symbol.

         datetime dtOpeningTime     = Time[0] - TimeSeconds(Time[0]); // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period() * 60;  // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent() ;                 // The time of current tick
         
         if( dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan ||  bIsFirstTick)
         {  // The current tick is within the closing time span or this is the first tick of the bar.

            // Code

         }
       }
    }
}
Archivos adjuntos:
 

1. En cuanto al rendimiento:

La mayoría de las veces no necesitamos recalcular un indicador para cada tick. (Referencia - "Utilizar el valor de la barra anterior".) Un indicador tiene que ser calculado en la "Apertura de la barra" o en el "Cierre de la barra".


2. fMicron:

Utilizo fMicron = Punto/2 cuando comparo los precios para tomar decisiones de trading. Pero esto no es aplicable a los indicadores. Por ejemplo. para USDJPY punto = 0,01; fMicron = 0,005.

0,000075 es el resultado de muchas pruebas a lo largo de los años. Empecé a trabajar en FSB en 2001 :) Por supuesto que no significa nada. He cambiado de opinión muchas veces al respecto.

**edición: MT da esto a las manos de los usuarios. Probablemente los gurús de los EAs puedan decir lo que utilizan en sus EAs.

**Edición2: Pondré este parámetro en el archivo de configuración para experimentar.


3. Empezaré a proporcionar el código fuente original para su descarga para cada versión de FSB. En tal caso, no tendré que actualizar el sitio web por cada pequeño cambio.


Empecé a cambiar el flotador por el doble. Publicaré esta versión pronto esta noche o mañana. Después hay que probarlo a fondo. Tenemos que pasar por cada indicador para arreglar algunos problemas / características antes de escribirlos en MQL.

 

1. Sí, en la mayoría de los casos (dado el enfoque general de FSB para la apertura/cierre de posiciones (en la apertura/cierre de barra)) - Esto no es necesario. Pero, digamos - las reglas de las buenas costumbres - son obligatorias. El cálculo del indicador "desde cero" cada vez (incluso una vez en la Barra) - en general (estoy de acuerdo) no es crítico dentro de los límites de los grandes períodos... ¿Pero qué pasa si el periodo es de minutos? ¿Y qué pasa si el indicador sigue necesitando (o queriendo) que se calcule cada barra? (Algún punto sofisticado de la posición, que no puede (o no puede, debido a que el precio de apertura es inferior al nivel de los stops) ser capturado por una orden).

La conversión no es muy complicada, de hecho - sí, hay algo de código "en la envoltura" y el principio de la marcha de la barra se invierte. En realidad, eso es todo, en general. Lo principal es mantener el algoritmo (para que se pueda leer e identificar fácilmente dentro del código fuente) y mantener la compatibilidad paramétrica con FSB. Crear un mecanismo conveniente para la extracción de señales. Y para que sea utilizable para los diseñadores puramente visuales (que no se preocupan por EA). En mi opinión.


2. Bueno, no he sugerido utilizar la variante Punto/2 para comparar valores (igualmente) indicadores :). - Sólo estaba sugiriendo una constante. La cuestión está en su valor y dimensión (0,000075 - no está mal, no he dicho eso - no entiendo por qué exactamente 75 y no "normalmente" 50:)? La experiencia "desde 2001" es bastante reveladora (¡argumento!) y estoy bastante dispuesto a aceptar este valor. Pero como última observación - para citas con una dimensión de 0,12345 esto no será suficiente (quiero decir - mucho :))). El número debe desplazarse al menos un cuadro hacia la derecha (0,0000075). En mi empresa de corretaje, por ejemplo, estas cotizaciones son ya una práctica habitual... Yo sugeriría ajustarlo para el instrumento y usar "10", no "75" :):

fMicron = Punto * 0,1f

En resumen, sí - propongo hacerlo paramétrico - fijado (creo que después de alguna experimentación amistosa todo caerá en su lugar (aunque... si el punto ha cambiado muchas veces ;)...). Y esperar la opinión de más gente...


3. He conseguido descargar las fuentes publicadas :-P. Así que habrá "algo que comparar" (en términos de código resultante). Y aunque no quiero molestarte más, ¡buena suerte con la conversión de flotante a doble!


(¿cómo es la prueba con RSI? ;), si es que logras hacerla)

 

He descubierto que lo mejor es 100 > Micron > 50. Por eso tomé 75. Fue para mi corredor: Punto = 0,0001.

Pero tienes razón en que los corredores empezaron a cotizar a 0,00001.

Hagámoslo: Micron = Math.Min(Point * 0.75, 0.000075)

Espero terminar con la conversión en 3 horas a partir de ahora. Pondré aquí el programa para probarlo.

También subiré los códigos fuente de los indicadores convertidos.

 

Todos los indicadores y parámetros son números dobles .

Micra = 0,000075


Ponga el exe en la carpeta junto con el último FSB v2.8.3.3 Beta. Ambos programas compartirán los mismos datos y estrategias. Es conveniente para comparar. Tenga cuidado con los valores de los indicadores. Se han cambiado prácticamente todos los indicadores y la mitad de los demás archivos.

Para ver la precisión total pulse F12 en el gráfico o utilice la consola de comandos (ind ####).


Por favor, informe de cualquier problema. Ahora es el momento de solicitar cambios sobre los indicadores. Tenemos que arreglarlas antes de continuar el trabajo de integración de la MT.



 

¡Buenos días!

Miroslav, el tiempo es muy limitado ahora... para que sea rápido:

1. Gracias por la pronta traducción (del flotador al doble). ¡Genial!

2. De momento todo parece funcionar (hasta donde he podido comprobar), se pueden ver las diferencias (sobre la marcha), tanto en los valores de los indicadores como en los resultados de las estrategias :)

3. PERO, ¡las diferencias no eran las que esperábamos! (Anoche realicé un experimento interno y mis "temores" se confirmaron: la conversión aumentará la precisión del cálculo, pero no cambiará catastróficamente el resultado. Algo del área de las diferencias en el cuarto-quinto dígito... pero tenemos divergencias desde el segundo dígito. (el mismo RSI, por ejemplo))


¡¡¡LA RAZÓN ES OTRA!!!


Lo que he conseguido comprobar:

1. Al principio pensé en si había algún enlace duro sobre el tema de los Dígitos (tengo instrumentos con 5 dígitos, eso sí)... Forzar la especificación de 4 dígitos en las propiedades de la herramienta - no ayudó (por cierto - ¡pero funciona!)

2. El código de los propios indicadores... hmm... ... bueno, ¡no hay nada de qué quejarse! Ahora es doble en todas partes, el código en sí (tal como lo veo) no ha cambiado... El código es bastante simple (muy a menudo operando sólo con sumas y restas) - ¡¡¡tal error puede NO haberse acumulado allí!!! (No estoy tan seguro de ello... pero... ;))

3. Mi último pensamiento (que no podré comprobar) - ¡ESTO ES LO QUE :)!:



Valores de cierre/apertura de bares (???) (y otros, potencialmente?)


¿De dónde salen estas cifras? :))) (¿qué clase de "aditivos" son?)

Lo tomo de aquí (Bar Closing.cs):

            // Saving the components
            component = new IndicatorComp[1];

            component[0] = new IndicatorComp();
            component[0]. CompName  = "Closing price of the bar";
            component[0]. DataType  = ( parameters. SlotType == SlotTypes.Open) ? IndComponentType. OpenPrice : IndComponentType. ClosePrice;
            component[0]. ChartType = IndChartType. NoChart;
            component[0]. FirstBar  = 2;
            component[0].Value     = Data.Close;

Como resultado, mi primera suposición de trabajo es que (tal vez) se trata de esto? ("mal" (o "bien", pero ¿por qué exactamente así?) regalando los valores de las comillas en la función)

Parcialmente, aparentemente, a la cuestión de los valores obtenidos (para llenar los buffers operados mientras se calcula el indicador) de la función protected static float[] Price(BasePrice price)


En general, Miroslav, "la pelota está en tu campo" :). Por ahora me he fijado en el nuevo código de SUS indicadores, que es perfectamente compatible con los indicadores de MT (soy persistente :D, ya terminaré el tema del RSI):



La misma barra, primer indicador - conversión, segundo - nativo de MT.


¿Alguna idea o sugerencia? (Estaré allí en 6 horas)

 

Частично, видимо, заодно к вопросу получаемых значений (для заполнения оперируемых буферов при расчете индикатора) из искомой функции protected static float[] Price(BasePrice price)

Todas las clases base, los métodos y las propiedades devuelven ahora valores dobles, así como todas las funciones comerciales (cambié las últimas hace 6 meses).

Parece que hay una diferencia en la fórmula del RSI. No puede ser en el segundo signo "¡pero ya tenemos una diferencia en el segundo signo! :) Voy a tratar de adoptar la fórmula de MT RSI existente en FSB.



**Edición:

Ya está arreglado:

Parámetros por defecto: RSI(close, 14, smoothed) == MT RSI

            for (int iBar = 1; iBar < Bars; iBar++)
            {
                if ( adBasePrice[ iBar] > adBasePrice[ iBar - 1]) adPos[ iBar] = adBasePrice[ iBar] - adBasePrice[ iBar - 1];
                if ( adBasePrice[ iBar] < adBasePrice[ iBar - 1]) adNeg[ iBar] = adBasePrice[ iBar - 1] - adBasePrice[ iBar];
            }

            double[] adPosMA = MovingAverage( iPeriod, 0, maMethod, adPos);
            double[] adNegMA = MovingAverage( iPeriod, 0, maMethod, adNeg);

            for (int iBar = iFirstBar; iBar < Bars; iBar++)
            {
                if ( adNegMA[ iBar] == 0)
                    adRSI[ iBar] = 100;
                else
                    adRSI[ iBar] = 100 - (100 / (1 + adPosMA[ iBar] / adNegMA[ iBar]));
            }


Programa para descargar pronto.


 

Miroslav - no hay diferencias en las fórmulas. Como dije al principio de la discusión sobre el RSI - sólo tienes otro bucle de promediación (que forzosamente hace Smoothed de cualquier resultado de las funciones de MovingAverage que funcionan correctamente) :), EXCEPTO el primer valor (que permanece de la ejecución de MovingAverage :).

¡De todos modos, a juzgar por el último código citado - todo ha caído en su lugar (y RSI ahora leerá otros modos de promedio normalmente) :)! ¡Yahoo!


(el código del indicador, que guardé antes, ya contiene este cambio ;) - sólo llame a fsbRSI con los siguientes parámetros para asegurarse de ello:

indLogic = no importante

maMethod = 2 (! importante MODE_SMMA en términos de MT)

basePrice = 0 (PRICE_CLOSE en términos de MT)

iPeriodo = 14

fNivel = no importante

iPrvs = no importante

Y obtener una coincidencia exacta de los resultados con el Índice de Fuerza Relativa nativo (que viene con MT)

Excepto que tanto fsbRSI como iRSI NO son lo mismo que el FSB :(


Así que volvamos al problema principal:


"Todas las clases base, los métodos y las propiedades devuelven ahora valores dobles, así como todas las funciones comerciales (cambié las últimas hace 6 meses)".


¡Bueno, eso es genial! No entiendo cómo esta tesis debería afectar

¿Precio deapertura de la barra y precio de cierre de la barra? En el ejemplo anterior.


Para repetir la pregunta: ¿Por qué los precios buscados son DIFERENTES de las cotizaciones? (Me refiero a 6,7,8, ... dígitos)


¡el doble no tiene absolutamente nada que ver! Los valores entre comillas están normalizados y deben conservarse (ser completamente idénticos) cuando se copian simplemente entre variables.

Si empiezan a aparecer valores similares en el cálculo de los indicadores (cuando los buffers para el cálculo se llenan en base a los valores de cotización, el protected static float[] Price(BasePrice price)), entonces estamos BEAUTIFUL (por extraño que parezca), es decir, como otra fuente (además del anterior float), datos "ligeramente" desnormalizados :)

 

He cambiado ligeramente algunos de los indicadores para que se parezcan a los estándar de MT.


Cambio de los indicadores del FSB:

RSI

Oscilador del RSI

Oscilador RSI MA

Bandas de Bollinger

Desviación estándar

Estocástico


Hay diferencias en los siguientes indicadores:

Impulso

Índice de facilitación del mercado


Otros:

MT Moving Average Oscillator == FSB MACD Histograma

MT Momentum == FSB Rate of Change

Índice de vigor relativo - no incluido en el FSB


Ahora los indicadores FSB y MT deberían ser más o menos iguales.


TODO:

Estocástico - revisión de las señales;

Índice de Facilitación del Mercado - revisión de la fórmula;

Un Momentum como el de MT que se incluirá en el FSB - llamado "Momentum MT"

Inclusión del "índice de vigor relativo" en el FSB.

Razón de la queja: