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

 
Vitalii Ananev:

Вместо Close[2] поставьте значение индикатора на втором баре (например iRSI(.......,2) ), а вместо Close[1] значение индикатора на первом баре. А uroven это значения уровня.

А остальное вам выше уже сказали. 

Спасибо.
 
Подскажите, может кому нить попадался боковой объем  дня с права на графике  для мт5,  для мт4 нашел ,   здесь https://www.mql5.com/ru/code/9777    . Варианта два:  либо  в нем переменные переписать , либо найти готовый.  ну или заказывать  в чем не вижу смысла,,,,,,, нужно проверить одну теорию равновесия ,,,, Нашел в базе на эту работу для мт5 где с лево  рисует профиль вчерашнего дня  но там один важный недостаток   не рисует то что происходит сегодня. Вот и хочу дополнить  шаблон графика  информацией с право что происходит в текущий момент торговли
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • голосов: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

Условие:


ProfitSellDBL рассчитывается здесь

Profit_Upgr = 0.01

Tral_Start__Upgr приравнивается к внешней переменной типа int и равняется 5.

Tral_Size__Upgr аналогично равняется 4

TV - tick value, =10

SumLotSellDBL = 0.04

Прочла. Посмотрела, как будет работать, если определить Tral_Start__Upgr, Tral_Size__Upgr и их внешние переменные как double. Т.е. когда все будет в одном типе без приведения и потери данных. Результат тот же. Что я поняла не так?
 
Maria Baburina:
Прочла. Посмотрела, как будет работать, если определить Tral_Start__Upgr, Tral_Size__Upgr и их внешние переменные как double. Т.е. когда все будет в одном типе без приведения и потери данных. Результат тот же. Что я поняла не так?

Разговор слепого с глухим. Хотите чтобы кто-то смог проверить - нужен минимально возможный код, который можно откомпилировать на другой машине и проверить. Нет кода - разговор не о чём.

 

Добавлено: пользуйтесь отладкой (Отладка):

Предварительная настройка

Точки останова

Запуск отладки

Наблюдаемые выражения

Просмотр стека вызовов

Пошаговая отладка

Приостановка, возобновление и завершение отладки

Отладка на истории

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

comp, 2016.04.03 18:21

Ошибка выполнения

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

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 &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
  return(rates_total);
}

 В четверке такое прокатывало на ура! В пятерке - облом. Это еще одно архитектурное ограничение, по сравнению с четверкой? Дайте ссылку на обсуждение этого, сам не нашел.


 
Правильно ли понимаю, что присваивать что-либо индикаторным буферам можно только после первого вызова самим терминалом (не вручную) OnCalculate?
 
comp:
Правильно ли понимаю, что присваивать что-либо индикаторным буферам можно только после первого вызова самим терминалом (не вручную) OnCalculate?

Обращаться к индикаторным буферам можно после вызова OnCalculate(). При этом сам индикаторный буфер должен быть объявлен в области глобальных переменных:

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red
#property indicator_width1  2
#property indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define DATA_LIMIT 37
 

Кажеться нашел  что искал  но от древности кода выдает ошибку

 помогите исправить ......если несложно 

а если поможете его развернуть на правую сторону экрана то вообще  будет супер

Файлы:
 
Karputov Vladimir:

Обращаться к индикаторным буферам можно после вызова OnCalculate().

Как оказалось, вы ошибаетесь. Можно обращаться только тогда, когда САМ терминал вызывет OnCalculate. При этом в MT4 условие более гибкое, т.к. достаточно вызова всего один раз OnCalculate. А в MT5 - надо дожидаться вызова OnCalculate САМИМ терминалом каждый раз, после SetIndexBuffer. Доказательство

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

    TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

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 &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

В MT4 этот индикатор будет пахать без проблем, в MT5 - вылетит сразу с ошибкой. Как оказалось, в MT4 достаточно дождаться первого вызова OnCalculate САМИМ терминалом, и дальше что угодно делать с буферами, включая их переопределение через SetIndexBuffer. А вот в MT5 после КАЖДОГО SetIndexBuffer необходимо дожидаться снова первого вызова OnCalculate САМИМ терминалом.

 

Такая особенность в документации нигде не освещена. И, вроде, не подходит под определение "новичка".

 

Можно ли ожидать, что в MT5 будет поведение такое же, как в MT4? Т.е. чтобы после первого вызова OnCalculate САМИМ терминалом можно было без проблем вызывать SetIndexBuffer?

 
comp:

Как оказалось, вы ошибаетесь. Можно обращаться только тогда, когда САМ терминал вызывет OnCalculate. При этом в MT4 условие более гибкое, т.к. достаточно вызова всего один раз OnCalculate. А в MT5 - надо дожидаться вызова OnCalculate САМИМ терминалом каждый раз, после SetIndexBuffer. Доказательство

В MT4 этот индикатор будет пахать без проблем, в MT5 - вылетит сразу с ошибкой. Как оказалось, в MT4 достаточно дождаться первого вызова OnCalculate САМИМ терминалом, и дальше что угодно делать с буферами, включая их переопределение через SetIndexBuffer. А вот в MT5 после КАЖДОГО SetIndexBuffer необходимо дожидаться снова первого вызова OnCalculate САМИМ терминалом.

 

Такая особенность в документации нигде не освещена. И, вроде, не подходит под определение "новичка".

 

Можно ли ожидать, что в MT5 будет поведение такое же, как в MT4? Т.е. чтобы после первого вызова OnCalculate САМИМ терминалом можно было без проблем вызывать SetIndexBuffer?

Не занимайтесь словоблудием - естественно вызов OnCalculate подразумевает вызов самим терминалом, ибо 
Функция OnCalculate() вызывается только в пользовательских индикаторах при необходимости произвести расчет значений индикатора по событию Calculate. Обычно это происходит при поступлении нового тика по символу, для которого рассчитывается индикатор. При этом индикатор не обязательно должен быть прикреплен к какому-нибудь ценовому графику данного символа.
Причина обращения: