[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 78

 

Здравствуйте! Начал постигать мкюэль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()
}

Так вот, как сделать так, чтоб линия буфера проходила не по каждой свече, а через две(три и т.д.) свечи?

 
wolf05632:

Так вот, как сделать так, чтоб линия буфера проходила не по каждой свече, а через две(три и т.д.) свечи?

Для начала научитесь вставлять правильно в код сообщение, кнопочкой "SRC", чтобы он имел читабельным вид и выглядел прям так как в MetaEditor'е.


Вторым шагом будет Ваша попытка связать переменную Counted_bars с оператором if.

Например:

Будем ввести расчёт индикатора каждый второй бар (нечётные пропускаем, чётные оставляем):

if (MathMod(Counted_bars, 2) == 0)
{
   // расчёт для буферов индикатора
}
else return(0);

Здесь можете почитать про функцию MathMod(). Но не обязательно пользоваться ей. В оператор if Вы можете вставить любое условие.

Но не забудьте, что от таких модификаций кода у Вас начнут пропадать некоторые значения в буфере. Нужно Вам это или нет, Я не знаю. Всё будет зависеть от Вашей задачи.

 

Немного не понял. Я пытался сделать шаг цикла, равный двум (по моему, у Вас смысл такой же будет), но не работает. Мне надо не конкретно через одну, а через произвольное количество свечей. Я так понял, структура должна быть такая:

массив буфера[1]= массив свечей[1]

массив буфера[2]= массив свечей[2]

массив буфера[3]= массив свечей[4]

...

массив буфера[5]= массив свечей[х] и т.д. Но не получается

 
wolf05632:

Не вижу закономерности между индексами буфера и индексами свечей...

А ещё будет лучше, если Вы прикрепите рисунок того, что хотите получить.

 

Получается так

А мне нужно так:

Но не привязывайтесь конкретно к тому, что линии русуются через свечку, они могут рисоваться и через две, и через три, и т.д.

 
sergeev:

похоже надо было топик сносить не сюда, а к телепатам.

он просто над нами издевается.


Да посмотрите уже код, там без пробелов видно где результат отправки ордера, код его ошибки и digits для инструмента.
 

Тогда придётся использовать зиг-заг'о подобный индикатор (Моя точка зрения):

#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() в качестве индекса рассчитываемого бара.

Ваша задача теперь вынести делитель во внешний параметр. Он и будет равен числу пропускаемых свечей.

 
grell:

Да посмотрите уже код, там без пробелов видно где результат отправки ордера, код его ошибки и digits для инструмента.

Вот именно. Поэтому речь и пошла о Телепатах.

Ранее Вы приводили код:

Alert("Ordersend_Number",res,err);

А ошибку, сколько раз Я не смотрел код, к сожалению обнаружить не смог... Опыта в написании мультивалютных советников нет. Лишь знаю некоторые принципы и не больше.

 
Так ведь ежу же ясно, что -1129 и есть код ошибки, где вы видели ошибку с номером 1292?
 
grell:
Так ведь ежу же ясно, что -1129 и есть код ошибки, где вы видели ошибку с номером 1292?

Всякое бывает...

Вы только на одном ДЦ тестировали Вашего советника? И долго ли приходит ошибка 129? Или ордер всё же открывается после нескольких запросов?

Причина обращения: