Proyecto abierto - probador-optimizador interno

 
Tengo la idea de escribir mi propio comprobador en forma de indicador. El requisito - con un mínimo de reelaboración, el Asesor Experto debe ser adecuado tanto para los probadores estándar como para los autodidactas. Esto se consigue añadiendo el prefijo my a las constantes y funciones estándar. La optimización también es aceptable.
La plantilla está escrita, es necesario implementar las funciones de comercio escribiendo sus propias funciones.
Quien sea bueno en esto, que se una a nosotros. Funciones de negociación mediante la manipulación de arrays. También necesitamos un experto en el dibujo de objetos en el gráfico - utilizar flechas/dibujos para representar los niveles de apertura, stop y take profit.
También necesitamos organizar la salida del historial de pedidos y las series numéricas en un archivo para abrir gráficos en Excel. En general, todo es muy serio :)

En principio he pensado en todo, pero no soy universalista.

Puedo dar ideas, si alguien quiere. Además, es posible que la variante de fabricación propia en algunos casos de optimización por rendimiento sea capaz de superar a la construida.

//+------------------------------------------------------------------+
//|                                                   SelfTester.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 DarkBlue
#property indicator_color3 LawnGreen
//---- input parameters
extern int       mySpread=4;
extern int       BeginYear=2002;
extern int       BeginMonth=1;
extern int       BeginDay=1;
extern string    ReportName="report";
extern int       Param1=8;
extern int       Param2=13;
extern double    myDepo=10000.0;
extern double    mylots=0.1;
extern int       myTakeProfit=100.0;
extern int       myStopLoss=80.0;
extern int       myTrailingStop=20;
//---- buffers
double myBalance[];
double myEquity[];
double myProfit[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,myBalance);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,myEquity);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,myProfit);
   double TradeOrdersArray[100][14];
   double ClosedOrdersArray[2000][14];
   int myOrdersTotal=0;
   double myOrderOpenPrice=0.0;
   double myOrderLots=0.0; 
   string myOrderComment=""; 
   int myOrderMagicNumber;
   int myOrderOpenTime;
   double myOrderProfit=0.0;
   double myOrderStopLoss=0.0;
   double myOrderTakeProfit=0.0;
   int myOrderTicket;
   int myOrderType; 

   int myOP_BUY=0;
   int myOP_SELL=1;
   int myOP_BUYLIMIT=2;
   int myOP_BUYSTOP=3;
   int myOP_SELLLIMIT=4;
   int myOP_SELLSTOP=5;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+




 
No sé qué galimatías ha aparecido. Si alguien lo quiere, lo publicaré en otro foro.
 
2 Rosh
No estoy muy seguro de lo que quieres decir con este preajuste. En mi opinión, ¿quieres conseguir un conjunto de funciones que calculen los beneficios y marquen los puntos de entrada/stop en el gráfico al mismo tiempo? ¿Y el motor de decisión será diferente para cada uno de ellos?

Y un par de consejos:
extern int       BeginYear=2002


mejor que se sustituya por

extern string       BeginDate="2002.01.01 18:00"


- es posible trabajar inmediatamente con una construcción del tipo

Time[i] > StrToTime(BeginDate)



Sí y probablemente cosas como

double myOrderOpenPrice=0.0;
double myOrderLots=0.0; 


también sería más conveniente almacenar como

#define LOTS 0;
#define OPEN_PRICE 1;

double MyOrder[2] = {0.0, 0.0};
.....................
MyOrder[OPEN_PRICE] = Open[i];
.....................
 


pero eso es sólo las pequeñas cosas...

 
Filin, estás fuera de tu alcance. ¿Por qué hay que definir la constante
?
#define LOTS 0;

Esta es la variable de entrada para el probador.

¿De dónde viene esto?

#define OPEN_PRICE 1;


¿Te has dado cuenta de que todas estas variables (que podrían estar mejor definidas por funciones)

double myOrderOpenPrice=0.0;
double myOrderLots=0.0; 

Son gemelos del construido en mql-4. Escribí que el objetivo es que nuestro probador y el probador incrustado entiendan el
EA con un mínimo de retrabajo.

El motor de decisión es el código EA. Y se integrará fácilmente en este EA. Y el motor del probador son funciones que sugiero
para "anular" - es decir, tomamos la función estándar incorporada, por ejemplo OrderSend(), y usándola, escribimos una función similar completa - myOrderSend(). Y así sucesivamente.
Escribiré esta función esta noche para que quede más claro.

Hay que ser más minucioso, más minucioso... :)

 
No sé qué galimatías ha aparecido. Si alguien lo quiere, lo publicaré en algún otro foro.

Esto apareció no hace mucho. Al transferir el texto desde MQL, las letras rusas aparecen de esta manera. Lo mismo que hace FronPage con las letras rusas.
 
Pensaba que las letras cursivas se convertirían de nuevo en letras rusas cuando copiara y pegara en el archivo indicador. Resultó no ser así. Lo publicaré en otro foro esta noche
y publicaré el enlace.
 
Rosh,
¿no puedes borrar la basura?
Es imposible de ver.
Debe ser un fallo del foro, del hosting o de MT al copiar los scripts con texto ruso.
 
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. Obtienes un conjunto de funciones estándar y listo.
Pero este conjunto no es más que una semilla: apertura/cierre, cálculo de ganancias/pérdidas, dibujo de flechas/guiones.
El principal y más importante es el algoritmo de apertura/cierre, que, digamos, ya ha sido descrito en algún Asesor Experto. No se puede arrastrar y soltar este algoritmo
en su totalidad. Sólo se puede hacer por partes. Y luego el seguimiento "sin errores" del código resultante... Además, todo tipo de giros asociados a este proceso...
todo tipo de retoques... En resumen, acabamos escribiendo un programa distinto sobre el mismo tema desde cero por segunda vez. Después de todo eso, en 1 segundo obtienes
o un resultado insatisfactorio, o las flechas están en el lugar equivocado, o se cierran en los lugares equivocados. Entonces vuelves al texto del programa y lo intentas de nuevo...
Tu cerebro funciona en lugar de un depurador, te conviertes en un monitor por un tiempo... Finalmente, al tercer día, la prueba se ejecuta
parece estar bien, pero te convences de que la estrategia "no es buena". Y en este punto, ¡eso es todo! Porque probar la siguiente estrategia de esta manera
no hay deseo de probar la siguiente estrategia. ¿Por qué he escrito todo esto? La idea es atractiva. Y en principio, funciona. Pero, créanme, no es algo
no va a funcionar. Si hablamos de una plantilla, tiene que ser una plantilla muy fundamental, es decir, un diseño muy decente y bien pensado. En general,
el programa no es el más fácil. Y si alguien después de leer este opus no va a romper una lanza en el marco de lo descrito, es decir, utilizar este mi
Si alguien utiliza mi poca, pero no obstante práctica experiencia y avanza sin perder tiempo, puede que algo funcione. Entonces todos aquellos que están sufriendo
(incluido yo mismo) participarán en la construcción de un monumento al autor. :)
 
Bien, haré una función por la noche (como prometí), todo estará más claro. Por ahora, mi opinión es que con un probador bien diseñado será posible
para utilizar Asesores Expertos nativos con algunas modificaciones cosméticas. La primera "víctima" es MACD_sample.mq4 .
 
Rosh,<br / translate="no"> ¿no se puede borrar la basura?
Es imposible de ver.
Debe ser un fallo del foro, del hosting o de MT al copiar los scripts con texto ruso.


La "basura" fue eliminada. Los programadores probablemente saben lo aburrido que es escribir (comentarios) :).

¿Alguien sabe si he definido correctamente estas constantes según la norma?
  int myOP_BUY=0;
   int myOP_SELL=1;
   int myOP_BUYLIMIT=2;
   int myOP_BUYSTOP=3;
   int myOP_SELLLIMIT=4;
   int myOP_SELLSTOP=5;


Significado de los valores específicos.

 
Soy un tonto, ¿por qué reinventar la rueda? Hagámoslo sencillo:

   int myOP_BUY=OP_BUY;
   int myOP_SELL=OP_SELL;
   int myOP_BUYLIMIT=OP_BUYLIMIT;
   int myOP_BUYSTOP=OP_BUYSTOP;
   int myOP_SELLLIMIT=OP_SELLLIMIT;
   int myOP_SELLSTOP=OP_SELLSTOP;


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