Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 6

 

Compañeros, nunca he hecho ningún ajuste de historial, así que no conozco los entresijos de la lectura del gráfico tras la optimización.

Existe dicho gráfico tras el pase anual 2014-2015, ¿dónde mirar y qué significa? Te interesa el color y la ubicación de los cubos, ¿por qué algunos están en el centro, otros abajo/arriba, y dos/tres en el mismo cuadrado?

Gracias por la aclaración.

 
strongflex:
No abre el comercio en el probador. ¿Cuál podría ser el problema aquí?)

Bueno... En primer lugar, usted está tratando de abrir una venta a precio de compra. Mientras que usted abre una venta en Bid y una compra en Ask.

He puesto la búsqueda de datos del RSI y su cruce de niveles en una función. También cuenta con una comprobación de precios. Devuelve señales: para comprar, para vender, o nada (-1)

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  UpperRSIlevel  = 70;          // Верхний уровень RSI
input int                  LowerRSIlevel  = 30;          // Нижний уровень RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта RSI
int upperRSIlevel;         // Верхний уровень RSI
int lowerRSIlevel;         // Нижний уровень RSI
//---
double   prevRSIvalue0;    // Значение RSI для заданного тф xxx минут назад
double   prevRSIvalue1;    // Значение RSI для заданного тф xxx минут назад-x минут
//---
double   prevClose_0;      // Значение Close для заданного тф xxx минут назад
double   prevClose_1;      // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
   upperRSIlevel=(UpperRSIlevel<1?1:UpperRSIlevel>100?100:UpperRSIlevel);
   lowerRSIlevel=(LowerRSIlevel<0?0:lowerRSIlevel>99?99:LowerRSIlevel);
   if(upperRSIlevel<=lowerRSIlevel) upperRSIlevel=lowerRSIlevel+1;
   if(lowerRSIlevel>=upperRSIlevel) lowerRSIlevel=upperRSIlevel-1;
   /*

   */
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
         //--- получили сигнал на покупку
         Print("Сигнал на покупку ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         //--- вызов функции открытия позиции на покупку
         }
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
         //--- получили сигнал на продажу
         Print("Сигнал на продажу ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) {
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) {
   if(time<0) return(-1);
   //---
   datetime array[], time0;
   if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1);
   time0=array[0];
   if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1);
   datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1);
   if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1);
   else return(ArraySize(array));
}
//+------------------------------------------------------------------+
datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) {
   if(bar<0) return(-1);
   datetime array[];
   if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int SignalByRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int minutes_before, int upper_lev_rsi=70, int lower_lev_rsi=30) {
   //--- время 1x и 2x минут назад
   datetime time_before_0=TimeCurrent()-minutes_before*PeriodSeconds(PERIOD_M1);
   datetime time_before_1=TimeCurrent()-2*minutes_before*PeriodSeconds(PERIOD_M1);
   //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
   int shift_0=GetBarShift(symbol_name,timeframe,time_before_0);
   int shift_1=GetBarShift(symbol_name,timeframe,time_before_1);
   //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
   double prev_rsi_value_0=GetLastDataRSI(symbol_name,timeframe,shift_0);
   double prev_rsi_value_1=GetLastDataRSI(symbol_name,timeframe,shift_1);
   //--- значения цен закрытия баров 1х и 2х минут назад
   double prev_close_0=GetPriceClose(symbol_name,timeframe,shift_0);
   double prev_close_1=GetPriceClose(symbol_name,timeframe,shift_1);
   //--- отладочные сообщения
   string tf=EnumToString(TimeframeRSI);
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   Comment(
          "\nВремя проверки RSI: ",TimeCurrent(),", минуты времени проверки: ",server_time.min,
          "\nВремя ",minutes_before," минут назад: ",time_before_0,", бар ",tf," : ",shift_0,
          "\nВремя ",minutes_before*2," минут назад: ",time_before_1,", бар ",tf," : ",shift_1,
          "\nЗначение RSI ",minutes_before," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_0,4),
          "\nЗначение RSI ",minutes_before*2," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_1,4),
          //---
          "\nЗначение Close ",minutes_before," минут назад > ",tf," : ",DoubleToString(prev_close_0,Digits()),
          "\nЗначение Close ",minutes_before*2," минут назад > ",tf," : ",DoubleToString(prev_close_1,Digits())
          );
   //--- проверка наличия данных RSI
   if(prev_rsi_value_1>0 && prev_rsi_value_0>0) {
      //--- проверка условия на продажу
      if(prev_rsi_value_1<upper_lev_rsi && prev_rsi_value_0>upper_lev_rsi) {
         if(prev_close_0>SymbolInfoDouble(symbol_name,SYMBOL_BID)) return(OP_SELL);
         }
      //--- проверка условия на покупку
      if(prev_rsi_value_1>lower_lev_rsi && prev_rsi_value_0<lower_lev_rsi) {
         if(prev_close_0<SymbolInfoDouble(symbol_name,SYMBOL_ASK)) return(OP_BUY);
         }
      }
   return(-1);
}
//+------------------------------------------------------------------+
 
Vitaly Muzichenko:

Compañeros, nunca he hecho ningún ajuste de historial, así que no conozco los entresijos de la lectura del gráfico después de la optimización.

Existe dicho gráfico tras el pase anual 2014-2015, ¿dónde mirar y qué significa? Te interesa el color y la ubicación de los cubos, ¿por qué algunos están en el centro, otros abajo/arriba, y dos/tres en el mismo cuadrado?

Gracias por la aclaración.

Yo tampoco he confiado nunca en los optimizadores en tantos años, creo que es un ajuste. Pero es como si cuanto más rico sea el color, mejor. Y además, cuantos más bloques con colores saturados, mejor. Pero qué hacer después con este lío - no puedo pensar. Siempre he tratado de construir sistemas adaptativos, y no con una selección estúpida de valores para una historia de probadores.

Quizás haya alguien que pueda explicarnos todo esto

 
Artyom Trishkin:

Yo tampoco me he fiado nunca de los optimizadores en tantos años, los considero una chapuza. Pero cuanto más saturado sea el color, mejor. Y además, cuantos más bloques con colores saturados, mejor. Pero qué hacer después con este lío - no puedo pensar. Siempre he tratado de construir sistemas adaptativos, y no con una selección estúpida de valores para una historia de probadores.

Quizás haya alguien que pueda explicarnos todo esto

Lo más probable es que nadie lo haga. Quedan 10-12 personas en el foro, algunas de ellas fueron baneadas y muchas de ellas no volverán. Ahora si miras el foro, aparecen unas 5-7 personas, la mitad de ellas no contestan a las preguntas. Mi pregunta sobre el horario sigue sin respuesta.
 
Vitaly Muzichenko:
Es probable que nadie lo explique. Quedan 10-12 personas en el foro, algunas de ellas han sido baneadas y muchas de ellas no volverán. Ahora si miras el foro, hay unas 5-7 personas, la mitad de ellas no contestan a las preguntas. No se ha respondido a mi pregunta sobre el horario.
Hay que mirar en el cuarto foro - vi una explicación del optimizador allí una vez hace mucho tiempo, pero no recuerdo de qué se trataba ni dónde estaba...
 
Artyom Trishkin:
Tienes que buscar en el cuarto foro - vi una explicación del optimizador allí hace algún tiempo, pero no recuerdo bien de qué se trataba y dónde estaba...
Aquí está, sólo que no coincide con lo que obtuve durante las pruebas, por eso hice una pregunta a los entendidos.
 

Hola.

Me pueden decir por qué no es posible seleccionar una fecha en el calendario desplegable si lo hago en la configuración externa:
extern datetime CloseTime        = D'2016.09.11 15:50';  //

¿Hay alguna forma de cambiar para que se pueda seleccionar una fecha en lugar de escribirla desde el teclado?

 
Vitaly Muzichenko:

Compañeros, nunca he hecho ningún ajuste de historial, así que no conozco los entresijos de la lectura del gráfico después de la optimización.

Existe dicho gráfico tras el pase anual 2014-2015, ¿dónde mirar y qué significa? Te interesa el color y la ubicación de los cubos, ¿por qué algunos están en el centro, otros abajo/arriba, y dos/tres en el mismo cuadrado?

Gracias por la aclaración.

Vitaly Muzichenko:
Sí, lo más probable es que nadie lo explique. Sólo quedan 10-12 personas en el foro, algunas de ellas han sido baneadas, y muchas no han vuelto. Ahora, si miras el foro, aparecen unas 5-7 personas, la mitad de ellas no contestan a las preguntas. Mi pregunta sobre el horario quedó sin respuesta.

No hay mucho que explicar y nadie responde. El gráfico que has mostrado no tiene sentido y cómo se ha obtenido es un misterio.

Y la opción "Superficie bidimensional" en la pestaña "Gráfico de optimización" del probador tiene sentido (imho) cuando queremos optimizar 2 parámetros de entrada de un EA o para ver claramente, a qué valores de 2 parámetros los resultados fueron buenos en la historia y si estos parámetros son interdependientes, y si tienen sentido en absoluto.

Aquí hay un ejemplo de la optimización de 2 parámetros de entrada (tal vez no es el mejor, pero no puedo encontrar un mejor ejemplo en este momento):


El eje horizontal es el valor del primer parámetro en 16 incrementos, y el eje vertical es el valor del segundo parámetro, también en 16 incrementos. Cuanto más oscuro sea el cuadrado verde, mayor será el beneficio (si la optimización por el beneficio) en los valores correspondientes de los parámetros, y cuanto más pálido, menor. El mejor resultado (por el beneficio de la historia) fue en el centro. El "montón" de color verde oscuro parece estar alrededor, lo que sugiere cierta dependencia y regularidad entre estos 2 parámetros y los parámetros no son sin sentido, mientras que el resultado de la optimización no es accidental. Por ello, conviene prestar atención a los valores de estos 2 parámetros a partir del mejor resultado (en el centro).

En general, todo es muy sencillo. En cuanto a cómo utilizarlo, bueno, es cuestión de imaginación. No miro estos cuadrados verdes durante mucho tiempo ))

Tu gráfico tiene sólo 0 en ambos ejes por alguna razón, y verticalmente estos 0 también están divididos en 3 pasos intermedios, de ahí los "cubos uno en el centro, dos abajo/arriba, y dos/tres en el mismo cuadrado". Y los resultados parecen aleatorios: los "cubos" blancos y verdes están dispersos al azar. Así que el gráfico no tiene sentido y no parece significar nada.

 
Hola.
Estoy escribiendo mi propia dll para trabajar con la base de datos sqlite3 de indicator. El entorno de desarrollo de Codeblockes funciona, pero no correctamente y ocasionalmente se bloquea con una violación de acceso.
Preguntas iniciales:
1. ¿Es posible construir dlls en codeblockes correctamente o sólo en Visual Studio? Se construyen ejemplos sencillos (trabajar con Int, double) y funcionan. Las pilas y el trabajo con los archivos no - el programa se bloquea.
2. No pude iniciar y trabajar con __stdcall, sólo con __cdecl. Nombres de funciones distorsionados, y el archivo def en los bloques de código no funciona normalmente.
Busco la ayuda de los usuarios conocedores.
Si ya existe un tema, por favor pida al administrador que lo publique en la rama apropiada.
 
mila.com:

Hola.

Por favor, pueden decirme por qué no es posible seleccionar una fecha en el calendario desplegable si lo hago en los ajustes externos:
extern datetime CloseTime        = D'2016.09.11 15:50';  //

¿Hay alguna forma de cambiar para que se pueda seleccionar la fecha en lugar de introducirla desde el teclado?

input datetime CloseTime        = D'2016.09.11 15:50';
Razón de la queja: