Скачать MetaTrader 5

Как пересчитать данные внутри бара?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
neelan
91
neelan 2012.06.12 07:12 

Форумчане, скажите как реализовать следующую идею.

Есть нулевой часовой бар. Внутри этого бара расположены несколько минутных баров. Исходя из данных только этих минутных баров нужно построить индюк из 2-ух линий по схеме:

1. Считая от начала часа на новых Low минуток производится суммирование всех цен Close минуток от начала часа и до текущего момента, но не дальше конца часа.

2. Также считая от начала часа на новых High минуток производится суммирование всех цен Open минуток от начала часа и до текущего момента, но не дальше конца часа.

Заранее спасибо!

Aleksander
1673
Aleksander 2012.06.12 07:18  

ну а просто на минутках чего это мешает сделать?

Time[0] - время текущего нулевого бара есть

--

int TimeHour( datetime time)

Возвращает час для указанного времени.

---

условно - сделай цикл от текущего бара на -61 бар назад

поверь - равен ли час у этого бара - часу у нулевого (тогда в обработку его) {

__и тут обрабатывай их по своему желанию...

}

MikeM
289
MikeM 2012.06.12 11:33  
У меня навязчивая идея, что этот вопрос 3 дня назад я уже читал.
Как и 3 дня назад, я не понимаю, каков смысл суммирования нескольких выборочных цен.
Neelan, просвятите, пожалуйста.
neelan
91
neelan 2012.06.13 13:57  
Aleksander:

ну а просто на минутках чего это мешает сделать?

Попытался. Первый цикл сделал сразу, а вот со вторым, отвечающим за суммирование цен пока не пойму что не так. Вот код:

int start() {
 double lw,cls;
   int i, j;
   int th=TimeHour(Time[0]);
   for (i = 61; i>=0; i--){
   if(TimeHour(Time[i])!=th) continue;
   if (lw<NormalizeDouble(Low[i], Digits) || lw<=0) 
  {
   lw=NormalizeDouble(Low[i], Digits);
   for (j = i; j<=61; j++){
   if(TimeHour(Time[j])!=th) continue;
   cls=NormalizeDouble(Close[j], Digits)+cls;
   }  
  }
 }
 return(0); 
}
MikeM:
У меня навязчивая идея, что этот вопрос 3 дня назад я уже читал.
Как и 3 дня назад, я не понимаю, каков смысл суммирования нескольких выборочных цен.
Neelan, просвятите, пожалуйста.
Экспериментирую. Хочу одну идею проверить.
Aleksander
1673
Aleksander 2012.06.13 14:17  
а второй то цикл зачем? если Уже бар попал в текущий час то делай им свои проверки и суммирования...
neelan
91
neelan 2012.06.13 14:49  
Aleksander:
а второй то цикл зачем? если Уже бар попал в текущий час то делай им свои проверки и суммирования...
Там нужно чтобы не просто попал в час, нужно чтобы суммирование запускалось только в случае если
 if (lw<NormalizeDouble(Low[i], Digits) || lw<=0) 
  {
   lw=NormalizeDouble(Low[i], Digits);
  }
Т.е только на новом Low. И если первый цикл считает от 61 до 0, то второй наоборот от i до начала часа.
Aleksander
1673
Aleksander 2012.06.13 14:56  

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

или тебе нужен только самый последний Лоу в течении текущего часа?


int start() {
   double lw,cls;
   int i, j;
   int th = TimeHour(Time[0]);
   //
   for (i = 61; i>=0; i--){
       if (TimeHour(Time[i]) = th) {
          if (NormalizeDouble(Low[i], Digits) < lw) {
             lw=NormalizeDouble(Low[i], Digits);
             cls = 0;
             for (j = i; j<=61; j++) {
                 if(TimeHour(Time[j]) = th) {
                   cls = NormalizeDouble(Close[j], Digits) + cls;
                 }  
             }
          }
       }
   }
   return(0); 
}
neelan
91
neelan 2012.06.13 15:08  
Aleksander:

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

или тебе нужен только самый последний Лоу в течении текущего часа?

Cамый низкий Low, в течении текущего часа.

В распринтовке Print (" j =", j); пишет ерунду. Должен писать от i == индексу самого низкого Low и до начала часа. Т.е. например j=7; j=8; j=9; j=10; j=11; j=12;

Aleksander
1673
Aleksander 2012.06.13 15:20  

ну выведи j через DoubleToStr(j, 0)

int start() {
   double lw,cls;
   int i, j, k;
   int th = TimeHour(Time[0]);
   //
   for (i = 61; i>=0; i--){
       if (TimeHour(Time[i]) = th) {
          if (NormalizeDouble(Low[i], Digits) < lw) {
             lw=NormalizeDouble(Low[i], Digits);
             cls = 0;
             print сюда вставь
             for (j = i; j<=61; j++) {
                 if(TimeHour(Time[j]) = th) {
                   cls = NormalizeDouble(Close[j], Digits) + cls;
                 }  
             }
          }
       }
   }
   return(0); 
}
neelan
91
neelan 2012.06.13 15:34  
Aleksander:

ну выведи j через DoubleToStr(j, 0)


Так даже цикл не запустился. Пишет cls=0; lw=0;
Aleksander
1673
Aleksander 2012.06.13 15:37  
косяг в тексте возможно - чегогадать - показывай весь текст... хотя... мой запас кончился...
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий