Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 318

 
muzzletop:
Доброго дня. Есть советник, в тестере стратегий работает нормально (ордера открывает и всё такое). Но когда просто накидываю его на график - ничего не происходит. Советник не работает. И ещё что заметил - рядом с названием советника на графике крестик отображается. Как это исправить?


при накидывании советника на график открывается окно с параметрами, там есть разные вкладки - в первой "Общее" надо поставить галочку напротив "разрешить советнику торговать"

если же советник уже на кинут и отображается крестиком - на панели инструментов нажмите кнопочку "советники" (кубик желтого цвета в шляпе с красным кругом и белым квадратом внутри этого круга).

 

Добрый день. Помогите разобраться со странной проблемой.

Суть в чем: пишу мультитаймовый индикатор, т.е. индикатор, который, будучи открытым на одном любом тайме, будет вести расчеты и давать сигналы так же и по всем остальным таймам.

Основа индикатора - RSI.

В init() при переключении тайма в соответствие линии индикатора ставится отдельный массив. И каждый из них отображается линией, когда находишься на том или ином тайме, но при этом расчеты по другим таймам не идут (функция iRSI тупо гонит нули при расчете). Т.е. текущий тайм рассчитывается, а остальные нет.

Привожу код:

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80

#property indicator_level1 20          // уровень RSI
#property indicator_level2 42          // уровень RSI
#property indicator_level3 50          // уровень RSI
#property indicator_level4 58          // уровень RSI
#property indicator_level5 80          // уровень RSI

#property indicator_levelcolor White   // цвет уровней 

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2           // толщина RSI

//--- buffers
double   RSI_M1[];               // буферы под RSI
double   RSI_M5[];
double   RSI_M15[];
double   RSI_M30[];
double   RSI_H1[];
double   RSI_H4[];
double   RSI_D1[];
double   RSI_W1[];
double   RSI_MN[];

int         RSI_per           = 12;                // период RSI
int         RSIPriceType      =  PRICE_CLOSE;      // покакой цене считать RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   IndicatorShortName("test");
   
   switch(Period()) {
      case PERIOD_M1:
          SetIndexBuffer(0, RSI_M1);
          break;
      case PERIOD_M5:
          SetIndexBuffer(0, RSI_M5);
          break;
      case PERIOD_M15:
          SetIndexBuffer(0, RSI_M15);
          break;
      case PERIOD_M30:
          SetIndexBuffer(0, RSI_M30);
          break;
      case PERIOD_H1:
          SetIndexBuffer(0, RSI_H1);
          break;
      case PERIOD_H4:
          SetIndexBuffer(0, RSI_H4);
          break;
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          break;
      case PERIOD_W1:
          SetIndexBuffer(0, RSI_W1);
          break;
      case PERIOD_MN1:
          SetIndexBuffer(0, RSI_MN);
          break;
   }   
   
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0,"RSI(" + RSI_per + ")");
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   shift, _Bars;
   static int  _counted_bars_W1 = 0,
               _counted_bars_D1 = 0;
   //--------------------------------------------------------------------
   _Bars = iBars(NULL, PERIOD_W1);
   shift = _Bars - _counted_bars_W1 - 1;   // Индекс первого непосчитанного
   _counted_bars_W1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_W1[shift]       = iRSI(NULL, PERIOD_W1, RSI_per, RSIPriceType, shift);
      Print(RSI_W1[shift]);
      shift--;
   }
   //------------------------------------------
   _Bars = iBars(NULL, PERIOD_D1);
   shift = _Bars - _counted_bars_D1 - 1;   // Индекс первого непосчитанного
   _counted_bars_D1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_D1[shift]       = iRSI(NULL, PERIOD_D1, RSI_per, RSIPriceType, shift);
      shift--;
   }
   //------------------------------------------   
   return(0);
  }
//+------------------------------------------------------------------+

Что интересно: если оставить только один массив для линии индикатора и на любом тайме рассчитывать только например W1, то все корректно считается и рисуется на любом(!) тайме.
В чем же фишка? Нельзя при инициализации в зависимости от тайма брать для линии индикатора разные массивы?

 
satorifx:

Добрый день. Помогите разобраться со странной проблемой.

Суть в чем: пишу мультитаймовый индикатор, т.е. индикатор, который, будучи открытым на одном любом тайме, будет вести расчеты и давать сигналы так же и по всем остальным таймам.

Основа индикатора - RSI.

В init() при переключении тайма в соответствие линии индикатора ставится отдельный массив. И каждый из них отображается линией, когда находишься на том или ином тайме, но при этом расчеты по другим таймам не идут (функция iRSI тупо гонит нули при расчете). Т.е. текущий тайм рассчитывается, а остальные нет.

Привожу код:

Что интересно: если оставить только один массив для линии индикатора и на любом тайме рассчитывать только например W1, то все корректно считается и рисуется на любом(!) тайме.
В чем же фишка? Нельзя при инициализации в зависимости от тайма брать для линии индикатора разные массивы?

Считывается только W1 и D1! Что же хотите? Допишите для остальных!
 
borilunad:
Считывается только W1 и D1! Что же хотите? Допишите для остальных!

Дело не в этом. Привел расчеты только для D1 и W1, чтобы код не был слишком длинным. Обратите внимание: на каждом тике на любом тайме распечатываются расчетные значения W1. Так вот если открыт любой тайм кроме W1, печатаются нули. Если будет работать для W1 - будет и для остальных.
 
satorifx:

Дело не в этом. Привел расчеты только для D1 и W1, чтобы код не был слишком длинным. Обратите внимание: на каждом тике на любом тайме распечатываются расчетные значения W1. Так вот если открыт любой тайм кроме W1, печатаются нули. Если будет работать для W1 - будет и для остальных.
Правильно! Чтобы показывать на других графиках, нужно открыть и недельный график!
 
borilunad:
Правильно! Чтобы показывать на других графиках, нужно открыть и недельный график!


Если честно, этого высказывания я не понял.
А показывать ничего другого и не надо. Запустите мой код, и увидите, что уже сейчас показывается все, что надо: на Д1 показывается график RSI D1, а на W1 - график RSI W1, но при этом, если открыт D1, то расчеты RSI по W1 все нулевые, а если открыт W1, то расчеты по D1 нулевые. Вопрос в том, почему так, и как это исправить.

 

Проблема в том, что индексный массив сам инициализируется и ресайзится под нужный размер.
Поэтому когда открываю D1 - RSI_D1[] становится индексным, и с ним все гуд, а остальные массивы остаются в зачаточном состоянии.
Попробовал так: объявил все массивы так:

double   RSI_W1[]    =  {0};
А в init() в switch изменил так:
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

Однако на ArrayResize GetLastError дает ошибку:

EURUSD,Daily: cannot resize the array

EURUSD,Daily: some array error

Все таки кто подскажет, как решить проблему?

 
satorifx:

Проблема в том, что индексный массив сам инициализируется и ресайзится под нужный размер.
Поэтому когда открываю D1 - RSI_D1[] становится индексным, и с ним все гуд, а остальные массивы остаются в зачаточном состоянии.
Попробовал так: объявил все массивы так:

А в init() в switch изменил так:

Однако на ArrayResize GetLastError дает ошибку:

EURUSD,Daily: cannot resize the array

EURUSD,Daily: some array error

Все таки кто подскажет, как решить проблему?

Если массив динамический, то обязательно при записи в него значений увеличивайте размер массива под новые данные. ArrayResize()
 
artmedia70:
Если массив динамический, то обязательно при записи в него значений увеличивайте размер массива под новые данные. ArrayResize()

Об этом я выше и написал:
Однако на ArrayResize GetLastError дает ошибку:

EURUSD,Daily: cannot resize the array

EURUSD,Daily: some array error
 
satorifx:
Об этом я выше и написал:
Однако на ArrayResize GetLastError дает ошибку:

EURUSD,Daily: cannot resize the array

EURUSD,Daily: some array error
satorifx:


Если честно, этого высказывания я не понял.
А показывать ничего другого и не надо. Запустите мой код, и увидите, что уже сейчас показывается все, что надо: на Д1 показывается график RSI D1, а на W1 - график RSI W1, но при этом, если открыт D1, то расчеты RSI по W1 все нулевые, а если открыт W1, то расчеты по D1 нулевые. Вопрос в том, почему так, и как это исправить.

Потому что буфер один и показывает по очереди по вашему вызову!

#property indicator_buffers 1
Неужели вы думаете, что мне делать нечего, как скачивать ваши "кодики" и тестить? Я вам помогаю советом. А если что-то не то, так всё наверху для вас! Или лень раньше вас родилась?!
Причина обращения: