Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью и она попадет в MetaTrader 5!
Buz23
18
Buz23 2016.06.29 15:11 

Помогите исправить код гистограммы

#property indicator_chart_window

extern int      MinutesCount = 5000;  // 3000 - 10000 ;
extern int      Amplitude = 20;       // 10 .. 100
extern int      RefreshPeriod = 1;    // 1 .. 60
extern color    HistColor = SteelBlue;
extern double   PricePoint = 0.00001;


double Hist[];
datetime OpenTime = 0;

int init()
{
    return(0);
}

int deinit()
{
    DeleteObjects();
    return(0);
}

int DeleteObjects()
{
    for (int i = 0; i< 3000; i++) ObjectDelete("VH"+i);
}

int DrawLine(int n, double price, int vol, int max)
{
    vol = MathRound(Amplitude * vol / max );
    if (vol > 0)
    {
        int first = WindowFirstVisibleBar();
        datetime dt1 = iTime(NULL, Period(), first);
        datetime dt2 = iTime(NULL, Period(), first-vol);
        ObjectCreate("VH"+n, OBJ_RECTANGLE, 0, dt1, price, dt2, price+PricePoint);
        ObjectSet("VH"+n, OBJPROP_STYLE, DRAW_HISTOGRAM);
        ObjectSet("VH"+n, OBJPROP_COLOR, HistColor);
        ObjectSet("VH"+n, OBJPROP_BACK, true);
    }
    return (0);
}

int start()
{
    if (OpenTime != iOpen(Symbol(), PERIOD_M1, 0))
    {
        OpenTime = iOpen(Symbol(), PERIOD_M1, 0);

        int n, MaxVolume;
        double max = iHigh(Symbol(), PERIOD_M1, iHighest(Symbol(), PERIOD_M1, MODE_HIGH, MinutesCount, 0));
        double min = iLow(Symbol(), PERIOD_M1, iLowest(Symbol(), PERIOD_M1, MODE_LOW, MinutesCount, 0));
        int items = MathRound((max - min) / PricePoint);

        if (max == 0)
        {
            Alert("There is no minutes data. Please download M1.");
            return (0);
        }

        ArrayResize(Hist, items);      
        ArrayInitialize(Hist, 0);
        for (int i = 1; i <= MinutesCount; i++)
        {
        
              double C=iLow[i];
              while(C<iHigh[i])
           {
             n=int((C-min)/PricePoint);
         Hist[n]++;
         C+=PricePoint;
           }
        
        }
        MaxVolume = Hist[ArrayMaximum(Hist)];
        DeleteObjects();
        for (i = 0; i <= items; i++)
        {
            DrawLine(i, min + i*PricePoint, Hist[i], MaxVolume);
        }
    }
        return(0);
}


чтобы получить результат, как на картинке 



LRA
321
LRA 2016.06.29 16:22  
Buz23:    Помогите исправить код гистограммы  чтобы получить результат, как на картинке 

Получилось так... И когда покупать и продавать?

Buz23
18
Buz23 2016.06.29 18:49  
LRA:

Получилось так... И когда покупать и продавать?


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

При компиляции у меня ругалось на скобки, подскажите где ошибка.

LRA
321
LRA 2016.06.29 18:58  

Как пробовать? Когда покупать - продавать? Ну поделитесь секретом. Потом, если толково будет, напишу советник... Или это просто шутка?

Buz23
18
Buz23 2016.06.29 19:01  
LRA:

Как пробовать? Когда покупать - продавать? Ну поделитесь секретом. Потом, если толково будет, напишу советник... Или это просто шутка?

Никаких секретов нет все коды нашел в интернете, что не нравилось - решил переделать и посмотреть... В тех гистограммах, откуда этот код были пропуски и мне это не понравилось. Между горизонтальными полосками были пропуски.


https://www.mql5.com/ru/code/8920 Идея отсюда, а я решил подправить.

LRA
321
LRA 2016.06.29 19:38  
Buz23:   нашел в интернете, что не нравилось - решил переделать и посмотреть.. https://www.mql5.com/ru/code/8920

