Вопрос по мультивалютному советнику - страница 2

 

alexjou, я посмотрел справку и обнаружил:

"Класс памяти extern определяет внешнюю переменную. Модификатор extern указывается перед типом данных. Внешние переменные определяют входные параметры программы, они доступны из окна свойств программы. Массивы не могут выступать в качестве внешних переменных. "

Вот весь код пользовательского индикатора.

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern string    st="---Параметры Stochastic---";
extern int       KPeriod =12;
extern int       DPeriod =3;
extern int       Slowing =2;
//extern string    en="---Параметры Envelopes---";
extern int       EnvPeriod=17;
extern int       Deviation=15;
extern int       Shift=1;
//---- buffers
double Stochastic[];
double UP[];
double LOW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Stochastic);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UP);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LOW);
//----
   return(0);
  }
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<limit; i++)
 
{
Stochastic[i]=iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
}
     for( i=0; i<limit; i++)
{
UP[i] =iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)+Deviation;
LOW[i]=iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)-Deviation;
)
 
  return(0);
  }

В кач. внешних переменных советника задаю

extern int     K__period        =6;
extern int     Env_period      =10; 
extern double  Env_deviation    =12;
 
//---------------------------------------------
int start()
  {
 
... ...
double Env_low[2];
//
double Stochastic[2];
 
Env_low[0]    = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,2,0);
Stochastic[0] = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,0,0);
Stochastic[1] = iCustom("USDJPY",0,"i-StochEnv",K__period,3,3,Env_period, Env_deviation,1,0,1);
В тестере эта пара работает. В чем здесь может быть ошибка?

 
спасибо большое, не откажусь. :-) А мыло я тебе в аську напишу, укажи номер.
А насчет ответов я тебе так скажу: я просто первей откликнулся, другие зашли увидели ответ и не стали ничего добавлять. Поэтому ты не думай, что все тут такие злые и не хотят делиться знаниями.
 
Эксперт: iCustom("USDJPY", ...


А индикатор откуда об этом знает? Лучше добавить в секцию extern индикатора строковую переменную вроде


extern string SymbolName = "USDJPY"; // инструмент по умолчанию 

и вызывать стохастик так 

Stochastic[i]=iStochastic(SymbolName, 0, ...

(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
 
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern string    st="---Параметры Stochastic---";
extern string    SymbolName = "USDJPY"; 
extern int       TimeFrame = 0; 
extern int       KPeriod =12;
extern int       DPeriod =3;
extern int       Slowing =2;
//extern string    en="---Параметры Envelopes---";
extern int       EnvPeriod=17;
extern int       Deviation=15;
extern int       Shift=1;
//---- buffers
double Stochastic[];
double UP[];
double LOW[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Stochastic);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UP);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LOW);
//----
   return(0);
  }
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=limit-1; i>=0; i--) // индикаторы лучше рассчитывать слева направо
 
{
Stochastic[i]=iStochastic(SymbolName,TimeFrame,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
}
     for(i=limit-1; i>=0; i--) // см. примечание
{
UP[i] =iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)+Deviation;
LOW[i]=iMAOnArray(Stochastic,0, EnvPeriod, Shift,MODE_SMA,i)-Deviation;
)
 
  return(0);
  }


Вызов из эксперта:

iCustom("USDJPY", 0, ...

С iMAOnArray вообще надо обращаться аккуратно. Например, поэкспериментировать с порядком ее расчета. 
А лучше всего такие вещи делать самому. Кстати, для мультивалютного эксперта может потребоваться везде 
явно задавать имя символа и рабочий тайм-фрейм, чтобы избежать умолчательных сюрпризов вроде этого.
 

alexjou !

Првильно ли я вас понял??????????

В мультивалютном эксперте при вызове польз. индикатора iCustom для конкретной пары нужно лучше сначала в самом польз. индикаторе предусмотреть -

extern string SymbolName = "USDJPY"; // инструмент по умолчанию

Это помимо того что и в советнике задавать :

iCustom("USDJPY", 60, ... для этой пары!

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

Но тогда действительно проще рассчитать iMAOnArray внутри эксперта самому без всяких пользовательских индюков!

 
Правильно. Хотя это дело вообще-то на любителя. Моя практика, например, заключается в применениии пользовательских индикаторов лишь для проверки некой идеи с последующим переносом кода индикатора в эксперт, если идея окажется рабочей. Такой подход практически гарантирует от подводных камней типа "пустых" значений индикатора, которые обнаруживаются с трудом и могут сильно отравить жизнь при неряшливом программировании.
 

,Благодарю за пояснения! CЕйчас займусь...

klerk, у меня с аськой по выходным проблемы.

Вот моя почта - на неё можно прислать адрес для советника.

rid200549@ya.ru

 
alexjou:
(Опять какие-то глюки форума. В Лисе стрелки не работают, оттго и пишу не по-людски) 
Глюки были у меня в клавиатурном разъеме на мамке. Форум абсолютно ни при чем. Извиняйте за ложную тревогу.
 

klerk, пож. подтвердите здесь или в почту получение моего послания.

И ещё вопрос к специалистам (извините если слишком глупый):

в мултивалютном эксперте -

double bid_GBP = MarketInfo("GBPUSD", MODE_BID);
 double ask_GBP = MarketInfo("GBPUSD", MODE_ASK);
 double point_GBP =MarketInfo("GBPUSD",MODE_POINT);

А в трейлингах по каждой паре нужно ли тоже вводить и заменять эти значения?

.... ...
if (OrderType()==OP_BUY)                                            {
       if (!Profit_Trailing || (Bid-OrderOpenPrice())>Trailing_Stop*Point) {
        if (OrderStopLoss()<Bid-(Trailing_Stop+Trailing_Step-1)*Point)      {
.... ....
или можно оставить как есть?
 
rid:

А в трейлингах по каждой паре нужно ли тоже вводить и заменять эти значения?

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