Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 744

 
Marat Sultanov:
Там есть участок кода, который я не понял. Вам нужно самому его откорректировать.


Можете показать что именно....

 
Rafael Sahibgareev:


Можете показать что именно....


Скачайте код - там Marat Sultano написал, что непонятно.
 

Марат , спасибо за оказанную помощь с кодом ......

Еще вопрос , покажите пожалуйста , как правильно организовать цикл для такого участка кода  ......

//--- цикл расчета 
      
        {
        
         //--- если предыдущая свеча имеет параметры больше MSC
         if(IsLossCandle)
            if(ASSHighBuf[i-1]>=max_size_candel)
               BufferLossCanle[i]=low[i-1];
                 {
                  if(IsTopShadow)
                     if((ASSOpenBuf[i-1]==ASSCloseBuf[i-1]) && IMaDifBuff[i]-IMaDifBuff[i-1]>0 || (ASSLowBuf[i-1]==0 && IMaDifBuff[i]-IMaDifBuff[i-1]>0))
                        BufferTop[i]=low[i-1];
                  if(IsLowerShadow)
                     if((ASSOpenBuf[i-1]==ASSCloseBuf[i-1]) && IMaDifBuff[i]-IMaDifBuff[i-1]<0 || (ASSLowBuf[i-1]==0 && IMaDifBuff[i]-IMaDifBuff[i-1]<0))
                        BufferLower[i]=high[i-1];
                 }
        }


//--- return value of prev_calculated for next call 
   return(rates_total);
  }
 
Rafael Sahibgareev:

Марат , спасибо за оказанную помощь с кодом ......

Еще вопрос , покажите пожалуйста , как правильно организовать цикл для такого участка кода  ......

Как-то так:

//--- цикл расчета
   const int Limit = fmax(prev_calculated, 1);

   for(int i=Limit; i<rates_total; ++i)
   {
      //--- если предыдущая свеча имеет параметры больше MSC
      if(IsLossCandle)
      {
         if(ASSHighBuf[i-1]>=max_size_candel) BufferLossCanle[i]=low[i-1];

         if(IsTopShadow)
         {
            if((ASSOpenBuf[i-1]==ASSCloseBuf[i-1] && IMaDifBuff[i]-IMaDifBuff[i-1]>0) || (ASSLowBuf[i-1]==0 && IMaDifBuff[i]-IMaDifBuff[i-1]>0))
            {
               BufferTop[i]=low[i-1];
            }
         }

         if(IsLowerShadow)
         {
            if((ASSOpenBuf[i-1]==ASSCloseBuf[i-1] && IMaDifBuff[i]-IMaDifBuff[i-1]<0) || (ASSLowBuf[i-1]==0 && IMaDifBuff[i]-IMaDifBuff[i-1]<0))
            {
               BufferLower[i]=high[i-1];
            }
         }
      }
   }

//--- return value of prev_calculated for next call 
   return(rates_total);
}

Только меня смутил участок вашего кода:

if(ASSHighBuf[i-1]>=max_size_candel)
   BufferLossCanle[i]=low[i-1];
     {

Почему фигурная скобка там стоит. Был ли замысел, который вы не реализовали? (я намекаю на условный оператор else)

 

Марат,  в очередной раз безграничная благодарность , а то я в последний раз код писал еще в школе 22 года назад.

Вот на счет оператора else я и тупил сидел , куда его воткнуть , как прерыватель следующих четырех операторов.....

С этим я думаю сам разберусь ........

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

 
Rafael Sahibgareev:

Марат,  в очередной раз безграничная благодарность , а то я в последний раз код писал еще в школе 22 года назад.

Вот на счет оператора else я и тупил сидел , куда его воткнуть , как прерыватель следующих четырех операторов.....

С этим я думаю сам разберусь ........

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

Простите, могу ли я узнать вашу цель, какой результат вы хотите получить от обсуждаемого куска кода? Поняв ваш замысел, мне станет гораздо проще вам помочь :)
 

По поводу  цикла спрашивал из любопытва...... Возмоно ли такое......

Сам по себе он без хитростный , первый оператор "иф" если срабатывает запрет то , не срабатывают операторы классификации направления .......

Далее , в будущем,  планирую изменить код , сделать его тиковым с работой на нулевом баре , 

дабы этот самый классификатор запрета появлялся на том тике когда спред выходит за рамки....индикатор без доп. фильтров кластеризации скальперский....

Да и вообще я так себе понимаю , все паттерны живут в тиках......

 

Цикл же для прохода по барам нужен. Если вам нужны показания только для 1 или 2 последних баров, тогда можете без цикла обойтись, но если нужно делать расчет для десятка и больше баров, тогда разумнее использовать цикл, верно?

Отказываясь от циклов вы обрекаете себя на китайски код :)

 

Рафаель, я рекомендую вам почитать в таком порядке:

  1. Условный оператор if-else
  2. Оператор цикла for
  3. Оператор цикла while
  4. Оператор продолжения continue
  5. Оператор завершения break

Ну а если вас затянет, тогда углубляйтесь в:

  1. Оперторы
  2. Основы языка
Я распределил по частоте примененимости на практике. Ни чего сложного, просто достаточно понять суть. 


 

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

В индикаторе  меня и вправду интересовали только последние три бара включая опен[0].....

Позже уже наверное понадобится больше штук 15-20 ..... тут уже без циклов не обойтись .....

Еще раз искренне благодарю за помощь и поддержку.....

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