как правильно работыть с iCustom() - страница 2

 
На самом деле как то странно я с таким индюком не сталкивался .Нужно к спецам обратиться.
 
Это обычная раскрашенная диаграмма. В таких случаях необходимо анализировать значения всех четырех буферов. Вызовите DataWindow и посмотрите какие буфера будут меняться с изменением цвета гистограммы. Дело минутное.
 

вот что получилось

   ind_H0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,1);
   ind_H1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,1,1);
   ind_D0 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,1);
   ind_D1 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,4,1);
 
   Print(ind_H1, " : ", ind_H0, " : ", ind_D0, " : ", ind_D1);

почемуто для бара 1 он вывел 1 раз и последущие он выводит нули

 
Rosh:
Это обычная раскрашенная диаграмма. В таких случаях необходимо анализировать значения всех четырех буферов. Вызовите DataWindow и посмотрите какие буфера будут меняться с изменением цвета гистограммы. Дело минутное.


Я понимаю, что это минутное дело для профи, потому я и выложил сам индикатор и его основу.

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

С Уважением Виталий.

 

вот сам саветник в котором я пытаюсь вытащить данные

//+------------------------------------------------------------------+
//|                                                  Auto Trader.mq4 |
//|                 ® Copyright © 2006, Хитенков Виталий Викторович. |
//|                                                khitenkov@mail.ru |
//+------------------------------------------------------------------+
#property copyright "® Copyright © 2007, Хитенков Виталий Викторович."
#property link      "khitenkov@mail.ru"
 
extern double Lots=0.1;     // Размер объёма позиции
extern int TakeProfit=30;   // Уровень прибыли
extern int TrailingStop=30; // Уровеь убытков
 
int order_id=31415956;       // Идентификатор
int total;
int i;
int ticket;
int MODE_FIRST=4;
 
double ind_H0=0;
double ind_H1=0;
double ind_D0=0;
double ind_D1=0;
double ind_W0=0;
double ind_W1=0;
 
bool SignalBuyOpen=true;          // Формирование сигнала на открытие Buy
bool SignalSellOpen=true;         // Формирование сигнала на открытие Sell
bool SignalBuyClose=true;         // Формирование сигнала на закрытие Buy
bool SignalSellClose=true;        // Формирование сигнала на закрытие Sell
 
extern bool AllowBuyOpen=false;   // Ручное разрешение на открытие Buy
extern bool AllowSellOpen=false;  // Ручное разрешение на открытие Sell
extern bool AllowBuyClose=false;  // Ручное разрешение на закрытие Buy
extern bool AllowSellClose=false; // Ручное разрешение на закрытие Sell
 
// Данные для внешнего эксперта
extern int NumberOfBars=160; // Сколько баров расчитывать
extern int SmoothPeriod=7;   // период сглаживания
extern int SmoothMode=1;     // тип сглаживания:MODE_SMA=0, MODE_EMA=1, MODE_SMMA=2, MODE_LWMA=3 
 
//+------------------------------------------------------------------+
//| Проинициализируем функции эксперта                               |
//+------------------------------------------------------------------+
int init()
  {
//----
   Comment ("\n","® Copyright © 2007, Хитенков Виталий Викторович");
   return(0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Работа функций эксперта                                          |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+
   ind_H0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,1);
   ind_H1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,1,1);
   ind_D0 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,1);
   ind_D1 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,4,1);
 
   Print(ind_H1, " : ", ind_H0, " : ", ind_D0, " : ", ind_D1);
 
// Обьявляем переменные и присваиваем им значения
    total=OrdersTotal();                  // Присваиваем total число открытых ордеров
//+------------------------------------------------------------------+
//| Закрытие ордеров                                                 |
//+------------------------------------------------------------------+
// Проверяем есть ли ордер?
    if (total>0)
// Если есть ордера.
    {
// Выполнение цикла, если есть один или более открытых ордеров и перебираем их.
      for(i=total; i>=0; i--)
      {
// Проверяем среди открытых ордеров кроме отложенных, закрытых или удаленных
        if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
// Проверяем это орбер BUY
          if (OrderType()==OP_BUY && SignalBuyClose && AllowBuyClose) // можно тут вписать свое сравнение :)
          {
// Закрываем ордер BUY
            OrderClose(OrderTicket(),OrderLots(),Bid,0,White);
            continue;
          }   
// Проверяем это орбер SELL
          if (OrderType()==OP_SELL && SignalSellClose && AllowSellClose) // можно тут вписать свое сравнение :)
          {
// Закрываем ордер SELL
            OrderClose(OrderTicket(),OrderLots(),Ask,0,White);
            continue;
          } 
        }
      }
    }
//+------------------------------------------------------------------+
//| Открытие ордеров                                                 |
//+------------------------------------------------------------------+
    else
// Если нет ордера.
    {
//+------------------------------------------------------------------+
// Проверяем образован ли сигнал на покупку Buy
      if (SignalBuyOpen && AllowBuyOpen)
      {
// Открываем ордер Buy
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-TrailingStop*Point,Ask+TakeProfit*Point,"#Хитенков",order_id,0,Blue);
// Проверяем принять ли ордер
        if(ticket>0)
        {
// Ордер принят, печатаем его в журнале
          if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
// Ордер отклонен, печатаем причину в журнале
        }
        else Print("Error opening SELL order : ",GetLastError());
// Все удачно открыто ждем некоторое время и выходим
        return(0);
      }
//+------------------------------------------------------------------+
// Проверяем образован ли сигнал на покупку Buy
      if (SignalSellOpen && AllowSellClose)
      {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TrailingStop*Point,Ask-TakeProfit*Point,"#Хитенков",order_id,0,Red);
// Проверяем принять ли ордер
        if(ticket>0)
        {
// Ордер принят, печатаем его в журнале
          if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
// Ордер отклонен, печатаем причину в журнале
        }
        else Print("Error opening SELL order : ",GetLastError());
// Все удачно открыто ждем некоторое время и выходим
        return(0);
      }
//+------------------------------------------------------------------+
    }
  }
return(0);
//+------------------------------------------------------------------+
 
Вам нужно получить значения всех буферов на 0 и 1 баре, для каждого периода. Вот код для Н1:
Выведите их через комментарии и всё станет понятно. Аналогично и для Д1...

   Buffer0_Bar0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,0);
   Buffer0_Bar1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,1);
   Buffer1_Bar0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,1,0);
   Buffer1_Bar1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,1,1);
   Buffer2_Bar0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,2,0);
   Buffer2_Bar1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,2,1);
   Buffer3_Bar0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,0);
   Buffer3_Bar1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,1);
 

Все я написал правильно, просто не пойму почему он его обнуляет

   ind_H0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,1);
   ind_H1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,1,1);
   ind_D0 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,1);
   ind_D1 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,4,1);
 
   Print(ind_H1, " : ", ind_H0, " : ", ind_D0, " : ", ind_D1);

добавил операцию

   ind_H0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,0);
   ind_H1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,1,0);
   ind_D0 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,0);
   ind_D1 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,4,0);
   if (ind_H0>ind_H1)
   {
   Print(ind_H1, " : ", ind_H0, " : ", ind_D0, " : ", ind_D1);
   }

стал выводить правильные результаты при каждом тике

вопрос почему именно так ? теперь придется мудрить незная что будет в результате.. он не гаррантирован.

Кто что скажет?

 

не.. тут чтото не так с самой опперацие iCustom() так как я опять вернув назад код.. все зароботало, но при попытке считать теперь не нулевой бар все тщетно летит там тарары.

 
   ind_H1_b0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,0);
   ind_H1_b1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,1);
   
   ind_D1_b0 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,3,0);
   ind_D1_b1 = iCustom(NULL, PERIOD_D1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,4,0);
//   if (ind_H1_b0>ind_H1_b1)
//   {
   Print(ind_H1_b0, " : ", ind_H1_b1);
//   }

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

 

Прошу принять к сведенью разработчиков терминала.

что данная опперация не совсем корректно работает

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

   ind_H1_b0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,0);
   ind_H1_b1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,10);
   ind_H1_b2 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,20);
   ind_H1_b3 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,21);
   
   Print(ind_H1_b0, " : ", ind_H1_b1, " : ", ind_H1_b2, " : ", ind_H1_b3);

Первая строка дает мне из 0 буффера плавающий но нудный ответ 0 бара.

вторая должна выдать мне 1 бар я его поменял на 10 может думаю глюк в 1 баре

и добавил еще 2 строки

и результат печатаю в журнал

а там просто хаос

как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже.. а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий.. глюк какойто

 
khitenkov:

как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже.. а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий.. глюк какойто

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

Если индикатор корректно обнуляет значения неиспользуемых цветовых буферов и присваивает значение только нужному буферу, то чтобы сильно не заморачиваться и не искать нужный буфер, можно попробовать просто сложить значения всех четырех (с 0 по 3, вроде на гистограмме используется 4 цвета) буферов для требуемого бара и по идее получится нужное значение индикатора (повторяю, прокатит если неиспользуемые буфера обнуляются).

Еще, часто разработчики (сам так делаю) сохраняют расчитанное значение индикатора (чтобы лишний раз не пересчитывать) во вспомогательном (не отображаемом) буфере, но вызвать то его значения из эксперта можно. :) Попробуйте запросить значения буферов с номером большим чем цветовых буферов на графике. Вполне возможно что где-нибудь в пятом (т.е. с индексом 4, т.к. с 0 считаем) буфере и будет нужное Вам значение индикатора (не придется ничего искать и суммировать). :)
Причина обращения: