Здравствуйте! Начал постигать мкюэль4. Свой вопрос изложу на примере простого индикатора, который считает макс и мин цену свеч, и через два буфера выводит линии по экстремумам свечей на экран:
#property indicator_chart_window // Индик. рисуется в основном окне#property indicator_buffers 2// Количество буферов#property indicator_color1 Blue // Цвет первой линии#property indicator_color2 Red // Цвет второй линииdouble Buf_0[],Buf_1[]; // Объявление массивов (под буферы индикатора)//--------------------------------------------------------------------int init() // Специальная функция init()
{
SetIndexBuffer(0,Buf_0); // Назначение массива буферуSetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линииSetIndexBuffer(1,Buf_1); // Назначение массива буферуSetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Стиль линииreturn; // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------int start() // Специальная функция start()
{
int i,// Индекс бара
Counted_bars; // Количество просчитанных баров //--------------------------------------------------------------------
Counted_bars=IndicatorCounted(); // Количество просчитанных баров
i=Bars-Counted_bars-1;
// Индекс первого непосчитанногоwhile(i>=0) // Цикл по непосчитанным барам
{
Buf_0[i]=High[i]; // Значение 0 буфера на i-ом баре
Buf_1[i]=Low[i]; // Значение 1 буфера на i-ом баре
i--; // Расчёт индекса следующего бара
}
//--------------------------------------------------------------------return; // Выход из спец. ф-ии start()
}
Так вот, как сделать так, чтоб линия буфера проходила не по каждой свече, а через две(три и т.д.) свечи?
Так вот, как сделать так, чтоб линия буфера проходила не по каждой свече, а через две(три и т.д.) свечи?
Для начала научитесь вставлять правильно в код сообщение, кнопочкой "SRC", чтобы он имел читабельным вид и выглядел прям так как в MetaEditor'е.
Вторым шагом будет Ваша попытка связать переменную Counted_bars с оператором if.
Например:
Будем ввести расчёт индикатора каждый второй бар (нечётные пропускаем, чётные оставляем):
if (MathMod(Counted_bars, 2) == 0)
{
// расчёт для буферов индикатора
}
elsereturn(0);
Здесь можете почитать про функцию MathMod(). Но не обязательно пользоваться ей. В оператор if Вы можете вставить любое условие.
Но не забудьте, что от таких модификаций кода у Вас начнут пропадать некоторые значения в буфере. Нужно Вам это или нет, Я не знаю. Всё будет зависеть от Вашей задачи.
Немного не понял. Я пытался сделать шаг цикла, равный двум (по моему, у Вас смысл такой же будет), но не работает. Мне надо не конкретно через одну, а через произвольное количество свечей. Я так понял, структура должна быть такая:
массив буфера[1]= массив свечей[1]
массив буфера[2]= массив свечей[2]
массив буфера[3]= массив свечей[4]
...
массив буфера[5]= массив свечей[х] и т.д. Но не получается
Тогда придётся использовать зиг-заг'о подобный индикатор (Моя точка зрения):
#property indicator_chart_window // Индик. рисуется в основном окне#property indicator_buffers 2// Количество буферов#property indicator_color1 Blue // Цвет первой линии#property indicator_color2 Red // Цвет второй линииdouble Buf_0[], Buf_1[]; // Объявление массивов (под буферы индикатора)//--------------------------------------------------------------------int init() // Специальная функция init()
{
SetIndexBuffer(0, Buf_0); // Назначение массива буферуSetIndexStyle (0, DRAW_SECTION);
SetIndexBuffer(1, Buf_1); // Назначение массива буферуSetIndexStyle (1, DRAW_SECTION);
return; // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------int start() // Специальная функция start()
{
int i,// Индекс бара
Counted_bars; // Количество просчитанных баров //--------------------------------------------------------------------
Counted_bars=IndicatorCounted(); // Количество просчитанных баров if (MathMod(Bars, 2) != 0 && Counted_bars == 0)
return(0);
i = Bars-Counted_bars-1;
// Индекс первого непосчитанногоwhile(i >= 0) // Цикл по непосчитанным барам
{
if (MathMod(i, 2) == 0)
{
Buf_0[i] = High[i]; // Значение 0 буфера на i-ом баре
Buf_1[i] = Low[i]; // Значение 1 буфера на i-ом баре
}
i--; // Расчёт индекса следующего бара
}
//--------------------------------------------------------------------return; // Выход из спец. ф-ии start()
}
В изменениях Я думаю Вы разберётесь. Единственное, в чём Я был не прав, лучше использовать параметр Bars, а не IndicatorCounted() в качестве индекса рассчитываемого бара.
Ваша задача теперь вынести делитель во внешний параметр. Он и будет равен числу пропускаемых свечей.
Да посмотрите уже код, там без пробелов видно где результат отправки ордера, код его ошибки и digits для инструмента.
Вот именно. Поэтому речь и пошла о Телепатах.
Ранее Вы приводили код:
Alert("Ordersend_Number",res,err);
А ошибку, сколько раз Я не смотрел код, к сожалению обнаружить не смог... Опыта в написании мультивалютных советников нет. Лишь знаю некоторые принципы и не больше.
Здравствуйте! Начал постигать мкюэль4. Свой вопрос изложу на примере простого индикатора, который считает макс и мин цену свеч, и через два буфера выводит линии по экстремумам свечей на экран:
Так вот, как сделать так, чтоб линия буфера проходила не по каждой свече, а через две(три и т.д.) свечи?
Так вот, как сделать так, чтоб линия буфера проходила не по каждой свече, а через две(три и т.д.) свечи?
Для начала научитесь вставлять правильно в код сообщение, кнопочкой "SRC", чтобы он имел читабельным вид и выглядел прям так как в MetaEditor'е.
Вторым шагом будет Ваша попытка связать переменную Counted_bars с оператором if.
Например:
Будем ввести расчёт индикатора каждый второй бар (нечётные пропускаем, чётные оставляем):
Здесь можете почитать про функцию MathMod(). Но не обязательно пользоваться ей. В оператор if Вы можете вставить любое условие.
Но не забудьте, что от таких модификаций кода у Вас начнут пропадать некоторые значения в буфере. Нужно Вам это или нет, Я не знаю. Всё будет зависеть от Вашей задачи.
Немного не понял. Я пытался сделать шаг цикла, равный двум (по моему, у Вас смысл такой же будет), но не работает. Мне надо не конкретно через одну, а через произвольное количество свечей. Я так понял, структура должна быть такая:
массив буфера[1]= массив свечей[1]
массив буфера[2]= массив свечей[2]
массив буфера[3]= массив свечей[4]
...
массив буфера[5]= массив свечей[х] и т.д. Но не получается
Не вижу закономерности между индексами буфера и индексами свечей...
А ещё будет лучше, если Вы прикрепите рисунок того, что хотите получить.
Получается так
А мне нужно так:
Но не привязывайтесь конкретно к тому, что линии русуются через свечку, они могут рисоваться и через две, и через три, и т.д.
похоже надо было топик сносить не сюда, а к телепатам.
он просто над нами издевается.
Да посмотрите уже код, там без пробелов видно где результат отправки ордера, код его ошибки и digits для инструмента.
Тогда придётся использовать зиг-заг'о подобный индикатор (Моя точка зрения):
В изменениях Я думаю Вы разберётесь. Единственное, в чём Я был не прав, лучше использовать параметр Bars, а не IndicatorCounted() в качестве индекса рассчитываемого бара.
Ваша задача теперь вынести делитель во внешний параметр. Он и будет равен числу пропускаемых свечей.
Да посмотрите уже код, там без пробелов видно где результат отправки ордера, код его ошибки и digits для инструмента.
Вот именно. Поэтому речь и пошла о Телепатах.
Ранее Вы приводили код:
А ошибку, сколько раз Я не смотрел код, к сожалению обнаружить не смог... Опыта в написании мультивалютных советников нет. Лишь знаю некоторые принципы и не больше.
Так ведь ежу же ясно, что -1129 и есть код ошибки, где вы видели ошибку с номером 1292?
Всякое бывает...
Вы только на одном ДЦ тестировали Вашего советника? И долго ли приходит ошибка 129? Или ордер всё же открывается после нескольких запросов?