Стандартная библиотека - страница 3

 

Чтоб получить ответ или конкретную помощь, то лучше всего задать вполне конкретный вопрос. Без просьб про пространные рассуждения об ООП и библиотеку в частности.

Если вы уже так долго мыкаетесь в дебрях кода, то лучше выложите свой непонятный вам пример кода. И вам смогут помочь, отвечая на ваши конкретные вопросы про реализацию той или иной конкретной задачи.

В самом начале этой темы есть коротенький пример использования библиотеки. Есть ли непонятные вопросы у вас из этого примера?
 
sergeev:
В самом начале этой темы есть коротенький пример использования библиотеки. Есть ли непонятные вопросы у вас из этого примера?
Да - помогло, дало первый импульс, потом стало проще разбираться.
sergeev:

Чтоб получить ответ или конкретную помощь, то лучше всего задать вполне конкретный вопрос. Без просьб про пространные рассуждения об ООП и библиотеку в частности.


Здесь Вы правы, конечно вопросы должны быть более конкретными.

Я за mql4 сел в январе этого года и к маю написал все индикаторы своей торговой системы (т.е. язык - несложный). За mql5 сел в мае. Сказать - что совсем ничего не понимаю - было бы неправильно. Но с ООП пока в "контрах".

Так вот  -  опыта в программировании у меня совсем немного,  и вопрос, порой, сформулировать не  всегда получается ... (язык у меня "топорный").

Я выложу код индикатора (он рисует волны ..  точнее соединяет линиями экстремумы со всех таймфреймов)

Таймфреймов всего 8  - ( М1, М5, М15, Н1, Н4, D1, W1. MN)  -  остальные я даже из настроек терминала убрал .

Мне очень важно понять - как этот индикатор можно написать используя ООП.  У самого у меня мелькают разрозненные мысли - но очень прошу людей с опытом ООП посмотреть и помочь в понимании.....

//+------------------------------------------------------------------+
//|                                             Proba_ClassTrend.mq5 |
//|                                       Copyright 2010, E. Kovalev |
//|                                                 er-kov@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, E. Kovalev"
#property link      "er-kov@yandex.ru"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#include <Indicators\Trend.mqh>

CiMA  c_MA;
CiSAR c_SAR;

input double    SARStep = 0.01;    // Шаг стоп-сигнала
input double    SARMaxi = 0.01;    // Максимальный шаг
double step;
double maxi;

ENUM_TIMEFRAMES arr_period[] = {PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1};
double arr_main[8][40][10];
color  arr_color[] = {Gray, DarkOrange, LimeGreen , Magenta , DodgerBlue, DarkGreen, FireBrick, Navy};


double low_1[];
double high_1[];
double low_2[];
double high_2[];

ENUM_TIMEFRAMES period;
string symbol;

int OnInit()
{
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    if(SARStep < 0.0)
    {
        step = 0.01;
        Print("Входные параметры введены некорректно." 
        "Будет использовано значение SARStep - по умолчанию = ", step);
    }
    else step = SARStep;
    if(SARMaxi < 0.0)
    {
        maxi = 0.01;
        Print("Входные параметры введены некорректно.", 
        "Будет использовано значение SARMaxi - по умолчанию = ", maxi);
    }
    else maxi = SARMaxi;      
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::        
    
    period = Period();
    symbol = Symbol();
    
   return(0);
}
void OnDeinit(const int reason)
{
    DeleteLines();


}


//================================================================================================================
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{

    int limit = prev_calculated - 1;
    if (prev_calculated == 0) limit = 0;   
    
    int    bars, direct, number, up_dn, dt, dt1, dt2, delta_right, delta_left;
    double pr_1, pr_2,  pr1, pr2, sar_cur, sar_pre, ma_cur, ma_pre;
    bool   find, rev_up, rev_dn;
    ENUM_TIMEFRAMES arr_per;
    color coler;
    datetime time_1[], time1, time_2[], time2;
    string name;
    
    
    int    current_index = IndexOfPeriod(period);
    int index = ArrayRange(arr_period, 0) - 1;
    
    while (index >= current_index)
    {
        coler = arr_color[index];
        arr_per = arr_period[index];
        bars = Bars(symbol, arr_period[index]) - 2;
        number = 0;
        up_dn = 0;    
    
        if(!c_MA.Create(symbol, arr_per, 10, 0, MODE_SMA, PRICE_MEDIAN)) Print("c_MA.Create    Код ошибки -  ", GetLastError());
        c_MA.BuffSize(bars-2);
        c_MA.Refresh(-1);
    
        if(!c_SAR.Create(symbol, arr_per, step, maxi)) Print("c_SAR.Create    Код ошибки -  ", GetLastError());
        c_SAR.BuffSize(bars-2);
        c_SAR.Refresh(-1);
    
        for(int i = 0; i < bars; i++)
        {
            sar_cur = c_SAR.Main(i); 
            sar_pre = c_SAR.Main(i-1);
            ma_cur = c_MA.Main(i);
            ma_pre = c_MA.Main(i-1);
            rev_up = false; if((sar_cur < ma_cur) && (sar_pre > ma_pre)) { rev_up = true; up_dn = 1;  }
            rev_dn = false; if((sar_cur > ma_cur) && (sar_pre < ma_pre)) { rev_dn = true; up_dn = -1; }
            if( (rev_up) || (rev_dn) )
            {
                dt = i;
                pr_1 = sar_cur;
                pr_2 = sar_pre;
                arr_main[index][number][0] = number + 1;
                arr_main[index][number][1] = dt;       // 
                arr_main[index][number][2] = pr_1; // 
                arr_main[index][number][3] = pr_2; // 
                arr_main[index][number][4] = up_dn;   // 
                dt1 = FindExtrim(arr_per, bars, up_dn, dt, sar_pre);
                arr_main[index][number][5] = dt1; 
                if(up_dn > 0) pr1 = iHigh(symbol, arr_per, dt1);
                else pr1 = iLow(symbol, arr_per, dt1);                   
                arr_main[index][number][6] = pr1; 
                
                if(number == 0)
                {
                    if(up_dn < 0) { dt2 = iHighest(symbol, arr_per, dt1, 0); pr2 = iHigh(symbol, arr_per, dt2); }
                             else { dt2 = iLowest(symbol,  arr_per, dt1, 0); pr2 = iLow(symbol,  arr_per, dt2);  }                  
                }
                
                if(number > 0)
                {
                    dt2 = arr_main[index][number-1][5]; 
                    pr2 = arr_main[index][number-1][6]; 
                    arr_main[index][number][7] =  dt2;
                    arr_main[index][number][8] =  pr2;
                }
                
                number++;
                
                name = IntegerToString(index, 1, ' ') + " Line № " + IntegerToString(number, 2, ' '); 
                    
                if(CopyTime(symbol, arr_per, dt1, 1, time_1) > 0) time1 = time_1[0];
                if(CopyTime(symbol, arr_per, dt2, 1, time_2) > 0) time2 = time_2[0];
                    
                if ( ObjectFind(0, name) < 0 ) ObjectCreate(0, name, OBJ_TREND, 0, time1, pr1, time2, pr2);               
                ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
                ObjectSetInteger(0, name, OBJPROP_COLOR, coler);
                ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
                ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID);
                    
                    
                if(number >= 30) break;
            }
        }           
        index--;
    }
    
   return(rates_total);
}
//====================================================================================================================
int IndexOfPeriod (ENUM_TIMEFRAMES per)
{
    int ret;
    for(int i = 0; i < ArrayRange(arr_period, 0); i++) 
    {
        ret = i;
        if(per == arr_period[i]) break;
    }
   return(ret);
}

int DeleteLines()
{
    string nm;
    for(int ind = ArrayRange(arr_period, 0)-1; ind >= 0; ind--)
    {
        for(int num = 0; num <= 40; num++)
        {
            nm = IntegerToString(ind, 1, ' ') + " Line № " + IntegerToString(num, 2, ' '); 
            ObjectDelete(0, nm);
        }
    }
   return(0);
}

int FindExtrim(ENUM_TIMEFRAMES per, int bar_totl, int u_d, int dt, double pr)
{
    int ret;
    double price;
    for(int i = dt; i < bar_totl; i++)
    {
        if(u_d > 0) price = iHigh(symbol, per, i);
        else price = iLow(symbol, per, i);
        ret = i;
        if (price == pr) break;
    }
   return(ret);
}

double iLow(string symb, ENUM_TIMEFRAMES per, int dt)
{
    double low = 0.0;
    ArraySetAsSeries(low_1, true);
    if(CopyLow(symb, per, dt, 1, low_1) > 0) low = low_1[0];
   return(low);
}
double iHigh(string symb, ENUM_TIMEFRAMES per,int dt)
{
    double high = 0.0;
    ArraySetAsSeries(high_1, true);
    if(CopyHigh(symb, per, dt, 1, high_1) > 0) high = high_1[0];
   return(high);
}

int iLowest(string symb, ENUM_TIMEFRAMES per, int end, int strt)
{
    int lowest = 0;
    ArraySetAsSeries(low_2, true);
    if(CopyLow(symb, per, strt, end, low_2) > 0 ) lowest = ArrayMinimum(low_2, strt, end);
   return(lowest);
}

int iHighest(string symb, ENUM_TIMEFRAMES per, int end, int strt)
{
    int highest = 0;
    ArraySetAsSeries(high_2, true);
    if(CopyHigh(symb, per, strt, end, high_2) > 0 ) highest = ArrayMaximum(high_2, strt, end);
   return(highest);
}


Перед присоединением к графику лучше лишние таймфреймы убрать (просто я не знаю - что будет если не убрать)


Помогите с ООП ....

С уважением, Э Ковалев



Файлы:
 

Еще ...

Если будут нужны комментарии по кускам кода - я все разъясню

На МТ4 итоговый вариант этого индикатора у меня выглядет так:


Файлы:
 
Еще вопрос: Что это за надпись у меня периодически выплывает ???
2010.07.30 16:05:33    Proba_ClassTrend (EURUSD,M1)    Unhandled C++ exception in 'C:\Program Files (x86)\MetaTrader 5\MQL5\Indicators\Proba_ClassTrend.ex5'



 
erkov:
Еще вопрос: Что это за надпись у меня периодически выплывает ???
2010.07.30 16:05:33    Proba_ClassTrend (EURUSD,M1)    Unhandled C++ exception in 'C:\Program Files (x86)\MetaTrader 5\MQL5\Indicators\Proba_ClassTrend.ex5'

Просьба сообщить об этом заявкой в Сервисдеск
Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 
Rosh:
Просьба сообщить об этом заявкой в Сервисдеск

Сообщил

С уважением ...

 
erkov:

Сообщил

С уважением ...

В Вышем профиле есть такая вещица как "Сервисдеск"...
 
Interesting:
В Вышем профиле есть такая вещица как "Сервисдеск"...

Эх..

Вот я "недотепа" ...

Нашел -  сейчас попробую правильно оформить ..

С уважением...

 
erkov:

Мне очень важно понять - как этот индикатор можно написать используя ООП.  У самого у меня мелькают разрозненные мысли - но очень прошу людей с опытом ООП посмотреть и помочь в понимании.....

Для начала возьмите простой пример CiADX. найдите функцию Create. И посмотрите вот это
bool CiADX::Create(string symbol,ENUM_TIMEFRAMES period,int ma_period)
  {
   m_handle=iADX(symbol,period,ma_period);

В вашем случае будет практически тоже самое, только вместо iADX вы будете вызывать свой иникатор iCustom.

Другими словами суть ООП в созданной библиотеки индикаторов - это не расчет индикатора, а просто возврат значения для бара от конкретного буфера. Только выполненное в обложке ООП.

Но вашу написанную функцию OnCalculate в ООП засунуть можно, только смысл? Это получится не совсем ООП, а просто функция для некоторого расчета.

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

Думаю, что для OnCalculate в индикаторах не стоит сушить себе голову с ООП. Этот подход используется немного для других целей. А индикаторы обычно имеют узкоспециализированные расчеты, которые не понадобятся в потомках.

 

В справке уже появились новые методы класса CTrade : CheckResultRetcode() ...  PrintCheckResult() , а стандартной поставке после обновления билда их нет в Trade.mqh.

Обычно было наоборот.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
Причина обращения: