Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 810

 
Anttonnio:

Saludos.


Me pueden decir cómo hacer una matriz de instu

Estoy tratando de hacerlo así:

entrada doble Df_1 = 0,8;

entrada doble Df_2 = 0,1;

entrada doble Df_3 = 0,3;


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


pero genera un error :

'Df_1' - expresión constante requerida

'Df_2' - expresión constante requerida

'Df_3' - expresión constante requerida

Refiriéndose a la cadena de inicialización de la matriz

Una 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;

(Inserte el código correctamente en el foro)

 
Rafil Nurmukhametov:

Conestas funciones ChartTimePriceToXY y ChartXYToTimePrice se pueden organizar en cualquier lugar

No hay suficiente cerebro para averiguar cómo hacerlo. Aquí lo he hecho a la antigua, torcido, pero funciona. Y nadie puede mostrarte cómo hacer que se vea bien usando las funciones ChartTimePriceToXY y ChartXYToTimePrice o proporcionarte un enlace a un ejemplo de código que funcione.
 
Leo59:
No tengo el cerebro para averiguar cómo hacerlo. Aquí lo hice a la vieja usanza, torcido e inclinado, pero funciona. Y nadie puede mostrarte cómo hacer que se vea bien usando las funciones ChartTimePriceToXY y ChartXYToTimePrice o proporcionarte un enlace a un ejemplo de código que funcione.
#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);
  }

No he reescrito tu código, sólo he añadido un fragmento de cómo utilizar las funciones

 
Rafil Nurmukhametov:

no reescribió su código, sólo añadió un fragmento sobre el uso de funciones

Ooh, Rafil, ..... esto es tan inesperado, y sobre todo, tan bonito, que hasta me confunde... ¡¡¡¡¡MUCHAS GRACIAS!!!!! ¡¡¡¡SUPER!!!! ¡¡¡¡Probablemente es lo que necesitaba !!!! Ya es de noche, y por la mañana intentaré darle sentido))

 
Rafil Nurmukhametov:

No he reescrito tu código, sólo he añadido un fragmento sobre el uso de funciones

Pero en tu versión, Rafil, los dígitos no se redibujan en cada nueva barra y no se escalan en el límite superior (en tu versión) de la ventana.

Mi variante:


Tu, Rafil, variante:


 
Leo59:

Pero en tu versión, Rafil, los dígitos no se redibujan en cada nueva barra y no se escalan en el límite superior (en tu versión) de la ventana.

Mi variante:


Tu, Rafil, opción:



¿Supongo que lo necesitas?


 
Rafil Nurmukhametov:

¿Supongo que necesitas esto? haz clic en la imagen


En la animación de tu foto puedes ver que los números de la barra están colocados en el borde superior de la ventana. ¿Qué ocurre cuando se forma una nueva barra? ¿Tal vez la duración del clip debería haber sido ligeramente más larga, antes de que se forme una nueva barra, para ilustrar esto?
 

Si quiero pasar un parámetro indicador de tipo ENUM_TIMEFRAMES a través de la estructura MqlParam, ¿qué tipo debo indicar para este parámetro?

EnENUM_DATATYPE no existe el tipo ENUM_TIMEFRAMES y otras enumeraciones.

 
Leo59:
Su animación muestra que los números de la barra se sitúan cerca del borde superior de la ventana. ¿Qué ocurre cuando se forma una nueva barra? ¿Tal vez la duración de la animación debería haber sido ligeramente más larga antes de que se forme una nueva barra para ilustrar esto?

Lo siento, no capté el momento en que apareció la nueva barra, fíjate bien, en la imagen de abajo...

y el código en sí, y_pos - número de píxeles desde el borde superior, si desea la parte inferior, utiliceCHART_HEIGHT_IN_PIXELS oCHART_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:

Lo siento, no capté el momento en que apareció la nueva barra, fíjate bien, en la imagen de abajo...

y el código, y_pos - número de píxeles desde el borde superior. Si desea la parte inferior, utiliceCHART_HEIGHT_IN_PIXELS oCHART_WINDOW_YDISTANCE


Rafil, no tienes nada que disculpar. Lo que ha hecho merece respeto y emulación. Estoy muy satisfecho. Y la cuestión no está ni siquiera en el hecho de que hayas hecho lo que necesitaba, sino en tu actitud hacia las personas que necesitan atención, apoyo y ayuda. Tú, Rafil, eres uno de los pocos que sabe y puede. Puede hacer algo más que aconsejar que se pulse la tecla "F1". INFINITAS GRACIAS A TI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!...

Con profundo respeto, Leonid Belsky.

Razón de la queja: