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

 
Anttonnio:

Grüße!


Können Sie mir sagen, wie ich ein Array von Instu

Ich versuche, es so zu machen:

Eingabe double Df_1 = 0,8;

Eingabe double Df_2 = 0,1;

Eingabe double Df_3 = 0,3;


const double Df[3] = {Df_1 ,Df_2 ,Df_3 };


aber es wird ein Fehler erzeugt:

Df_1" - konstanter Ausdruck erforderlich

Df_2" - konstanter Ausdruck erforderlich

Df_3" - konstanter Ausdruck erforderlich

Unter Bezugnahme auf die Array-Initialisierungszeichenfolge

Eine Variante:

input double   Df_0 = 0.8;
input double   Df_1 = 0.1;
input double   Df_2=0.3;
double Df[3];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+ 
void OnInit()
  {
   Df[0]=Df_0;
   Df[1]=Df_1;
   Df[2]=Df_2;

(Fügen Sie den Code korrekt in das Forum ein)

 
Rafil Nurmukhametov:

Mitdiesen Funktionen ChartTimePriceToXY und ChartXYToTimePrice können Sie überall anordnen

Nicht genug Köpfchen, um herauszufinden, wie man es macht. Hier habe ich es auf die altmodische Weise gemacht, schief, aber es funktioniert. Und niemand kann Ihnen zeigen, wie man es mit den Funktionen ChartTimePriceToXY und ChartXYToTimePrice schön aussehen lässt, oder Ihnen einen Link zu einem funktionierenden Codebeispiel geben.
 
Leo59:
Ich habe nicht den Verstand, um herauszufinden, wie man das macht. Hier habe ich es auf die altmodische Art und Weise gemacht, krumm und schräg, aber es funktioniert. Und niemand kann Ihnen zeigen, wie man es mit den Funktionen ChartTimePriceToXY und ChartXYToTimePrice schön aussehen lässt, oder Ihnen einen Link zu einem funktionierenden Codebeispiel geben.
#property  indicator_chart_window

extern int History = 35;                                              // Сколько баров мы имеем ввиду
extern int Multiple = 5;                                              // Кратность отображаемой разметки
color    Color=0;
color    Color_multiple=Moccasin;                                     // Цвет индексов кратных "Multiple"
color    Color_between=MintCream;                                     // Цвет индексов промежуточных 
string   name="", name2="";
string   Text="";
int      Font_size=0;
int      Font_size_multiple=14;                                       // Размер шрифта индексов кратных "Multiple"
int      Font_size_between=8;                                         // Размер шрифта индексов промежуточных

bool     Back=true;                                                   //--- отобразим на переднем (false) или заднем (true) плане. Если (true), то подсветки дат не выводится
string   Font="Arial";                                                // Шрифт
double   Angle=0.0;                                                 // Угол наклона в градусах

int      Style=STYLE_DOT;                                             // Для всех - стиль пунктир
int      Width=1;                                                     // Толщина линии
int      x,y=10,y2;
double    _price;
datetime  dt;
int       window;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
//+------------------------------------------------------------------+
//| Custom indicator initialization function                    F  1 | int init()
//+------------------------------------------------------------------+
int init()
  {
//    IndicatorShortName(IN + " (" + ")");                              // Короткое имя индикатора
   return(INIT_SUCCEEDED);                                           // Успешная инициализация приложения
  }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
//+------------------------------------------------------------------+
//| expert deinitialization function                             F 2 | int deinit()
//+------------------------------------------------------------------+
int deinit() // Время исполнения специальной функции deinit() ограничено периодом 2,5 секунды.
  {
   ObjectsDeleteAll(0,"label",0);                                  // Идентификатор графика, префикс имени объекта, индекс окна
   ObjectsDeleteAll(0,"text",0);
   return(0);                                                        // Выход из deinit()
  }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
//+------------------------------------------------------------------+
//| Custom indicator iteration function                         F  3 | int start()
//+------------------------------------------------------------------+
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[])
  {
   int i=0;

   int limit=Bars-IndicatorCounted()-1;
   if(limit>1) limit=MathMin(Bars,History+(History==0)*Bars)-1;
   for(i=0; i<History; i++)
     {
      name="label "+i;
      name2= "text "+i;
      Text = DoubleToStr(i,0);

      if(MathMod(i,Multiple)==0) // MathMod() Возвращает вещественный остаток от деления двух чисел (i/Multiple).
        {
         Color=Color_multiple;
         Font_size=Font_size_multiple;

         if(ObjectFind(0,name)==-1) // Если объект "name" не найден
           {
            ObjectCreate(0,name,OBJ_VLINE,0,Time[i],0);             // Создаем объект..
            ObjectSetInteger(0,name,OBJPROP_STYLE,Style);           //--- установим стиль отображения линии
            ObjectSetInteger(0,name,OBJPROP_WIDTH,Width);           //--- установим толщину линии
            ObjectSetInteger(0,name,OBJPROP_COLOR,Color);           //--- установим цвет

            if(ChartTimePriceToXY(0,0,time[i],close[i],x,y2))
              {
               if(x<0) continue;
              }
            else
               Print(__FUNCTION__," return error code: ",GetLastError());
            if(ChartXYToTimePrice(0,x,y,window,dt,_price))
              {
               if(!ObjectCreate(0,name2,OBJ_TEXT,0,time[i],_price))
                 {
                  Print(__FUNCTION__,
                        ": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
                 }
               //--- установим угол графика, относительно которого будут определяться координаты точки 
               ObjectSetInteger(0,name2,OBJPROP_CORNER,CORNER_LEFT_UPPER);
               //--- установим текст 
               ObjectSetString(0,name2,OBJPROP_TEXT,IntegerToString(i));
               //--- установим шрифт текста 
               ObjectSetString(0,name2,OBJPROP_FONT,"Arial");
               //--- установим размер шрифта 
               ObjectSetInteger(0,name2,OBJPROP_FONTSIZE,12);
               //--- установим угол наклона текста 
               ObjectSetDouble(0,name2,OBJPROP_ANGLE,0);
               //--- установим способ привязки 
               ObjectSetInteger(0,name2,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
               //--- установим цвет 
               ObjectSetInteger(0,name2,OBJPROP_COLOR,clrBlue);
               //--- отобразим на переднем (false) или заднем (true) плане 
               ObjectSetInteger(0,name2,OBJPROP_BACK,false);
               //--- включим (true) или отключим (false) режим перемещения метки мышью 
               ObjectSetInteger(0,name2,OBJPROP_SELECTABLE,false);
               ObjectSetInteger(0,name2,OBJPROP_SELECTED,false);
               //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
               ObjectSetInteger(0,name2,OBJPROP_HIDDEN,true);
               //--- установим приоритет на получение события нажатия мыши на графике 
               ObjectSetInteger(0,name2,OBJPROP_ZORDER,0);
              }
            else
               Print(__FUNCTION__," return error code: ",GetLastError());

           }
         else                                                        // Если объект "name" найден
           {
            ObjectMove(0,name,0,Time[i],0);                     // Сообщение новых координат. 
           }
        }
/*  else
             {
              Color = Color_between;
              Font_size = Font_size_between;

              if(ObjectFind(0, name)==-1)                                  // Если объект "name" не найден
                  {
                   ObjectCreate(0,name,OBJ_VLINE,0,Time[i],0);             // Создаем объект..
                   ObjectSetInteger(0,name,OBJPROP_STYLE,Style);           //--- установим стиль отображения линии
                   ObjectSetInteger(0,name,OBJPROP_WIDTH,Width);           //--- установим толщину линии
                   ObjectSetInteger(0,name,OBJPROP_COLOR,Color);           //--- установим цвет
                   ObjectSetString(0,name,OBJPROP_TEXT,Text);              //--- установим текст
                   ObjectSetString(0,name,OBJPROP_FONT,Font);              //--- установим шрифт текста
                   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,Font_size);    //--- установим размер шрифта
                   ObjectSetDouble(0,name,OBJPROP_ANGLE,Angle);            //--- установим угол наклона текста
                   // Для отображения текстового описания объекта необходимо включить галочку опции "Показывать описания объектов" в окне Графики->Свойства финансового инструмента (F8) > Общие.         
                   ObjectSetInteger(0,name,OBJPROP_BACK, Back);            //--- отобразим на переднем (false) или заднем (true) плане
                  }
               else                                                        // Если объект "name" найден
                  {
                   ObjectMove(0,name, 0, Time[i], 0);                     // Сообщение новых координат. 
                  }
             }*/
     }
   return(rates_total);
  }

Ich habe Ihren Code nicht umgeschrieben, sondern nur einen Schnipsel hinzugefügt, wie die Funktionen zu verwenden sind

 
Rafil Nurmukhametov:

Ich habe Ihren Code nicht umgeschrieben, sondern nur einen Schnipsel über die Verwendung von Funktionen hinzugefügt

Oh, Rafil, ..... das ist so unerwartet und vor allem so nett, dass ich sogar verwirrt bin... VIELEN DANK!!!!! SUPER!!!! Wahrscheinlich genau das, was ich brauchte!!!! Es ist jetzt tief in der Nacht, und morgen früh werde ich versuchen, mir einen Reim darauf zu machen))

 
Rafil Nurmukhametov:

Ich habe Ihren Code nicht umgeschrieben, sondern nur ein Fragment zur Verwendung von Funktionen hinzugefügt

Leider werden in Ihrer Version, Rafil, die Ziffern nicht bei jedem neuen Balken neu gezeichnet und nicht an der oberen (in Ihrer Version) Grenze des Fensters skaliert.

Meine Variante:


Ihre, Rafil, Variante:


 
Leo59:

Leider werden in Ihrer Version, Rafil, die Zahlen nicht bei jedem neuen Balken neu gezeichnet und nicht an der oberen (in Ihrer Version) Grenze des Fensters skaliert.

Meine Variante:


Ihre, Rafil, Option:



Ich nehme an, Sie brauchen es?


 
Rafil Nurmukhametov:

Ich nehme an, Sie brauchen das? Klicken Sie auf das Bild


Aus der Animation in Ihrem Bild können Sie ersehen, dass die Taktzahlen am oberen Rand des Fensters positioniert sind. Was passiert, wenn ein neuer Balken gebildet wird? Vielleicht hätte die Dauer des Clips etwas länger sein sollen, bevor ein neuer Balken gebildet wird, um dies zu verdeutlichen?
 

Wenn ich einen Indikatorparameter vom Typ ENUM_TIMEFRAMES über die Struktur MqlParam übergeben möchte, welchen Typ sollte ich für diesen Parameter angeben?

InENUM_DATATYPE gibt es keinen Typ ENUM_TIMEFRAMES und andere Aufzählungen.

 
Leo59:
Ihre Animation zeigt, dass sich die Balken am oberen Rand des Fensters befinden. Was passiert, wenn ein neuer Balken gebildet wird? Vielleicht hätte die Dauer der Animation etwas länger sein sollen, bevor ein neuer Balken gebildet wird, um dies zu verdeutlichen?

Tut mir leid, ich habe den Moment nicht erwischt, als die neue Leiste erschien, schauen Sie genau hin, das Bild unten...

und der Code selbst, y_pos - Anzahl der Pixel vom oberen Rand, wenn Sie den unteren wollen, verwenden SieCHART_HEIGHT_IN_PIXELS oderCHART_WINDOW_YDISTANCE


//|                                                    indexBars.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window 
#property indicator_buffers 0 
#property indicator_plots   0 

int     y_pos=10,     //--- координата по Y для текстовой метки
        x_pos,        //--- координата по Х для текстовой метки  
        y2, bars,             
        visibleBars=0,//--- количество баров в видимой части графика
        indexBars=0;  //--- индекс левого крайнего бара в видимой части графика
double  price;         
string  names="text"; 
datetime times[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
   EventSetMillisecondTimer(100);
   MqlTick last_tick;
   if(SymbolInfoTick(Symbol(),last_tick)) price=last_tick.last;
   else Print("SymbolInfoTick() failed, error = ",GetLastError());

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
   ObjectsDeleteAll(0,names);
  }
//+------------------------------------------------------------------+ 
//| 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[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   bars=Bars(_Symbol, _Period);
   if(bars<=0) return;
   if(CopyTime(_Symbol, _Period, 0, bars, times)<=0) return;
//--- перевернем доступ к массиву times[] - сделаем как в таймсерии 
   ArraySetAsSeries(times,true);
//--- если изменился номер крайнего индекса или кол-во видимых баров на графике, то отрисуем     
   if(indexBars!=ChartFirstVisibleBar() || visibleBars!=ChartVisibleBars())
     {
      indexBars=ChartFirstVisibleBar();            //запомним новое значение
      visibleBars=ChartVisibleBars();
      int a=indexBars-visibleBars;
      ObjectsDeleteAll(0,names);
      for(int i=indexBars;  i>a; i--)
        {
         if(ChartTimePriceToXY(0,0,times[i],price,x_pos,y2))
           {
            string nname=names+IntegerToString(i);
            if(!LabelCreate(0,nname,0,x_pos,y_pos,0,IntegerToString(i,0)))
               Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
           }
         else
            Print(__FUNCTION__," return error code: ",GetLastError());
        }
     }
   ChartRedraw();
  }
//+------------------------------------------------------------------+ 
//| Создает текстовую метку                                          | 
//+------------------------------------------------------------------+ 
bool LabelCreate(const long              chart_ID=0,               // ID графика 
                 const string            name="Label",             // имя метки 
                 const int               sub_window=0,             // номер подокна 
                 const int               x=0,                      // координата по оси X 
                 const int               y=0,                      // координата по оси Y 
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки 
                 const string            text="Label",             // текст 
                 const string            font="Arial",             // шрифт 
                 const int               font_size=10,             // размер шрифта 
                 const color             clr=clrRed,               // цвет 
                 const double            angle=0.0,                // наклон текста 
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки 
                 const bool              back=false,               // на заднем плане 
                 const bool              selection=false,          // выделить для перемещений 
                 const bool              hidden=true,              // скрыт в списке объектов 
                 const long              z_order=0)                // приоритет на нажатие мышью 
  {
//--- сбросим значение ошибки 
   ResetLastError();
//--- создадим текстовую метку 
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим координаты метки 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста 
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки 
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение 
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Функция получает номер первого видимого бара на графике.         | 
//| Индексация как в таймсерии, последние бары имеют меньшие индексы.| 
//+------------------------------------------------------------------+ 
int ChartFirstVisibleBar(const long chart_ID=0)
  {
//--- подготовим переменную для получения значения свойства 
   long result=-1;
//--- сбросим значение ошибки 
   ResetLastError();
//--- получим значение свойства 
   if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- вернем значение свойства графика 
   return((int)result);
  }
//+------------------------------------------------------------------+ 
//| Функция получает количество баров, которые отображаются (видимы )| 
//| в окне графика.                                                  | 
//+------------------------------------------------------------------+ 
int ChartVisibleBars(const long chart_ID=0)
  {
//--- подготовим переменную для получения значения свойства 
   long result=-1;
//--- сбросим значение ошибки 
   ResetLastError();
//--- получим значение свойства 
   if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- вернем значение свойства графика 
   return((int)result);
  }
//+------------------------------------------------------------------+
 
Rafil Nurmukhametov:

Tut mir leid, ich habe den Moment nicht erwischt, als die neue Leiste erschien, schauen Sie genau hin, das Bild unten...

und den Code, y_pos - Anzahl der Pixel vom oberen Rand. Wenn Sie den unteren Rand wünschen, verwenden SieCHART_HEIGHT_IN_PIXELS oderCHART_WINDOW_YDISTANCE


Rafil, du musst dich für nichts entschuldigen. Was Sie getan haben, verdient Respekt und Nachahmung. Ich bin sehr zufrieden! Und der Punkt ist nicht einmal die Tatsache, dass Sie getan haben, WAS ich brauchte, sondern Ihre Einstellung zu Menschen, die Aufmerksamkeit, Unterstützung und Hilfe brauchen. Du, Rafil, bist einer der wenigen, die das wissen und können. Kann mehr als nur den Rat geben, die Taste "F1" zu drücken. UNENDLICHEN DANK AN SIE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!...

Mit tiefem Respekt, Leonid Belsky.

Grund der Beschwerde: