Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 6

 

Camarades, je n'ai jamais fait d'ajustement historique, donc je ne connais pas les subtilités de la lecture du graphique après optimisation.

Il existe un tel graphique après le passage annuel 2014-2015, où regarder et que signifie-t-il ? Intéressé par la couleur et l'emplacement des cubes, pourquoi certains sont au centre, d'autres plus bas/haut, et deux/trois dans le même carré ?

Merci pour cette précision !

 
strongflex:
Il n'ouvre pas le commerce dans le testeur. Quel pourrait être le problème ici ?)

Eh bien... Tout d'abord, vous essayez d'ouvrir un Sell au prix Ask. Alors que vous ouvrez une vente à Bid et un achat à Ask.

J'ai mis la recherche de données RSI et son franchissement de niveau dans une fonction. Il permet également de vérifier les prix. Il renvoie des signaux : acheter, vendre, ou rien (-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:

Camarades, je n'ai jamais fait d'ajustement historique, donc je ne connais pas les subtilités de la lecture du graphique après optimisation.

Il existe un tel graphique après le passage annuel 2014-2015, où regarder et que signifie-t-il ? Intéressé par la couleur et l'emplacement des cubes, pourquoi certains sont au centre, d'autres en dessous/au-dessus, et deux/trois dans le même carré ?

Merci pour cette précision !

Je n'ai jamais fait confiance aux optimiseurs depuis tant d'années non plus - je pense que c'est un ajustement. Mais c'est un peu comme si plus la couleur est riche, mieux c'est. Et aussi - plus il y a de blocs avec des couleurs saturées, mieux c'est. Mais que faire ensuite avec ce désordre - je ne peux pas y penser. J'ai toujours essayé de construire des systèmes adaptatifs, et pas avec une sélection stupide de valeurs pour l'histoire d'un testeur.

Il y a peut-être quelqu'un qui peut nous expliquer tout cela.

 
Artyom Trishkin:

Depuis tant d'années, je n'ai jamais fait confiance aux optimiseurs non plus - je les considère comme des bricoleurs. Mais plus la couleur est saturée, mieux c'est. Et aussi - plus il y a de blocs avec des couleurs saturées, mieux c'est. Mais que faire ensuite avec ce désordre - je ne peux pas y penser. J'ai toujours essayé de construire des systèmes adaptatifs, et pas avec une sélection stupide de valeurs pour l'histoire d'un testeur.

Il y a peut-être quelqu'un qui peut nous expliquer tout cela.

Il est probable que personne ne le fera. Il reste 10-12 personnes sur le forum, certaines d'entre elles ont été bannies et beaucoup ne reviendront pas. Maintenant si vous regardez le forum, environ 5-7 personnes apparaissent, la moitié d'entre elles ne répondent pas aux questions. Ma question sur le calendrier reste sans réponse.
 
Vitaly Muzichenko:
Oui, il est probable que personne ne l'explique. Il reste 10-12 personnes sur le forum, certaines d'entre elles ont été bannies et beaucoup ne reviendront pas. Maintenant, si vous regardez le forum, il y a environ 5-7 personnes, dont la moitié ne répond pas aux questions. Ma question sur le calendrier n'a pas reçu de réponse.
Il faut regarder sur le quatrième forum - j'y ai vu une explication de l'optimiseur il y a longtemps, mais je ne me souviens plus de quoi il s'agissait ni où c'était...
 
Artyom Trishkin:
Vous devez regarder sur le quatrième forum - j'y ai vu une explication de l'optimiseur il y a quelque temps, mais je ne me souviens plus exactement de quoi il s'agissait et où c'était...
Le voici, seulement il ne correspond pas à ce que j'ai obtenu lors des tests, c'est pourquoi j'ai posé une question aux connaisseurs.
 

Bonjour.

Pouvez-vous me dire pourquoi il est impossible de sélectionner une date dans le calendrier déroulant si je le fais dans les paramètres externes :
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Existe-t-il un moyen de modifier le système de manière à ce que vous puissiez sélectionner une date au lieu de la taper au clavier ?

 
Vitaly Muzichenko:

Camarades, je n'ai jamais fait d'ajustement historique, donc je ne connais pas les subtilités de la lecture du graphique après optimisation.

Il existe un tel graphique après le passage annuel 2014-2015, où regarder et que signifie-t-il ? Intéressé par la couleur et l'emplacement des cubes, pourquoi certains sont au centre, d'autres plus bas/haut, et deux/trois dans le même carré ?

Merci pour cette précision !

Vitaly Muzichenko:
Oui, très probablement, personne n'expliquera. Il ne reste plus que 10-12 personnes sur le forum, certaines ont été bannies, et beaucoup ne sont jamais revenues. Maintenant, si vous regardez le forum, environ 5-7 personnes apparaissent, la moitié d'entre elles ne répondent pas aux questions. Ma question sur le calendrier est restée sans réponse.

Il n'y a pas grand-chose à expliquer et personne ne répond. Le graphique que vous avez montré n'a aucun sens et la façon dont il a été obtenu est un mystère.

Et l'option "Surface bidimensionnelle" dans l'onglet "Graphique d'optimisation" du testeur a du sens (imho) lorsque nous voulons optimiser 2 paramètres d'entrée d'un EA ou pour voir clairement, à quelles valeurs de 2 paramètres les résultats étaient bons sur l'historique et si ces paramètres sont interdépendants, et s'ils ont un sens du tout.

Voici un exemple d'optimisation de 2 paramètres d'entrée (peut-être pas le meilleur, mais je ne peux pas trouver un meilleur exemple pour le moment) :


L'axe horizontal est la valeur du 1er paramètre en 16 incréments, et l'axe vertical est la valeur du 2ème paramètre, également en 16 incréments. Plus le carré vert est foncé, plus le profit (si l'optimisation par le profit) était important aux valeurs correspondantes des paramètres, plus il est pâle, moins il est important. Le meilleur résultat (par le bénéfice historique) a été obtenu dans le centre. Un "tas" vert foncé semble l'entourer, ce qui suggère une certaine dépendance et régularité entre ces 2 paramètres et les paramètres ne sont pas sans signification, tandis que le résultat de l'optimisation n'est pas accidentel. Il convient donc de prêter attention aux valeurs de ces 2 paramètres à partir du meilleur résultat (au centre).

En général, tout est très simple. Quant à savoir comment l'utiliser, c'est une question d'imagination. Je ne regarde pas ces carrés verts pendant longtemps ;))

Votre graphique ne comporte que des 0 sur les deux axes pour une raison quelconque, et verticalement ces 0 sont également divisés en 3 étapes intermédiaires, d'où les "cubes un au centre, deux en dessous/au-dessus, et deux/trois dans le même carré". Et les résultats semblent aléatoires - les "cubes" blancs et verts sont dispersés au hasard. Le graphique n'a donc aucun sens et semble ne rien vouloir dire.

 
Bonjour.
Je suis en train d'écrire ma propre dll pour travailler avec une base de données sqlite3 à partir d'un indicateur. L'environnement de développement codeblockes fonctionne, mais pas correctement et se bloque occasionnellement avec une violation d'accès.
Questions initiales :
1. Est-il possible de construire correctement les dlls dans les blocs de code ou seulement dans Visual Studio ? Des exemples simples (travailler avec Int, double) sont construits et fonctionnent. Les piles et le travail avec les fichiers ne fonctionnent pas - le programme se plante.
2. je n'ai pas pu démarrer et travailler avec __stdcall, seulement avec __cdecl. Noms de fonctions déformés, et le fichier def dans les blocs de code ne fonctionne pas normalement.
Je cherche l'aide d'utilisateurs compétents.
S'il existe déjà un sujet, veuillez demander à l'administrateur de le poster dans la branche appropriée.
 
mila.com:

Bonjour.

Pouvez-vous me dire pourquoi il est impossible de sélectionner une date dans le calendrier déroulant si je le fais dans les paramètres externes :
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Existe-t-il un moyen de modifier la date pour qu'elle puisse être sélectionnée au lieu d'être saisie au clavier ?

input datetime CloseTime        = D'2016.09.11 15:50';
Raison: