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

 

MT4

Quel est cet article et à quoi sert-il ? Je ne trouve aucune description nulle part.

Comment puis-je le désactiver par défaut ?


 
void OnStart()
  {
string text="Hello man";
   string keystr="ABCDEFG";
   uchar src[],dst[],key[];
//--- подготовка ключа шифрования
   StringToCharArray(keystr,key);
//--- подготовка исходного массива src[]
   StringToCharArray(text,src);
//--- вывод исходных данных
   PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
//--- шифрование массива src[] методом DES с 56-битным ключом key[]
   int res=CryptEncode(CRYPT_AES256,src,key,dst);
//--- проверка результата шифрования
   if(res>0)
     {
      //--- вывод шифрованных данных
      PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
      //--- расшифровка данных массива dst[] методом DES с 56-битным ключом key[]
      res=CryptDecode(CRYPT_AES256,dst,key,src);
      //--- проверка результата
      if(res>0)
        {
         //--- вывод дешифрованных данных
         PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
        }
      else
         Print("Ошибка в CryptDecode. Код ошибки=",GetLastError());
     }
   else
      Print("Ошибка в CryptEncode. Код ошибки=",GetLastError());
  }
//+------------------------------------------------------------------+
string ArrayToHex(uchar &arr[],int count=-1)
  {
   string res="";
//--- проверка размера
   if(count<0 || count>ArraySize(arr))
      count=ArraySize(arr);
//--- преобразование в шестнадцатиричную строку
   for(int i=0; i<count; i++)
      res+=StringFormat("%.2X",arr[i]);
//---
   return(res);
  }

J'essaie d'exécuter l'exemple cryptographique du manuel, maisj'utilise la méthode CRYPT_AES256 au lieu deCRYPT_DES. Le résultat est l'erreur 4029 après la méthodeCryptEncode

 
Dmitri Custurov:

J'essaie d'exécuter l'exemple cryptographique du manuel, maisj'utilise la méthode CRYPT_AES256 au lieu deCRYPT_DES. En conséquence, l'erreur 4029 après la méthodeCryptEncode

J'ai compris. Il a besoin d'une clé plus prudente.)

 

Bonjour !

Je suis stupide et je n'arrive pas à trouver la solution moi-même. Veuillez m'indiquer quel est le problème ou au moins m'indiquer la bonne direction.

Différents indicateurs commencent à montrer de façon synchrone une autre partie de l'histoire. Ça arrive parfois, pas tous les jours.

Je pensais que la raison était que les indicateurs ne traitent pas correctement l'historique chargé dynamiquement. J'ai essayé tout ce qui concerne la mise à jour correcte de l'indicateur sur l'historique de mise à jour, je ne sais pas ce qu'il faut faire d'autre pour éviter cela.

Courtier Alpari. MT5 build 2363 du 13.03.2020.

Les captures d'écran montrent d'abord la version "ratée".

Puis la version correcte après la mise à jour manuelle.

//+------------------------------------------------------------------+
bool IsReadyForCalculate(const int rates_total,const int prev_calculated,const datetime &time[])
  {
   //--- подключение терминала и синхронизация данных
   if(TerminalInfoInteger(TERMINAL_CONNECTED))  
      if(!SymbolIsSynchronized(_Symbol) || 
         !SeriesInfoInteger(_Symbol,_Period,SERIES_SYNCHRONIZED))   return(false);
   //--- некорректное значение prev_calculated
   if(prev_calculated<0)                  return(false);
   //---
   if(prev_calculated==0)     prev_time = time[rates_total-1];
   //--- произошли изменения в данных, но prev_calculated не сброшен в 0
   //--- или изменение времени не соответствует одному бару
   if(  (rates_total!=prev_calculated+1 &&
         rates_total!=prev_calculated &&
         prev_calculated!=0) ||
        (time[rates_total-1]>prev_time &&
         time[rates_total-2]!=prev_time))
     {
      loc_prev_calculated = 0;    // чтобы индикатор не висел "голым" до следующей котировки, вычисляю индикатор из того, что есть
      return(true);
     }
   //--- корректный сценарий
   if(  (rates_total==prev_calculated   || rates_total==prev_calculated+1 || prev_calculated==0) &&
        (time[rates_total-1]==prev_time || time[rates_total-2]==prev_time))
     {
      loc_prev_calculated = prev_calculated;
      return(true);
     }
   //--- 
   return(false);       // верну false, пока не знаю, какие варианты ещё могут быть
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],const double &low[],const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
  {
   if(!IsReadyForCalculate(rates_total,prev_calculated,time))     return(0);
//---
        // вызов функции зигзага
   
//--- return value of prev_calculated for next call
   prev_time = time[rates_total-1];
   return(rates_total);
  }
//+------------------------------------------------------------------+
Dossiers :
 

Bonjour.

J'ai cette question dans MQL5. Comment puis-je forcer le lancement de la fonction OnChartEvent() ? Existe-t-il une méthode standard pour le faire ?

Pour cela, j'utilise la fonction ChartNavigate() et je l'exécute depuis OnChartEvent(). Mais cela fonctionne de manière instable - quand beaucoup de ticks arrivent, souvent OnChartEvent() ne redémarre pas après avoir appelé ChartNavigate() pour une raison quelconque. Je n'arrive pas à comprendre comment cela est lié - ChartNavigate() et le taux d'arrivée des tics, mais cela se produit néanmoins.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
inwinterborn:

Bonjour !

Je suis stupide et je n'arrive pas à trouver la solution moi-même. Veuillez me dire quel est le problème ou au moins m'indiquer la bonne direction.


      loc_prev_calculated = 0;    // чтобы индикатор не висел "голым" до следующей котировки, вычисляю индикатор из того, что есть
      return(true);

J'ai peut-être ajouté ça récemment pour rien...

Supprimé
loc_prev_calculated 

Remplacé par...

      return(false);

Je vais garder un œil dessus.


Parlez-moi des indicateurs standard fournis avec le MT5, comment fonctionnent-ils ? Est-ce qu'ils tombent comme je l'ai fait dans les captures d'écran ci-dessus ?

 

Bonjour à tous !
Je maîtrise la double fonction OnTester() et la fonction TesterStatistics( ). J'ai écrit un code simple pour mon testeur dans MT4, qui ouvre un ordre chaque jour à 10:00, à 16:00, à 20:00 et à 01:00. À la fin de l'essai, la fonction TesterStatistics( ) renvoie la plus petite valeur de solde (c'est-à-dire le prélèvement relatif).

PROBLÈME

TesterStatistics( ) renvoie la plus petite valeur de solde pour TOUS les ordres ouverts.

QUESTION

Comment puis-je utiliser une construction linguistique pour que TesterStatistics() renvoie la plus petite valeur de solde uniquement pour un ordre ouvert à une heure donnée, par exemple à 16h00. A ce stade, toutes les commandes spécifiées dans le code doivent être testées simultanément. Cela signifie que TesterStatistics doit suivre la dynamique du solde pour un seul ordre ouvert à 16h00 et, à la fin du test, afficher la valeur minimale du solde uniquement pour l'ordre ouvert à 16h00.

Je vous serais très reconnaissant si vous pouviez insérer la construction linguistique requise dans mon code. Il me permettra de comprendre rapidement l'algorithme de résolution de mon problème.
Voici mon code.

int H;
double  TesterStatistics( );
void OnTick()
{
if (H!=Hour( ))
if (Hour( )==10||Hour( )==16||Hour( )==20||Hour( )==1)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+400*Point,Ask-200*Point,"C2",123 );
H=Hour( );
}
}
double OnTester()
{
TesterStatistics( STAT_BALANCEMIN  );
Print("-----------TesterStatistics( STAT_BALANCEMIN  )--------------",TesterStatistics( STAT_BALANCEMIN  )); 
}
 
ANDREY:

Bonne journée à tous !
J'ai maîtrisé le double OnTester() et TesterStatistics( ). J'ai écrit un code simple pour mon testeur dans MT4, qui ouvre un ordre à 10:00, à 16:00, à 20:00 et à 01:00 chaque jour. À la fin de l'essai, la fonction TesterStatistics renvoie la plus petite valeur de solde (c'est-à-dire le tirage relatif).

PROBLÈME

TesterStatistics( ) renvoie la valeur du solde le plus bas pour TOUS les ordres ouverts.

QUESTION

Quelle construction linguistique peut-on utiliser pour que TesterStatistics() renvoie la plus petite valeur de solde uniquement pour un ordre ouvert à une heure donnée, par exemple à 16h00. A ce stade, toutes les commandes spécifiées dans le code doivent être testées simultanément. Par exemple, TesterStatistics( ) devrait suivre la dynamique du solde d'un seul ordre ouvert à 16h00 et, à la fin du test, renvoyer la valeur minimale du solde pour l'ordre ouvert à 16h00 uniquement.

Je vous serais très reconnaissant, si vous pouviez insérer le langage requis dans mon code. Cela me permettra de comprendre très rapidement l'algorithme pour résoudre mon problème.
Voici mon code.

int H;
double  TesterStatistics( );
void OnTick()

Qu'est-ce que c'est ?

 
 Сергей Таболин
:

C'est ce que c'est ?

Merci pour vos commentaires. Grâce à vous, j'ai réalisé que la spécification de la fonctionTesterStatistics( ) ; avec la déclaration de la variable globale H ... était mon erreur. Je l'ai réparé.

int H;
//double  TesterStatistics( );
void OnTick()
{
if (H!=Hour( ))
if (Hour( )==10||Hour( )==16||Hour( )==20||Hour( )==1)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+400*Point,Ask-200*Point,"C2",123 );
H=Hour( );
}
}
double OnTester()
{
TesterStatistics( STAT_BALANCEMIN  );
Print("-----------TesterStatistics( STAT_BALANCEMIN  )--------------",TesterStatistics( STAT_BALANCEMIN  )); 
}
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Bonjour ! Comment puis-je mettre en œuvre l'affichage des données des barres hautes et basses sur un graphique ? Et mettre en évidence la même couleur.