Индикаторы: работа с буферами

  • Автор темы Автор темы sergh67
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

sergh67

Активный участник
Подскажите, пожалуйста, как быть?
Есть инфо индикаторы, которые выводят сигналы с RSI Ctoch и т.п.
Мне также надо вывести сигнал с нескольких индикаторов. Точнее объединить индикаторы в одном коде и сами сигналы будут зависимыми, связанными с другими индикаторами находящимися в коде.
Вторая сложность в том, что каждый индикатор построен на каскаде буферов . Скажем 1buf содержится в 2buf. 2buf содержится в 3buf. и т.д. Набирается до 5 -6 буферов в каждом индикаторе. Причем идет такая зависимость: - если я хоть одну линию удаляю из init. То индикаторы не работают.
Теоретически что с этим набором можно сделать? Хотя бы понемногу на каждый вопрос ответьте.
И я не сильно программист, вообще не программист. Если можно доходчиво и попроще.
 
Последнее редактирование модератором:

DiZin

Местный знаток
Подскажите, пожалуйста, как быть?
Есть инфо индикаторы, которые выводят сигналы с RSI Ctoch и т.п.
Мне также надо вывести сигнал с нескольких индикаторов. Точнее объединить индикаторы в одном коде и сами сигналы будут зависимыми, связанными с другими индикаторами находящимися в коде.
Вторая сложность в том, что каждый индикатор построен на каскаде буферов . Скажем 1buf содержится в 2buf. 2buf содержится в 3buf. и т.д. Набирается до 5 -6 буферов в каждом индикаторе. Причем идет такая зависимость: - если я хоть одну линию удаляю из init. То индикаторы не работают.
Теоретически что с этим набором можно сделать? Хотя бы понемногу на каждый вопрос ответьте.
И я не сильно программист, вообще не программист. Если можно доходчиво и попроще.
При такой постановке никто не ответит.
Если новый индикатор содержит данные в буферах и их меньше 8 - то можно, потому что можно не встраивать код с чужих индюков в свои. а просто читать с них данные..
см функцию iCustom
 

AlexeyVik

Программист mql4 mql5
Напиши
#property indicator_buffers 1
а в init()
IndicatorBuffers(8);
и тогда будут все буферы а отображаться будет только один.
 

sergh67

Активный участник
К примеру, у меня 3 из 6 буферов задействованы в функции, а остальные составляют цепочку из друг друга. Я не могу понять, как из допустим 3х индикаторов данного типа составить один, чтобы вывести инфо. Они все требуют полноценной инициализации буферов, а я не могу 18 буферов прописать в init().
Я могу вообще не прописывать #property indicator_buffers 1, но так или иначе все буферы должны пройти инициализацию в init(), если хоть одного там не будет, индикатор не выведется.
Я думал о iCustom, но столкнулся с непониманием. К примеру
buf 2 в первой инициализации start(); формируется данными из функции + некий период + метод.
Второй раз он появляется с данными другой функции + другой период + содержит данные предыдущего буфера.
Потом он появляется третий раз + другой период + содержит данные предыдущего буфера.
Так что же мне выводить через iCustom? Что будет считывать iCustom?
 
Последнее редактирование:

sergh67

Активный участник
Если трудно ответить на мои вопросы, подскажите в какой форме они должны быть?
 

qqmber

Почетный гражданин
Если трудно ответить на мои вопросы, подскажите в какой форме они должны быть?

Пишите код и выкладывайте тут. Упростите задачу до скелета, до трех нехитрых индикаторов, и логики 6 взаимозависимых буферов для каждого. Проще будет обсудить неудачный код, чем неведомый нам ход мысли.
 

sergh67

Активный участник
Вот смотрите как вариант. это один из трех индюков + его я еще хотел разложить на все TF. Если в этом поможете будет вообще шикарно. Смысл сигналов таков: Зелёные вверх = BUY,
Красные вниз = SELL,
Зеленые ниже 0 как и красные выше 0 нейтральная зона, - требует подтверждения сигнала с младших TF.
Ну и соответственно как можно совместить 3 подобных индикатора?
PHP:
Expand Collapse Copy
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 Aqua
#property indicator_color2 White
#property indicator_color3 Yellow
#property indicator_color4 C'0,55,0'
#property indicator_color5 FireBrick
#property indicator_color6 Silver
#property indicator_color7 FireBrick
#property indicator_color8 Orange
#property indicator_width4 3
#property indicator_width5 3
#property indicator_width8 2

