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

 
Igor Makanu #:

pas du tout

Si vous l'appelez par programme, vous pouvez générer un paramètre de façon aléatoire.

et que vous devez l'exécuter manuellement, vous devrez toujours changer le paramètre d'entrée


essayez de voir ce qu'il y a maintenant dans les macros prédéfinies, il y avait __COUNT___ et maintenant il y a quelque chose avec le hasard, je n'ai pas vérifié comment __COUNT___ fonctionne - il s'avère statique, il a peu d'effet, peut-être que vous pouvez utiliser le hasard pour votre tâche

J'ai trouvé __RANDOM__, mais je dois compiler du code pour changer la valeur. Ou peut-être que je rate quelque chose ?

#define  MACRO __RANDOM__ 
input ulong MASlow = MACRO; // Период медленной МА

Peut-on le modifier à l'exécution d'une manière ou d'une autre ?

__RANDOM__
 
Компилятор для каждого объявления __RANDOM__ подставляет в код случайное ulong-число.
 
 
n'est pas un nouveau numéro à chaque appel ?
 
Fast235 #:
Il n'y a pas un nouveau numéro à chaque appel ?

Non

 
Fast235 #:
n'est pas un nouveau numéro à chaque appel ?
Compilateur, donc au moment de la compilation.
 
Vitaly Muzichenko #:

Non

Eh bien, alors ce n'est pas un problème soluble.

Quel est le problème ? - Vous devez essayer de le formuler différemment.

 
Vitaly Muzichenko #:

Non

Vitaly, c'est pour quoi tout ça ? Est-il nécessaire d'avoir > 1 fenêtre d'indicateur pour obtenir un numéro de fenêtre et y mettre quelque chose ?
 
Alexey Viktorov #:
Vitaliy, pour quoi faire ? Est-il nécessaire d'avoir > 1 fenêtre d'indicateur pour obtenir un numéro de fenêtre et y mettre quelque chose ?

Oui, c'est vrai.

Vous devez obtenir le numéro de la fenêtre où se trouve l'indicateur. Pour ce faire, cliquez sur le bouton et obtenez les données

  if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,(string)wndNum+"_butt")!=-1) {
    Alert("Window number:"+(string)wndNum," => Program name:"+prog_name," => Short name:"+short_name);
    ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
  }

mt4 fonctionne


mt5 ne fonctionne que dans un seul - le premier installé, les copies sont ignorées.


 

On en est arrivé là, il n'y a pas moyen de résoudre le problème de la semaine :(

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
//#property indicator_width1  1

input ulong MASlow = __COUNTER__; // Период медленной МА

//+------------------------------------------------------------------+
int wndNum;
string prog_name,short_name;
double Label1Buffer[];
bool flag=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  prog_name=MQLInfoString(MQL_PROGRAM_NAME);

  int q=0;
  for(int k=1; k<ChartGetInteger(0,CHART_WINDOWS_TOTAL); k++) {
    for(int e=0; e<ChartGetInteger(0,CHART_WINDOWS_TOTAL); e++) {
      if(ChartIndicatorName(0,k,e)==prog_name) {
        q++;
      }
    }
  }

  short_name="Set ("+(string)MASlow+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  wndNum=ChartWindowFind();
  
  wndNum=q;
  
  ButtonCreate(0,(string)wndNum+"_butt",44,18,40,14,CORNER_RIGHT_LOWER,"= "+(string)wndNum+" =","Alert","Arial",9,clrBlack,C'236,233,216',clrGray,false,false,false);
  
  SetIndexBuffer(0,Label1Buffer);
  PlotIndexSetInteger(0,PLOT_LINE_WIDTH,q+1);

  flag=true;

  Print("INIT SUCCEEDED: "+(string)wndNum," => Count: ",q);
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  ObjectsDeleteAll(0,(string)wndNum+"_butt");
  ChartRedraw();
}

//+------------------------------------------------------------------+
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[])
{
  for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++) {
    Label1Buffer[i] = close[i];
  }
  if(flag==false) OnInit();
  return(rates_total);
}

//+------------------------------------------------------------------+
//| OnChartEvent function                                            |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,(string)wndNum+"_butt")!=-1) {
    Alert("Window number:"+(string)wndNum," => Program name:"+prog_name," => Short name:"+short_name);
    ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
  }
  if(id==CHARTEVENT_CHART_CHANGE) {
    ButtonCreate(0,(string)wndNum+"_butt",44,18,40,14,CORNER_RIGHT_LOWER,"= "+(string)wndNum+" =","Alert","Arial",9,clrBlack,C'236,233,216',clrGray,false,false,false);
    OnInit();
  }
}

//===============================================================================================
//--------------------------------------- Создает кнопку ---------------------------------------+
//===============================================================================================
void ButtonCreate(long chart_ID=0,string nm="Button",int xd=0,int yd=0,int width=50,int height=18,int cr=0,
                  string text="Button",string tooltip="Button",string font="Arial",int font_size=9,color clr=clrBlack,
                  color back_clr=C'236,233,216',color border_clr=clrNONE,bool state=false,bool selection=true,bool selectable=true,bool bc=false)
{
  if(ObjectFind(chart_ID,nm)<0) {
    ObjectCreate(chart_ID,nm,OBJ_BUTTON,wndNum,0,0);
    ObjectSetInteger(chart_ID,nm,OBJPROP_XSIZE,width);
    ObjectSetInteger(chart_ID,nm,OBJPROP_YSIZE,height);
    ObjectSetInteger(chart_ID,nm,OBJPROP_CORNER,cr);
    ObjectSetString(chart_ID,nm,OBJPROP_TEXT,text);
    ObjectSetString(chart_ID,nm,OBJPROP_TOOLTIP,tooltip);
    ObjectSetString(chart_ID,nm,OBJPROP_FONT,font);
    ObjectSetInteger(chart_ID,nm,OBJPROP_FONTSIZE,font_size);
    ObjectSetInteger(chart_ID,nm,OBJPROP_COLOR,clr);
    ObjectSetInteger(chart_ID,nm,OBJPROP_BGCOLOR,back_clr);
    ObjectSetInteger(chart_ID,nm,OBJPROP_BORDER_COLOR,border_clr);
    ObjectSetInteger(chart_ID,nm,OBJPROP_BACK,bc);
    ObjectSetInteger(chart_ID,nm,OBJPROP_STATE,state);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTABLE,selectable);
    ObjectSetInteger(chart_ID,nm,OBJPROP_SELECTED,selection);
    ObjectSetInteger(chart_ID,nm,OBJPROP_HIDDEN,false);
    ObjectSetInteger(chart_ID,nm,OBJPROP_YDISTANCE,yd);
    ObjectSetInteger(chart_ID,nm,OBJPROP_ZORDER,10);
    ObjectSetInteger(chart_ID,nm,OBJPROP_XDISTANCE,xd);
    ChartRedraw();
  }
}
//+------------------------------------------------------------------+
 
Vitaly Muzichenko #:

Oui, c'est vrai.

Vous devez obtenir le numéro de la fenêtre où se trouve l'indicateur. Pour ce faire, cliquez sur le bouton et obtenez les données

mt4 fonctionne


mt5 ne fonctionne que dans un seul - le premier installé, il ignore les copies


Eh bien, apparemment, c'est une conséquence de l'augmentation de la productivité... Pourquoi recalculer l'indicateur 100500 fois au gré d'un utilisateur pas très malin ? Mais il se trouve que certaines fonctionnalités souffrent d'une protection.

Il est probablement nécessaire d'entrer un paramètre externe dans le nom court de l'indicateur.

input int MAFast = 8;  // Период быстрой МА
input string shortName = "1";  // Префикс…
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  short_name = shortName+MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  Print("INIT_SUCCEEDED");
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Cela fonctionne de cette façon. Testé.

 
Alexey Viktorov #:

Eh bien, apparemment, c'est une conséquence de l'augmentation des performances... Pourquoi recalculer l'indicateur 100500 fois au gré des caprices d'un utilisateur pas très futé ? Mais il se trouve que certaines fonctionnalités souffrent d'une protection.

Il est probablement nécessaire d'entrer un paramètre externe dans le nom court de l'indicateur.

Cela fonctionne de cette façon. Testé.

Encore une fois, faut-il changer le préfixe lors du chargement de la prochaine copie ?

Raison: