Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1331

 

Помогите исправить индикатор, он не отображается в терминале MT5, при компиляции выдает ошибки. 

//--- descriзгo
#property description "Script cria objeto grбfico de \"Texto\"."
//--- janela de exibiзгo dos parвmetros de entrada durante inicializaзгo do script
#property script_show_inputs


//--- entrada de parвmetros do script
input int               IHistoryBars=25;          // Check Historical Data
input string            InpFont="Tahoma";       // Font Type
input int               InpFontSize=7;          // Size of fonts
input color             UpColor=clrGold;         // Cor Up
input color             DwColor=clrRoyalBlue;         // Cor Dw
input color             HLColor=clrAqua;         // Cor Center
input bool              InpBack=false;           // Objeto de fundo
input bool              InpSelection=false;      // Destaque para mover
input bool              InpHidden=true;          // Ocultar na lista de objetos
input bool              WithDigit=true;          // Ocultar na lista de objetos
input long              InpZOrder=0;             // Prioridade para clique do mouse


int digits=0,extradig=0;

double            InpAngle=0.0;           // Вngulo de inclinaзгo em graus
ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Tipo de ancoragem
double   gBars=0;
double   gTotalRates=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   digits= MathPow(10,_Digits-extradig);
   if(WithDigit) extradig=1;

  }
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem                                         |
//+------------------------------------------------------------------+
bool TextMove(const long   chart_ID=0,  // ID do grбfico
              const string name="Text", // nome do objeto
              datetime     time=0,      // coordenada do ponto de ancoragem do tempo
              double       price=0)     // coordenada do ponto de ancoragem do preзo
  {
//--- se a posiзгo do ponto nгo estб definida, mover para a barra atual tendo o preзo Bid
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- redefine o valor de erro
   ResetLastError();
//--- mover o ponto de ancoragem
   if(!ObjectMove(chart_ID,name,0,time,price))
     {
      Print(__FUNCTION__,
            ": falha ao mover o ponto de ancoragem! Cуdigo de erro = ",GetLastError());
      return(false);
     }
//--- sucesso na execuзгo
   return(true);
  }
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrгo |
//| para aqueles vazios                                              |
//+------------------------------------------------------------------+
void ChangeTextEmptyPoint(datetime &time,double &price)
  {
//--- se o tempo do ponto nгo estб definido, serб na barra atual
   if(!time)
      time=TimeCurrent();
//--- se o preзo do ponto nгo estб definido, ele terб valor Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ClearMyObjects();
   Print("Deinit Value Chart, reason = "+IntegerToString(reason));
  }
//+------------------------------------------------------------------+
//| Value Chart                                                      | 
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {

//--- definir a forma como muitas vezes os textos serгo exibidos
   int scale=(int)ChartGetInteger(0,CHART_SCALE);
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS)+3;
   double value;
   digits=MathPow(10,_Digits-extradig);

//--- definir o passo
   int step=1;
   switch(scale)
     {
      case 0:
         step=12;
         break;
      case 1:
         step=6;
         break;
      case 2:
         step=4;
         break;
      case 3:
         step=2;
         break;
     }
   gTotalRates=rates_total;
   gBars=bars;
   for(int i=rates_total-1;i>rates_total-bars;i-=step) 
     {
      if(Close[i]>Open[i])
        {
         // bullish candle
         value=(Close[i]-Open[i])*digits;
         //Print(Close[i]-Open[i], "->", Close[i]-Open[i]*digits);

         TextCreate(0,"Text_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],(Close[i]+Open[i])/2,DoubleToString(value,extradig),InpFont,InpFontSize,
                    UpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder);

         value=(Open[i]-Low[i]) *digits;
         if(!TextCreate(0,"TextL_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],Low[i],DoubleToString(value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0;     }

         value=(High[i]-Close[i]) *digits;
         if(!TextCreate(ChartID(),"TextH_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],High[i],DoubleToString(value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0;     }

           } else {

         value=(Open[i]-Close[i]) *digits;
         if(!TextCreate(ChartID(),"Text_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],(Close[i]+Open[i])/2,DoubleToString(value,extradig),InpFont,InpFontSize,
            DwColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {      return 0;      }

         value=(Close[i]-Low[i]) *digits;
         if(!TextCreate(ChartID(),"TextL_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],Low[i],DoubleToString(value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0;     }

         value=(High[i]-Open[i]) *digits;
         if(!TextCreate(ChartID(),"TextH_"+(string)i+(string)PERIOD_CURRENT,0,Time[i],High[i],DoubleToString(value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0;     }
        }

     }
   ChartRedraw();
   return 0;
  }
//+------------------------------------------------------------------+
//|  Trace Arrow Function                                            |
//+------------------------------------------------------------------+
void Trace(string name,int sens,double price,datetime time,color couleur)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,time,price);
   if(sens==1)
      ObjectSetInteger(0,name,OBJPROP_ARROWCODE,233);
   if(sens==-1)
      ObjectSetInteger(0,name,OBJPROP_ARROWCODE,234);
   ObjectSetInteger(0,name,OBJPROP_COLOR,couleur);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,5);
  }
//+------------------------------------------------------------------+
//|   Delete Arrow Function                                          |
//+------------------------------------------------------------------+  
void ClearMyObjects() 
  {
   string name;
   int scale=(int)ChartGetInteger(0,CHART_SCALE);
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS)+3;
   double value;
   digits=MathPow(10,_Digits-extradig);
   int step=1;
   switch(scale)
     {
      case 0:
         step=12;
         break;
      case 1:
         step=6;
         break;
      case 2:
         step=4;
         break;
      case 3:
         step=2;
         break;
     }
   for(int i=gTotalRates-1;i>gTotalRates-bars;i-=step) 
     {
      if(!TextDelete(ChartID(),"Text_"+(string)i+(string)PERIOD_CURRENT)){}
      if(!TextDelete(ChartID(),"TextH_"+(string)i+(string)PERIOD_CURRENT)){}
      if(!TextDelete(ChartID(),"TextL_"+(string)i+(string)PERIOD_CURRENT)){}
      //--- redesenhar o grбfico
     }
   ChartRedraw();

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Alterar o texto do objeto                                        |
//+------------------------------------------------------------------+
bool TextChange(const long   chart_ID=0,  // ID do Grбfico
                const string name="Text", // nome do objeto
                const string text="Text") // texto
  {
//--- redefine o valor de erro
   ResetLastError();
//--- alterar texto do objeto
   if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
     {
      Print(__FUNCTION__,
            ": falha ao alterar texto! Cуdigo de erro = ",GetLastError());
      return(false);
     }
//--- sucesso na execuзгo
   return(true);
  }
//+------------------------------------------------------------------+
//| Excluir objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextDelete(const long   chart_ID=0,  // Id do Grбfico
                const string name="Text") // nome do objeto
  {
//--- redefine o valor de erro
   ResetLastError();
//--- excluir o objeto
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": falha ao excluir o objeto \"Texto\"! Cуdigo de erro = ",GetLastError());
      return(false);
     }
//--- sucesso na execuзгo
   return(true);
  }
//+------------------------------------------------------------------+
//| Criando objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextCreate(const long              chart_ID=0,               // ID do grбfico
                const string            name="Text",              // nome do objeto
                const int               sub_window=0,             // нndice da sub-janela
                datetime                time=0,                   // ponto de ancoragem do tempo
                double                  price=0,                  // ponto de ancoragem do preзo
                const string            text="Text",              // o prуprio texto
                const string            font="Arial",             // fonte
                const int               font_size=10,             // tamanho da fonte
                const color             clr=clrRed,               // cor
                const double            angle=0.0,                // inclinaзгo do texto
                const ENUM_ANCHOR_POINT anchor=ANCHOR_CENTER,// tipo de ancoragem
                const bool              back=false,               // no fundo
                const bool              selection=false,          // destaque para mover
                const bool              hidden=true,              // ocultar na lista de objetos
                const long              z_order=0)                // prioridade para clicar no mouse
  {

   if(ObjectFind(chart_ID,name)==-1) 
     {

      //--- definir as coordenadas de pontos de ancoragem, se eles nгo estгo definidos
      //--- redefine o valor de erro
      ResetLastError();
      //--- criar objeto Texto
      if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price)) 
        {
         Print(__FUNCTION__,
               ": falha ao criar objeto \"Texto\"! Cуdigo de erro = ",GetLastError());
         return(false);
        }
      //--- definir o texto
      ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
      //--- definir o texto fonte
      ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
      //--- definir tamanho da fonte
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
      //--- definir o вngulo de inclinaзгo do texto
      ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
      //--- tipo de definiзгo de ancoragem
      ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
      ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,ALIGN_CENTER);

      //--- definir cor
      ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
      //--- exibir em primeiro plano (false) ou fundo (true)
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
      //--- habilitar (true) ou desabilitar (false) o modo de mover o objeto com o mouse
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
      //--- ocultar (true) ou exibir (false) o nome do objeto grбfico na lista de objeto 
      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
      //--- definir a prioridade para receber o evento com um clique do mouse no grбfico
      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
      ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
      ObjectSetInteger(chart_ID,name,OBJPROP_TIME,time);

      //--- sucesso na execuзгo
      return(true);
        } else {
      ChangeTextEmptyPoint(time,price);

      ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
      ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
      ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
      ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,ALIGN_CENTER);
      ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
      ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
      ObjectSetInteger(chart_ID,name,OBJPROP_TIME,time);
      ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
      //--- definir tamanho da fonte
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
      ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,100);

/*ObjectSetString(chart_ID,name,OBJPROP_FONT,Font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,Size);*/
      return (true);
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Event ID
                  const long& lparam,   // Parameter of type long event
                  const double& dparam, // Parameter of type double event
                  const string& sparam  // Parameter of type string events
                  )
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      ClearMyObjects();
     }

  }
//+------------------------------------------------------------------+
Файлы:
 
Green handsome:

Помогите исправить индикатор, он не отображается в терминале MT5, при компиляции выдает ошибки. 

самое простое - в OnCalculate в самом начале всем массивам задать ArraySetAsSeries(Open,true) ;  ArraySetAsSeries(Close,true) ; и так далее.

это традиционный сюрприз на ровном месте: в 5-ке направления индексации по умолчанию иное чем в 4-ке..

индикатор буферов не использует, просто строит граф.объекты - после запуска нажмите Ctrl+B и смотрите куда он их там поместил

 

Перекопал документацию и  форум ...
Как сделать глобальными переменные типа указатель на объект [в примере var], если они создаются в OnInit() строкой:

CObj* var=new CObj(p1,p2,p3);

 причем количество объектов и параметры конструкторов заранее неизвестны и вычисляются в OnInit() ?

 
Mikhail Tkachev:

Перекопал документацию и  форум ...
Как сделать глобальными переменные типа указатель на объект, если они создаются в OnInit():

 причем количество объектов и параметры конструкторов заранее неизвестны и вычисляются в OnInit() ?

Ничё не понял, но передавайте массив указателей CArrayObj на созданные в OnInit() объекты

Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
  • www.mql5.com
CArrayObj - Коллекции данных - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:

Ничё не понял, но передавайте массив указателей CArrayObj на созданные в OnInit() объекты

Артем, спасибо за ответ.
Прошу прощения за непонятный вопрос)
В эксперте могут использоваться три глобальные переменные типа указатели на объект : var1, var2, var3.

До исполнения OnInit() неизвестно, все ли эти переменные будут нужны (это связано с таймфреймами), неизвестны также параметры для конструкторов, которые будут инициализировать объекты.
Как создать такие переменные в OnInit(), чтобы они при этом были глобальными?

 
Mikhail Tkachev:

Артем, спасибо за ответ.
Прошу прощение за непонятный вопрос)
В эксперте могут использоваться три глобальные переменные типа указатели на объект : var1, var2, var3.

До исполнения OnInit() неизвестно, все ли эти переменные будут нужны (это связано с таймфремами), неизвестны также параметры для конструкторов, которые будут инициализировать объекты.
Как создать такие переменные в OnInit(), чтобы они при этом были глобальными?

Я не знаю что у вас там за волшебный конструктор, в котором одни неизвестные :)

Объекты не нужно заранее объявлять как экземпляры.

Нужно объявить один массив CArrayObj. Сами ваши объекты должны быть наследниками CObject.

Создаёте ваш объект по new и добавляете указатель на него в список.

Создаёте следующий и добавляете в список, и т.д.

Уже этот список - указатель на него (а список объявлен глобально), передаёте в ваши конструкторы.

Но вот как вы собрались делать конструкторы с неизвестными заранее аргументами - тут я немного не понял. Попробуйте это пояснить

 
Artyom Trishkin:


Но вот как вы собрались делать конструкторы с неизвестными заранее аргументами - тут я немного не понял. Попробуйте это пояснить

Создание объектов типа CIsNewBar для каждого используемого таймфрейма по каждому символу.
Символы задаются одной строкой с разделителями в input-параметре, поэтому нельзя заранее создать все объекты перед OnInit().
Т.е. первый неизвестный параметр конструктора - символ.
Второй неизвестный параметр конструктора - таймфрейм, т.к. для каждого символа будет свой набор таймфреймов, аналогично передаётся строкой с разделителями в input-параметре.

З.Ы. С классом   CArrayObj была проблемка: при обращении к элементам типа  CArrayObj*   ArrayObj.At(0) недоступны члены класса объекта, который At(0), хотя эти члены класса точно публичные, т.е. конструкция типа  ArrayObj.At(0).method(parameter) не работает.
И еще боюсь использовать эти библиотеки, вдруг что-то изменят в них при обновлении терминала и мой эксперт вдруг перестанет работать...
 
Mikhail Tkachev:

Создание объектов типа CIsNewBar для каждого используемого таймфрейма по каждому символу.
Символы задаются одной строкой с разделителями в input-параметре, поэтому нельзя заранее создать все объекты перед OnInit().
Т.е. первый неизвестный параметр конструктора - символ.
Второй неизвестный параметр конструктора - таймфрейм, т.к. для каждого символа будет свой набор таймфреймов, аналогично передаётся строкой с разделителями в input-параметре.

З.Ы. С классом   CArrayObj была проблемка: при обращении к элементам типа  CArrayObj*   ArrayObj.At(0) недоступны члены класса объекта, который At(0), хотя эти члены класса точно публичные, т.е. конструкция типа  ArrayObj.At(0).method(parameter) не работает.
И еще боюсь использовать эти библиотеки, вдруг что-то изменят в них при обновлении терминала и мой эксперт вдруг перестанет работать...

Всё как-то не так...

Напишите простыми словами что хотите сделать. Без всяких упоминаний своих попыток закодить это всё.

 
Artyom Trishkin:

Всё как-то не так...

Напишите простыми словами что хотите сделать. Без всяких упоминаний своих попыток закодить это всё.

Мультивалютный эксперт.
Список символов задается через input-параметр, строка с разделителем "AUDUSD,EURUSD,GBPUSD...", количество символов заранее не определено.
Для каждого символа есть два таймфрейма, на которых работает его "собственная" торговая система.
Соответственно два input-параметра, строки с разделителем :   короткий таймфрейм для соответствующего символа "M1,M30,M5..."
                                                                                                     длинный таймфрейм для соответствующего символа "Н1,D1,H4..."
Т.е. для AUDUSD таймфреймы М1 и Н1, для EURUSD М30 и D1, и т.д.
В OnTick() по каждому символу нужно отслеживать появление нового бара на обоих (коротком и длинном) таймфреймах для принятия торговых решений.
Старался написать как можно проще)

 
Mikhail Tkachev:

Мультивалютный эксперт.
Список символов задается через input-параметр, строка с разделителем "AUDUSD,EURUSD,GBPUSD...", количество символов заранее не определено.
Для каждого символа есть два таймфрейма, на которых работает его "собственная" торговая система.
Соответственно два input-параметра, строки с разделителем :   короткий таймфрейм для соответствующего символа "M1,M30,M5..."
                                                                                                     длинный таймфрейм для соответствующего символа "Н1,D1,H4..."
Т.е. для AUDUSD таймфреймы М1 и Н1, для EURUSD М30 и D1, и т.д.
В OnTick() по каждому символу нужно отслеживать появление нового бара на обоих (коротком и длинном) таймфреймах для принятия торговых решений.
Старался написать как можно проще)

Класс нового бара уже есть?

И как именно выглядят входные параметры?

Причина обращения: