iCustom для Symphonie_Trendline_Indicator_v3.0.mq4

 

Помогите не могу правильно передать параметры в функцию iCustom, чтобы получить значение индикатора Symphonie_Trendline_Indicator_v3.0.mq4

пишу вот так:

z=iCustom(NULL,0,"Symphonie_Trendline_Indicator_v3.0",63,18,0,1);

но z почему то всегда = 0. думаю что то с параметрами, подскажите что не так? вот код  Symphonie_Trendline_Indicator_v3.0.mq4:

//+------------------------------------------------------------------------+
//|                                 Symphonie_Trendline_Indicator_v3.0.mq4 |
//|Based on basic Trendline by MetaTrader_Experts_and_Indicators           |
//+------------------------------------------------------------------------+
#property copyright "Symphonie Trader System"
#property link      "MetaTrader_Experts_and_Indicators"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DodgerBlue
#property indicator_color2 Red

extern int CCIPeriod=63;
extern int ATRPeriod=18;
double TrendUp[];
double TrendDown[];
int st = 0;
//extern int SlowerEMA = 6;



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

  SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(0, TrendUp);
  SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(1, TrendDown);

  /*SetIndexStyle(0, DRAW_ARROW, EMPTY);
  SetIndexArrow(0, 159);
  SetIndexBuffer(0, TrendUp);
  SetIndexStyle(1, DRAW_ARROW, EMPTY);
  SetIndexArrow(1, 159);
  SetIndexBuffer(1, TrendDown);*/

  /*for(int i = 0; i < Bars; i++) {
     TrendUp[i] = NULL;
     TrendDown[i] = NULL;
  }*/
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function|
//+------------------------------------------------------------------+
int deinit()
 {
//----
  /*for(int i = 0; i < Bars; i++) {
     TrendUp[i] = NULL;
     TrendDown[i] = NULL;
  }*/
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function|
//+------------------------------------------------------------------+
int start()
 {

  int limit, i, counter;
  double Range, AvgRange, cciTrendNow, cciTrendPrevious, var;

  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;

  for(i = limit; i >= 0; i--) {
     cciTrendNow = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i);
     cciTrendPrevious = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i+1);

     //st = st * 100;


     counter = i;
     Range = 0;
     AvgRange = 0;
     for (counter = i; counter >= i-9; counter--) {
        AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
     }
     Range = AvgRange/10;
     if (cciTrendNow >= st && cciTrendPrevious < st) {
        TrendUp[i+1] = TrendDown[i+1];
     }

     if (cciTrendNow <= st && cciTrendPrevious > st) {
        TrendDown[i+1] = TrendUp[i+1];
     }

     if (cciTrendNow >= st) {
        TrendUp[i] = Low[i] - iATR(NULL, 0, ATRPeriod, i);
        if (TrendUp[i] < TrendUp[i+1]) {
           TrendUp[i] = TrendUp[i+1];
        }
     }
     else if (cciTrendNow <= st) {
        TrendDown[i] = High[i] + iATR(NULL, 0, ATRPeriod, i);
        if (TrendDown[i] > TrendDown[i+1]) {
           TrendDown[i] = TrendDown[i+1];
        }
     }
  }

//----

//----
  return(0);
 }

//+------------------------------------------------------------------+
 
CeBePHb1Y:

Помогите не могу правильно передать параметры в функцию iCustom, чтобы получить значение индикатора Symphonie_Trendline_Indicator_v3.0.mq4

пишу вот так:

но z почему то всегда = 0. думаю что то с параметрами, подскажите что не так? вот код  Symphonie_Trendline_Indicator_v3.0.mq4:

 



  double TrendUp=iCustom(NULL,0,"Symphonie_Trendline_Indicator_v3.0",63,18,0,1);
  double TrendDown=iCustom(NULL,0,"Symphonie_Trendline_Indicator_v3.0",63,18,1,1);
  
  Comment("\n","  TrendUp = ",TrendUp,
          "\n","  TrendDown = ",TrendDown); 
 
r772ra:



попробовал, пишет что они оба = 0 постоянно =(
 
CeBePHb1Y:

попробовал, пишет что они оба = 0 постоянно =(

Ваш инструмент падает. Надо продавать, а не покупать. Особого отличия от  индикатора Supertrend не заметил. Хотя, могут быть добавлены ошибки.

//+------------------------------------------------------------------+
//|                                                   Supertrend.mq4 |
//|                   Copyright © 2005, Jason Robinson (jnrtrading). |
//|                                      http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2

extern int CCIPeriod = 36;
extern int ATRPeriod = 4;

double TrendUp[];
double TrendDown[];
double st = 0.0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0, TrendUp);
   SetIndexBuffer(1, TrendDown);
   IndicatorDigits( Digits);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   
   int limit, i;
   double cciTrendNow, cciTrendPrevious, rATR;
   double spread = MarketInfo( Symbol(), MODE_SPREAD);
   double lotsize = MarketInfo( Symbol(), MODE_TICKVALUE);
   Comment( "Spread ", spread, " Tickvalue ", lotsize);
   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;
   
   cciTrendPrevious = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, limit+1);
   for(i = limit; i >= 0; i--)
   {
      cciTrendNow = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i);
      rATR = iATR(NULL, 0, ATRPeriod, i);

      if (cciTrendNow >= st)
      {
         if (cciTrendPrevious < st) TrendUp[i+1] = TrendDown[i+1];
         TrendUp[i] = MathMax( TrendUp[i+1], Low[i] - rATR);
         TrendDown[i] = EMPTY_VALUE;
      }
      if (cciTrendNow <= st)
      {
         if ( cciTrendPrevious > st) TrendDown[i+1] = TrendUp[i+1];
         TrendDown[i] = MathMin( TrendDown[i+1], High[i] + rATR);
         TrendUp[i] = EMPTY_VALUE;
      }
      cciTrendPrevious = cciTrendNow;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Mislaid:

Ваш инструмент падает. Надо продавать, а не покупать. Особого отличия от  индикатора Supertrend не заметил. Хотя, могут быть добавлены ошибки.

В этом коде есть стратегический момент:

   cciTrendPrevious = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, limit+1);
   for(i = limit; i >= 0; i--)
   {
      cciTrendNow = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i);
      rATR = iATR(NULL, 0, ATRPeriod, i);
   }

 выделенная строка вынесена за пределы цикла (по сравнению с индикатором от ТС).

 
CeBePHb1Y:

Помогите не могу правильно передать параметры в функцию iCustom, чтобы получить значение индикатора Symphonie_Trendline_Indicator_v3.0.mq4

пишу вот так:

но z почему то всегда = 0. думаю что то с параметрами, подскажите что не так? вот код  Symphonie_Trendline_Indicator_v3.0.mq4:

 

Вызов индикатора осуществляете правильно, ошибку ищите в другом месте. Выложенный индикатор делает лишние расчёты, убрал не нужный код:

//+------------------------------------------------------------------------+
//|                                 Symphonie_Trendline_Indicator_v3.0.mq4 |
//|Based on basic Trendline by MetaTrader_Experts_and_Indicators           |
//+------------------------------------------------------------------------+
#property copyright "Symphonie Trader System"
#property link      "MetaTrader_Experts_and_Indicators"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red

extern int   CCIPeriod = 63;
extern int   ATRPeriod = 18;
double       TrendUp[], TrendDown[];
int          st = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function|
//+------------------------------------------------------------------+
int init()
{
    string short_name = StringConcatenate ("STI: (", CCIPeriod, "/", ATRPeriod, ")");
//---- indicators

    SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2);
    SetIndexBuffer (0, TrendUp);
    SetIndexLabel (0, "STI | UP");
    SetIndexStyle (1, DRAW_LINE, STYLE_SOLID, 2);
    SetIndexBuffer (1, TrendDown);
    SetIndexLabel (1, "STI | DOWN");
    //----
    IndicatorDigits (Digits);
    IndicatorBuffers (2);
    IndicatorShortName (short_name);
//----
    return (0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
    return (0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function|
//+------------------------------------------------------------------+
int start()
{
    int    limit, counted_bars = IndicatorCounted();
    double lda_CCI[2], ld_ATR;
//----
    //---- check for possible errors
    if (counted_bars < 0) return (-1);
    limit = Bars - counted_bars - 1;
    for (int i = limit; i >= 0; i--)
    {
        for (int li_IND = 0; li_IND < 2; li_IND++)
        {lda_CCI[li_IND] = iCCI (NULL, 0, CCIPeriod, PRICE_TYPICAL, i + li_IND);}
        if (lda_CCI[0] >= st) if (lda_CCI[1] < st) {TrendUp[i+1] = TrendDown[i+1];}
        if (lda_CCI[0] <= st) if (lda_CCI[1] > st) {TrendDown[i+1] = TrendUp[i+1];}
        ld_ATR = iATR (NULL, 0, ATRPeriod, i);
        if (lda_CCI[0] >= st)
        {
           TrendUp[i] = Low[i] - ld_ATR;
           if (TrendUp[i] < TrendUp[i+1]) {TrendUp[i] = TrendUp[i+1];}
        }
        else if (lda_CCI[0] < st)
        {
            TrendDown[i] = High[i] + ld_ATR;
            if (TrendDown[i] > TrendDown[i+1]) {TrendDown[i] = TrendDown[i+1];}
        }
    }
//----
    return (0);
}
//+------------------------------------------------------------------+

...и для начала загляните в лог.

 
CeBePHb1Y:
мб по теме что-нибудь?

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

 
valeryk:

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

Это одна из ОЧЕНЬ возможных причин.

to CeBePHb1Y: А для простоты переименуйте это "поэтическое" имя, например, аббревиатурой "STI" и поменяйте в коде советника вызов.

 
TarasBY:

Это одна из ОЧЕНЬ возможных причин.

to CeBePHb1Y: А для простоты переименуйте это "поэтическое" имя, например, аббревиатурой "STI" и поменяйте в коде советника вызов.


теперь все показывает)) спасибо!
 
все равно ничего не понятно... в общем конкретнее опишу что я хочу. вот этот вот индикатор Symphonie_Trendline_Indicator_v3.0.mq4 (код которого выше) рисует трендовую линию и в зависимости от того, какой тренд, цвет этой линии меняется (красный - тренд в ни3, сини - тренд вверх). вот я через iCustom хочу узнавать какой сейчас тренд (ну или куакой цвет линии). вот как это сделать? а то  iCustom(NULL,0,"Symphonie_Trendline_Indicator_v3.0",63,18,0,1);  возвращает мне одно и то же число постоянно 2147483647... если написать так iCustom(NULL,0,"Symphonie_Trendline_Indicator_v3.0",63,18,1,1); то показывает текущую цену... ни чего не понятно...
 
CeBePHb1Y:
все равно ничего не понятно... в общем конкретнее опишу что я хочу. вот этот вот индикатор Symphonie_Trendline_Indicator_v3.0.mq4 (код которого выше) рисует трендовую линию и в зависимости от того, какой тренд, цвет этой линии меняется (красный - тренд в ни3, сини - тренд вверх). вот я через iCustom хочу узнавать какой сейчас тренд (ну или куакой цвет линии). вот как это сделать? а то iCustom возвращает мне одно и то же число постоянно 2147483647... ни чего не понятно...

Это число означает EMPTY_VALUE. В одном буфере будет ПУСТО, а второй буфер будет иметь НЕПУСТО. Где НЕПУСТО, там и тренд. ;)

P.S. А вообще, если глянуть в код этого "поэтического" индюка, то  определение тренда сводится к положениию CCI относительно 0: выше -> вверх (UP), ниже -> вниз (DW). И индюка можно заменить такой строчкой:

    double ld_CCI = iCCI (NULL, 0, CCI_Period, PRICE_TYPICAL, Bar);
    int    li_Signal = -1;
    if (ld_CCI > 0.) li_Signal = OP_BUY;
    else if ((ld_CCI < 0.) li_Signal = OP_SELL;
- вот такая "поэзия"... :)
Причина обращения: