Имя пользователя:

Пароль:



MQL4 - вопросы программирования

Добавили в закладки: lbh
Подписчиков: lbh

MQL4 - вопросы программирования

Номер сообщения:#581  Непрочитанное сообщение coder-ex » 17 окт 2016, 20:18

Сигнатура твоей функции:
int signal() (int)()
сделай ее к примеру:
(int)(const string&)
этим ты добьешься того, что одну и ту-же функцию ты сможешь вызывать применительно для разных инструментов из одной точки программы.
Пример:
Код: выделить все · Развернуть
//--- глобальные переменные
int Signal(const string& sy); // прототип функции которую нужно вызвать
/*!
   \brief   используем класс т.к. у структур в mql нет указателей
*/
class CInstrument
  {
private:
   symbol m_symbol;
   //... необходимые поля для учета
public:
   CInstrument(const string& sy ...) : m_symbol(sy) { }   // конструктор
   const string GetSymbol(void) const { return m_symbol; }   // гетер символа, но это не красиво
   const string operator=() const { return m_symbol; }   // так удобнее, чем с гетером
   //... необходимые методы для учета
  };

CInstrument *inst[];
string arr_symbol[] = { EURUSD, GBPUSD, NZDUSD }   // объявили массив торгуемых инструментов
int size = 0;   // число торгуемых символов

//--- callback инициализации
int OnInit() {
   size = ArrayResize(inst, ArraySize(arr_symbol));
   for(int i = 0, j = size; i < j; i++)
      inst[i] = new CInstrument(arr_symbol[i]);
//---
   return(INIT_SUCCEEDED);
}
//--- callback поступления тиков в терминал
void OnTick() {
   /* некая логика программы */
   //...

   /* тут вызываем функцию Sygnal */
   int _sygnal = 0;
   for(int i = 0; i < size; i++) {
      // вызов с гетером
      _sygnal = Symbol(inst[i].GetSymbol());
      // или вызов с оператором '='
      _sygnal = Symbol(inst[i]);
   }
   /* остальная логика программы */
}
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 26 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL4 - вопросы программирования

Номер сообщения:#582  Непрочитанное сообщение Kordan » 18 окт 2016, 02:17

Позволю себе сделать замечание. Абсолютное большинство прогеров не рационально разбрасываются назначением типов переменных, что ведет к увеличенным требованиям по использованию памяти. Полагаю, что более опытные программисты будут использовать типы char, unsigned char, short, unsigned short, весом во много раз меньше int, для которого выделяется памяти более 2млрд. чисел.
Аватар пользователя
Kordan
.
.
      Автор темы
Сообщений: 2452
Возраст: 49
Зарегистрирован: 65 месяцев и 26 дней
Откуда: Саратов
Национальный флаг:
Russia
Благодарил (а): 667 раз.
Поблагодарили: 1220 раз.
Имя: Валерий
Пункты репутации: 25
Молодой трейдерМолодой трейдерМолодой трейдер

MQL4 - вопросы программирования

Номер сообщения:#583  Непрочитанное сообщение coder-ex » 18 окт 2016, 04:58

Kordan писал(а):

Позволю себе сделать замечание. Абсолютное большинство прогеров не рационально разбрасываются назначением типов переменных, что ведет к увеличенным требованиям по использованию памяти. Полагаю, что более опытные программисты будут использовать типы char, unsigned char, short, unsigned short, весом во много раз меньше int, для которого выделяется памяти более 2млрд. чисел.

Для MQL это не сильно важно т.к. их типы не работают напрямую с процессором, а все крутятся через их менеджер памяти. Вернее это конечно важно, но ощутимого прибавления в скорости не увидим из-за этого. Сам на это обратил внимание когда поработал с их OpenCL, вот там использование больших типов ощутимо сказывается на производительности, т.к. там типы данных напрямую работают с ядрами GPU. Реально скорость вычислений прыгает в разы если использовать не длинные типы данных.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 26 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL4 - вопросы программирования

Номер сообщения:#584  Непрочитанное сообщение Kordan » 18 окт 2016, 12:27

Я больше по психологии программиста.

Считаю, что программист должен в любом случае, важно это или не важно или не так важно, максимально экономить память, тем более что в данном случае это не сложно, просто использовать минимальные типы. Это у него уже в крови должно быть заложено.
Аватар пользователя
Kordan
.
.
      Автор темы
Сообщений: 2452
Возраст: 49
Зарегистрирован: 65 месяцев и 26 дней
Откуда: Саратов
Национальный флаг:
Russia
Благодарил (а): 667 раз.
Поблагодарили: 1220 раз.
Имя: Валерий
Пункты репутации: 25
Молодой трейдерМолодой трейдерМолодой трейдер

MQL4 - вопросы программирования

Номер сообщения:#585  Непрочитанное сообщение coder-ex » 18 окт 2016, 15:29

Kordan писал(а):

Я больше по психологии программиста.
Считаю, что программист должен в любом случае, важно это или не важно или не так важно, максимально экономить память, тем более что в данном случае это не сложно, просто использовать минимальные типы. Это у него уже в крови должно быть заложено.

Совершенно верно, когда смотришь не оптимизированный код, то через какое то время ловишь себя на мысли, что ты его уже оптимизируешь и теряешь на этом время :neznayu:
Но по отношению к MQL - ты сделай цикл расчета (возьми любой расчет из любого индикатора) для сравнения где присутствуют длинные типы данных, в цикле укажи млн. итераций, замерь скорость прохождения всех итераций цикла и потом сделай то же самое для маленьких типов. То же самое проведи на C++, думаю сам поймешь, что сильно оптимизировать по используемым типам в MQL не получится.
Вообще в плане оптимизаций программ написано много всего. В MQL к примеру можно прооптимизировать циклы for. Вот ты в курсе какая операция инкремента и декремента выполняется быстрее - постфикс или префикс? Сразу скажу, префиксные операции происходят быстрее, т.к. под них не создается отдельной переменной компилятором. Вот как выглядит префиксные операции инкремента:
Код: выделить все · Развернуть
return _var++;
а вот так выглядит постфиксная операция инкремента:
Код: выделить все · Развернуть
void _tmp = _var;
_var++;
return _tmp;
void относится к тому типу, который инкрементируем, для декремента все то же самое. Информация про операции инкремента/декремента
Но это не значит, что нужно кинуться и все циклы перевести на префикс, нужно смотреть затратное время на выражение цикла и на количество итераций.
Еще один из вариантов оптимизации циклов for, как правило используют общепринятый вариант
Код: выделить все · Развернуть
for(int i = 0; i < ArraySize(+arr); ++i)
но можно избежать вызова функции ArraySize на каждой итерации цикла, к примеру так:
Код: выделить все · Развернуть
for(int i = 0, j = ArraySize(+arr); i < j; ++i)

вариантов оптимизации не мало :men:
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 26 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL4 - вопросы программирования

Номер сообщения:#586  Непрочитанное сообщение tai78 » 09 ноя 2016, 14:44

Опять вопрос по работе на нескольких парах, что сделал не так, значение автодистанции вижу тока на одной паре
Код: выделить все · Развернуть
extern int       MinDistAvr       =       1; // минимальный отступ для усреднения в пунктах
int gi_672 = 20;
int gi_676 = 3;
double gd_124 = 20.0;
double gd_1160[171],gd_1152[171];
.........
int start() {
for(int i=1; i<=171; i++){
       if(IsTesting() && Symbols[i]!=Symbol())continue;
       if(OnlyCurrentSymbol && Symbols[i]!=Symbol())continue;
       if (SymbPendingExist[i] >= MaxPendingOpen) continue;
if(Symbols[i]==Symbol()){MinDistAvr = MinDistAvrS[i];}
   gd_1160[i] = f0_0(Symbols[i],gi_672);
   gd_1152[i] = f0_19(Symbols[i],gi_676);
   if (AutoOrderDistanceSize) {
      MinDistAvr = MinDistAvrS[i];
      MinDistAvrS[i] = (gd_1160[i] + gd_1152[i]) / 2.0 / (gd_124 / 2.0);
      //if (Digits == 5 || Digits == 3) MinDistAvrS[i] = 10.0 * MinDistAvrS[i];
      f0_18(0);
   }
  return(0) ;
}

int f0_19(string symbol,int ai_0) {
   double ihigh_4;
   double ilow_12;
   bool li_20 = FALSE;
   int index_24 = 0;
   int count_28 = 0;
   double ld_ret_32 = 0;
   if (ai_0 == 0) return (0);
   int month_40 = TimeMonth(Time[0]);
   //symbol=OrderSymbol();
   while (!li_20) {
      if (TimeMonth(Time[index_24]) != month_40) {
         ihigh_4 = iHigh(symbol, PERIOD_MN1, iBarShift(symbol, PERIOD_MN1, Time[index_24]));
         ilow_12 = iLow(symbol, PERIOD_MN1, iBarShift(symbol, PERIOD_MN1, Time[index_24]));
         ld_ret_32 += (ihigh_4 - ilow_12) / gd_740;
         count_28++;
         if (count_28 == ai_0) li_20 = TRUE;
      }
      month_40 = TimeMonth(Time[index_24]);
      if (index_24 < Bars - 1) index_24++;
      else li_20 = TRUE;
   }
   ld_ret_32 /= ai_0;
   return (ld_ret_32);
}
   
int f0_0(string symbol,int ai_0) {
   double ihigh_4;
   double ilow_12;
   bool li_20 = FALSE;
   int index_24 = 0;
   int count_28 = 0;
   double ld_ret_32 = 0;
   if (ai_0 == 0) return (0);
   int day_40 = TimeDay(Time[0]);
   //symbol=OrderSymbol();
   while (!li_20) {
      if (TimeDay(Time[index_24]) != day_40 && TimeDayOfWeek(Time[index_24]) != 0) {
         ihigh_4 = iHigh(symbol, PERIOD_D1, iBarShift(symbol, PERIOD_D1, Time[index_24]));
         ilow_12 = iLow(symbol, PERIOD_D1, iBarShift(symbol, PERIOD_D1, Time[index_24]));
         ld_ret_32 += (ihigh_4 - ilow_12) / gd_740;
         count_28++;
         if (count_28 == ai_0) li_20 = TRUE;
      }
      day_40 = TimeDay(Time[index_24]);
      if (index_24 < Bars - 1) index_24++;
      else li_20 = TRUE;
   }
   ld_ret_32 /= ai_0;
   return (ld_ret_32);
}
MQL4 - вопросы программирования
Аватар пользователя
tai78
.
.
Сообщений: 200
Возраст: 39
Зарегистрирован: 64 месяцев и 5 дней
Откуда: Оренбург
Национальный флаг:
Russia
Благодарил (а): 197 раз.
Поблагодарили: 61 раз.
Имя: Андрей
Пункты репутации: 3
Ученик трейдера

MQL4 - вопросы программирования

Номер сообщения:#587  Непрочитанное сообщение SVG » 09 ноя 2016, 21:05

tai78 писал(а):

Опять вопрос по работе на нескольких парах, что сделал не так, значение автодистанции вижу тока на одной паре
Код: выделить все · Развернуть
extern int       MinDistAvr       =       1; // минимальный отступ для усреднения в пунктах
int gi_672 = 20;
int gi_676 = 3;
double gd_124 = 20.0;
double gd_1160[171],gd_1152[171];
.........
int start() {
for(int i=1; i<=171; i++){
       if(IsTesting() && Symbols[i]!=Symbol())continue;
       if(OnlyCurrentSymbol && Symbols[i]!=Symbol())continue;
       if (SymbPendingExist[i] >= MaxPendingOpen) continue;
if(Symbols[i]==Symbol()){MinDistAvr = MinDistAvrS[i];}
   gd_1160[i] = f0_0(Symbols[i],gi_672);
   gd_1152[i] = f0_19(Symbols[i],gi_676);
   if (AutoOrderDistanceSize) {
      MinDistAvr = MinDistAvrS[i];
      MinDistAvrS[i] = (gd_1160[i] + gd_1152[i]) / 2.0 / (gd_124 / 2.0);
      //if (Digits == 5 || Digits == 3) MinDistAvrS[i] = 10.0 * MinDistAvrS[i];
      f0_18(0);
   }
  return(0) ;
}

int f0_19(string symbol,int ai_0) {
   double ihigh_4;
   double ilow_12;
   bool li_20 = FALSE;
   int index_24 = 0;
   int count_28 = 0;
   double ld_ret_32 = 0;
   if (ai_0 == 0) return (0);
   int month_40 = TimeMonth(Time[0]);
   //symbol=OrderSymbol();
   while (!li_20) {
      if (TimeMonth(Time[index_24]) != month_40) {
         ihigh_4 = iHigh(symbol, PERIOD_MN1, iBarShift(symbol, PERIOD_MN1, Time[index_24]));
         ilow_12 = iLow(symbol, PERIOD_MN1, iBarShift(symbol, PERIOD_MN1, Time[index_24]));
         ld_ret_32 += (ihigh_4 - ilow_12) / gd_740;
         count_28++;
         if (count_28 == ai_0) li_20 = TRUE;
      }
      month_40 = TimeMonth(Time[index_24]);
      if (index_24 < Bars - 1) index_24++;
      else li_20 = TRUE;
   }
   ld_ret_32 /= ai_0;
   return (ld_ret_32);
}
   
int f0_0(string symbol,int ai_0) {
   double ihigh_4;
   double ilow_12;
   bool li_20 = FALSE;
   int index_24 = 0;
   int count_28 = 0;
   double ld_ret_32 = 0;
   if (ai_0 == 0) return (0);
   int day_40 = TimeDay(Time[0]);
   //symbol=OrderSymbol();
   while (!li_20) {
      if (TimeDay(Time[index_24]) != day_40 && TimeDayOfWeek(Time[index_24]) != 0) {
         ihigh_4 = iHigh(symbol, PERIOD_D1, iBarShift(symbol, PERIOD_D1, Time[index_24]));
         ilow_12 = iLow(symbol, PERIOD_D1, iBarShift(symbol, PERIOD_D1, Time[index_24]));
         ld_ret_32 += (ihigh_4 - ilow_12) / gd_740;
         count_28++;
         if (count_28 == ai_0) li_20 = TRUE;
      }
      day_40 = TimeDay(Time[index_24]);
      if (index_24 < Bars - 1) index_24++;
      else li_20 = TRUE;
   }
   ld_ret_32 /= ai_0;
   return (ld_ret_32);
}

Еще и декомпилированный код юзаешь :)
Посмотри как тут и учти все ошибки. Давно уже на форуме у нас валяется

MK_SINHROFILTR 170 tral.mq4
У вас нет доступа для просмотра вложений в этом сообщении.
Скоростной и надежный VPN сервер
Аватар пользователя
SVG
.
.
Сообщений: 1430
Возраст: 45
Зарегистрирован: 64 месяцев и 18 дней
Откуда: Khimki Left coast
Национальный флаг:
Russia
Благодарил (а): 454 раз.
Поблагодарили: 805 раз.
Имя: Владимир
Пункты репутации: 29
Молодой трейдерМолодой трейдерМолодой трейдер

MQL4 - вопросы программирования

Номер сообщения:#588  Непрочитанное сообщение tai78 » 10 ноя 2016, 08:02

Так я как раз этим советником и занимаюсь, уже с того момента как Михаил его забросил)))), добавляя свои хотелки, пока вот результат
У вас нет доступа для просмотра вложений в этом сообщении.
MQL4 - вопросы программирования
Аватар пользователя
tai78
.
.
Сообщений: 200
Возраст: 39
Зарегистрирован: 64 месяцев и 5 дней
Откуда: Оренбург
Национальный флаг:
Russia
Благодарил (а): 197 раз.
Поблагодарили: 61 раз.
Имя: Андрей
Пункты репутации: 3
Ученик трейдера

MQL4 - вопросы программирования

Номер сообщения:#589  Непрочитанное сообщение tai78 » 16 ноя 2016, 11:46

И тишина, что-то сложное спросил :)
MQL4 - вопросы программирования
Аватар пользователя
tai78
.
.
Сообщений: 200
Возраст: 39
Зарегистрирован: 64 месяцев и 5 дней
Откуда: Оренбург
Национальный флаг:
Russia
Благодарил (а): 197 раз.
Поблагодарили: 61 раз.
Имя: Андрей
Пункты репутации: 3
Ученик трейдера

MQL4 - вопросы программирования

Номер сообщения:#590  Непрочитанное сообщение lbh » 16 ноя 2016, 18:03

tai78 писал(а):

Так я как раз этим советником и занимаюсь, уже с того момента как Михаил его забросил)))), добавляя свои хотелки, пока вот результат


выглядит интересно
"хотелки" какие добавляли может поделитесъ?
...мыслямими или модернизированым кодом?

пробую смотретъ вариант (ввыше от svg линк)
пробую "укротитъ" до 4х валют (170х выглядит для меня "зАаАмного") и неоределился еще с индикатором bands
братъ его на пробой или отбой от границы?
торгую CFD (DAX, Nasdaq, DOW, SP500, BOCUSD(нефть)), Forex: EUR/USD, EUR/JPY
Аватар пользователя
lbh
.
.
Сообщений: 261
Зарегистрирован: 62 месяцев и 1 день
Откуда: Germany, Frankfurt/M
Национальный флаг:
Germany
Благодарил (а): 176 раз.
Поблагодарили: 74 раз.
Имя: lbh
Пункты репутации: 2
Ученик трейдера

Пред.

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



Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

  • Объявления
cron