Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1344

 
Igor Makanu #:

de maneira nenhuma

Se lhe chamar programática, pode gerar um parâmetro de forma aleatória

e precisa de o executar manualmente, terá ainda de alterar o parâmetro de entrada


tente ver o que está agora nas macros predefinidas, foi __COUNT___ e agora há algo com aleatório, não verifiquei como funciona __COUNT___- torna-se estático, tem pouco efeito, talvez possa usar aleatório para a sua tarefa

Encontrei __RANDOM__, mas preciso de compilar código para alterar o valor. Ou talvez me esteja a escapar alguma coisa?

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

Pode ser alterado de alguma forma no momento da execução?

__RANDOM__
 
Компилятор для каждого объявления __RANDOM__ подставляет в код случайное ulong-число.
 
 
não é um novo número em cada chamada?
 
Fast235 #:
não há um novo número em cada chamada?

Não

 
Fast235 #:
não é um novo número em cada chamada?
Compilador, por isso em tempo de compilação.
 
Vitaly Muzichenko #:

Não

Bem, então o problema é insolúvel.

Qual é o problema? - É preciso tentar formulá-lo de forma diferente.

 
Vitaly Muzichenko #:

Não

Vitaly, para que serve tudo isto? É necessário ter > 1 janela indicadora para obter um número de janela e colocar algo nela?
 
Alexey Viktorov #:
Vitaliy, para quê? É necessário ter > 1 janela indicadora para obter um número de janela e colocar algo nela?

Sim, é isso mesmo.

É necessário obter o número da janela onde se encontra o indicador. Para o fazer, clique no botão e obtenha os dados

  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);
  }

obras do mt4


mt5 só funciona num - o primeiro instalado, as cópias são ignoradas


 

Chegados a este ponto, não há maneira de resolver o problema da semana :(

//+------------------------------------------------------------------+
//|                                                      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 #:

Sim, é isso mesmo.

É necessário obter o número da janela onde se encontra o indicador. Para o fazer, clique no botão e obtenha os dados

obras do mt4


mt5 só funciona em uma - a primeira instalada, ignora as cópias


Bem, aparentemente isto é uma consequência do aumento da produtividade ... Porquê recalcular o indicador 100500 vezes por capricho de um utilizador pouco inteligente? Mas acontece que algumas características sofrem de protecção.

Provavelmente, é necessário introduzir um parâmetro externo no nome curto do indicador.

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);
 }/******************************************************************/

Funciona desta forma. Testado.

 
Alexey Viktorov #:

Bem, aparentemente isto é uma consequência do aumento do desempenho... Porquê recalcular o indicador 100500 vezes por capricho de um utilizador não tão esperto? Mas acontece que algumas características sofrem de protecção.

Provavelmente, é necessário introduzir um parâmetro externo no nome curto do indicador.

Funciona desta forma. Testado.

Mais uma vez, precisa de alterar o prefixo ao carregar a próxima cópia?