Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1344

 
Igor Makanu #:

auf keinen Fall

Wenn Sie die Funktion programmatisch aufrufen, können Sie einen Parameter zufällig generieren

und Sie es manuell ausführen müssen, müssen Sie trotzdem den Eingabeparameter ändern


versuchen Sie zu sehen, was jetzt in den vordefinierten Makros ist, war __COUNT___ und jetzt gibt es etwas mit random, ich habe nicht überprüft, wie __COUNT___ funktioniert - es stellt sich heraus, statisch, es hat wenig Wirkung, vielleicht können Sie random für Ihre Aufgabe verwenden

Ich habe __RANDOM__ gefunden, aber ich muss Code kompilieren, um den Wert zu ändern. Oder übersehe ich vielleicht etwas?

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

Kann sie zur Laufzeit irgendwie geändert werden?

__RANDOM__
 
Компилятор для каждого объявления __RANDOM__ подставляет в код случайное ulong-число.
 
 
ist nicht bei jedem Anruf eine neue Nummer?
 
Fast235 #:
Gibt es nicht bei jedem Anruf eine neue Nummer?

Nein

 
Fast235 #:
ist nicht bei jedem Anruf eine neue Nummer?
Compiler, also zur Kompilierzeit.
 
Vitaly Muzichenko #:

Nein

Nun, dann ist es nicht lösbar.

Was ist das Problem? - Man muss versuchen, es anders zu formulieren.

 
Vitaly Muzichenko #:

Nein

Vitaly, wofür ist das alles gut? Ist es notwendig, mehr als 1 Indikatorfenster zu haben, um eine Fensternummer zu erhalten und etwas in dieses Fenster zu setzen?
 
Alexey Viktorov #:
Vitaliy, wozu? Ist es notwendig, mehr als 1 Indikatorfenster zu haben, um eine Fensternummer zu erhalten und etwas in dieses Fenster zu setzen?

Ja, das ist richtig.

Sie müssen die Nummer des Fensters ermitteln, in dem sich der Indikator befindet. Klicken Sie dazu auf die Schaltfläche und rufen Sie die Daten ab

  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 arbeitet


mt5 funktioniert nur in einem - dem ersten installierten, Kopien werden ignoriert


 

Es ist so weit, das Problem der Woche lässt sich nicht lösen :(

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

Ja, das ist richtig.

Sie müssen die Nummer des Fensters ermitteln, in dem sich der Indikator befindet. Klicken Sie dazu auf die Schaltfläche und rufen Sie die Daten ab

mt4 arbeitet


mt5 funktioniert nur in einem - dem ersten installierten, es ignoriert Kopien


Nun, offenbar ist dies eine Folge der erhöhten Produktivität ... Warum den Indikator 100500 Mal nach Lust und Laune eines nicht sehr klugen Benutzers neu berechnen? Aber es ist nun einmal so, dass einige Funktionen unter dem Schutz leiden.

Wahrscheinlich müssen Sie einen externen Parameter in den Kurznamen des Indikators eingeben.

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

Es funktioniert folgendermaßen. Getestet.

 
Alexey Viktorov #:

Nun, offenbar ist dies eine Folge der erhöhten Leistung... Warum den Indikator 100500 Mal neu berechnen, nur weil ein nicht ganz so intelligenter Benutzer es will? Aber es ist nun einmal so, dass einige Funktionen unter dem Schutz leiden.

Wahrscheinlich müssen Sie einen externen Parameter in den Kurznamen des Indikators eingeben.

Es funktioniert folgendermaßen. Getestet.

Muss das Präfix beim Laden der nächsten Kopie wieder geändert werden?