[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 279

 

 Что-то не верно возвращается значение элементов одного массива через функцию у меня. Опишу всё по порядку касательно данного вопроса.

В глобальных переменных есть:

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

 Функции использующиеся в данном расчёте:

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

 В старте дополнительно принтую значение элементов массива, возвращаемые функцией GetStateMa(int& crossDir[]):

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

  Вот что возвращается:

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

 Значение элементов массива crossDir[] возвращается разные, хотя должны быть все со значением 1.

 Это видно из распринтовки выражений сравнения Машек 4 периодов и 365-ой. Подскажите, почему не верно возвращаются значения?

 
Ekburg:


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

но глотать всё, что вы сплёвываете, ни кто кроме вас не будет ;)


Как Вы учились, если учились, на подсказках? Только активное и пытливое самообучение даст свои плоды! Я Вам расжевал, а Вы "отплёвываетесь" от резонных советов! Наймите няню Ваши нюни утирать!
 
Всем доброго вечера.У меня индикатор Б построен от индикатора А (через iCustom ).Оба индикатора на графике.При изменении параметров индикатора А индикатор Б автоматически не перестраивается,для этого необходимо его принудительно перекомпилировать!Почему индикатор Б автоматически не перестраивается?Подскажите,пожалуйста,в чём моя ошибка?
 
MK07:
Всем доброго вечера.У меня индикатор Б построен от индикатора А (через iCustom ).Оба индикатора на графике.При изменении параметров индикатора А индикатор Б автоматически не перестраивается,для этого необходимо его принудительно перекомпилировать!Почему индикатор Б автоматически не перестраивается?Подскажите,пожалуйста,в чём моя ошибка?
Вы вызываете индикатор А (через iCustom) с конкретными настройками, которые НЕ ЗАВИСЯТ от настроек в самом индикаторе А. Т.е. терминал одновременно просчитывет ДВЕ НЕЗАВИСИМЫХ копии индикатора А. Индикатор, вызываемый извне (из другого кода), просчитывается терминалом виртуально.
 
TarasBY:
Вы вызываете индикатор А (через iCustom) с конкретными настройками, которые НЕ ЗАВИСЯТ от настроек в самом индикаторе А. Т.е. терминал одновременно просчитывет ДВЕ НЕЗАВИСИМЫХ копии индикатора А.

А что нужно сделать,чтобы терминал просчитывал второй вариант индикатора А?
 
MK07:
А что нужно сделать,чтобы терминал просчитывал второй вариант индикатора А?
Конкретизируйте задачу.
 
borilunad:

Как Вы учились, если учились, на подсказках? Только активное и пытливое самообучение даст свои плоды! Я Вам расжевал, а Вы "отплёвываетесь" от резонных советов! Наймите няню Ваши нюни утирать!

умерьте своё эго! я не отплёвываюсь от советов, я принял их и поблагодарил, но не приемлю такой манеры выражения! я культурно спросил и культурно отвечал!
 

Здравствуй!

в советнике необходимо использовать значение переменной Point.

Но оно равно 0.

Насколько я понял, это из-за 5-ти цифр после запятой в котировке.

Есть ли какой-то способ определения этого значения?

Спасибо. 

 
TarasBY:
Конкретизируйте задачу.

Индикатор А- обычный АО (My_AO) - верхний на рисунке.

Индикатор Б -гистограмма (+1/-1) индикатора АО (My_AO) - средний на рисунке.

При изменении параметров индикатора А (нижний на рисунке) индикатор Б не изменяется даже при перекомпиляции.

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



Первый код-индикатор А.

Второй код- индикатор Б.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07:

Индикатор А- обычный АО (My_AO) - верхний на рисунке.

Индикатор Б -гистограмма (+1/-1) индикатора АО (My_AO) - средний на рисунке.

При изменении параметров индикатора А (нижний на рисунке) индикатор Б не изменяется даже при перекомпиляции.

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

Первый код-индикатор А.

Второй код- индикатор Б.

И такой порядок вещей - нормальный (это принципы работы терминала).

Если хотите, чтобы при изменении параметров индикатора А индикатор Б изменял свои показания, сделайте обмен информацией м\у индикаторами (м.б. файл, глобальные переменные терминала, оперативная память компьютера): индикатор A при инициализации передаёт свои инициализируемые параметры, а индикатор Б периодически проверяет возможные изменения параметров индикатора А. При обнаружении изменений, индикатор Б тоже должен перинициализироваться с новыми параметрами (принудительный запуск init()).