т.е. Вы не ищете профит, точки входа и т.п. - а просто смотрите!!!

Vitalie Postolache
11045
Vitalie Postolache 2016.06.29 20:16  
Buz23:

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

При компиляции у меня ругалось на скобки, подскажите где ошибка.

Почему не совсем как надо? Считает, насколько я смог понять, сколько раз цена принимала определённое значение за указанное количество баров на М1. Если кинуть индикатор на М1, то примерно так и есть. Правда, смысла в этом не очень много.

 Код правда не очень, если с #property strict компилировать, то кучу предупреждений выдаст и работать перестанет. И есть же _Point, зачем  пользовать 

extern double   PricePoint = 0.00001;

Вот, этот код компилируется без ошибок и предупреждений:

#property indicator_chart_window

extern int      MinutesCount = 5000;  // 3000 - 10000 ;
extern int      Amplitude = 20;       // 10 .. 100
extern color    HistColor = SteelBlue;


double Hist[];
datetime OpenTime = 0;

int init()
{
    return(0);
}

int deinit()
{
    DeleteObjects();
    return(0);
}

void DeleteObjects()
{
    for (int i = 0; i< 3000; i++) ObjectDelete("VH"+i);
}

int DrawLine(int n, double price, int vol, int max)
{
    vol = (int)MathRound(Amplitude * vol / max );
    if (vol > 0)
    {
        int first = WindowFirstVisibleBar();
        datetime dt1 = iTime(_Symbol, Period(), first);
        datetime dt2 = iTime(_Symbol, Period(), first-vol);
        ObjectCreate("VH"+n, OBJ_RECTANGLE, 0, dt1, price, dt2, price+_Point);
        ObjectSet("VH"+n, OBJPROP_STYLE, 0);
        ObjectSet("VH"+n, OBJPROP_COLOR, HistColor);
        ObjectSet("VH"+n, OBJPROP_BACK, true);
    }
    return (0);
}

int start()
{
    if (OpenTime != iTime(Symbol(), PERIOD_M1, 0))
    {
        OpenTime = iTime(Symbol(), PERIOD_M1, 0);

        int n, MaxVolume;
        double max = iHigh(Symbol(), PERIOD_M1, iHighest(Symbol(), PERIOD_M1, MODE_HIGH, MinutesCount, 0));
        double min = iLow(Symbol(), PERIOD_M1, iLowest(Symbol(), PERIOD_M1, MODE_LOW, MinutesCount, 0));
        int items = MathRound((max - min) / _Point);

        if (max == 0)
        {
            Alert("There is no minutes data. Please download M1.");
            return (0);
        }

        ArrayResize(Hist, items);      
        ArrayInitialize(Hist, 0);
        for (int i = 1; i <= MinutesCount; i++)
        {
        
         double C=Low[i];
            while(C<High[i])
            {
             n=MathRound((C-min)/_Point);
             Hist[n]++;
             C+=_Point;
            }
        
        }
        MaxVolume = Hist[ArrayMaximum(Hist)];
        DeleteObjects();
        for (i = 0; i <= items; i++)
        {
            DrawLine(i, min + i*_Point, Hist[i], MaxVolume);
        }
    }
        return(0);
}
Buz23
18
Buz23 2016.06.30 04:35  
evillive:

Почему не совсем как надо? Считает, насколько я смог понять, сколько раз цена принимала определённое значение за указанное количество баров на М1. Если кинуть индикатор на М1, то примерно так и есть. Правда, смысла в этом не очень много.

 Код правда не очень, если с #property strict компилировать, то кучу предупреждений выдаст и работать перестанет. И есть же _Point, зачем  пользовать 

extern double   PricePoint = 0.00001;

Вот, этот код компилируется без ошибок и предупреждений:

 

Спасибо за подсказку, я использовал старую версию metaeditor, в ней мне выдавало ошибки. Все работает!
Buz23
18
Buz23 2016.06.30 04:51  
LRA:

т.е. Вы не ищете профит, точки входа и т.п. - а просто смотрите!!!


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