Discusión sobre el artículo "Redes neuronales: así de sencillo (Parte 66): Problemática de la exploración en el entrenamiento offline"
Dmitry hola. Dice que usaste 5 agentes y recogiste 100 pases con ellos. ¿Realizaste la recogida 20 veces? De lo contrario sólo 5 pases serán recogidos por 5 agentes. Además, si ejecutas el Asesor Experto con los mismos parámetros, no recalcula, sino que saca el resultado de la caché. ¿O cambiaste estos 5 agentes en cada recogida posterior? Por favor, explique este punto.
Lo ejecuté 20 veces, pero borré la caché antes de ejecutarlo. No puede desplazar agentes porque el fichero modelo está vinculado al número de agente. Por lo tanto, si cambia los agentes cada vez, se creará un nuevo modelo aleatorio y no obtendremos el efecto deseado.
Lo he ejecutado 20 veces, pero he borrado la caché antes de empezar. No se pueden desplazar los agentes porque el archivo del modelo está vinculado al número de agente. Por lo tanto, si se desplazan los agentes, se creará un nuevo modelo aleatorio cada vez y no obtendremos el efecto deseado.
entonces establecer agente a 5 y Optimización a 20
Total de 100...
entonces establecer agente a 5 y Optimización a 20
Total de 100...
Hola,
¿Cuántos núcleos has utilizado?
No sé cómo MetaTrader Tester selecciona entradas para cada núcleo. La idea principal en el estudio online es usar el modelo preentrenado de una pasada a otra. Pero si Tester ejecutar Optimithation 1..4 al Agente 1 en una sola pasada el que todos utilizan al azar (no pre-entrenado) modelo.
No sé cómo MetaTrader Tester selecciona entradas para cada núcleo. La idea principal en el estudio en línea es utilizar el modelo pre-entrenado de una pasada a otra. Pero si Tester ejecutar Optimithation 1..4 al Agente 1 en una sola pasada el que todos utilizan al azar (no pre-entrenado) modelo.
También he añadido algunos indicadores y parámetros, total 27 BarDescr.... Momentum, Bandas & Ichimoku Kinko Hyo =)
int OnInit()
{
Establecer símbolo y actualizar
if(! Symb.Name(_Symbol))
return INIT_FAILED;
Symb.Refresh();
//---
if(! RSI. Create(Symb.Name(), TimeFrame, RSIPeriod, RSIPrice))
return INIT_FAILED;
//---
if(! CCI.Create(Symb.Name(), TimeFrame, CCIPeriod, CCIPrice))
return INIT_FAILED;
//---
if(! ATR. Create(Symb.Name(), TimeFrame, ATRPeriod))
return INIT_FAILED;
//---
if(! MACD. Create(Symb.Name(), TimeFrame, FastPeriod, SlowPeriod, SignalPeriod, MACDPrice)))
return INIT_FAILED;
//---
if (! Momentum.Create(Symb.Name(), TimeFrame, MomentumMaPeriod, MomentumApplied))
return INIT_FAILED;
Inicializar el indicador Ichimoku Kinko Hyo
if (! Ichimoku.Create(Symb.Name(), TimeFrame, Ichimokutenkan_senPeriod, Ichimokukijun_senPeriod, Ichimokusenkou_span_bPeriod)))
return INIT_FAILED;
//---
if (! Bands.Create(Symb.Name(), TimeFrame, BandsMaPeriod, BandsMaShift, BandsDeviation, BandsApplied))
return INIT_FAILED;
//---
if(! RSI. ¡BufferResize(HistoryBars) || ! ¡CCI.BufferResize(HistoryBars) ||| !
¡! ATR. ¡BufferResize(HistoryBars) || ! MACD. BufferResize(HistoryBars))
{
PrintFormat("%s -> %d", __FUNCTION__, __LINE__);
return INIT_FAILED;
}
//---
void OnTick()
{
//---
if(! IsNewBar())
return;
//---
int bars = CopyRates(Symb.Name(), TimeFrame, iTime(Symb.Name(), TimeFrame, 1), HistoryBars, Rates);
if(! ArraySetAsSeries(Tipos, true))
return;
//---
RSI. Refresh();
CCI.Refresh();
ATR. Actualizar();
MACD. Actualizar();
Symb.Refresh();
Momentum.Refresh();
Bandas.Actualizar();
Symb.RefreshRates();
Actualiza los valores de Ichimoku para la barra actual
Ichimoku.Refresh();
--- Datos históricos
float atr = 0;
for (int b = 0; b < (int)HistoryBars; b++)
{
float open = (float)Tasas[b].open;
float close = (float)Rates[b].close;
float rsi = (float)RSI. Main(b);
float cci = (float)CCI.Main(b);
atr = (float)ATR. Main(b);
float macd = (float)MACD. Principal(b);
float señal = (float)MACD. Señal(b);
float mome = (float)Momentum.Main(b);
float bandzup = (float)Bands.Upper(b);
float bandzb = (float)Bandas.Base(b);
float bandzlo = (float)Bands.Lower(b);
float tenkan = (float)Ichimoku.TenkanSen(0); Utiliza el valor calculado
float kijun = (float)Ichimoku.KijunSen(1); Usar el valor calculado
float senkasa = (float)Ichimoku.SenkouSpanA(2); Utilice el valor calculado
float senkb = (float)Ichimoku.SenkouSpanB(3); Usar el valor calculado
Comprobar EMPTY_VALUE y división por cero
if (rsi == EMPTY_VALUE || cci == EMPTY_VALUE || atr == EMPTY_VALUE || macd == EMPTY_VALUE ||
sign == EMPTY_VALUE || mome == EMPTY_VALUE || bandzup == EMPTY_VALUE || bandzb == EMPTY_VALUE || bandzb == EMPTY_VALUE ||
bandzlo == EMPTY_VALUE || tenkan == EMPTY_VALUE || kijun == EMPTY_VALUE || senkasa == EMPTY_VALUE || senkasa == EMPTY_VALUE ||
senkb == EMPTY_VALUE || kijun == 0.0 | senkb == 0.0)
{
continuar;
}
Asegúrese de que los buffers no se redimensionan dentro del bucle
int shift = b * BarDescr;
sState.state[shift] = (float)(Rates[b].close - open);
sState.state[shift + 1] = ((float)(Rates[b].close - open) + (tenkan - kijun)) / 2.0f;
sState.state[shift + 2] = (float)(Rates[b].high - open);
sState.state[shift + 3] = (float)(Rates[b].low - open);
sState.state[shift + 4] = (float)(Rates[b].high - close);
sState.state[shift + 5] = (float)(Rates[b].low - close);
sState.state[shift + 6] = (tenkan - kijun);
sState.state[shift + 7] = (float)(Rates[b].tick_volume / 1000.0f);
sState.state[shift + 8] = ((float)(Rates[b].high) - (float)(Rates[b].low));
sState.state[shift + 9] = (bandzup - bandzlo);
sState.state[shift + 10] = rsi;
sState.state[shift + 11] = cci;
sState.state[shift + 12] = atr;
sState.state[shift + 13] = macd;
sState.state[shift + 14] = sign;
sState.state[shift + 15] = mome;
sState.state[shift + 16] = (float)(Rates[b].open - tenkan);
sState.state[shift + 17] = (float)(Rates[b].open - kijun);
sState.state[shift + 18] = (float)(Rates[b].open - bandzb);
sState.state[shift + 19] = (float)(Rates[b].open - senkasa);
sState.state[shift + 20] = (float)(Rates[b].open - senkb);
sState.state[shift + 21] = (float)(Rates[b].close - tenkan);
sState.state[shift + 22] = (float)(Rates[b].close - kijun);
sState.state[shift + 23] = (float)(Rates[b].close - bandzb);
sState.state[shift + 24] = (float)(Rates[b].close - senkasa);
sState.state[shift + 25] = (float)(Rates[b].close - senkb);
sState.state[shift + 26] = senkasa - senkb;
//---
RSI.Refresh();
CCI.Refresh();
ATR.Refresh();
MACD.Refresh();
Symb.Refresh();
Momentum.Refresh();
Bandas.Actualizar();
Symb.RefreshRates();
// Actualizar los valores de Ichimoku para la barra actual
Ichimoku.Refresh();
//---
Print("Estado 0: ", sEstado.estado[shift]);
Print("Estado 1: ", sEstado.estado[shift + 1]);
Print("Estado 2: ", sEstado.estado[shift + 2]);
Print("Estado 3: ", sEstado.estado[turno + 3]);
Print("Estado 4: ", sEstado.estado[turno + 4]);
Print("Estado 5: ", sEstado.estado[turno + 5]);
Print("Estado 6: ", sEstado.estado[turno + 6]);
Print("Estado 7: ", sEstado.estado[turno + 7]);
Print("Estado 8: ", sEstado.estado[turno + 8]);
Print("Estado 9: ", sEstado.estado[turno + 9]);
Print("Estado 10: ", sEstado.estado[turno + 10]);
Print("Estado 11: ", sEstado.estado[turno + 11]);
Print("Estado 12: ", sEstado.estado[turno + 12]);
Print("Estado 13: ", sEstado.estado[turno + 13]);
Print("Estado 14: ", sEstado.estado[turno + 14]);
Print("Estado 15: ", sEstado.estado[turno + 15]);
Print("Estado 16: ", sEstado.estado[turno + 16]);
Print("Estado 17: ", sEstado.estado[turno + 17]);
Print("Estado 18: ", sEstado.estado[turno + 18]);
Print("Estado 19: ", sEstado.estado[turno + 19]);
Print("Estado 20: ", sEstado.estado[turno + 20]);
Print("Estado 21: ", sEstado.estado[turno + 21]);
Print("Estado 22: ", sEstado.estado[turno + 22]);
Print("Estado 23: ", sEstado.estado[turno + 23]);
Print("Estado 24: ", sEstado.estado[turno + 24]);
Print("Estado 25: ", sEstado.estado[turno + 25]);
Print("Estado 26: ", sEstado.estado[shift + 26]);
Print("Tenkan Sen: ", tenkan);
Print("Kijun Sen: ", kijun);
Print("Senkou Span A: ", senkasa);
Print("Senkou Span B: ", senkb);
}
bState.AssignArray(sState.state);
También he añadido algunos indicadores y parámetros, total 27 BarDescr.... Momentum, Bandas y Ichimoku Kinko Hyo =)
int OnInit()
{
Establecer símbolo y actualizar
if(! Símbolo.Nombre(_Símbolo))
return INIT_FAILED;
Symb.Actualizar();
//---
if(! RSI. Create(Symb.Name(), TimeFrame, RSIPeriod, RSIPrice))
return INIT_FAILED;
//---
if(! CCI.Create(Symb.Name(), TimeFrame, CCIPeriod, CCIPrice))
return INIT_FAILED;
//---
if(! ATR. Create(Symb.Name(), TimeFrame, ATRPeriod))
return INIT_FAILED;
//---
if(! MACD. Create(Symb.Name(), TimeFrame, FastPeriod, SlowPeriod, SignalPeriod, MACDPrice))
return INIT_FAILED;
//---
if (! Momentum.Create(Symb.Name(), TimeFrame, MomentumMaPeriod, MomentumApplied))
return INIT_FAILED;
Inicializar el indicador Ichimoku Kinko Hyo
If (! Ichimoku.Create(Symb.Name(), TimeFrame, Ichimokutenkan_senPeriod, Ichimokukijun_senPeriod, Ichimokusenkou_span_bPeriod))
return INIT_FAILED;
//---
if (! Bands.Create(Symb.Name(), TimeFrame, BandsMaPeriod, BandsMaShift, BandsDeviation, BandsApplied))
return INIT_FAILED;
//---
if(! RSI. ¡BufferResize(HistoryBars) || ! CCI.BufferResize(HistoryBars) ||| CCI.
¡! ATR. ¡BufferResize(HistoryBars) || ! MACD. BufferResize(HistoryBars))
{
PrintFormat("%s -> %d", __FUNCTION__, __LINE__);
return INIT_FAILED;
}
//---
void OnTick()
{
//---
if(! IsNewBar())
vuelve;
//---
int bars = CopyRates(Symb.Name(), TimeFrame, iTime(Symb.Name(), TimeFrame, 1), HistoryBars, Rates);
if(! ArraySetAsSeries(Tasas, true))
return;
//---
RSI. Refresh();
CCI.Refresh();
ATR. Actualizar();
MACD. Refresh();
Symb.Refresh();
Momentum.Refresh();
Bandas.Actualizar();
Symb.RefreshRates();
Actualiza los valores de Ichimoku para la barra actual
Ichimoku.Refresh();
--- Datos históricos
float atr = 0;
for (int b = 0; b < (int)HistoryBars; b++)
{
float open = (float)Rates[b].open;
float close = (float)Tarifas[b].close;
float rsi = (float)RSI. Main(b);
float cci = (float)CCI.Main(b);
atr = (float)ATR. Principal(b);
float macd = (float)MACD. Main(b);
float señal = (float)MACD. Señal(b);
float mome = (float)Momentum.Main(b);
float bandzup = (float)Bandas.Superior(b);
float bandzb = (float)Bandas.Base(b);
float bandzlo = (float)Bands.Lower(b);
float tenkan = (float)Ichimoku.TenkanSen(0); Utilizar el valor calculado.
float kijun = (float)Ichimoku.KijunSen(1); Usar el valor calculado
float senkasa = (float)Ichimoku.SenkouSpanA(2); Usar el valor calculado
float senkb = (float)Ichimoku.SenkouSpanB(3); Usar el valor calculado
Comprobar EMPTY_VALUE y división por cero
if (rsi == EMPTY_VALUE || cci == EMPTY_VALUE || atr == EMPTY_VALUE || macd == EMPTY_VALUE ||
sign == EMPTY_VALUE || mome == EMPTY_VALUE || bandzup == EMPTY_VALUE || bandzb == EMPTY_VALUE || bandzb == EMPTY_VALUE ||
bandzlo == EMPTY_VALUE || tenkan == EMPTY_VALUE || kijun == EMPTY_VALUE || senkasa == EMPTY_VALUE || senkasa == EMPTY_VALUE ||
senkb == EMPTY_VALUE || kijun == 0.0 || senkb == 0.0)
{
continuar;
}
Asegurarse de que los buffers no se redimensionan dentro del bucle.
int desplazamiento = b * BarDescr;
sState.state[shift] = (float)(Rates[b].close - open);
sState.state[shift + 1] = ((float)(Rates[b].close - open) + (tenkan - kijun)) / 2.0f;
sState.state[shift + 2] = (float)(Rates[b].high - open);
sState.state[shift + 3] = (float)(Rates[b].low - open);
sState.state[shift + 4] = (float)(Rates[b].high - close);
sState.state[shift + 5] = (float)(Rates[b].low - close);
sState.state[shift + 6] = (tenkan - kijun);
sState.state[shift + 7] = (float)(Rates[b].tick_volume / 1000.0f);
sState.state[shift + 8] = ((float)(Rates[b].high) - (float)(Rates[b].low));
sState.state[shift + 9] = (bandzup - bandzlo);
sState.state[shift + 10] = rsi;
sState.state[shift + 11] = cci;
sState.state[shift + 12] = atr;
sState.state[shift + 13] = macd;
sState.state[shift + 14] = sign;
sState.state[shift + 15] = mome;
sState.state[shift + 16] = (float)(Rates[b].open - tenkan);
sState.state[shift + 17] = (float)(Rates[b].open - kijun);
sState.state[shift + 18] = (float)(Rates[b].open - bandzb);
sState.state[shift + 19] = (float)(Rates[b].open - senkasa);
sState.state[shift + 20] = (float)(Rates[b].open - senkb);
sState.state[shift + 21] = (float)(Rates[b].close - tenkan);
sState.state[shift + 22] = (float)(Rates[b].close - kijun);
sState.state[shift + 23] = (float)(Rates[b].close - bandzb);
sState.state[shift + 24] = (float)(Rates[b].close - senkasa);
sState.state[shift + 25] = (float)(Rates[b].close - senkb);
sState.state[shift + 26] = senkasa - senkb;
//---
RSI.Refresh();
CCI.Actualizar();
ATR.Actualizar();
MACD.Actualizar();
Symb.Refresh();
Momentum.Refresh();
Bandas.Actualizar();
Symb.RefreshRates();
// Refresca los valores de Ichimoku para la barra actual
Ichimoku.Refresh();
//---
Print("Estado 0: ", sEstado.estado[shift]);
Print("Estado 1: ", sEstado.estado[shift + 1]);
Print("Estado 2: ", sEstado.estado[shift + 2]);
Print("Estado 3: ", sEstado.estado[turno + 3]);
Print("Estado 4: ", sEstado.estado[turno + 4]);
Print("Estado 5: ", sEstado.estado[turno + 5]);
Print("Estado 6: ", sEstado.estado[turno + 6]);
Print("Estado 7: ", sEstado.estado[turno + 7]);
Print("Estado 8: ", sEstado.estado[turno + 8]);
Print("Estado 9: ", sEstado.estado[turno + 9]);
Print("Estado 10: ", sEstado.estado[turno + 10]);
Print("Estado 11: ", sEstado.estado[turno + 11]);
Print("Estado 12: ", sEstado.estado[turno + 12]);
Print("Estado 13: ", sEstado.estado[turno + 13]);
Print("Estado 14: ", sEstado.estado[turno + 14]);
Print("Estado 15: ", sEstado.estado[turno + 15]);
Print("Estado 16: ", sEstado.estado[turno + 16]);
Print("Estado 17: ", sEstado.estado[turno + 17]);
Print("Estado 18: ", sEstado.estado[turno + 18]);
Print("Estado 19: ", sEstado.estado[turno + 19]);
Print("Estado 20: ", sEstado.estado[turno + 20]);
Print("Estado 21: ", sEstado.estado[turno + 21]);
Print("Estado 22: ", sEstado.estado[turno + 22]);
Print("Estado 23: ", sEstado.estado[turno + 23]);
Print("Estado 24: ", sEstado.estado[turno + 24]);
Print("Estado 25: ", sEstado.estado[turno + 25]);
Print("Estado 26: ", sEstado.estado[turno + 26]);
Print("Tenkan Sen: ", tenkan);
Print("Kijun Sen: ", kijun);
Print("Senkou Span A: ", senkasa);
Print("Senkou Span B: ", senkb);
}
bState.AssignArray(sState.state);
JimReaper - ¿Cuántos ciclos estudiaste tu versión antes de obtener el resultado de tu foto? (recopilación de datos - entrenamiento). ¿Y cuánto tiempo te llevó?
¿Cuál es la configuración de tu ordenador (procesador, tarjeta de vídeo, RAM)?
Muchas gracias
entonces establecer agente a 5 y Optimización a 20
Total de 100...
Veo que el código hace referencia al agente, pero no a la optimización. ¿Has añadido algo al código para utilizar este nuevo parámetro?
Gracias
Paul

- 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
Artículo publicado Redes neuronales: así de sencillo (Parte 66): Problemática de la exploración en el entrenamiento offline:
El entrenamiento offline del modelo se realiza sobre los datos de una muestra de entrenamiento previamente preparada. Esto nos ofrecerá una serie de ventajas, pero la información sobre el entorno estará muy comprimida con respecto al tamaño de la muestra de entrenamiento, lo que, a su vez, limitará el alcance del estudio. En este artículo, querríamos familiarizarnos con un método que permite llenar la muestra de entrenamiento con los datos más diversos posibles.
El método ExORL puede dividirse en 3 etapas esenciales. La primera consiste en recoger datos de exploración sin etiquetar. Para ello, podemos utilizar diversos algoritmos de aprendizaje no supervisado. Los autores del método no limitan la gama de algoritmos usados. Para ello, utilizaremos una política π que dependerá de la historia de interacciones previas al interactuar con el entorno en cada episodio. Cada episodio se almacenará en el conjunto de datos como una secuencia del estado St, de la acción At y del consecuente estado St+1 Los datos de entrenamiento se recogerán hasta que la muestra de entrenamiento cuyo tamaño está organizado por la tarea técnica o los recursos disponibles, esté completamente llena.
Una vez recogido un conjunto de datos de estados y acciones, se reevaluarán utilizando una función de recompensa determinada. En esta fase, simplemente se tratará de estimar la recompensa de cada tupla del conjunto de datos.
La experiencia práctica demuestra que es posible utilizar en paralelo en un mismo búfer de reproducción lo recogido por distintos métodos. Hemos utilizado las trayectorias recogidas por el asesor "Research.mq5" y el asesor "ResearchExORL.mq5". La primera señala las ventajas e inconvenientes de la política de aprendizaje del actor. La segunda permite explorar al máximo el entorno y evaluar las oportunidades no aprovechadas.
En el proceso de entrenamiento iterativo del modelo, hemos logrado mejorar su rendimiento.
A pesar de haber reducido el número de transacciones durante el periodo de prueba en 3 veces (56 frente a 176), el beneficio ha aumentado prácticamente en 3 veces. El importe de la transacción más rentable se ha multiplicado por más de 2, mientras que la media de transacciones rentables se ha multiplicado por 5. Al mismo tiempo, hemos visto crecer el balance a lo largo del periodo de pruebas. Como resultado, el factor de beneficio del modelo ha aumentado de 1,3 a 2,96.
Autor: Dmitriy Gizlyk