Ошибка в одну свечу

 
Всем привет!

Решил сделать советник на основе индикаторов CCI_HISTOGRAM (один анализирует за период 45 а второй за 15)

С помощью iCustom вызвал в советник результаты CCI_HISTOGRAM, с помощью функции if делаю следующее: если на индикаторе 45 и 15 столбики синие, объявляю покупку если столбики красные объявляю продажу. все это на Н1.

И в начале создания столкнулся с проблемой, достаточно часто советник упускает 1-2 столбика и только потом говорит что есть сигнал на покупку/продажу. 

Ниже прикладываю файлы которые у меня для этого используются!

С чем это может быть связанно? ))) 

Или если у кого то есть другие идеи как это решить можно, то вот условия:

Инными словами: Н1 когда на CCI_HISTOGRAM с периодом 15 и 45 одновременно появляется синий столбик, открываю ордер на покупку, если оба стобика красные на продажу. 

 
измененные индикаторы и сам советник
 
Для вставки кода используйте  SRC
 

Код индикатора период 45

//+-------------------------------------------------------------------+
//|    Trailing_CCI_Trend.mq4
//| Based on Symphonie_Trendline_Indicator
//| !!! this file is created with Tab size 4 and no space indentation
//+-------------------------------------------------------------------+
#property copyright "Comer"
#property link        ""

#property indicator_separate_window

#property indicator_buffers    2

#property indicator_color1    DodgerBlue
#property indicator_style1    STYLE_SOLID
#property indicator_width1    4

#property indicator_color2    Red
#property indicator_style2    STYLE_SOLID
#property indicator_width2    4




double CCI_Trigger_Level = 0.0;

double TrendUp[];
double TrendDown[];

int BarNumber;
int BarIndex;

int init() {
    SetIndexStyle ( 0, DRAW_HISTOGRAM );
    SetIndexBuffer( 0, TrendUp );
   
    SetIndexStyle ( 1, DRAW_HISTOGRAM );
    SetIndexBuffer( 1, TrendDown );
   
    return(0);
}
 
int deinit() {
    return(0);
}

int start() {
    BarNumber = IndicatorCounted();    // [0 .. Bars]
  
    for( BarIndex = Bars - BarNumber; BarIndex > 0; ) {
        BarIndex--;        // [Bars-1 .. 0]
        processBar();
        BarNumber++;
    }
  
    return(0);
}

void processBar() {
    double    cciNow;
    double    cciPrevious;
    bool    trendUp;

    if( BarNumber == 0 ) // BarIndex == Bars-1
        return;

    cciNow        = iCCI( NULL, 0, 45, PRICE_TYPICAL, BarIndex    );
    cciPrevious    = iCCI( NULL, 0, 45, PRICE_TYPICAL, BarIndex+1    );
   
    if( (cciNow > CCI_Trigger_Level) && (cciPrevious <= CCI_Trigger_Level) ) // crossed up through the trigger level
        trendUp = true;
    else
    if( (cciNow < CCI_Trigger_Level) && (cciPrevious >= CCI_Trigger_Level) ) // crossed down through the trigger level
        trendUp = false;
    else    // trend did not change
        trendUp = (TrendUp[BarIndex+1] != 0);

    if( trendUp ) {
        TrendUp[BarIndex] = 1;
        TrendDown[BarIndex] = 0;
    }
    else {
        TrendDown[BarIndex] = 1;
        TrendUp[BarIndex] = 0;
    }
}

 

Код индикатора период 15

//+-------------------------------------------------------------------+
//|    Trailing_CCI_Trend.mq4
//| Based on Symphonie_Trendline_Indicator
//| !!! this file is created with Tab size 4 and no space indentation
//+-------------------------------------------------------------------+
#property copyright "Comer"
#property link        ""

#property indicator_separate_window

#property indicator_buffers    2

#property indicator_color1    DodgerBlue
#property indicator_style1    STYLE_SOLID
#property indicator_width1    4

#property indicator_color2    Red
#property indicator_style2    STYLE_SOLID
#property indicator_width2    4




double CCI_Trigger_Level = 0.0;

double TrendUp[];
double TrendDown[];

int BarNumber;
int BarIndex;

int init() {
    SetIndexStyle ( 0, DRAW_HISTOGRAM );
    SetIndexBuffer( 0, TrendUp );
   
    SetIndexStyle ( 1, DRAW_HISTOGRAM );
    SetIndexBuffer( 1, TrendDown );
   
    return(0);
}
 
int deinit() {
    return(0);
}

int start() {
    BarNumber = IndicatorCounted();    // [0 .. Bars]
  
    for( BarIndex = Bars - BarNumber; BarIndex > 0; ) {
        BarIndex--;        // [Bars-1 .. 0]
        processBar();
        BarNumber++;
    }
  
    return(0);
}

void processBar() {
    double    cciNow;
    double    cciPrevious;
    bool    trendUp;

    if( BarNumber == 0 ) // BarIndex == Bars-1
        return;

    cciNow        = iCCI( NULL, 0, 15, PRICE_TYPICAL, BarIndex    );
    cciPrevious    = iCCI( NULL, 0, 15, PRICE_TYPICAL, BarIndex+1    );
   
    if( (cciNow > CCI_Trigger_Level) && (cciPrevious <= CCI_Trigger_Level) ) // crossed up through the trigger level
        trendUp = true;
    else
    if( (cciNow < CCI_Trigger_Level) && (cciPrevious >= CCI_Trigger_Level) ) // crossed down through the trigger level
        trendUp = false;
    else    // trend did not change
        trendUp = (TrendUp[BarIndex+1] != 0);

    if( trendUp ) {
        TrendUp[BarIndex] = 1;
        TrendDown[BarIndex] = 0;
    }
    else {
        TrendDown[BarIndex] = 1;
        TrendUp[BarIndex] = 0;
    }
}
 

Советник

//+------------------------------------------------------------------+
//|                                                  подключаюсь.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict




//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
double h15 = iCustom(NULL, 0, "CCI_Histogram15", 0, 0);
double l15 = iCustom(NULL, 0, "CCI_Histogram15", 1, 0);
double h45 = iCustom(NULL, 0, "CCI_Histogram45", 0, 0);
double l45 = iCustom(NULL, 0, "CCI_Histogram45", 1, 0);
 
 if (h15 == 1 && h45 == 1) Print ("Buy");
    else Print ("NOBuy");
  
  
    
  
  }
//+------------------------------------------------------------------+
 

Вы про внешние переменные (extern, input) вобще в курсе? Писать несколько одинаковых по коду индикаторов, отличающихся всего одним параметром?

А насчёт советника, так на нулевом баре может быть как угодно, индикаторы же этот бар перерисовывают.

 
evillive:

Вы про внешние переменные (extern, input) вобще в курсе? Писать несколько одинаковых по коду индикаторов, отличающихся всего одним параметром?

А насчёт советника, так на нулевом баре может быть как угодно, индикаторы же этот бар перерисовывают.

Я в этом деле начинающий, можете подсказать как исправить или может есть другой способ решения?
 

Что именно исправить?  Ввести внешнюю переменную в индикатор? Надо прописать строку

extern int per=15;

в начало индикатора и переписать вызовы ССI так:

    cciNow        = iCCI( NULL, 0, per, PRICE_TYPICAL, BarIndex    );
    cciPrevious    = iCCI( NULL, 0, per, PRICE_TYPICAL, BarIndex+1    );

Ну и индикатор переименовать в просто "CCI_Histogram", отныне он будет один, как для периода 15, так и для 45. А в советнике вызывать уже так:

double h15 = iCustom(NULL, 0, "CCI_Histogram",15, 0, 0);
double l15 = iCustom(NULL, 0, "CCI_Histogram",15, 1, 0);
double h45 = iCustom(NULL, 0, "CCI_Histogram",45, 0, 0);
double l45 = iCustom(NULL, 0, "CCI_Histogram",45, 1, 0);

Но советник продолжит мусорить в журнал на каждом тике записями "Buy", "NOBuy", в большинстве своём - ни о чём, так как тренд угадывать будет только в половине случаев или даже хуже.

 
evillive:

Что именно исправить?  Ввести внешнюю переменную в индикатор? Надо прописать строку

в начало индикатора и переписать вызовы ССI так:

Ну и индикатор переименовать в просто "CCI_Histogram", отныне он будет один, как для периода 15, так и для 45. А в советнике вызывать уже так:

Но советник продолжит мусорить в журнал на каждом тике записями "Buy", "NOBuy", в большинстве своём - ни о чём, так как тренд угадывать будет только в половине случаев или даже хуже.

Спасибо, я просто думал, что если этот индикатор при открытии свечи задал своему столбику цвет, то в процессе формирования этой свечи, столбик уже не может сменить цвет на обратный, но я так понял что ошибся ((
 
inuboh:
Спасибо, я просто думал, что если этот индикатор при открытии свечи задал своему столбику цвет, то в процессе формирования этой свечи, столбик уже не может сменить цвет на обратный, но я так понял что ошибся ((

Это главное что вы усвоили ))), все входы что вы видите по истории, в реальности Вами просто не были бы определены, а индикатор Вам не помог бы, а только еще больше запутал. 

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

Должна быть идея (концепция), проверенная на исторических моделях с вероятностью исполнения не менее 70% или же понимание событий происходящих в данный момент. Просто воткнуть индикатор в эксперт и косить бабло не получиться.