extern bool Show_VISUAL_Alerts=true;
extern int TimeFrame = 10080;
extern int       P1=9;
extern int       P2=9;
extern int       P3=9;
extern int       P4=1;
extern int       P5=21;
extern int       P6=7;
extern int       P7=1;
extern int       P8=4;
extern int       P9=21;
double A[],B[],C[],D[],E[],F[],G[],H[];
string INDNAME ="Batt";
int init(){
 SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,E);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,C);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,D);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,G);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,H);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,B);
   SetIndexStyle(6,DRAW_NONE);
   SetIndexBuffer(6,A);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(7,F);
   IndicatorShortName(INDNAME);
   return(0);
  }
int start(){
int counted_bars=IndicatorCounted();
for (int i = Bars; i >= 0; i--){
      A[i] = (iMA(Symbol(), TimeFrame, 2,0,0, PRICE_TYPICAL, i)*10000)-(iMA(Symbol(), TimeFrame, P1,0,0, PRICE_TYPICAL, i)*10000); 
      B[i] = SS(P2,i); 
      D[i] = SS(P3,i); 
      C[i] = QQ(A,P4,i); 
      E[i] = QQ(C,P5,i);
      D[i] = QQ(C,P7,i);
      F[i] = QQ(D,P6,i); 
      B[i] = QQ(C,P8,i);
      D[i] = QQ(B,P7,i);
      F[i] = QQ(B,P6,i);
      E[i] = QQ(B,P9,i);
      G[i] = C[i];    
      H[i] = C[i]; 
  if(C[i] <=C[i+1])
      G[i] = EMPTY_VALUE;
  if(C[i] >=C[i+1])
      H[i] = EMPTY_VALUE;
   }
   if(Show_VISUAL_Alerts==true){        
string Mountains_direct="";
string Mountains_text="";
color  Mountains_colordirect;
color  Mountains_colortext;       
         
       if(G[0]==C[0] && G[0]>0){Mountains_direct="l";              Mountains_colordirect=Lime;}
       if(G[0]==C[0] && G[0]>0){Mountains_text="BUY_"+TimeFrame;   Mountains_colortext=DarkGoldenrod;}
       if(H[0]==C[0] && H[0]<0){Mountains_direct="l";              Mountains_colordirect=Red;}
       if(H[0]==C[0] && H[0]<0){Mountains_text="SELL_"+TimeFrame;  Mountains_colortext=DarkGoldenrod;}
       if(G[0]==C[0] && G[0]<0){Mountains_direct="l";              Mountains_colordirect=Red;}
       if(G[0]==C[0] && G[0]<0){Mountains_text="SELL_"+TimeFrame;  Mountains_colortext=DarkGoldenrod;}
       if(H[0]==C[0] && H[0]>0){Mountains_direct="l";              Mountains_colordirect=Lime;}
       if(H[0]==C[0] && H[0]>0){Mountains_text="BUY_"+TimeFrame;   Mountains_colortext=DarkGoldenrod;}
string Mountains2_direct="";
string Mountains2_text="";
color  Mountains2_colordirect;
color  Mountains2_colortext;      

       if(G[0]==C[0] && G[0]>0){Mountains2_direct="l";              Mountains2_colordirect=C'0x50,0x50,0x99';}
       if(H[0]==C[0] && H[0]<0){Mountains2_direct="l";              Mountains2_colordirect=C'0x50,0x50,0x99';}
       if(G[0]==C[0] && G[0]<0){Mountains2_direct="l";              Mountains2_colordirect=Orange;}
       if(H[0]==C[0] && H[0]>0){Mountains2_direct="l";              Mountains2_colordirect=Orange;}
      

      ObjectDelete(INDNAME+"a_sigal");
      ObjectCreate(INDNAME+"a_sigal", OBJ_LABEL,WindowFind(INDNAME), 0, 0);
     ObjectSetText(INDNAME+"a_sigal",Mountains_direct, 15, "Wingdings",Mountains_colordirect );
         ObjectSet(INDNAME+"a_sigal", OBJPROP_CORNER, 3);
         ObjectSet(INDNAME+"a_sigal", OBJPROP_XDISTANCE, 10);
         ObjectSet(INDNAME+"a_sigal", OBJPROP_YDISTANCE, 10);
         
      ObjectDelete(INDNAME+"b_sigal");
      ObjectCreate(INDNAME+"b_sigal", OBJ_LABEL,WindowFind(INDNAME), 0, 0);
     ObjectSetText(INDNAME+"b_sigal",Mountains_text, 10, "Neuropol",Mountains_colortext);
         ObjectSet(INDNAME+"b_sigal", OBJPROP_CORNER, 3);
         ObjectSet(INDNAME+"b_sigal", OBJPROP_XDISTANCE, 80);
         ObjectSet(INDNAME+"b_sigal", OBJPROP_YDISTANCE, 13); 
         
      ObjectDelete(INDNAME+"c_sigal");
      ObjectCreate(INDNAME+"c_sigal", OBJ_LABEL,WindowFind(INDNAME), 0, 0);
     ObjectSetText(INDNAME+"c_sigal",Mountains2_direct, 15, "Wingdings",Mountains2_colordirect );
         ObjectSet(INDNAME+"c_sigal", OBJPROP_CORNER, 3);
         ObjectSet(INDNAME+"c_sigal", OBJPROP_XDISTANCE, 10);
         ObjectSet(INDNAME+"c_sigal", OBJPROP_YDISTANCE, 30);
         }
   return(0);
  }
double SS(int vv, int bar){double nn = 9999, rr = -5555;
for(int i = 0; i < vv; i++){
      if (nn > A[bar + i]) nn = A[bar + i];
      if (rr < A[bar + i]) rr = A[bar + i];
}
      if (nn == rr) return (B[bar+1]);
   return (100 * (A[bar] - nn) / (rr - nn));
}
double QQ (double array[], int period, int shift){double ss = 0;
for (int i = shift + period - 1; i >= shift; i--){ss += array[i];
}
   return (ss / period);
}
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Вот смотрите как вариант. это один из трех индюков + его я еще хотел разложить на все TF. Если в этом поможете будет вообще шикарно. Смысл сигналов таков: Зелёные вверх = BUY,
Красные вниз = SELL,
Зеленые ниже 0 как и красные выше 0 нейтральная зона, - требует подтверждения сигнала с младших TF.
Ну и соответственно как можно совместить 3 подобных индикатора?

Один индикатор не может иметь больше 8 буферов, факт.
Но в одном окне могут работать несколько индикаторов, т.е. линий может быть нарисовано сколько угодно.
Если нужно считать показания нескольких индикаторов или нескольких буферов индикатора в коде, то выше уже сказали, iCustom(). Первый параметр - имя индюка, предпоследний - номер буфера.
 

sergh67

Активный участник
Если нужно считать показания нескольких индикаторов или нескольких буферов индикатора в коде, то выше уже сказали, iCustom(). Первый параметр - имя индюка, предпоследний - номер буфера.

Предположим, я попробую сделать iCustom(). Но?
Я не программист. И мне чтобы какой-нибудь пустяк слепить, может понадобиться неделя, а то и месяцы. А из-за того что мне это непонятно, а потому очень тяжело, я задаю вопросы чтобы облегчить понимание задачи.

Вот у меня такой вопрос: Хоть и внутреннее содержание индикаторов похожее они по сути своей абсолютно разные. Я их понатыкаю через iCustom(), а как это все будет работать? Они что друг другу мешать не будут? Я говорю о том, что они у меня все работают в разных диапазонах.

Я обращал внимание, что зачастую в цифровых индикаторах используется функция Void(); Я ее не знаю, но может она как то разделяет функционал цифровых индикаторов на составные части.

Скажите что у меня бред, что не бред. В том смысле, что на самом деле мне необходимо знать, на что обратить внимание, чтобы сделать такой индикатор как хочу? Или все же одним iCustom() все обойдется?

У меня и индикаторы объема присутствуют и трендовые и oscillator. Как они будут уживаться в одном коде?
 

Вложения

  • 2013-06-23_024212.jpg
    2013-06-23_024212.jpg
    61,7 КБ · Просмотры: 164
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Самый большой бред в твоих словах, это утверждение что ты не программист, но хочешь слепить индикатор.
Или ты не программист и прекрати этим заниматься, или, если хочешь освоить программирование, то изволь пытаться разобраться в предложенных функциях.
Если тебе предлагают использовать iCustom() значит так можно решить поставленную проблему и ничего ничему мешать не будет.
И ещё один способ обойти ограничение в 8 буферов, это использовать обычные переменные для тех значений которые не должны отображаться на графике.
 

sergh67

Активный участник
Программистом можно назвать того, кто хоть один индикатор сам написал. Я же не понимаю свечного анализа вообще. Не понимаю как работают многие функции вообще, хоть раньше писал программки на PHP для работы. Я только и освоил что сигналы ставить, да линии размножать. Все остальное методом тыка. Вы считаете что метод тыка позволяет меня называть уже программистом?
Вот я прописал iCustom;
PHP:
Expand Collapse Copy
for (int i = Bars; i >= 0; i--){
      aa[i] = iCustom(NULL, TimeFrame, "Foundation",0, 0, 7);
      bb[i] = iCustom(NULL, TimeFrame, "Foundation",0, 0, 6);
      cc[i] = iCustom(NULL, TimeFrame, "Foundation",0, 0, 2);
      dd[i] = iCustom(NULL, TimeFrame, "Foundation",0, 0, 3);
      ee[i] = iCustom(NULL, TimeFrame, "Foundation",0, 0, 1);
      ff[i] = iCustom(NULL, TimeFrame, "Foundation",0, 0, 8); 
   }
Правильно определяется либо первая линия, если я не проставляю цифры в остальных, либо они определяются все
но абсолютно как прямые линии. Пробовал периоды ставить, буферы указывать поименно, for изменял и под каждый буфер ставил. - Ничего. - только терминал зависает.
Я раньше единственный раз данные с одного буфера получал, а не с такого количества.
Может подскажете что делать?
 
Последнее редактирование:

DiZin

Местный знаток
Может проще составить ТЗ полностью? и попросить запрограммировать?
У функции iCustom указывается как номер буфера, так и сдвиг .. тем самым можно читать значения на разных свечках .. и у разных линий индикатора
 

sergh67

Активный участник
Я не хочу по возможности иметь дело с программистами, которые берутся что то делать. Мне в этом не везет.
Из 1000000 попыток не платно не бесплатно мне не кто нечего до сих пор не сделал. Зато переписки длятся от нескольких дней до недели, и с моей точки зрения, по сущим пустякам. Я устал от этого. Единственный раз пол года назад мне здесь немного помогли, именно на этом форуме в этой категории или разделе.
Я не так уж много прошу. Дать мне толчок ,подсказку чтобы дальше я мог сам ковыряться.
Во вторых у меня не определены поступления и обработка сигналов. Это само по себе потребует уйму времени доводить все до ума.
В третьих: Если я получу результат объединив насколько индикаторов, то в дальнейшем хочу их разложить на все TF, для того чтобы были подтверждения для открытия сделок.
Вот к примеру третья картинка отражает поведение рынка на разных TF. касательно одного индикатора. Код которого я выше предоставил.
И еще раз повторюсь. Что на этом индикаторе тренд определяется прохождением раскрашенной линии через 0. Зеленые выше 0 - тренд идет вверх. Красные ниже 0 - тренд идет вниз. Зеленая ниже 0, или красная выше 0 считается нейтральной зоной. В этой нейтральной зоне определяют тренд младшие TF. Соответственно 10 или 100 пунктов профита в день будет зависеть именно от этих параметров. Остальные индикаторы призваны искать общее направление движения тренда. По их сигналам я надеюсь смогу определять на каких TF оно наиболее эффективное и наиболее предсказуемое.
Прикладываю еще две картинки, чисто на обозрение, чтобы было понятно что у меня есть очень неплохие шансы сделать рынок более понятным и предсказуемым. И это не считая того что у меня есть и более перспективные разработки. Очень хочется чтобы мне чуть-чуть помогли.
 

Вложения

  • 2013-06-23_204148.jpg
    2013-06-23_204148.jpg
    113 КБ · Просмотры: 59
  • 2013-06-23_204420.jpg
    2013-06-23_204420.jpg
    124,9 КБ · Просмотры: 61
  • 2013-06-23_200339.jpg
    2013-06-23_200339.jpg
    68,9 КБ · Просмотры: 64

sergh67

Активный участник
Может проще составить ТЗ полностью? и попросить запрограммировать?
У функции iCustom указывается как номер буфера, так и сдвиг .. тем самым можно читать значения на разных свечках .. и у разных линий индикатора

Не совсем понял сдвиг чего? Если не трудно поясните.
 

DiZin

Местный знаток
Не совсем понял сдвиг чего? Если не трудно поясните.


double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.

mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer. - это номер буффера

shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). - это индекс свечи на которой смотрится зачение - 0 - текущая, 1 - предыдущая и тд

P.S. не в обиду сказано, но часто, если нет ТЗ то программист и не знает, что Вы от него хотите. И, соответственно, я не удивляюсь, почему ничего и не получается у Вас от взаимодействия...

и совет.. Сделайте сначала для текущего тайма. Сделать его после мультитаймфреймовым будет скорей всего проще.
 

DiZin

Местный знаток
Соответственно, разберем Ваш код
for (int i = Bars; i >= 0; i--){
aa = iCustom(NULL, TimeFrame, "Foundation",0, 0, 7);
bb = iCustom(NULL, TimeFrame, "Foundation",0, 0, 6);
cc = iCustom(NULL, TimeFrame, "Foundation",0, 0, 2);
dd = iCustom(NULL, TimeFrame, "Foundation",0, 0, 3);
ee = iCustom(NULL, TimeFrame, "Foundation",0, 0, 1);
ff = iCustom(NULL, TimeFrame, "Foundation",0, 0, 8);
}
Вы во все массивы берете данные с индюка Foundation, с одной и той же линии с буффером 0, но с разных свечек (последняя цифра)
соответственно, уверен, что Вы совсем не это хотели. и совсем уже не удивительно, что у Вас прямые линии.. код если и должен выглядить то примерно так (увы, не знаю сколько параметров у данного индюка)

for (int i = Bars; i >= 0; i--){
aa = iCustom(NULL, TimeFrame, "Foundation",0, 0, 7, i);
bb = iCustom(NULL, TimeFrame, "Foundation",0, 0, 6, i);
cc = iCustom(NULL, TimeFrame, "Foundation",0, 0, 2, i);
dd = iCustom(NULL, TimeFrame, "Foundation",0, 0, 3, i);
ee = iCustom(NULL, TimeFrame, "Foundation",0, 0, 1, i);
ff = iCustom(NULL, TimeFrame, "Foundation",0, 0, 8, i);
}

Но данным кодом Вы "тупо" перегоняете буфферы индюка в свои. Зачем?!

Поэтому повторюсь, выкладывайте индикаторы, и на картинках объясняйте что хотите.. Или учитесь программировать на более простых задачах, постепенно усложняя их
 

DiZin

Местный знаток
for (int i = Bars; i >= 0; i--){
aa = iCustom(NULL, TimeFrame, "Foundation",0, 0, 7, i);
bb = iCustom(NULL, TimeFrame, "Foundation",0, 0, 6, i);
cc = iCustom(NULL, TimeFrame, "Foundation",0, 0, 2, i);
dd = iCustom(NULL, TimeFrame, "Foundation",0, 0, 3, i);
ee = iCustom(NULL, TimeFrame, "Foundation",0, 0, 1, i);
ff = iCustom(NULL, TimeFrame, "Foundation",0, 0, 8, i);
if((aa < 0) && (aa < bb))
buffer = -1;
if((aa > 0) && (aa > bb))
buffer = 1;
}


что то такое Вы должны увидеть у себя в коде
 

DiZin

Местный знаток
Мне в этом не везет.
Из 1000000 попыток не платно не бесплатно мне не кто нечего до сих пор не сделал. Зато переписки длятся от нескольких дней до недели, и с моей точки зрения, по сущим пустякам.
Я не удивлюсь, если и про текущую ветку у Вас будет похожее мнение. На данном этапе Вас невозможно понять.
Вы пытаетесь решить задачу изначально неправильным способом. Программирование - не только знание языка. но еще и способ мышления.
Поэтому мы и гуманитарии немного не понимаем друг друга. И когда человек путается в объяснении задачи, то программист путается в исполнении задачи.
 

sergh67

Активный участник
Спасибо за подсказку. Попробую. Я по советам выше ставил цифры последними, а i пробовал ставить только перед цифрами. Возможно действительно в этом ошибка.
Потом я на этой ветке раз 5 объявлялся. Но меня как правило из этой ветки гонят, типа здесь только вопросы можно задавать, правда не факт что на них ответят и не факт что удачно намекнут. Говорят иди от сюда в ветку где доработка индикаторов и ботов, а там меня почти всегда игнорируют, как будто я не какого вопроса не задавал.
Спасибо за ваше предложение, но как бы все индикаторы я здесь выкладывать не хочу, они мне стояли года жизни и потери зрения.
Если у меня все будет хреново, а я подозреваю что у меня будет все хреново, я вам тогда если вы не против лучше в Личку напишу.
Просто все как то стремно и не верится. Сколько я чего не выкладывал, только расстраивался. Результатов почти никогда положительных нет.

Потом описать все сигналы оповещения в текстовом формате довольно трудно, нужна хоть какая-то наработка сигналов. Иначе я вас и себя в конец запутаю. Надо хоть что-то сделать. Более подробно материал можно будет изложить или выложить мне кажется, только когда будет хоть что-то сделано.
 
Последнее редактирование:

sergh67

Активный участник
Еще хотел задать вопрос:
Если я буду разбивать индикатор по TF, или соединять несколько индикаторов вместе, мне это делать сплошным блоком, или через функцию start()1,2,3, или правильней как то еще?
 
Статус
Закрыто для дальнейших ответов.
Верх