Questions des débutants MQL5 MT5 MetaTrader 5 - page 353

 
_new-rena:

Ceci (ci-dessous) ne fonctionne pas, j'ai tapé F_Path dans l'explorateur, cliqué sur entrée, le fichier s'ouvre... L'info WinApi ressemble-t-elle à cela?

Qui empêche l'utilisation du drapeau FILE_COMMON en écriture et en lecture ? Le fichier sera disponible pour tous les terminaux installés sur le système. Il sera dans le dossier partagé de tous les terminaux.

Dans ME File --> Ouvrir le dossier de données partagées

 
artmedia70:

Qui empêche l'utilisation du drapeau FILE_COMMON en écriture et en lecture ? Le fichier sera disponible pour tous les terminaux installés sur le système. Il sera situé dans le dossier partagé de tous les terminaux.

Dans ME File --> Ouvrir le dossier de données partagées

Merci ( !!!), je vais essayer.
 

Bonjour, quelqu'un a-t-il rencontré ce problème lors de la création d'une demande de transaction avec des paramètres :

si je mets les paramètres suivants :

mrequest.action=TRADE_ACTION_DEAL ;
mrequest.type_filling=ORDER_FILLING_FOK ;

mrequest.type=ORDER_TYPE_BUY ;

le terminal m'annonce que j'ai spécifié une méthode invalide mrequest.type_filling(politique d'exécution de l'ordre) ; si je spécifie mrequest.type_filling=ORDER_FILLING_RETURN, l'ordre est ouvert mais je ne peux pas le fermer par programme car le terminal signale qu'une méthode invalide est utilisée. J'exécute le conseiller expert sur un serveur forex et tout fonctionne bien sur les autres serveurs. Quelqu'un peut-il écrire une politique d'exécution des ordres qui puisse être utilisée lors du développement de robots de trading pour ce courtier ? Merci.
 

Il existe un indicateur mq4 avec fonction d'alerte.

Par exemple :

//+------------------------------------------------------------------+
//|                                                    RSI-Alert.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
//#property indicator_minimum 0
//#property indicator_maximum 100
#property indicator_buffers 3
#property  indicator_color1 LightSeaGreen
#property  indicator_color2 CLR_NONE
#property  indicator_color3 CLR_NONE
#property  indicator_width1 1
#property  indicator_width2 1
#property  indicator_width3 1
#property  indicator_style1 STYLE_SOLID
#property  indicator_style2 STYLE_DOT
#property  indicator_style3 STYLE_DOT
//---- input parameters
extern int RSIPeriod=48;
extern int ApplyTo=0;
extern bool AlertMode=true;
extern int OverBought=0;
extern int OverSold=0;
//---- buffers
double RSIBuffer[];
double RSIOBBuffer[];
double RSIOSBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,RSIBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,RSIOBBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,RSIOSBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="RSI-Alert("+RSIPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"OverBought");
   SetIndexLabel(2,"OverSold");
//----
   SetIndexDrawBegin(0,RSIPeriod);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
//----
   if(Bars<=RSIPeriod) return(0);
//----
   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
   {
      RSIBuffer[i]=iForce(NULL,0,RSIPeriod,1,0,i);
      RSIOBBuffer[i]=OverBought;
      RSIOSBuffer[i]=OverSold;
      i--;
   }
   
   if(AlertMode)
   {
      if(RSIBuffer[1]<OverBought && RSIBuffer[0]>=OverBought)
         Alert("RSI = "+ RSIBuffer[i]+ ", Sell.");
      else if(RSIBuffer[1]>OverSold && RSIBuffer[0]<=OverSold)
         Alert("RSI = "+ RSIBuffer[i]+ ", Buy.");
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Comment faire en sorte que, soit dans le coin supérieur gauche de la sous-fenêtre (où le nom et les paramètres de l'indicateur sont habituellement affichés), soit ailleurs, on indique si le signal est activé(extern bool AlertMode=true ;) ou désactivé ?
 
Nilog:

Il existe un indicateur mq4 avec fonction d'alerte.

Par exemple :

Comment faire en sorte que, soit dans le coin supérieur gauche de la sous-fenêtre (où le nom de l'indicateur et les paramètres sont habituellement affichés), soit d'une autre manière, pour indiquer si le signal est activé(extern bool AlertMode=true ;) ou désactivé ?
Sortie de texte par objets par exemple.
 

C'est ce que dit la documentation :

При тестировании в эксперте можно обрабатывать пользовательские события с помощью функции OnChartEvent(), но в индикаторах эта функция в тестере не вызывается. Даже если индикатор имеет обработчик OnChartEvent() и этот индикатор используется в тестируемом эксперте, то сам индикатор не будет получать никаких пользовательских событий.

Pour le moment, cette déclaration n'est pas pertinente - dans les indicateurs, cette fonction est appelée dans le testeur, au moins un indicateur peut recevoir des événements générés par un autre indicateur dans le testeur.

Le problème est qu'une fois que l'indicateur reçoit l'appel de cette fonction, il n'a pas accès aux données stockées dans les variables déclarées au niveau global, et vice versa - toutes les modifications effectuées dans cette fonction ne sont pas stockées dans les variables de niveau d'accès global.

Exemples :

1. L'objet est déclaré globalement et initialisé dans la fonction OnInit. Il est possible d'y accéder à partir de la fonction OnCalculate, mais nous obtenons un message d'erreur dans la fonction OnChartEvent - pointeur invalide.

2. il existe une fonction qui envoie le contenu d'une variable au journal (la variable est déclarée globalement). Lorsque nous appelons cette fonction à partir de OnCalculate, nous obtenons la valeur attendue, mais lorsque nous appelons la même fonction à partir de OnChartEvent, nous obtenons un non-sens.

 

Bonne journée !

J'ai été confronté à un problème lors de l'utilisation d'événements, notamment la fonction OnChartEvent() dans un indicateur. Lorsqu'on l'utilise dans un conseiller expert, il n'y a pas de problème, mais dans l'indicateur, il ne fonctionne pas correctement. C'est-à-dire que l'événement se produit mais qu'il n'y a aucun moyen de modifier les champs existants. Exemple :

//----------------------------------------------------------------------------------------------
int k ;
int OnInit()
{
k = 0 ;
ihandleDE = iCustom(_Symbol, _Period, "DrawExtremums") ;
//< ... >
return(INIT_SUCCEEDED) ;
}

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[])
{
Print("OnCalculate() : k =", k);
//< ... >
return(rates_total)

}

void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
string nameEv = "EXTR_UP" ;
if (sparam == nameEv)
{
Print("OnChartEvent() : k = ", k) ;
k++ ;

}

}

//----------------------------------------------------------------------------------------------

Par conséquent, nous obtenons :

"OnCalculate() : k = 0" - toujours.

"OnChartEvent() : k = 0,...,123332" - compte de 0 à ...

Comment cela peut-il être et pourquoi ? Y a-t-il un moyen de le réparer ? Si quelqu'un comprend, une réponse serait très appréciée.

P.S. : Cette injustice se produit uniquement dans le testeur de stratégie, en temps réel tout fonctionne bien.

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
dariamap:

Bonne journée !

J'ai été confronté à un problème lors de l'utilisation d'événements, notamment la fonction OnChartEvent() dans un indicateur. Lorsqu'on l'utilise dans un conseiller expert, il n'y a pas de problème, mais dans l'indicateur, il ne fonctionne pas correctement. C'est-à-dire que l'événement se produit mais qu'il n'y a aucun moyen de modifier les champs existants. Exemple :

//----------------------------------------------------------------------------------------------
int k ;
int OnInit()
{
k = 0 ;
ihandleDE = iCustom(_Symbol, _Period, "DrawExtremums") ;
//< ... >
return(INIT_SUCCEEDED) ;
}

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[])
{
Print("OnCalculate() : k =", k);
//< ... >
return(rates_total)

}

void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
string nameEv = "EXTR_UP" ;
if (sparam == nameEv)
{
Print("OnChartEvent() : k = ", k) ;
k++ ;

}

}

//----------------------------------------------------------------------------------------------

Par conséquent, nous obtenons :

"OnCalculate() : k = 0" - toujours.

"OnChartEvent() : k = 0,...,123332" - compte de 0 à ...

Comment cela peut-il être et pourquoi ? Y a-t-il un moyen de le réparer ? Si quelqu'un comprend, une réponse serait très appréciée.

P.S. : Cette injustice se produit uniquement dans le testeur de stratégie, en temps réel tout fonctionne bien.

Soirée. En son temps, le Service Desk a donné une réponse assez précise à ce sujet : le terminal et le testeur de stratégie sont deux programmes différents, et les performances des Expert Advisors/indicateurs dans le testeur et le terminal peuvent être différentes. Ce qui fonctionne souvent dans le terminal client ne fonctionne pas dans le Strategy Tester. Écrivez au Service Desk, fournissez des preuves et laissez-le résoudre le problème.
 
Tapochun:
Bonsoir. À l'époque, le Service Desk avait donné une réponse assez précise à ce sujet : le terminal et le testeur de stratégie sont deux programmes différents, et le travail des conseillers-experts/indicateurs dans le testeur et dans le terminal peut différer sensiblement. Ce qui fonctionne souvent dans le terminal client ne fonctionne pas dans le Strategy Tester. Veuillez écrire au Service Desk et leur fournir des preuves pour qu'ils puissent résoudre le problème.
Merci beaucoup ! Je suis content que le problème ne soit pas moi)
 
extern string Symbol1= "EURUSD";
extern string Symbol2= "GBRUSD";

  double Sell1=iFractals(Symbol1,240,MODE_UPPER,2);
  double Sell2=iFractals(Symbol2,240,MODE_UPPER,2);
Pouvez-vous me dire quelle commande écrire pour que lorsque les fractales Sell1 et Sell2 sont ouvertes en même temps, un ordre soit ouvert.
Raison: