Proyecto abierto - probador-optimizador interno - página 2

 
Sin embargo, no sé la reacción del compilador de antemano, ¿dejará pasar las constantes comerciales en el cuerpo del indicador o no? <br / translate="no"> Lo más probable es que lo haga.

Por supuesto que sí, todos son enteros, no un tipo separado.

Un pequeño consejo.

Por supuesto, es deseable no reescribir la estrategia para el probador. Una vez escrita, la estrategia debe funcionar en el probador y sin él (en el mundo real).

Esto puede hacerse con la ayuda de las bibliotecas.
1. Todas las funciones relacionadas con el comercio, cambiar sus nombres un poco (mi... - no es muy bueno, tal vez mejor _....).
2. Crear 2 bibliotecas. El primero contiene código de prueba (sin enviar realmente órdenes), el segundo sólo duplica los parámetros en las llamadas de las funciones estándar. El cambio de trabajo/prueba se realiza simplemente sustituyendo la biblioteca.

Por supuesto, podríamos ponerlo todo en una biblioteca e introducir un parámetro global para cambiar, pero probablemente sea innecesario.

Y sería maravilloso introducir en MT una función más, que, en mi opinión, simplificaría radicalmente la escritura de un probador de este tipo: la función de establecer la última barra actual.

Es decir, supongamos que tenemos 1000 barras en el historial sobre el que estamos probando.
Definamos la barra 200 como la última y utilicemos Close[200] en lugar de Close[0]. Esta característica debería funcionar en todas las funciones incorporadas.

El probador se verá entonces como un bucle en el número de barra en el que se establece este valor (la última barra de la prueba) y la llamada de la función de inicio en la estrategia.

De hecho, no es tan sencillo :))
Necesito algunos puntos más...
 
No lo entiendo, por favor explique
2. Creamos 2 bibliotecas. La primera biblioteca contiene código para las pruebas (sin enviar realmente las órdenes), la segunda simplemente duplica los parámetros en las llamadas a las funciones estándar.
El
cambio de trabajo/prueba se realiza simplemente sustituyendo la biblioteca
.
¿La frase "código para pruebas" es un código de probador o de EA? Sé más específico.

Eso también
Es decir, tengamos 1000 barras en el historial sobre el que estamos probando.
Definimos 200 barras como la última, entonces en lugar de Close[0] usamos Close[200].
Y este fic debería funcionar (afectar) en todas las funciones inline.


Cualquier código de EA se convierte fácilmente en código para un indicador :
Tomamos el bloque start() del EA, añadimos una construcción for (testerconter=Bars;testerconter>=0;testerconter--)
{
cerrarlo con un corchete al final
}
Sustituya todos los lugares que utilizan referencias por [testerconter+referencia].

Este es un ejemplo del Asesor Experto MACD_sample.mq4 incorporado.
Código fuente:
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);


Modificado

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+1);


Como puede ver, no hay ningún problema. Si quieres, siempre puedes redefinir testerconter=0 si
el código se ejecuta en el cuerpo del Asesor Experto, no en el cuerpo del Asesor Experto .

 
¿Se trata de un código para pruebas o de un código de Asesor Experto? Sé más específico.

En la primera biblioteca la función
_OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid + Stop * Point, Bid - Take * Point);


emula la ejecución de la orden en el probador, es decir, la añade a la lista de órdenes en el probador y no envía la orden al servidor.

En la segunda biblioteca, esta función simplemente llama a la función incrustada

int _OrderSend( string symbol, int cmd, double volume, double price, int slippage, 
                double stoploss, double takeprofit, string comment=NULL, int magic=0, 
                datetime expiration=0, color arrow_color=CLR_NONE) 
{
   return (OrderSend(symbol, cmd, volume, price, slippage, stoploss, 
                        takeprofit, comment, magic, expiration, arrow_color) );
}


Cualquier código del Asesor Experto puede ser fácilmente reelaborado en el código del indicador :
Tomamos el bloque start() del EA, añadimos una construcción for(testerconter=Bars;testerconter>=0;testerconter--)
{
cerrarlo con un corchete al final
}
Sustituir todos los lugares que utilizan referencias por [testerconter+referencia]

Eso es lo que quiero decir.
Sería más fácil llamar a la función que establece el valor de la variable testerconter en MT (0 por defecto) en lugar de sustituirla y esta sustitución ([testerconter+referencia]) se haría en la propia MT.
Entonces no tendríamos que hacer estas sustituciones en la propia estrategia.

for(testerconter=Bars;testerconter>=0;testerconter--)
{
   SetTestPoint(testerconter);
      далее текст эксперта без переделки,
      или лучше вызов его функции start (или _start)
}



Por favor, sustituya pre por. pre para citar en "es decir, digamos que tenemos 1000 barras en ...".
si no, la página vuelve a desaparecer.

 
Lo reemplacé con comillas, parece que su texto se va, haga una traducción for zada de la cadena en su ejemplo
sobre
int _OrderSend( cadena símbolo,....


Mi conclusión: parece que estamos hablando de lo mismo. Podemos olvidarnos de la solicitud de la última barra actual por ahora -
Tengo que intentar hacerlo así.
Por ahora sólo redefine las funciones comerciales estándar, el prefijo _. es aún más respetable :)
 
a avm
Es posible realizar pruebas de esta manera. Y es lo suficientemente bueno. Pero, por desgracia, no conseguirá el universalismo. <br / translate="no"> Pasé un par de semanas en tales pruebas. A primera vista parece sencillo.


Sospecho que ha probado "con mucha sangre", es decir, que no ha redefinido las funciones comerciales. Y cada nueva prueba
Cada nueva prueba requiere que se escriba un nuevo indicador de prueba. Pero sólo hay que hacerlo una vez, y sin problemas.
Si me equivoco, publica las funciones, no seas tacaño.
 
Otro punto.

Parece que no podemosllamar directamente a lafunción de inicio desde el Asesor Experto.
Por lo tanto, sería mejor escribir el código del Asesor Experto en una biblioteca y tener allí las funciones _init, _deinit y _start.

En el Asesor Experto, escribiremos
#include ".....";
   ...............

int init()
{
   return(_init());
}

int deinit()
{
   return(_deinit());
}

int start()
{
   return(_start());
}


Sin embargo, no está claro cuáles son los parámetros.

 
Por cierto, puede combinar varios EAs/señales en un gráfico.
Como se hace en Omega:
#include "A1.....";
#include "A2.....";
   ...............

int init()
{
   _initA1();
   _initA2();
   return(0);
}

int deinit()
{
   _deinitA1();
   _deinitA2();
   return(0);
}

int start()
{
   _startA1();
   _startA2();
   return(0);
}


No es muy bonito, pero funcionará.
En general, un sistema de procesamiento de eventos casero funcionará :))

 
¿Tal vez sea más fácil? Usted hace un script de análisis, que se aplica a un archivo mq4 (con código de Asesor Experto).
Procesa este código - inserta todo tipo de inclusión, matrices de trabajo para Balance , Equidad, etc,
cambia el nombre de las variables Lotes por el de _Lotes (y otros). En general, hace el trabajo duro.
Sólo tendré que archivar la salida y marcharme. :)
Método de transporte sencillo.
 
a avm<br / translate="no">
Es posible realizar pruebas de esta manera. Y es lo suficientemente bueno. Pero, por desgracia, no conseguirá el universalismo. He dedicado un par de semanas a estas pruebas. A primera vista parece sencillo.

Sospecho que ha probado "con mucha sangre", es decir, que no ha redefinido las funciones comerciales. Y cada nueva prueba requería escribir un nuevo indicador de comprobación. Pero sólo hay que hacerlo una vez, y sin problemas. Si me equivoco, quiero que publiques las funciones, no seas tacaño.

Absolutamente correcto. "Gran sangre". No hubo sustituciones. He hecho tales probadores en MT3.x. MQL4 es tan diferente de MQL2 como el cielo lo es de la tierra. Sin embargo, no he aprovechado MQL4. Tengo un estupor psicológico. Debería haber pensado primero, y luego trabajar.
A la mujer se le aconsejó: "Piensa primero, habla después". La mujer respondió: "Cómo voy a pensar en lo que aún no he dicho".
 
Me he adelantado un poco con lo del parser, primero hay que escribir las funciones. Pero recuerdo que los desarrolladores dijeron que no habrá un probador multidivisa (probador de cartera). ¿O estoy confundiendo algo? Si no estoy confundido, más razón para escribir el tuyo.