Perguntas de um "boneco" - página 262

 
agvozdezkiy:

Comecei agora a estudar MQL, e aqui escrevi uma EA que desenha um iMA e desenha uma tangente (muito próxima) ao gráfico do iMA no ponto em que o ponteiro do rato está no eixo do tempo.

Primeiro problema. O Conselheiro Especialista é MUITO lento. Significa que a tangente é redesenhada durante muito tempo e não segue o movimento do rato...

Vejam a minha versão:

//+------------------------------------------------------------------+
//|                                                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;
     }
  }

No meu portátil - tudo voa!

 

Recebo o erro 5040 (parâmetro corrompido do tipo string) a primeira vez que chamo uma função de criação de objectos

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

Se antes de um conjunto de chamadas

nTL="";

erro 4002 (parâmetro inválido ao chamar internamente a função terminal do cliente)

Se estabelecido antes da chamada

nTL="a";

o primeiro objecto será nomeado a.

Eu chamo-lhe assim

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()));
     };

Poderia dizer-me onde se encontra um erro?

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

Na versão antiga.

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

nunca teve qualquer falha.

É um erro no código ou no terminal?

 
Silent:

Pode dizer-me onde está o erro?

Não sei onde está o erro, mas a manipulação de nomes de objectos é, no mínimo, muito questionável.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
Não é claro por que razão se quer um número aleatório no nome do objecto, isto também pode levar a um erro.
 
Silent:

Recebo o erro 5040 (parâmetro corrompido do tipo string) a primeira vez que chamo a função de criação do objecto

Se antes de um conjunto de chamadas

erro 4002 (parâmetro inválido ao chamar internamente a função terminal do cliente)

Se estabelecido antes da chamada

o primeiro objecto será nomeado a.

Eu chamo assim

Pode dizer-me onde está o erro?

Está preocupado porque Get LastError imprime algo diferente de zero? Em caso afirmativo, só se deve chamar a atenção para um erro se a função denunciar uma falha. E não se deve pedir um erro no fim do enredo, pode ser que se receba um valor de lixo. É assim que é no MT4, talvez seja diferente aqui.

Pseudocódigo:

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

Recebo o erro 5040 (parâmetro corrompido do tipo string) a primeira vez que chamo a função de criação do objecto

Se antes de um conjunto de chamadas

erro 4002 (parâmetro inválido ao chamar internamente a função terminal do cliente)

Se estabelecido antes da chamada

o primeiro objecto será nomeado a.

Eu chamo-lhe assim

Poderia dizer-me onde está o erro?

Tente "colar" cordas através de StringConcatenate()

 
TheXpert:
Não sei onde está o erro, mas a manipulação de nomes de objectos é muito questionável, para o dizer de forma suave.
Estarei a racionar os meus miolos por mais uma semana. Pode descrevê-lo com mais detalhe? (pode ser grosseiro :))
zfs:
Não é claro porque é que precisa de um número aleatório no nome do objecto, pode levar a um erro.

Existe outra opção para um par de centenas de objectos com nomes únicos?

(Um grupo de objectos deve ter a mesma parte do fio no nome, para remover o grupo).

 
220Volt:

Está preocupado porque o Get Last Error imprime algo diferente de zero? Em caso afirmativo, só deve pedir um erro se a função denunciar uma falha. E não se deve pedir um erro no fim do enredo, pode ser que se receba um valor de lixo. É assim que é no MT4, talvez seja diferente aqui.

Não, porque a primeira chamada não cria um objecto devido a um erro. Eu duplico (por agora) a linha da primeira chamada, depois da segunda chamada que cria.
 
220Volt:

Está preocupado porque a Get Last Errors imprime algo diferente de zero?

Bem, logicamente, se a função definir o último erro, então após a conclusão bem sucedida da função deverá haver um erro zero ou o valor descrito na documentação. Não há outra forma.

Ou seja, se a chamada foi bem sucedida e o erro não for zero, este caso deve ser descrito na documentação.

Silencioso:

Estarei a racionar os meus cérebros desta forma por mais uma semana. Posso dar-lhe mais alguns detalhes? (Pode ser grosseiro :))

Normalmente os nomes de objectos do mesmo tipo são formados a partir de uma parte comum, para fácil remoção ("nTL_" no seu caso) e diferenças. Também utilizo identificador de módulo, se puder haver mais do que um destes módulos ao mesmo tempo no gráfico.

A diferença pode ser qualquer coisa, mesmo um contador, que aumenta de cada vez que se cria um objecto. Mas é melhor fazer distinções logicamente -- tempo do objecto, coordenada do objecto, o objectivo é atingir a singularidade garantida. O efeito secundário é que ao construir um nome novamente, é possível alterar as propriedades de um objectocriado.

O aleatório não proporciona esta "singularidade garantida".

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