Preguntas de un "tonto" - página 262

 
agvozdezkiy:

Acabo de empezar a aprender MQL, y por eso escribí un EA que dibuja un iMA y dibuja una tangente (muy cercana) al gráfico en el iMA en el punto donde el puntero del ratón está en el eje del tiempo.

Problema uno. El Asesor Experto es MUY lento. Significa que la tangente se redibuja durante mucho tiempo y no sigue el movimiento del ratón...

Mira mi versión:

//+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---Рисуем индикатор iMA
   Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE);
   if(Handle_iMA!=INVALID_HANDLE)
     {
      ChartIndicatorAdd(0,0,Handle_iMA);
      Print("iMA скопировано в буффер.");
     }
//---
   string name="Line";
   ObjectCreate(0,name,OBJ_TREND,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,10);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
   ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &XCoord,
                  const double &YCoord,
                  const string &SParam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      int x=(int)XCoord;
      int y=(int)YCoord;
      if(x==prevX) return;
      CopyTime(NULL,0,0,1,CarrentBarTime);
      //---
      ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord);
      if(TimeCoord>CarrentBarTime[0]) return;
      CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA);
      //---
      string name="Line";
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]);
      ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds());
      //---
      ChartRedraw();
      prevX=x;
     }
  }

En mi portátil, ¡todo vuela!

 

Obtengo el error 5040 (parámetro corrompido de tipo cadena) la primera vez que llamo a una función de creación de objetos

void  CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL="nTL_"+IntegerToString(MathRand());
   nTLh="nTLh_"+IntegerToString(MathRand());
   nTLl="nTLl_"+IntegerToString(MathRand());
   nTLe="nTLe_"+IntegerToString(MathRand());
//------------
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  };

Si antes de una llamada se establece

nTL="";

error 4002 (parámetro no válido al llamar internamente a la función de terminal de cliente)

Si se establece antes de la llamada

nTL="a";

el primer objeto se llamará a.

Yo lo llamo así

if(hlp_var==high_low)
     {
      //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color);
      CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color);
      CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color);
      Print("CreateTL GetLastError "+IntegerToString(GetLastError()));
     };

¿Podría decirme dónde hay un error?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

En la versión antigua.

ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);

nunca ha tenido ningún fallo.

¿Es un error en el código o en el terminal?

 
Silent:

¿Puede decirme dónde está el error?

No sé dónde está el error, pero el manejo de los nombres de los objetos es, como mínimo, muy cuestionable.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
No está claro por qué querrías un número aleatorio en el nombre del objeto, esto también puede llevar a un error.
 
Silent:

Obtengo el error 5040 (parámetro corrompido de tipo cadena) la primera vez que llamo a la función de creación de objetos

Si antes de una llamada se establece

error 4002 (parámetro no válido al llamar internamente a la función de terminal de cliente)

Si se establece antes de la llamada

el primer objeto se llamará a.

Yo llamo así

¿Puede decirme dónde está el error?

¿Está preocupado porque Get LastError imprime algo distinto de cero? Si es así, sólo debe llamar a un error si la función informa de un fallo. Y no deberías pedir un error al final de la trama, podrías obtener un valor basura. Así es en MT4, tal vez sea diferente aquí.

Pseudocódigo:

if( ! ObjectCreate(...) )
    Print( GetLastError() );
 
Silent:

Obtengo el error 5040 (parámetro corrompido de tipo cadena) la primera vez que llamo a la función de creación de objetos

Si antes de una llamada se establece

error 4002 (parámetro no válido al llamar internamente a la función de terminal de cliente)

Si se establece antes de la llamada

el primer objeto se llamará a.

Yo lo llamo así

¿Podría decirme dónde está el error?

Prueba a "pegar" las cadenas mediante StringConcatenate()

 
TheXpert:
No sé dónde está el error, pero el manejo de los nombres de los objetos es muy cuestionable por decirlo suavemente.
Voy a devanarme los sesos una semana más. ¿Puede describirlo con más detalle? (puedes ser burdo :))
zfs:
No está claro por qué necesitas un número aleatorio en el nombre del objeto, podría dar lugar a un error.

¿Hay otra opción para un par de cientos de objetos con nombres únicos?

(Un grupo de objetos debe tener la misma parte de la cadena en el nombre, para eliminar el grupo).

 
220Volt:

¿Está preocupado porque Get Last Errors imprime algo distinto a cero? Si es así, sólo debe pedir un error si la función informa de un fallo. Y no deberías pedir un error al final de la trama, podrías obtener un valor basura. Así es en MT4, tal vez sea diferente aquí.

No, porque la primera llamada no crea un objeto debido a un error. Duplico (por ahora) la línea de la primera llamada, luego de la segunda ejecución crea.
 
220Volt:

¿Está preocupado porque Get Last Errors imprime algo distinto a cero?

Bueno, lógicamente, si la función establece el último error, entonces al finalizar con éxito la función debería haber un error cero o el valor descrito en la documentación. No hay otra manera.

Es decir, si la llamada fue exitosa y el error es distinto de cero, este caso debe ser descrito en la documentación.

Silenciosa:

Me devanaré los sesos de esta manera durante otra semana. ¿Puedo darle más detalles? (Puedes ser burdo :))

Pues normalmente los nombres de los objetos del mismo tipo se forman a partir de la parte común, para facilitar la eliminación ("nTL_" en su caso) y las diferencias. También uso el identificador de módulo, si puede haber más de uno de estos mismos módulos a la vez en el gráfico.

La diferencia puede ser cualquier cosa, incluso un contador, que se incrementa cada vez que se crea un objeto. Pero es mejor hacer distinciones por lógica -- tiempo del objeto, coordenada del objeto, el objetivo es lograr una unicidad garantizada. El efecto secundario es que al construir un nombre de nuevo, se pueden cambiar las propiedades de un objeto ya creado.

El azar no proporciona esta "garantía de unicidad".

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
Razón de la queja: