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

 
Kira27:

He probado todo lo que me has sugerido, girado y vuelto a girar, pero sigue pintando las líneas en un solo color en MT5. Y en MT4 pinta las líneas normalmente, y sin ningún retraso.

Creo que no he probado todo.

Alexey Viktorov:

Es muy probable que después de renombrar un objeto siga sin estar disponible para referirse a él. Puedes intentar poner ChartRedraw después de cambiar el nombre. Si no sirve de nada, tendremos que construir la secuencia de otra manera.

ps; Otra opción: primero repintar con el nombre sparam y luego renombrarlo.

Por alguna razón, el evento CHARTEVENT_OBJECT_CREATE cuenta inmediatamente después de que la rata toca el gráfico, no después de terminar la creación del objeto. Y los precios de los distintos extremos de la mecha resultan ser los mismos. Así que hay que volver a pintar después de crear el objeto.

Y una observación más: ¿pintan los niveles o la línea principal de la mecha?

Aquí hay tres variantes:

Uno.

bool endCreate;
string newName;
/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(endCreate)
   {
    double   Level_0= ObjectGetDouble(0, newName, OBJPROP_PRICE, 0);
    double   Level_1= ObjectGetDouble(0, newName, OBJPROP_PRICE, 1);
    if(Level_0 > Level_1)
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrDeepSkyBlue);
    else
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrYellow);
    endCreate = false;
   }
 }/******************************************************************/

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  if(id == CHARTEVENT_OBJECT_CREATE)
   {
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    newName = "Fibo "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
    endCreate = true;
   }
 }/******************************************************************/

Segundo.

/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {

 }/******************************************************************/

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  string newName;  
  if(id == CHARTEVENT_OBJECT_CREATE)
   {
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    newName = "Fibo "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
   }
  if(id == CHARTEVENT_OBJECT_DRAG)
   {
    double   Level_0= ObjectGetDouble(0, newName, OBJPROP_PRICE, 0);
    double   Level_1= ObjectGetDouble(0, newName, OBJPROP_PRICE, 1);
    if(Level_0 > Level_1)
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrDeepSkyBlue);
    else
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrYellow);
   }
 }/******************************************************************/

Tres.

/*******************Expert initialization function*******************/
int OnInit()
 {
  ChartSetInteger(ChartID(), CHART_EVENT_OBJECT_CREATE, true);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
 }/******************************************************************/

/***********************OnChartEvent function************************/
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                 )
 {
  if(id == CHARTEVENT_OBJECT_DRAG)
   {
    ulong timeCreate = ObjectGetInteger(0, sparam, OBJPROP_CREATETIME); //  получим время создания объекта
    string newName = "Fibo "+string(timeCreate); //  сформируем новое имя объекта
    ObjectSetString(0, sparam, OBJPROP_NAME, newName);  //  переименуем объект
    double   Level_0= ObjectGetDouble(0, newName, OBJPROP_PRICE, 0);
    double   Level_1= ObjectGetDouble(0, newName, OBJPROP_PRICE, 1);
    if(Level_0 > Level_1)
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrDeepSkyBlue);
    else
      ObjectSetInteger(0, newName, OBJPROP_LEVELCOLOR, 1, clrYellow);
   ChartRedraw(); 
  }
 }/******************************************************************/


 
SanAlex:

cómo organizar un algoritmo en un indicador para tomar puntos y transferirlos a otro buffer.

- Para dibujar las líneas de tendencia. (como en la imagen)

-----------------------------------------

Lo he intentado todo con la intuición, se dibujan pero en lugares extraños.

-----------------------------------------------------------------------------------------------------

He adjuntado el indicador, funciona, pero no puedo ajustar estas líneas.

No puedo hacerlo, tal vez alguien pueda dirigirme a los artículos sobre los puntos de unión de la línea de tendencia.

-- No puedo dibujarlos, no está claro en qué puntos.

EURUSDH4

---------------------------------------------------------

¿algo así, tal vez?

//--- найдем максимальное и минимальное значение графика
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- определим точки для рисования линии
   int d1=InpDate1*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- количество видимых баров в окне графика
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- размер массива price
   int accuracy=1000;
//--- массивы для хранения значений дат и цен, которые будут использованы
//--- для установки и изменения координат точек привязки линии
   datetime date[];
   double   price[];
//--- выделение памяти
   ArrayResize(date,bars);
   ArrayResize(price,accuracy);
//--- заполним массив дат
   ResetLastError();
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
     {
      Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
      return;
     }
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- определим точки для рисования линии
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
//--- создадим линию тренда
   if(!TrendCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,InpStyle,
      InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }



-------------------

¿estoy en el camino correcto?

Archivos adjuntos:
2.mq5  82 kb
 
SanAlex:

Tal vez alguien puede dirigirme a los artículos sobre los puntos de la línea de tendencia.

-- Todo lo que puedo hacer ahora es dibujarlos, no está claro en qué puntos.

---------------------------------------------------------

¿algo así, tal vez?

-------------------

¿estoy en el camino correcto?

Las líneas de tendencia se dibujan en 2 puntos, son los datos del precio o los datos de otro indicador, el ejemplo de dibujo por fractales, que, por cierto, ya conoces)

https://www.mql5.com/ru/code/29210

Line through two fractals
Line through two fractals
  • www.mql5.com
cm BASKET Советник управляющий счетом. Показывает какие пары инструментов сейчас торгуются на данном счете. Показывает прибыль полученную по каждой паре за определенное время. Помогает переключаться между множества открытых окон... Virtual Trailing Stop 2
 
VVT:

Las líneas de tendencia se dibujan en 2 puntos, se trata de datos de precios o de datos de otro indicador, un ejemplo de dibujo por fractales, que, por cierto, te resulta familiar)

https://www.mql5.com/ru/code/29210

Quise hacerlo con un indicador, pero no funcionó.

- Tuve que hacerlo con dos indicadores.

Eso es lo que hice.

GBPUSDM30 GOTOV

---------------------------

Me olvidé de dar las gracias. - ¡¡¡Gracias!!!

 
SanAlex:

Quise hacerlo en un Indicador, pero no funcionó, pero lo he hecho en este, que me sugeriste.

- por lo que tuve que hacerlo con dos Indicadores.

Así es como funcionó.

---------------------------

Me olvidé de dar las gracias. - ¡¡¡Gracias!!!

Si se combinan bien, se pueden crear muchos objetos diferentes en un solo indicador)

 
Alexey Viktorov:

Parece que no lo he probado todo.

Por alguna razón, el evento CHARTEVENT_OBJECT_CREATE cuenta inmediatamente después de que la rata toca el gráfico, y no después de que se crea el objeto. Y los precios de los distintos extremos de la mecha resultan ser los mismos. Por lo tanto, tenemos que volver a pintarlo después de la creación del objeto.


¿Cómo lo has determinado? ¿Lógicamente?

Y otra observación: ¿pintan los niveles o la línea principal de la fibra?


He probado a repintar las líneas de tendencia en diferentes variantes))))

Aquí hay tres variantes:

Uno.

Segundo.

El tercero.


Muchas gracias por estos!!! Puede que aprenda a pensar con lógica, basándome en tus ejemplos))))

¿Te dedicas a la codificación o al comercio? ¿Cuánto tiempo llevas comerciando? Yo lo hago desde hace 12 años))

 
Kira27:

Muchas gracias por las opciones!!! Usaré tus ejemplos y aprenderé a pensar con lógica))))

Quiero decir, ¿cuánto tiempo llevas comerciando? Yo lo hago desde hace 12 años).

No siempre soy tan "amable". No siempre soy tan "amable", sólo durante los ataques... Así que no hay mucho que aprender de mis ejemplos. Llevo casi el mismo tiempo en el comercio.

 
Alexey Viktorov:

No siempre soy tan "amable". Sólo durante los ataques... Así que no hay mucho que aprender de mis ejemplos. Yo estoy más o menos igual en el comercio.

No sé, estoy aprendiendo los métodos y técnicas de programación mejor con ejemplos. Me gustaría que MQL5 tuviera un tutorial como el de MQL4 en el que se explica el robot paso a paso utilizando los archivos incluidos.

 
Alexey Viktorov:

Llevo casi el mismo tiempo en el comercio.

¿Así que ya conoce la esencia de las fluctuaciones del mercado? Me parece que ya he aprendido)))) Sólo tengo que pedirlo, porque puedo trabajar con él durante un cierto tiempo, y luego me chasqueo y crear un lío)))))) Pero ahora entiendo cualquier activo)))) Me gusta especialmente el S&P, es técnico y dinámico))

 
VVT:

Pues bien, si los combinas, puedes crear muchos objetos diferentes en un solo indicador)

Quería hacerlo así. Llevaba una semana intentando hacerlo, pero no funcionaba.

- Parece que es mejor en el segundo indicador - no se puede ver más allá de los puntos y las líneas en sí, sólo hay aquellos puntos y niveles por los que se definen las entradas al mercado.

----------------

estos dos indicadores son uno (este es mi borrador - no cambié los nombres de 4 indicadores en él)

Razón de la queja: