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

 

Всем доброго дня! Есть индикатор Stochastic RSI. Проблема, что работает очень медленно. Насколько я понял основные "тормоза" создает этот участок из-за большого периода, по которому осуществляется поиск минимума и максимума в массивах:

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

По идее решением могло быть быть, если индикатор при первом заходе проходил бы по всем барам в истории, а при последующих обновлял бы только последний бар. Но не понимаю как это сделать. Так вообще возможно сделать? Если да, буду благодарен, если поделитесь ссылкой или советом как это сделать.

Вот весь код индикатора:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
 
Valeriy Yastremskiy #:

Да вроде норм, только проверка объема и достаточности лучше в одну функцию забить и логику кстати тоже поменять по достаточности. Мы проверяем больше или меньше лот маржи, но не уменьшаем его, если запрашиваемый лот меньше, я так же рассчитываю лот относительно имеющейся маржи, какой лот можно выставить,  и сравниваю его с минимальным лотом, и вот если он меньше, тогда точно торговля окончена.

Спасибо, Валерий!

С уважением, Владимир.

 

А вот и первые результаты работы функции:

2023.02.02 14:41:05.466 Experts automated trading is disabled because the account has been changed
2023.02.02 14:41:09.990 Experts automated trading is enabled
2023.02.02 14:42:43.410 Experts automated trading is disabled because the account has been changed
2023.02.02 14:42:52.690 Experts automated trading is enabled
2023.02.02 14:43:33.882 Experts automated trading is disabled because the account has been changed
2023.02.02 14:43:44.869 Experts automated trading is enabled

Интересно бы знать, что это такое? Не в смысле перевода на русский язык, т.к. уже перевёл:

2023.02.02 14:41:05.466 Автоматическая торговля экспертов отключена, так как аккаунт был изменен

а в смысле того, как может аккаунт быть изменённым? Кто-нибудь может подсказать, что за хрень творится с моим счётом и что в таких случаях делать?

Может быть это, как-нибудь связано с тем, что временно переключался с реального на демо счёт?

С уважением, Владимир.

 
Приветствую, возможно ли реализовать или есть готовое решение,  растягивать графики по вертикали без ограничений, как в tradingview?
 
MrBrooklin #:

Может быть это, как-нибудь связано с тем, что временно переключался с реального на демо счёт?

Да
 
Sergey Gridnev #:
Да

Спасибо, Сергей! Теперь буду знать.

С уважением, Владимир.

 
Советник использует индикатор на указанном ТФ, как можно по хендлу индикатора узнать ТФ?
 
Aleksey Vyazmikin #:
Советник использует индикатор на указанном ТФ, как можно по хендлу индикатора узнать ТФ?

Не понятно, указанный ТФ вроде должен быть известен. Подробнее ситуацию надо.

 
Aleksey Vyazmikin #:
Советник использует индикатор на указанном ТФ, как можно по хендлу индикатора узнать ТФ?

https://www.mql5.com/ru/docs/series/indicatorparameters

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
IndicatorParameters - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Valeriy Yastremskiy #:

Не понятно, указанный ТФ вроде должен быть известен. Подробнее ситуацию надо.

При копировании массива не хочу указывать принудительно ТФ для универсальности кода.

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