C-4: Что Вы понимаете под словом "выровнять"? Нормализовать мантиссу по количеству знаков после запятой? - Для этого есть функция NormalizeDouble. Если что-то другое - опишите подробней.
На входе любой положительный дабл, на выходе округление до реальной цены, которая может быть на этом инструменте.
Если шаг цены 0,25, значит округление до 0,25. Ну типа этого:
Спасибо за ответ на торгую на реале и всегда МТ5 включена . Если программа сама укажет что нужно обновиться это хорошо а если нет то где этот Live update?
Newalligator: Спасибо за ответ на торгую на реале и всегда МТ5 включена . Если программа сама укажет что нужно обновиться это хорошо а если нет то где этот Live update?
При подключении к торговому счёту на демо-сервере MetaQuotes-Demo терминал MetaTrader сам проверяет наличие обновлений. Если обновление в наличии, начнётся автоматическая закачка новой версии.
Всем доброго времени суток! Возникла такая проблема - не могу воспользоваться в пользовательском индикаторе показаниями другого пользовательского индикатора. Почти уверен, что делаю неправильно, но все же выложу код:
intOnCalculate(constint rates_total, constint prev_calculated, constint begin, constdouble &price[]) {
if(rates_total < iPeriod ) {
return(0);
}
int first;
if ( prev_calculated == 0 ) {
first = iPeriod + begin;
} else {
first = prev_calculated - 1;
}
// Пользовательский индикатор ROC для EURUSD double aRocRatesEURUSD[];
int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");
CopyBuffer(iRocHandleEURUSD, 0, 0, rates_total, aRocRatesEURUSD);
for(int bar = first; bar < rates_total; bar++) {
Вот, в этом коде буфер индикатора Rate Of Changes (aRocRatesEURUSD) не доступен. Почему - не могу понять, как правильно подключить этот индикатор, помогите, пожалуйста, разобраться?
Всем доброго времени суток! Возникла такая проблема - не могу воспользоваться в пользовательском индикаторе показаниями другого пользовательского индикатора. Почти уверен, что делаю неправильно, но все же выложу код:
Вот, в этом коде буфер индикатора Rate Of Changes (aRocRatesEURUSD) не доступен. Почему - не могу понять, как правильно подключить этот индикатор, помогите, пожалуйста, разобраться?
Хэндлы индикаторов следует объявлять в OnInit():
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
// Пользовательский индикатор ROC для EURUSD double aRocRatesEURUSD[];
int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");
}
Иначе получается, что Вы каждый вызов OnCalculate() создаёте новый пользовательский индикатор.
jommerbot: Так тоже не работает. Массив с буфером в итоге либо пустой, либо забит левыми значениями.
Тем не менее объявлять хэндлы индикаторов в OnInit() - это правильно. Другое дело - зачем Вам каждый раз с приходом нового тика (функция OnCalculate()) записывать
rates_total, // размер входных таймсерий
в буфер
aRocRatesEURUSD
? Это ведь может очень тормозить терминал. И, к тому же, это очень глубокая история.
#property indicator_chart_window#property indicator_buffers1#property indicator_plots1#property indicator_type1 DRAW_LINE#property indicator_color1 Red
double ExtLineBuffer[];
int iRocHandleEURUSD;
int iPlotShift = 0;
int iPeriod = 6;
voidOnInit() {
SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
PlotIndexSetInteger(0, PLOT_SHIFT, iPlotShift);
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, iPeriod - 1);
int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");
if( iRocHandleEURUSD == INVALID_HANDLE )
{
Print("Не удалось получить хендл индикатора ROC EURUSD");
}
}
intOnCalculate(constint rates_total, constint prev_calculated, constint begin, constdouble &price[]) {
if(rates_total < iPeriod ) {
return(0);
}
int first;
double aRocRatesEURUSD[];
if ( prev_calculated == 0 ) {
first = iPeriod + begin;
} else {
first = prev_calculated - 1;
}
for(int bar = first; bar < rates_total; bar++) {
CopyBuffer(iRocHandleEURUSD, 0, bar, 1, aRocRatesEURUSD);
Print(aRocRatesEURUSD[ 0 ]);
ExtLineBuffer[ bar ] = NormalizeDouble(aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS);
}
return(rates_total);
}
Не понимаю, где моя ошибка. Копирование буфера этого же индикатора в советнике и скрипте работает, а вот в индикаторе - нет. Хендл индикатора инициализируется без ошибки.
Что Вы понимаете под словом "выровнять"? Нормализовать мантиссу по количеству знаков после запятой? - Для этого есть функция NormalizeDouble. Если что-то другое - опишите подробней.
На входе любой положительный дабл, на выходе округление до реальной цены, которая может быть на этом инструменте.
Если шаг цены 0,25, значит округление до 0,25. Ну типа этого:
Но при этом, если есть офсет (вроде 0,13; 0,38; 0,63; 0,88), значит он учитывается. Тогда:
на входе 1,0 на выходе 1,13;
на входе 1,25 на выходе 1,38;
1,5 ---> 1,63...
На уровне API это можно было бы в пару команд ассемблера закодить и это однозначно базовая функция. Я думал она есть =/
как сделать update до нового билда через Live update. Где он этот Live update
Спасибо за ответ на торгую на реале и всегда МТ5 включена . Если программа сама укажет что нужно обновиться это хорошо а если нет то где этот Live update?
Всем доброго времени суток! Возникла такая проблема - не могу воспользоваться в пользовательском индикаторе показаниями другого пользовательского индикатора. Почти уверен, что делаю неправильно, но все же выложу код:
Вот, в этом коде буфер индикатора Rate Of Changes (aRocRatesEURUSD) не доступен. Почему - не могу понять, как правильно подключить этот индикатор, помогите, пожалуйста, разобраться?
Всем доброго времени суток! Возникла такая проблема - не могу воспользоваться в пользовательском индикаторе показаниями другого пользовательского индикатора. Почти уверен, что делаю неправильно, но все же выложу код:
Вот, в этом коде буфер индикатора Rate Of Changes (aRocRatesEURUSD) не доступен. Почему - не могу понять, как правильно подключить этот индикатор, помогите, пожалуйста, разобраться?
Хэндлы индикаторов следует объявлять в OnInit():
Иначе получается, что Вы каждый вызов OnCalculate() создаёте новый пользовательский индикатор.Хэндлы индикаторов следует объявлять в OnInit():
Так тоже не работает. Массив с буфером в итоге либо пустой, либо забит левыми значениями.
rates_total, // размер входных таймсерийв буфер
? Это ведь может очень тормозить терминал. И, к тому же, это очень глубокая история.
Думаю Вам будет интересно прочесть статью Принципы экономного пересчета индикаторов
А также прочесть справку по функции OnCalculate().
Ок, даже в самом простейшем случае не работает:
Не понимаю, где моя ошибка. Копирование буфера этого же индикатора в советнике и скрипте работает, а вот в индикаторе - нет. Хендл индикатора инициализируется без ошибки.