Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А может лучше обратить внимание разработчиков на проблему инициализации индикаторных буферов? Почему-же в МТ4 такой проблемы нет? Может опять не полное понимание? Проблема в том что даже при принудительной инициализации буферов после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах остаётся мусор и ничем оттуда его не выковырять...
Лично я не против костылей, но только если эти костыли не слишком сложны и с положительным эффектом. Но запись в файл с последующим чтением это корявый костыль.
Как Вы себе это представляете: "... после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах ..."? Это каким образом, после удаления индикатора с графика, Вы имеет доступе с его индикаторным буферам?
Давайте подробнее попробуем найти проблему. Нужен стандартный набор: код + что делали + что получили...
Как Вы себе это представляете: "... после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах ..."? Это каким образом, после удаления индикатора с графика, Вы имеет доступе с его индикаторным буферам?
Давайте подробнее попробуем найти проблему. Нужен стандартный набор: код + что делали + что получили...
Чисто предположение: может быть, попадание в ту же область памяти при текущем обращении к буферам, которая была занята предыдущими буферами.
Я в разговор не сильно вникал, не пинайте, Алексей хочет, чтобы при перезапуске (вкл/выкл терминала) индикатора данные в буферах оставались или только при prev_calculated = 0 (в случае, если ранее prev_calculated > 0)?
Как Вы себе это представляете: "... после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах ..."? Это каким образом, после удаления индикатора с графика, Вы имеет доступе с его индикаторным буферам?
Давайте подробнее попробуем найти проблему. Нужен стандартный набор: код + что делали + что получили...
Вот код индикатора
| BalansEquityTest.mq5 |
| Viktorov |
| v4forex@yandex.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link "v4forex@yandex.ru"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots 3
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrGold, clrGreen, clrRed
#property indicator_width1 2
#property indicator_label1 "Balance"
#property indicator_type2 DRAW_HISTOGRAM2
#property indicator_color2 clrCrimson
#property indicator_width2 2
#property indicator_label2 "EquityMin"
#property indicator_type3 DRAW_HISTOGRAM2
#property indicator_color3 clrDarkViolet
#property indicator_width3 2
#property indicator_label3 "EquityMax"
double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, balance, INDICATOR_DATA);
SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
SetIndexBuffer(2, equityMin, INDICATOR_DATA);
SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
SetIndexBuffer(4, equityMax, INDICATOR_DATA);
SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
ArrayInitialize(balance, 0.0); // принудительная
ArrayInitialize(equityMax, 0.0); // инициализация
ArrayInitialize(equityMaxB, 0.0); // всех
ArrayInitialize(equityMin, 0.0); // буферов
ArrayInitialize(equityMinB, 0.0); // индикатора
ArraySetAsSeries(balance, true); // все
ArraySetAsSeries(clrBalance, true); // буферы
ArraySetAsSeries(equityMax, true); // индикатора
ArraySetAsSeries(equityMaxB, true); // имеют
ArraySetAsSeries(equityMin, true); // флаг
ArraySetAsSeries(equityMinB, true); // AS_SERIES
IndicatorSetInteger(INDICATOR_DIGITS, 2);
IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
//---
if(prev_calculated == 0)
return(rates_total);
double bal = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
if(rates_total > prev_calculated)
{
minEquity = 0;
maxEquity = 0;
}
minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity);
maxEquity = fmax(maxEquity, equity);
balance[0] = AccountInfoDouble(ACCOUNT_BALANCE);
clrBalance[0] = 0.0;
equityMinB[0] = balance[0];
equityMin[0] = minEquity;
equityMaxB[0] = balance[0];
equityMax[0] = maxEquity;
if(balance[0] > balance[1])
clrBalance[0] = 1.0;
if(balance[0] < balance[1])
clrBalance[0] = 2.0;
Comment(PositionsTotal());
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Чуть позже выложу видео, тогда будет всё понятно. На пальцАх не могу пояснить доступней чем раньше.
Надеюсь вас не затруднит скачать и распаковать видео.
К сожалению почему-то не зафиксировался сам факт удаления индикатора с чарта и прикрепления, но всё-же присутствует тот факт что индикатор есть, потом его нет и опять есть. Это как раз удаление и постановка его взад.
Обратите внимание на окно данных после повторной установки индикатора. Даже после принудительной инициализации буферов там остаётся космический мусор.
Вот код индикатора
Нужно провести такой эксперимент: оставить открытым только один график и на него ставить и убирать индикатор. И нужна информация о терминале и об операционной системе (вкладка "Журнал" терминала).
А при чём тут один график? То что индикатор только на одном графике разве не достаточно?
добавлено:
Хоть и не верю что ОС может повлиять на поведение индикатора, всё-же вот информация о системе и терминале
2016.10.16 20:56:34.904 Terminal Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:00
2016.10.16 20:56:34.904 Terminal MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
А при чём тут один график? То что индикатор только на одном графике разве не достаточно?
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M @ 2.50GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038C9E8FAFF9EA373522ECC6D5159962
Такс... Начинает вырисовываться ситуация. Добавьте такой код:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M @ 2.50GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038C9E8FAFF9EA373522ECC6D5159962
Начал исполнять, но при запуске индикатора в одном буфере почти по всей истории чумные числа.
После снятия индикатора и постановке его взад через некоторое время буферы пустые.
Позже повторю снятие и постановку.
Предварительные выводы:
Такс... Начинает вырисовываться ситуация. Добавьте такой код:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
Добавил так