Скачать MetaTrader 5

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

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

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

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

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

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

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

Aleksander
1673
Aleksander  

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

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

--

int TimeHour( datetime time)

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

---

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

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

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

}

MikeM
289
MikeM  
У меня навязчивая идея, что этот вопрос 3 дня назад я уже читал.
Как и 3 дня назад, я не понимаю, каков смысл суммирования нескольких выборочных цен.
Neelan, просвятите, пожалуйста.
neelan
91
neelan  
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  
а второй то цикл зачем? если Уже бар попал в текущий час то делай им свои проверки и суммирования...
neelan
91
neelan  
Aleksander:
а второй то цикл зачем? если Уже бар попал в текущий час то делай им свои проверки и суммирования...
Там нужно чтобы не просто попал в час, нужно чтобы суммирование запускалось только в случае если
 if (lw<NormalizeDouble(Low[i], Digits) || lw<=0) 
  {
   lw=NormalizeDouble(Low[i], Digits);
  }
Т.е только на новом Low. И если первый цикл считает от 61 до 0, то второй наоборот от i до начала часа.
Aleksander
1673
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) {
          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  
Aleksander:

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

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

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

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

Aleksander
1673
Aleksander  

ну выведи 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  
Aleksander:

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


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