Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 6

 

Товарищи, никогда не занимался подгонкой под историю, поэтому не знаю тонкостей чтения графика после оптимизации.

Есть такой график после годового прохода 2014-2015, куда смотреть и что это значит? Интересует цвет и расположение кубиков, почему одни в центре, вторые ниже/выше, и два/три в одном квадрате?

 

Спасибо за разъяснение! 

 
strongflex:
в тестере не открывает сделку. В чем может быть тут то проблема?)

Ну... во-первых, вы пытаетесь открыть Sell по цене Ask. В то время как продажа открывается по Bid, а покупка по Ask.

Оформил поиск данных RSI и его пересечение уровней в функцию. Также в ней есть и проверка по ценам. Возвращает сигналы: на покупку, на продажу, или ничего (-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:

Товарищи, никогда не занимался подгонкой под историю, поэтому не знаю тонкостей чтения графика после оптимизации.

Есть такой график после годового прохода 2014-2015, куда смотреть и что это значит? Интересует цвет и расположение кубиков, почему одни в центре, вторые ниже/выше, и два/три в одном квадрате?

 

Спасибо за разъяснение! 

Я вот тоже за столько лет никогда не доверял оптимизаторам - считаю подгонкой. Но вроде как чем насыщеннее цвет, тем лучше. И ещё - чем кучнее блоки с насыщенными цветами, тем лучше. Но что с этим безобразием делать далее - ума не приложу. Всегда старался строить адаптивные системы, а не с тупым подбором значений под тестерную историю.

Наверное есть кто-то, кто сможет нам всё это объяснить

 
Artyom Trishkin:

Я вот тоже за столько лет никогда не доверял оптимизаторам - считаю подгонкой. Но вроде как чем насыщеннее цвет, тем лучше. И ещё - чем кучнее блоки с насыщенными цветами, тем лучше. Но что с этим безобразием делать далее - ума не приложу. Всегда старался строить адаптивные системы, а не с тупым подбором значений под тестерную историю.

Наверное есть кто-то, кто сможет нам всё это объяснить

Да скорее всего уже никто не объяснит. Пользователей на форуме осталось человек 10-12, их них некоторых забанили и многие уже не вернутся. Сейчас если посмотреть форум, то появляется около 5-7 человек, из них половина не отвечает на вопросы. Мой вопрос по поводу графика так и остался не отвеченным.
 
Vitaly Muzichenko:
Да скорее всего уже никто не объяснит. Пользователей на форуме осталось человек 10-12, их них некоторых забанили и многие уже не вернутся. Сейчас если посмотреть форум, то появляется около 5-7 человек, из них половина не отвечает на вопросы. Мой вопрос по поводу графика так и остался не отвеченным.
Нужно искать на четвёртом форуме - там когда-то давно видел разъяснения по оптимизатору, но не помню совершенно о чём там, и где оно...
 
Artyom Trishkin:
Нужно искать на четвёртом форуме - там когда-то давно видел разъяснения по оптимизатору, но не помню совершенно о чём там, и где оно...
Вот оно, только совсем не соответствует тому, что получено при тестировании, поэтому и задал вопрос знатокам.
 

Здравствуйте.

Скажите, пожалуйста, почему невозможно выбрать дату из выпадающего календаря, если во внешних настройках делаю так:
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Можно как-то изменить, чтобы можно было выбирать дату, а не вводить её с клавиатуры?

 
Vitaly Muzichenko:

Товарищи, никогда не занимался подгонкой под историю, поэтому не знаю тонкостей чтения графика после оптимизации.

Есть такой график после годового прохода 2014-2015, куда смотреть и что это значит? Интересует цвет и расположение кубиков, почему одни в центре, вторые ниже/выше, и два/три в одном квадрате?

 Спасибо за разъяснение! 

Vitaly Muzichenko:
Да скорее всего уже никто не объяснит. Пользователей на форуме осталось человек 10-12, их них некоторых забанили и многие уже не вернутся. Сейчас если посмотреть форум, то появляется около 5-7 человек, из них половина не отвечает на вопросы. Мой вопрос по поводу графика так и остался не отвеченным.

Там объяснять особо нечего, вот никто и не отвечает. Тот график, который Вы показали - бессмысленный, и как он был получен - загадка.

А имеет смысл опция "Двумерная поверхность" на вкладке "График оптимизации" в тестере тогда (имхо), когда нужно оптимизировать 2 входных параметра советника, или наглядно посмотреть, при каких значениях 2-х параметров на истории были хорошие результаты, взаимозависимы ли эти параметры, и имеют ли они смысл вообще.

Вот пример оптимизации 2-х входных параметров (может не самый удачный, но сейчас для примера лучше не нашёл):


По горизонтали - значения 1-го параметра с шагом 16, по вертикали - 2-го, тоже с шагом 16. Чем зелёный квадрат темнее, тем прибыль (если оптимизация по прибыли) больше была при соответствующих значениях параметров, чем бледнее, тем меньше. Лучший результат (по прибыли на истории) в центре оказался. Вокруг него вроде как тёмно-зелёная "куча" виднеется, значит, какая-то зависимость и закономерность между этими 2-мя параметрами есть, и параметры не бессмысленны, а результат оптимизации не случайный. Поэтому стоит обратить внимание на значения этих 2-x параметров из лучшего результата (в центре).

В общем, всё очень просто. А вот как это использовать, тут кому на что фантазии хватит. Я уже давно на эти зелёные квадраты не смотрю ))

У Вас на графике по обеим осям только 0 почему-то, причём по вертикали эти 0 еще на 3 промежуточных шага поделены, поэтому и "кубики одни в центре, вторые ниже/выше, и два/три в одном квадрате".  И результаты выглядят случайными - белые и зелёные "кубики" разбросаны случайным образом. Поэтому график бессмысленный и похоже ничего не означает.

 
Добрый день.
Пишу свою dll для работы с базой sqlite3 из индикатора.  Все примеры в дистрибутиве и в инете изучил. среда разработки codeblockes. dll работает, но некорректно и периодически падает с access violation.
Начальные вопросы: 
1. Можно ли вообще корректно собрать dll в codeblockes или только Visual Studio? Простые примеры ( работа с Int, double ) собираются и работают. Стоки и работа с файлами нет - программа падает.
2. не удалось запустить и работать с объявлением __stdcall, только с __cdecl. Искажаются имена функций , а Def файл в codeblockes нормально не работает.
Просьба знающим помочь.
Если есть уже тема, прошу Админа перенести сообщение в соответствующую ветку.
 
mila.com:

Здравствуйте.

Скажите, пожалуйста, почему невозможно выбрать дату из выпадающего календаря, если во внешних настройках делаю так:
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Можно как-то изменить, чтобы можно было выбирать дату, а не вводить её с клавиатуры?

input datetime CloseTime        = D'2016.09.11 15:50';
Причина обращения: