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

 
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() по каждому символу нужно отслеживать появление нового бара на обоих (коротком и длинном) таймфреймах для принятия торговых решений.
Старался написать как можно проще)

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

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

[Удален]  
Mikhail Tkachev:

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

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

Легко.

CObj* var1 = NULL;
CObj* var2 = NULL;
CObj* var3 = NULL;

int OnInit()
{
   var1 = new CObj( p1, p2, p3 );
   var2 = new CObj( p1, p2, p3 );
   var3 = new CObj( p1, p2, p3 );
}
 

Здравствуйте

в мт5 есть кнопка перекрестие

когда нажимаеш на графике то показывается информация сколько баров сколько пунктов и процент

помогите как правильно высчитать это значение чтоб можно было привязать его к роботу

спасибо

 
Artyom Trishkin:

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

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

Класс позаимствован на сайте: https://www.mql5.com/ru/code/768, сделаны незначительные изменения

//+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//|                               Copyright © 2011, Nikolay Kositsin |
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+ 
#property copyright "2011,   Nikolay Kositsin"
#property link      "farria@mail.redcom.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//|  Алгоритм определения момента появления нового бара              |
//| Для каждого таймфрейма каждого символа нужно создавать объект    |
//+------------------------------------------------------------------+  
#include <Object.mqh>

class CIsNewBar : public CObject // Сделан наследником класса для возможности работы с классом CArrayObj (из библиотеки)
// class CIsNewBar   // Первоначальная редакция
  {
   //----
public:

      //---- функция определения момента появления нового бара
   bool IsNewBar()
     {
      //---- получим время появления текущего бара
      datetime TNew=datetime(SeriesInfoInteger(m_Symbol,m_TimeFrame,SERIES_LASTBAR_DATE));

      if(TNew!=m_TOld && TNew) // проверка на появление нового бара
        {
         m_TOld=TNew;
         return(true); // появился новый бар!
        }
      //----
      return(false); // новых баров пока нет!
     };

   //---- конструктор класса    
                     CIsNewBar(const string &pSymbol, const ENUM_TIMEFRAMES pTimeFrame){
                        m_Symbol=pSymbol; m_TimeFrame=pTimeFrame;
                        m_TOld=-1;};

protected:
   datetime          m_TOld;        // Время хранится 
   ENUM_TIMEFRAMES   m_TimeFrame;   //    для каждого таймфрейма
   string            m_Symbol;      //    каждого символа

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

Предполагается применять следующим образом:

int OnInit()
{
    // Переменная NB_M1 - объект для контроля нового бара по символу currSymbol для таймфрейма M1

    CIsNewBar* NB_M1=new CIsNewBar(currSymbol,PERIOD_M1);
}

void OnTick()
{
    if (NB_M1.IsNewBar())  // (1) Если появился новый бар M1
        {....}
    ......
}
 
Koldun Zloy:

Легко.

Спасибо за ответ)
Сначала я так и сделал.
Таким образом, объект создается два раза, сначала пустой, потом, как положено, конструктором с параметрами.
Но ... Компилятор при этом на строку в OnInit() выводит предупреждение:

declaration of 'var1' hides global variable -> на строку в OnInit()
see previous declaration of 'var1'

Таким образом, локальная переменная скрывает глобальную ... и что при этом происходит ?
Какую переменную видит тогда другая функция, OnTick(), например? Глобальная у нас =NULL, локальная проинициализирована правильно, но её не может видеть другая функция ...

 
Mikhail Tkachev:

Класс позаимствован на сайте: https://www.mql5.com/ru/code/768, сделаны незначительные изменения

Предполагается применять следующим образом:

Из входных параметров нужно извлечь все подстроки, из них составить наименования символов и соответствующих им таймфреймов.

Далее из этих списков создать объекты-новые бары и указатель на каждый создаваемый объект "Новый бар" поместить в CArrayObj, который объявлен на глобальном уровне.

Далее - в OnTimer() в цикле по этому списку получать указатель на очередной объект в нём и проверять наличие нового бара. Если нету - переходим к следующему, если есть - делаем то, что нужно делать при открытии нового этого бара.

Таймер сделать по своим потребностям - миллисекундный, секундный, минутный - в общем, с той частотой, которую считаете достаточной для реакции на новый бар на нетекущем символе.

[Удален]  
Mikhail Tkachev:

Спасибо за ответ)
Сначала я так и сделал.
Таким образом, объект создается два раза, сначала пустой, потом, как положено, конструктором с параметрами.
Но ... Компилятор при этом на строку в OnInit() выводит предупреждение:

declaration of 'var1' hides global variable -> на строку в OnInit()
see previous declaration of 'var1'

Таким образом, локальная переменная скрывает глобальную ... и что при этом происходит ?
Какую переменную видит тогда другая функция, OnTick(), например? Глобальная у нас =NULL, локальная проинициализирована правильно, но её не может видеть другая функция ...

Смотрите внимательнее. Вы делали не так.