Переменная EXTERN в пользовательском индикаторе

 
extern string drawing = "DRAW_NONE";


Мне нужно чтобы при вызове индикатора можно было выбрать из нескольких значений - типа селективного меню. Например, что бы там были значения DRAW_LINE, DRAW_NONE, DRAW_HISTOGRAM, DRAW_ARROW,..

Далее пишем

SetIndexStyle(0,drawing);


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

Как решить проблему селекта?

 
Как решить проблему селекта?

К сожалению, пока никак. Есть мысль внести enum, но неизвестно когда за это возьмемся.
 
Ясно, значит будем пока по старинке - пальчиками ;)
 
Вот придума некую альтернативу. При вызове индикатора, нужно лишь у нужного типа отрисовки выбрать TRUE:

//+------------------------------------------------------------------+
//|                                                   Center Bar.mq4 |
//|                                Copyright © 2004, Hudyakov Vitaly |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, Hudyakov Vitaly"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 SaddleBrown
//---- input parameters

double Center[];

extern bool draw_arrow = 0;
extern bool draw_histogram = 0;
extern bool draw_line = 0;
extern bool draw_none = 0;
extern bool draw_section = 0;
string drawing = "DRAW_NONE";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

//---- 3 indicator buffers mapping
   SetIndexBuffer(0,Center);

//---- drawing settings
   if (draw_arrow) drawing = "DRAW_ARROW";
   if (draw_histogram) drawing = "DRAW_HISTOGRAM";
   if (draw_line) drawing = "DRAW_LINE";
   if (draw_none) drawing = "DRAW_NONE";
   if (draw_section) drawing = "DRAW_SECTION";

   SetIndexStyle(0,drawing);
//---- index labels
   SetIndexLabel(0,"Center");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Hudyakov Vitaly - Center Bar                                     |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- main loop
   for(int i=0; i<limit; i++)
     {
      Center[i] = (High[i] - Low[i])/2+Low[i];
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+




Только в чем-то трабла. Ругается: "invalid integer number as parameter 2 for SetIndexStyle function"

 
Вот придума некую альтернативу...Только в чем-то трабла. Ругается: "invalid integer number as parameter 2 for SetIndexStyle function"

второй параметр в функции имеет тип int, а у тебя string
гораздо проще
//+------------------------------------------------------------------+
//|                                                          123.mq4 |
//|                                        Copyright © 2005, Profi_R |
//|                                               rvm_fam@fromru.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Profi_R"
#property link      "rvm_fam@fromru.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DeepSkyBlue
//---- input parameters
extern int drawMode=0;
//---- buffers
double Center[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   switch (drawMode)
     {
      case 0: SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2); break;
      case 1: SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2); break;
      case 2: SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2); break;
      case 3: SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2); break;
      default: SetIndexStyle(0,DRAW_NONE); break;
     }
   SetIndexBuffer(0,Center);
   SetIndexLabel(0,"Center");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted(),limit;
//---- 
   //---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- main loop
   for(int i=0; i<limit; i++)
   {
      Center[i]=(High[i]-Low[i])/2+Low[i];
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+


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

 
Profi_R
Хе-хе.. - я сначала так и сделал, как показал только что ты.
Но ты через чур все упростил. Когда ты будешь запускать этот индикатор, скажем недели через 2 после его создания, ты уже врядли вспомнишь сколько значений может принимать drawMode и какое из них что значит.
А глядя на :

draw_arrow
draw_histogram
draw_line
draw_none
draw_section



Сразу понимаешь что к чему, да еще глядя на тип данных Bool и значения 0 и 1 ;)

 
Но ты через чур все упростил. Когда ты будешь запускать этот индикатор, скажем недели через 2 после его создания, ты уже врядли вспомнишь сколько значений может принимать drawMode и какое из них что значит.

Так может лучше говорить про комментарии к параметрам?
У меня часто возникает желание приписать параметрам какой нибудь коммент,
единицы измерения, или рекомендованный диапазон значений ...
 
Но ты через чур все упростил. Когда ты будешь запускать этот индикатор, скажем недели через 2 после его создания, ты уже врядли вспомнишь сколько значений может принимать drawMode и какое из них что значит.

Так может лучше говорить про комментарии к параметрам?
У меня часто возникает желание приписать параметрам какой нибудь коммент,
единицы измерения, или рекомендованный диапазон значений ...

я уже предлагал. Достаточно давно. Вразумительного ответа так и не получил.
 
Mak

да, это тоже хорошая идея!
жаль, что MQ не обратили пока что на нее внимания.
 
Profi_R
Хе-хе.. - я сначала так и сделал, как показал только что ты.
Но ты через чур все упростил. Когда ты будешь запускать этот индикатор, скажем недели через 2 после его создания, ты уже врядли вспомнишь сколько значений может принимать drawMode и какое из них что значит.
А глядя на :

draw_arrow
draw_histogram
draw_line
draw_none
draw_section



Сразу понимаешь что к чему, да еще глядя на тип данных Bool и значения 0 и 1 ;)


Предлагаю следующей вариант:
#property copyright "0-LINE,1-SECTION,2-HISTOGRAM,3-ARROW,default-NONE"


перед подключением индюка на график наводишь мышь на цель, получаешь хинт, дравмоде-тоже говорит о варианте отрисовке, да и потом на крайняк можно глянуть в код

 
перед подключением индюка на график наводишь мышь на цель, получаешь хинт, дравмоде-тоже говорит о варианте отрисовке, да и потом на крайняк можно глянуть в код

Это конечно извращение,
но за неимением лучшего ...
Причина обращения: