Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 845

 
Anatoliy Ryzhakov:
Здравствуйте. Подскажите  как вернуть значение типа предпоследнего в истории ордера

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

https://www.mql5.com/ru/forum/247136#comment_7555643

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

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

Можно ли применить шаблон к экспортируемой функции, которая будет экспортироваться из с++ в mql4?

Я создал файл обычного типа с расширением "срр" и записал туда примитивную функцию.

#define MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

Далее я создал файл с расширением "def" и указал название экспортируемой функции

LIBRARY "dllmt42"
EXPORTS
add

Потом запустил это дело через Построение - Построить решение.
Я хочу применить к своей функции шаблон т.к. будут разрабатываться функции работающие с массивами и без шаблона здесь не обойтись никак пробовал так 

#define MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

Т подсвечивается но пишет что есть ошибка помогите советом и возможно ли это, пробовал переставлять местами? Также как такая функция если это возможно будет вызываться со стороны mql4?




 
Roman Shiredchenko:

смотрите в кодебазе - на МТ4 точно были...

Прямо на первом листе, в этой ветке.

 

Добрый вечер. В процессе изучения и познавания МТ5 пробую воплотить в общем-то не сложную задачу, но малый опыт и пробелы в знаниях....... в общем не получается, прошу помощи и содействия.

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

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

Индикатор я не изменял, В советнике добавил в OnInit:

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

В OnTick добавил:

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

Конечно описал и инициировал соответствующие перепенные, массивы, определил как таймсерии и тд...... 

Для проверки использовал Comment и Print. Не сразу, но ошибок вроде нет, только пару предупреждений, мне не понятных. Но главное - параметры определяются неверно. Несмотря на условие ниже, выводятся максимально большое число для double для стрелки вверх и еще какое-то отрицательное число для стрелки вниз.

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
Здесь файлы
Файлы:
 
Sergey Voytsekhovsky:
Здесь файлы

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

Просто создайте в мастере MQL обычный советник и на нём тренируйтесь в использовании iCustom()

 
Sergey Voytsekhovsky:

Добрый вечер. В процессе изучения и познавания МТ5 пробую воплотить в общем-то не сложную задачу, но малый опыт и пробелы в знаниях....... в общем не получается, прошу помощи и содействия.

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

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

Индикатор я не изменял, В советнике добавил в OnInit:

В OnTick добавил:

Конечно описал и инициировал соответствующие перепенные, массивы, определил как таймсерии и тд...... 

Для проверки использовал Comment и Print. Не сразу, но ошибок вроде нет, только пару предупреждений, мне не понятных. Но главное - параметры определяются неверно. Несмотря на условие ниже, выводятся максимально большое число для double для стрелки вверх и еще какое-то отрицательное число для стрелки вниз.

Артём правильно сказал, а я просто отмечу ненужность одного сравнения

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

Если CopyBuffer возвращает количество скопированных в массив элементов, то размер массива именно таким и будет. Соответственно выделенная часть условия просто дублирует первую.

И мысли вслух: я не смотрел код индикатора и советника, поэтому могу быть неправ. А вы уверены что в диапазоне period_find сигнал обязательно быть должен?

 
Alexey Viktorov:

Артём правильно сказал, а я просто отмечу ненужность одного сравнения

Если CopyBuffer возвращает количество скопированных в массив элементов, то размер массива именно таким и будет. Соответственно выделенная часть условия просто дублирует первую.

И мысли вслух: я не смотрел код индикатора и советника, поэтому могу быть неправ. А вы уверены что в диапазоне period_find сигнал обязательно быть должен?

Да - это типа фильтра - от него зависит частота сигналов.

 
Artyom Trishkin:

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

Просто создайте в мастере MQL обычный советник и на нём тренируйтесь в использовании iCustom()

Спасибо, дельный совет, так и сделаю, как минимум будет удобнее.

Сегодня и приступлю.
 

Подскажите что не правильно в нормировке лота?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }