Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 696

 
Northwest:

1. Верните все назад, не мучайте компьютер .

Извините но вернуть не получиться,необходимо что бы индикатор считал слева на право.

А я его и не мучаю, я его использую по прямому назначению.

2.iBandsOnArray, iStdDevOnArray  рассчитанные на данных, хранящихся в массиве

Ну да они рассчитываются на данных из массива bbMacd[]   и что далее?

3.Массив же, заполняется в 1 цикле

В одном или в первом?

Вы хотите сказать что для заполнения одного массива нужен персональный цикл в котором этот

массив заполняется и более никакие операции производить нельзя?


Для меня важно выяснить почему происходит замедление работы индикатора и как вычислять те места где это происходит.

Вопросов стало больше а ответов нет.

К сожалению Вы так и не подсказали.

Если что-то строится по массиву, то строиться оно должно по уже готовому массиву. А это - один цикл подготовки массива и второй цикл построения индикатора по этому массиву. Это в общем случае. Есть ещё частные, но их обдумывать нужно в частном же порядке - например, можно сделать функции, возвращающие значения только с одного рассчитанного бара:

//+------------------------------------------------------------------+
//| BandsOnArray                                                     |
//+------------------------------------------------------------------+
double BandsOnArray(const int rates_total,const int index,const int period,const double deviation_bb,const double &array[],const int line,const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
   //--- calculate StdDev
   double dev=StdDevOnArray(rates_total,index,period,array);
   //--- base line
   double mid=0;              
   for(int i=0; i<period; i++)
      mid+=array[index+i];    
   mid/=period;               
   //--- upper line
   double top=mid+dev*deviation_bb;
   //--- lower line
   double btm=mid-dev*deviation_bb;
   return(line==UPPER_BAND ? top : line==LOWER_BAND ? btm : mid);
  }  
//+------------------------------------------------------------------+
//| StdDevOnArray                                                    |
//+------------------------------------------------------------------+
double StdDevOnArray(const int rates_total,const int index,const int period,const double &array[],const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
//--- calculate value
   double avg=0;              
   for(int i=0; i<period; i++)
      avg+=array[index+i];    
   avg/=period;               
   double sd=0;
   for(int i=0; i<period; i++)
      sd+=(avg-array[index+i])*(avg-array[index+i]);
   return(sqrt(sd/period));
  }  
//+------------------------------------------------------------------+

Но им тоже требуется на входе уже подготовленный массив данных, так как StdDevOnArray и BandsOnArray используют Simple-сглаживание, для которого нужны заполненные данные в количестве, равном значению Period сглаживания.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам

Artyom Trishkin, 2018.11.18 20:21

PlotIndexSetInteger(0,PLOT_ARROW,140);

Но вам нужно создать количество буферов, равных количеству недель. И каждому буферу задать код стрелки от 140 до 149 - 1,2,3,4,5,6,7,8,9,10 - десять недель разве хватит на год? Это же всего 70 дней. Или как вы хотели?


А можно переобувать SetIndexArrow через case?

Или хотя бы на гистограмме цифры выводить?


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам

Artyom Trishkin, 2018.11.18 20:02

Буфер же заполняется значением часа. И если час равен нулю, то гистограмма не нарисуется. Значит нужно проверить равен ли час нулю (в настройках задали искать нулевой час), и если он равен нулю, то вводить в буфер не значение часа (ноль), а 0.1 - чтобы отобразить столбец гистограммы. При этом в окне данных значение будет показано не 0.1, а 0, так как Digits индикатора задан нулевым.


Вот теперь понятно, спасибо.

 
psyman:

А можно переобувать SetIndexArrow через case?

Или хотя бы на гистограмме цифры выводить?



Вот теперь понятно, спасибо.

Он действует сразу на весь буфер.

Вам же нужно на найденном баре ставить значок номера недели, и их должно быть по количеству недель в году. Стрелок с цифрами явно не хватает в Wingdings.

Можно вывернуться при помощи объектов-текстов, а бары помечать значениями номера недели, но значок для буфера задать 32 - пустой символ. Значение на баре будет, а отображено не будет. Тогда значением может быть номер недели в году, а в объекте прописать всё, что хочется и объект выводить на найденном баре.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам

Artyom Trishkin, 2018.11.19 10:50

Он действует сразу на весь буфер.

Вам же нужно на найденном баре ставить значок номера недели, и их должно быть по количеству недель в году. Стрелок с цифрами явно не хватает в Wingdings.

Можно вывернуться при помощи объектов-текстов, а бары помечать значениями номера недели, но значок для буфера задать 32 - пустой символ. Значение на баре будет, а отображено не будет. Тогда значением может быть номер недели в году, а в объекте прописать всё, что хочется и объект выводить на найденном баре.


Я про день недели писал - пн, вт, ср.., не номер. Те нужно всего 5 разных отметок на чарте.

 
psyman:

Я про день недели писал - пн, вт, ср.., не номер. Те нужно всего 5 разных отметок на чарте.

Ну тогда вам нужно пять буферов, и каждому назначить свой номер стрелки - от 140 до 144.

 
Artyom Trishkin:

Если что-то строится по массиву, то строиться оно должно по уже готовому массиву. А это - один цикл подготовки массива и второй цикл построения индикатора по этому массиву. Это в общем случае. Есть ещё частные, но их обдумывать нужно в частном же порядке - например, можно сделать функции, возвращающие значения только с одного рассчитанного бара:

Но им тоже требуется на входе уже подготовленный массив данных, так как StdDevOnArray и BandsOnArray используют Simple-сглаживание, для которого нужны заполненные данные в количестве, равном значению Period сглаживания.

Спасибо что прояснили ситуацию.
 

приветствую 

как сделать всплывающее окно с кнопками?  Нужно для ручного подтверждения/отмены сделки

 
Andrey Sokolov:

приветствую 

как сделать всплывающее окно с кнопками?  Нужно для ручного подтверждения/отмены сделки

MessageBox()
 
Artyom Trishkin:
MessageBox()

Спасиб 

 

Всем привет.

Как получить процент максимальной просадки как в тестере?

Вот есть код:

double  MaxPeak,DD, MaxDD, DD2, MaxDD2;
--------------------------------------
--------------------------------------
это вывод:

 SM("Maximal drawdown        : " + DoubleToString(MaxDrawdown_Money(), 2)+ " (" + DoubleToString(MaxDrawdown_Protsent(), 2) +" %)");

-------------------------------------
-------------------------------------

//--------------------Рассчет % относительной просадки----------
double MaxDrawdown_Protsent()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD2 = NormalizeDouble((MaxPeak - AccountEquity())/MaxPeak*100,2);
}
if (MaxDD2< DD2)
{
MaxDD2 = DD2;
}
return (MaxDD2);
}
//---------------------Рассчет суммы максимальной просадки--------
double MaxDrawdown_Money()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD = NormalizeDouble(MaxPeak - AccountEquity(),2);
}
if (MaxDD< DD)
{
MaxDD = DD;
}
return (MaxDD);
}

Сумма макс.просадки выводится как в тестере один в один, процент относительной просадки тоже как в тестере. 

Как получить % максимальной просадки как в тестере?

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