新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 6

 

同志们,我没有做过历史拟合,所以我不知道优化后读图的复杂情况。

2014-2015年的年票后有这样一张图,在哪里看,有什么意义?对立方体的颜色和位置感兴趣,为什么有的在中心,有的在低处/高处,有的有两个/三个在同一个正方形?

谢谢你的澄清!

 
strongflex:
它没有在测试器中打开交易。这里可能有什么问题?)

嗯...首先,你试图在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年的年票后有这样一张图,在哪里看,有什么意义?对立方体的颜色和位置感兴趣,为什么有些在中间,有些在下面/上面,还有两个/三个在同一个正方形?

谢谢你的澄清!

维塔利-穆齐琴科
是的,很可能没有人会解释。论坛上只剩下10-12个人,其中一些人已经被禁止,许多人再也没有回来。现在,如果你看一下论坛,大约有5-7人出现,其中一半人不回答问题。我关于时间表的问题仍然没有得到回答。

没有什么可解释的,也没有人回答。你展示的图表毫无意义,如何得到的是一个谜。

当我们想优化EA的2个输入参数,或者想清楚地看到2个参数的哪个值在历史上的结果是好的,这些参数是否相互依赖,以及它们是否有意义时,测试仪 "优化图 "选项中的 "二维表面 "是有意义的(我认为)。

下面是一个优化2个输入参数的例子(也许不是最好的,但我现在找不到更好的例子)。


横轴是第1个参数的值,增量为16,纵轴是第2个参数的值,也是增量为16。绿色方块的颜色越深,说明在相应的参数值下利润越大(如果按利润优化),颜色越浅越小。最好的结果(按历史利润计算)是在中央。深绿色的 "堆 "似乎在它周围,这表明这两个参数之间有某种依赖性和规律性,参数不是无意义的,而优化结果不是偶然的。所以值得注意的是,从最好的结果(在中心)来看,这2个参数的值。

一般来说,一切都非常简单。至于如何使用它,嗯,这是一个想象力的问题。我很久没有看这些绿色方块了 ))

你的图形由于某种原因在两个轴上都只有0,而且在垂直方向上这些0也被分成了3个中间步骤,因此出现了 "方块一在中间,二在下面/上面,二/三在同一个方块"。 而且结果看起来是随机的--白色和绿色的 "方块 "随机地散布。所以这张图毫无意义,似乎没有任何意义。

 
你好。
我正在编写我自己的dll,以便与指标中的sqlite3数据库 一起工作。codeblockes开发环境可以工作,但并不正确,偶尔会因访问违规而崩溃。
最初的问题。
1.在codeblockes中的dlls到底能不能正确构建,还是只能在Visual Studio中构建?构建了简单的例子(与Int、double一起工作),并且可以工作。堆栈和文件的工作没有--程序崩溃了。
2.我无法用__stdcall启动和工作,只能用__cdecl。扭曲的函数名称,代码块中的def文件不能正常工作。
我正在寻求知识渊博的用户的帮助。
如果已经有一个主题,请管理员将其发布在适当的分支。
 
mila.com:

你好。

请告诉我,如果我在外部设置中这样做,为什么无法从下拉日历中选择一个日期。
extern datetime CloseTime        = D'2016.09.11 15:50';  //

有什么方法可以改变,使日期可以被选择,而不是从键盘输入?

input datetime CloseTime        = D'2016.09.11 15:50';
原因: