double BullsP[]; double BearsP[];
Массивы нулевой длины. Сделайте их тоже буферами как Buffer1 и со стилем DRAW_NONE если не хотите отображать их.
Массивы нулевой длины. Сделайте их тоже буферами как Buffer1 и со стилем DRAW_NONE если не хотите отображать их.
Добавил
double BullsP[]; double BearsP[];
SetIndexStyle(1,DRAW_NONE, 0, 2, color1); SetIndexBuffer(1, BullsP); SetIndexStyle(2,DRAW_NONE, 0, 2, color1); SetIndexBuffer(2, BearsP);
Но выводит все равно не то, что нужно. Какая-то прямая линия в самом низу.... окна индикатора....
Где же ошибка?
Расчет таков:
Если закрытие выше открытия (т.е. с повышением), то считаем силу быков (BullsP ) как High - Low. А силу медведей (BearsP), как High - Low - *тело свечи*
Если закрытие нижу открытия (т.е. с понижением), то считаем силу медведей (BearsP) как High - Low. А силу быков (BullsP ), как High - Low - *тело свечи*
Затем сглаживаем значения получившихся массивов с "силами" быков и медведей по 8 периодам.
Находим разницу между сглаженными значениями и выводим ее на экран в виде линии.
Добавлю весь подправленный код для удобочитаемости.
//+------------------------------------------------------------------+ //| Test_indicator.mq4 | //| Mikhail Dementienko | //| | //+------------------------------------------------------------------+ #property copyright "Mikhail Dementienko" #property link "" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Black extern int period1 = 8; extern color color1 = Black; double Buffer1[]; double BullsP[]; double BearsP[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators //---- SetIndexStyle(0,DRAW_LINE, 0, 2, color1); SetIndexBuffer(0, Buffer1); SetIndexStyle(1,DRAW_NONE, 0, 1, CLR_NONE); SetIndexBuffer(1, BullsP); SetIndexStyle(2,DRAW_NONE, 0, 1, CLR_NONE); SetIndexBuffer(2, BearsP ); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { double BullsPbuf; double BearsPbuf; int counted_bars=IndicatorCounted(); int i = counted_bars; while (i>=0) { if (Open[i]<Close[i]) // закрытие вверх { BullsP[i] = High[i] - Low[i]; // сила быков = макс - мин. BearsP[i] = BullsP[i] - MathAbs(Open[i]-Close[i]); // медведи = быки - то, что не отвоевали } if (Open[i]>Close[i]) { BearsP[i] = High[i] - Low[i]; BullsP[i] = BearsP[i] - MathAbs(Open[i]-Close[i]); // соотв. наоборот } if (Open[i]==Close[i]) { BullsP[i] = High[i] - Low[i]; BearsP[i] = BullsP[i]; } BullsPbuf = iMAOnArray (BullsP, 0, period1,0,MODE_SMMA,0); // сглаживаем значения BearsPbuf = iMAOnArray (BearsP, 0, period1,0,MODE_SMMA,0); // Buffer1[i] = BullsPbuf - BearsPbuf ; // выводим в буфер индикатора разницу сглаженных "сил" быков и медведей. i--; } //---- return(0); } //+------------------------------------------------------------------+
BullsPbuf = iMAOnArray (BullsP, 0, period1,0,MODE_SMMA,i); // сглаживаем значения
BearsPbuf = iMAOnArray (BearsP, 0, period1,0,MODE_SMMA,i); //
в iMAOnArray последний параметр "Индекс получаемого значения из индикаторного буфера" всегда ноль стоял, а надо i, потому и линия получалась
и ещё вначале i=Bars-counted_bars, а не counted_bars
и всё-равно у тебя после вычитания уср. значений получится 0 .т.к BullsPbuf = BearsPbuf будет всегда
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Нашлепал индикатор, а он не хочет рисоваться. В программировании плохо разбираюсь. Пожалуйста, помогите.
Я коментами пометил что и как хотел посчитать.