Вопросы от "чайника" - страница 262

 
agvozdezkiy:

Только начал изучать MQL, и вот написал советника, который рисует iMA и проводит касательную (весьма приближенную) к графику в iMA в точке, где находится указатель мыши по оси времени.

Проблема первая. Советник ОООЧЕНЬ тупит. То есть касательная долго перерисовывается, и не успевает за движением мышки...

Посмотрите мой вариант:

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

На ноутбуке - всё летает!

 

Получаю ошибку 5040 (Испорченный параметр типа string) при первом вызове функции создания объекта

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

Если до вызова задать

nTL="";

ошибка 4002 (Ошибочный параметр при внутреннем вызове функции клиентского терминала)

Если до вызова задать

nTL="a";

первый объект будет с именем а.

Вызываю так

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

Подскажите, где ошибка?

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

В старом варианте

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

сбоев не было ни разу.

Это ошибка в коде или в терминале?

 
Silent:

Подскажите, где ошибка?

Где ошибка хз, но работа с именами объектов мягко говоря очень спорная.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
Непонятно зачем вам случайное число в названии объекта, это может и привести к ошибке.
 
Silent:

Получаю ошибку 5040 (Испорченный параметр типа string) при первом вызове функции создания объекта

Если до вызова задать

ошибка 4002 (Ошибочный параметр при внутреннем вызове функции клиентского терминала)

Если до вызова задать

первый объект будет с именем а.

Вызываю так

Подскажите, где ошибка?

Вы волнуетесь из-за того что Гет ласт эррор принтует чего-то отличное от нуля? Если так, то запрашивать ошибку стоит только если функция отчиталась о провале. А запрашивать в конце участка ошибку не стоит, можно получить мусорное значение. Так в МТ4, может здесь как-то иначе.

Псевдокод:

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

Получаю ошибку 5040 (Испорченный параметр типа string) при первом вызове функции создания объекта

Если до вызова задать

ошибка 4002 (Ошибочный параметр при внутреннем вызове функции клиентского терминала)

Если до вызова задать

первый объект будет с именем а.

Вызываю так

Подскажите, где ошибка?

Попробуйте строки через StringConcatenate() "склеивать"

 
TheXpert:
Где ошибка хз, но работа с именами объектов мягко говоря очень спорная.
Эдак я ещё неделю голову ломать буду. Можно немного подробней? (можно грубо :))
zfs:
Непонятно зачем вам случайное число в названии объекта, это может и привести к ошибке.

Другой вариант на пару сотен объектов с уникальными именами есть?

(Группа объектов должна быть с одинаковой частью строки в имени, для удаления группы.)

 
220Volt:

Вы волнуетесь из-за того что Гет ласт эррор принтует чего-то отличное от нуля? Если так, то запрашивать ошибку стоит только если функция отчиталась о провале. А запрашивать в конце участка ошибку не стоит, можно получить мусорное значение. Так в МТ4, может здесь как-то иначе.

Нет, из-за того, что первый вызов из-за ошибки не создаёт объект. Дублирую (пока) строку первого вызова, тогда со второго запуска создаёт.
 
220Volt:

Вы волнуетесь из-за того что Гет ласт эррор принтует чего-то отличное от нуля?

Ну вообще по логике если функция вообще выставляет last error, то при успешном завершении функции должно быть нулевое значение ошибки или значение, описанное в документации. И никак по-другому.

Т.е. если вызов был успешным и ошибка ненулевая, то этот случай должен быть описан в документации.

Silent:

Эдак я ещё неделю голову ломать буду. Можно немного подробней? (можно грубо :))

Ну обычно имена однотипных объектов формируются из общей части, для удобства удаления ("nTL_" у вас) и различий. Я еще использую идентификатор модуля, если на графике этих самых модулей может быть больше одного сразу.

Различие может быть вообще любое, хоть счетчик, который вы увеличиваете каждый раз, когда создаете объект. Но лучше делать различия по логике -- время объекта, координата объекта, цель -- добиться гарантированной уникальности. Побочный положительный эффект -- сконструировав имя повторно, можно изменять свойства нужного уже созданного объекта.

Рандом этой самой "гарантированной уникальности" не дает.

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