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

 
Konstantin Nikitin:

Да о том-же. Ладно проскочили. Главное чтоб он понял что к чему...

Он - это кто? Я именно с этого и начал.

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

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

Alexey Viktorov, 2019.06.11 09:06

Для получения Point() SymbolInfoInteger никак не подойдёт.)))

А вообще, это необходимо для того, чтобы не забывать, что Point() или _Point только для текущего символа. Для символов отличных от того на котором работает советник нужно использовать именно эту функцию.

Функция SymbolInfoInteger возвращмет не только int значения, но и long, и bool, и перечисления.

А дальше, конечно имел ввиду Digits() или _Digits а написал то, что написал. И последняя строка ответа касалась второй части вопроса. Не забывайте русскую пословицу "Умный не скажет, дурак не догадается." догадался и сказал, значит ни то, ни другое, а так...
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov:

Следующий вопрос: Как вы думаете как часто значение индикатора будет равно ровно 50?

Как я понял задачу, то должно быть одного цвета >50 и другого цвета <50 а вот ==50 нигде не видел. Конечно чтобы исключить потерю в случае если == 50, надо к одному из сравнений добавить >=50 или другому <=50 Это уже как религия позволяет. Как будет красивей выглядеть.

И второй вопрос: на сколько была необходимость менять всю индексацию буферов? После переиндексации вы точно всё в коде исправили? Может проще было-бы буфер цвета назначить индексом 4, а вспомогательные буферы 5 и 6 соответственно. Меньше пришлось-бы править и меньше вероятность допустить ещё несколько ошибок.

  • Спасибо за ответ. Если бы Любили колупаться в чужом коде, скорее всего мы бы потеряли Вас как эксперта, так что в этом плане как раз таки ПОВЕЗЛО.
  • про <= или >= согласен, упущение, конечно один из них должен присутствовать, как только буду пробегать мимо, а пока не принципиально.
  • Пробовал, переназначал один буфер цвета, переназначал целыми группами, менял группы местами (выше/ниже) - ничего не помогает. Вот сейчас закончу пост и попробую сделать отдельно гистограммный индикатор, без линий. Если заработает, снова буду пытаться их объединить. Тут уже дело принципа. Не хочу оставлять за спиной белые пятна непонятного.

 
Sergey Voytsekhovsky:

  • Спасибо за ответ. Если бы Любили колупаться в чужом коде, скорее всего мы бы потеряли Вас как эксперта, так что в этом плане как раз таки ПОВЕЗЛО.
  • про <= или >= согласен, упущение, конечно один из них должен присутствовать, как только буду пробегать мимо, а пока не принципиально.
  • Пробовал, переназначал один буфер цвета, переназначал целыми группами, менял группы местами (выше/ниже) - ничего не помогает. Вот сейчас закончу пост и попробую сделать отдельно гистограммный индикатор, без линий. Если заработает, снова буду пытаться их объединить. Тут уже дело принципа. Не хочу оставлять за спиной белые пятна непонятного.

Наверное плохо мозг напрягали когда меняли индексацию буферов.

Вернитесь взад, возьмите старый код из сообщения 8806 и поменяйте там только последовательность буферов.

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
Потом проследите условия когда в буфер цвета надо ставить 0 и когда 1
 
Alexey Viktorov:

Наверное плохо мозг напрягали когда меняли индексацию буферов.

Вернитесь взад, возьмите старый код из сообщения 8806 и поменяйте там только последовательность буферов.

Потом проследите условия когда в буфер цвета надо ставить 0 и когда 1

Я так делал, не помогало, допустил что делал с ошибками, после Вашего поста сделал снова. Вот места кода, которые изменил. Старое закоментировано.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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[])
  {
   int i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

Вот так было до внесения изменений. Гистограмма есть, цвета нужного нету.

Вот так стало. Гистограмма исчезла, не отображается. 

Видимо опять слабо голову ломаю.


 
Sergey Voytsekhovsky:

Я так делал, не помогало, допустил что делал с ошибками, после Вашего поста сделал снова. Вот места кода, которые изменил. Старое закоментировано.

Вот так было до внесения изменений. Гистограмма есть, цвета нужного нету.

Вот так стало. Гистограмма исчезла, не отображается. 

Видимо опять слабо голову ломаю.


Здесь нарушена логика вообще. Последовательность должна быть такая: Определили значение гистограммы, заполнили i-тый индекс индикаторного буфера. Затем отдельная проверка, если это значение >=50 буфер цвета заполнить 0, иначе 1. Это определяется последовательностью цветов в директиве

#property indicator_color3  clrGreen,clrRed

Если 0, то берётся цвет clrGreen и если 1 то clrRed 

А эта строка абсолютно лишняя, да и последовательность противоположна первой.

color     colors[]={clrRed,clrGreen};

И это

int       cl;

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

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

Для заполнения буфера цвета я-бы использовал такую конструкцию

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
Оператор ?: равнозначен if else но применяется проще
 
Alexey Viktorov:

Здесь нарушена логика вообще. Последовательность должна быть такая: Определили значение гистограммы, заполнили i-тый индекс индикаторного буфера. Затем отдельная проверка, если это значение >=50 буфер цвета заполнить 0, иначе 1. Это определяется последовательностью цветов в директиве

Если 0, то берётся цвет clrGreen и если 1 то clrRed 

А эта строка абсолютно лишняя, да и последовательность противоположна первой.

И это

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

Для заполнения буфера цвета я-бы использовал такую конструкцию

Оператор ?: равнозначен if else но применяется проще

УУРРАА, и душа запела. Алексей, огромное спасибо !!!!!

Все заработало, не совсем понял, как получается обойтись без массива 

color     colors[]={clrRed,clrGreen};

ведь его описание удалено. Значит здесь вообще можно обойтись без лишнего массива?


 
Sergey Voytsekhovsky:

  • Спасибо за ответ. Если бы Любили колупаться в чужом коде, скорее всего мы бы потеряли Вас как эксперта, так что в этом плане как раз таки ПОВЕЗЛО.
  • про <= или >= согласен, упущение, конечно один из них должен присутствовать, как только буду пробегать мимо, а пока не принципиально.
  • Пробовал, переназначал один буфер цвета, переназначал целыми группами, менял группы местами (выше/ниже) - ничего не помогает. Вот сейчас закончу пост и попробую сделать отдельно гистограммный индикатор, без линий. Если заработает, снова буду пытаться их объединить. Тут уже дело принципа. Не хочу оставлять за спиной белые пятна непонятного.

Сергей огромная благодарность за кнопку on_off для моего советника.Работа длилась один год,и вот он готов,вы первый кто увидит результаты тестов,взял на вскидку,тестировал на разных валютах,с разным спредом,и вообщем результат везде одинаков.Даже извините стишок придумал...Мой Пискун он просто чудо,всё берёт везде и всюду.

p.s Я так и не научился правильно прикреплять изображение,прошу извинить,выложу скины с экрана.

Файлы:
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

Для заполнения буфера цвета я-бы использовал такую конструкцию

Оператор ?: равнозначен if else но применяется проще

Отличный совет и прекрасная наука на будующее!!! Пошел даже немного дальше. Ниже результат.

Так было:

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

Так стало, эффективность подхода очевидна!!! Спасибо.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

Отличный совет и прекрасная наука на будующее!!! Пошел даже немного дальше. Ниже результат.

Так было:

Так стало, эффективность подхода очевидна!!! Спасибо.

Здесь нет эффективности - три раза условие if-else вместо одного. Здесь - хуже как раз...

 
Artyom Trishkin:

Здесь нет эффективности - три раза условие if-else вместо одного. Здесь - хуже как раз...

Да, действительно. не обратил на это внимание. А смотрится лучше, буковок опять же меньше.

А засунуть под одного оператора ?: сразу три исполнения (не знаю как правильно сказать) никак нельзя?

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