Equity Indicator

 

Попробовал 3 разных индикатора equity, но ни один не показывает график - https://www.google.com/search?q=equity+indicator+-+mql4&ie=utf-8&oe=utf-8

В том окне, где должен быть чарт - пустота - https://snag.gy/0ufvns.jpg

Для теста написал свой индикатор и 2х строк, все равно ничего не показывает.

Why???

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2

#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE

#property indicator_color1 Blue
#property indicator_color2 Pink

struct SGenerics
{
   double m0[], m1[];
};

SGenerics iG;

input string InpMagic = "SNTS";

void OnInit()
{
    ZeroMemory(iG);

    SetIndexBuffer(0, iG.m0); ArraySetAsSeries(iG.m0, true);
    SetIndexBuffer(1, iG.m1); ArraySetAsSeries(iG.m1, true);

    PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
    PlotIndexSetString(0, PLOT_LABEL, "Balance");

    PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
    PlotIndexSetString(0, PLOT_LABEL, "Equity");

    IndicatorSetInteger(INDICATOR_DIGITS, 5);
    IndicatorSetString(INDICATOR_SHORTNAME, InpMagic);
}

int OnCalculate(
    const int bars,
    const int counted,
    const datetime &time[],
    const double &open[],
    const double& high[],
    const double& low[],
    const double &close[],
    const long &ticks[],
    const long &volume[],
    const int &spread[])
{
    iG.m0[0] = AccountBalance();
    iG.m1[0] = AccountEquity();
    
    return 1;
}
 
Andy Sanders:

Why???

Потому что все значения Вы записываете в одно и то же место (в одну и ту же точку графика). Чтобы получилась линия, нужно обеспечить сдвиг предыдущих данных в момент прихода новых. А так все сливается в одну точку, которую, к тому же, не видно в силу специфики выбранного Вами способа отображения - линии. Линия ведь не может быть построена по одной точке, нужно, как минимум, две точки для ее построения.
 
Andy Sanders:

Попробовал 3 разных индикатора equity, но ни один не показывает график - https://www.google.com/search?q=equity+indicator+-+mql4&ie=utf-8&oe=utf-8

В том окне, где должен быть чарт - пустота - https://snag.gy/0ufvns.jpg

Для теста написал свой индикатор и 2х строк, все равно ничего не показывает.

Why???

Отчего ссылка на кодобазу через гугл? Да и картинку вполне себе сюда можно вставить.

Для теста написал свой индикатор и 2х строк, все равно ничего не показывает. 

Ну прям так и ничего? Что прописали в коде, то и показывает, то есть эквити и баланс нового неторгованного счёта.

 

Ок, подправил с учетом сдвига - заработало, спасибо
Хотя мне казалось, что сдвиг в буфере автоматом делается ... ну ок
Также почему-то, если есть 2 буфера с одинаковым постоянным значением, то чарт не масштабирует шкалу и линий не видно (прилипают к потолку)
Пришлось добавить незначительную разницу между буферами.
Это заработало ...

Теперь почему-то функции AccountBalance() и AccountEquity() всегда возвращают баланс текущего аккаунта, а не тестируемого.
Можно ли как-то получить именно изменение баланса в режиме тестирования?

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2

#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE

#property indicator_color1 Blue
#property indicator_color2 Pink

struct SGenerics
{
   double m0[], m1[];
};

SGenerics iG;
int iStop = 1;

input string InpMagic = "SNTS";

void OnInit()
{
    ZeroMemory(iG);

    SetIndexBuffer(0, iG.m0); // ArraySetAsSeries(iG.m0, true);
    SetIndexBuffer(1, iG.m1); // ArraySetAsSeries(iG.m1, true);

    PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
    PlotIndexSetString(0, PLOT_LABEL, "Balance");

    PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
    PlotIndexSetString(0, PLOT_LABEL, "Equity");

    IndicatorSetInteger(INDICATOR_DIGITS, 5);
    IndicatorSetString(INDICATOR_SHORTNAME, InpMagic);
}

int OnCalculate(
    const int bars,
    const int counted,
    const datetime &time[],
    const double &open[],
    const double& high[],
    const double& low[],
    const double &close[],
    const long &ticks[],
    const long &volume[],
    const int &spread[])
{
    if (counted == 0)
    {
        ArrayFill(iG.m0, 0, bars, AccountBalance() + Point());
        ArrayFill(iG.m1, 0, bars, AccountEquity() - Point());
    }
    else
    {
        iG.m0[1] = iG.m0[0];
        iG.m1[1] = iG.m1[0];
        
        iG.m0[0] = AccountBalance();
        iG.m1[0] = AccountEquity();

    }

    return bars;
}
Файлы:
Capture.PNG  25 kb
 
Andy Sanders:

Ок, подправил с учетом сдвига - заработало, спасибо
Хотя мне казалось, что сдвиг в буфере автоматом делается ... ну ок

Так только два значения будет видно: текущее и предыдущее. Чтобы видеть все значения, нужно сдвигать все имеющиеся значения вверх. Также есть другой выход (с автоматическим сдвигом, как Вы говорите). Заключается он в том, что будет видно только одно значение на один бар. Тогда подойдет и предыдущая версия. Но для отображения графика нужно будет ждать закрытия хотя бы одного бара.

Теперь почему-то функции AccountBalance() и AccountEquity() всегда возвращают баланс текущего аккаунта, а не тестируемого.
Можно ли как-то получить именно изменение баланса в режиме тестирования?

В режиме тестирования нужно выбрать Индикатор в выпадающем списке, находящемся в верхнем левом углу окна тестера. Тогда индикатор будет брать тестируемые AccountBalance и AccountEquity. Правда, их некому будет изменять... 

 
Ihor Herasko:
Спасибо, но это не то, как-то все слишком геморно ...
Мне нужен был не индикатор отдельно, а чтобы его навесить на советник и тестировать именно советник, а индикатор просто болтающуюся эквити рисовать должен
если запустить индикатор параллельно с советником нельзя, то нафик это барахло, я не понимаю как работает советник, пока я не вижу как двигается эквити

После МТ5 с МТ4 работать можно только на морально-волевых ...
 
Andy Sanders:
Спасибо, но это не то, как-то все слишком геморно ...
Мне нужен был не индикатор отдельно, а чтобы его навесить на советник и тестировать именно советник, а индикатор просто болтающуюся эквити рисовать должен
если запустить индикатор параллельно с советником нельзя, то нафик это барахло, я не понимаю как работает советник, пока я не вижу как двигается эквити

После МТ5 с МТ4 работать можно только на морально-волевых ...

Тестер не освоили ещё в МТ4 и всё, пошло оно, это барахло ))) 

В визуализации на график цепляйте свой индикатор. 

 
Vitalie Postolache: В визуализации на график цепляйте свой индикатор. 
AccountBalance() и AccountEquity() всегда возвращают баланс текущего аккаунта, а не тестируемого
 
Andy Sanders:
Спасибо, но это не то, как-то все слишком геморно ...
Мне нужен был не индикатор отдельно, а чтобы его навесить на советник и тестировать именно советник, а индикатор просто болтающуюся эквити рисовать должен
если запустить индикатор параллельно с советником нельзя, то нафик это барахло, я не понимаю как работает советник, пока я не вижу как двигается эквити

После МТ5 с МТ4 работать можно только на морально-волевых ...
В тестере не требуется такой инструмент. Ведь он уже встроен в него: закладка График. Там и баланс, и эквити есть. Таким образом, индикатор баланса/эквити может потребоваться только в онлайн.
 
Andy Sanders:
AccountBalance() и AccountEquity() всегда возвращают баланс текущего аккаунта, а не тестируемого
То есть советник когда считает в тестере лот от AccountEquity() и  считается именно то, что нужно, то  нужное значение эквити святой дух подсовывает? Чушь не порите.