Jump to content

Общие вопросы по языку MQL


Recommended Posts

AntFX
7 часов назад, ZeleBoba сказал:

Надо в истории искать закрытый ордер по тикету.

OrderCloseTime()>0 только у ордеров в истории.


1

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

Ну, в данном случае мне стоило бы сразу соблюдать простейшие приёмы защитного программирования, то есть проверять, не равна ли нулю переменная, оказавшаяся под знаком деления. Ведь она "чужая", то ест

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

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

ZeleBoba
12 минут назад, AntFX сказал:

OrderCloseTime()>0 только у ордеров в истории.

Спасибо.


Лучше маленький профит, чем большие рога.

Link to post
Share on other sites
torgf
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[])
  {
//---
   if(rates_total<4) return(0);

   int limit=rates_total-prev_calculated;
   if(limit>0) 
     {
      ArrayInitialize(BufferPointDn,EMPTY_VALUE);
      ArrayInitialize(BufferPointUp,EMPTY_VALUE);
      limit=rates_total-2;

     }
///*
   for(int i=limit; i>0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }

Здравствуйте. Как ограничить историю 300 бароа? Чтобы индикатор не пересчитывал их на каждом тике. Если вместо limit поставить 300, то грузит терминал.

Link to post
Share on other sites
Ugar68

Он и так не пересчитывает их на каждом тике. Он вообще ничего не считает на каждом тике.

Вот так он будет считать на каждом тике только текущий бар.

 for(int i=limit; i>=0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }

Вот если надо что бы он на каждом тике считал 300 баров

то это выглядит так

if(limit<300)limit=300;
for(int i=limit; i>=0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
В 15.07.2018 в 08:06, Ugar68 сказал:

Вот если надо что бы он на каждом тике считал 300 баров

то это выглядит так

Возможно неправильно был задан вопрос.

Нужно ограничить историю 300 баров и чтобы не пересчитывались на новом баре уже посчитанные.

Link to post
Share on other sites
Ugar68

Ваш код считает не на каждом тике а при появлении нового бара.

И действительно он считает всю историю при появлении нового бара.

Вот эта строчка заставляет считать всю историю

limit=rates_total-2;

Не знаю что там за индикатор что надо пересчитывать всю историю на новом баре. Обычно делают пересчёт только тех баров которые перерисовываются.

После этой строчки добавляем ещё одну.

if(limit>300)limit=300;

Теперь индикатор будет считать только 300 баров.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
В 19.07.2018 в 16:18, Ugar68 сказал:

Не знаю что там за индикатор что надо пересчитывать всю историю на новом баре

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

 

Link to post
Share on other sites
Ugar68
1 час назад, torgf сказал:

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

 

 

В 14.07.2018 в 11:20, torgf сказал:

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[])
  {
//---
   if(rates_total<4) return(0);

   int limit=rates_total-prev_calculated;
   if(limit>300)limit=300;
///*
   for(int i=limit; i>0; i--) 
     {
     //код индикатора
     //..........
     return(rates_total);
     }

 

 

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
В 20.07.2018 в 20:16, Ugar68 сказал:

 

 

Спасибо.

Это можно выкинуть, для чего это делается?

      ArrayInitialize(BufferPointDn,EMPTY_VALUE);
      ArrayInitialize(BufferPointUp,EMPTY_VALUE);
Link to post
Share on other sites
Ugar68
1 час назад, torgf сказал:

Спасибо.

Это можно выкинуть, для чего это делается?


      ArrayInitialize(BufferPointDn,EMPTY_VALUE);
      ArrayInitialize(BufferPointUp,EMPTY_VALUE);

Эти строчки заполняют буферы пустыми значениями перед тем как полностью пересчитать их. Очистка перед пересчётом.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
В 23.07.2018 в 08:55, Ugar68 сказал:

 

Спасибо. Как узнать номер свечи открытой в 11:15 вчера или позавчера. mql5?

Edited by torgf
Link to post
Share on other sites
Ugar68
15 часов назад, torgf сказал:

Спасибо. Как узнать номер свечи открытой в 11:15 вчера или позавчера. mql5?

 

Недавно метаквоты пообещали добавить в MQL5 функцию iBarHift. И добавили, это упростило поиск бара по времени. Теперь он ничем не отличается от того же на MQL4.

  • Upvote 1
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
torgf
8 часов назад, Ugar68 сказал:

 

Недавно метаквоты пообещали добавить в MQL5 функцию iBarHift. И добавили, это упростило поиск бара по времени. Теперь он ничем не отличается от того же на MQL4.

Отлично, но меня это не спасает😳. Чтобы не писать дату текстом, как сюда, в time программно, поставить время которое написано ? 

datetime time=D'2018.07.27 11:15';
barIndex = iBarShift(NULL,PERIOD_M1, time,false );

 

Edited by torgf
Link to post
Share on other sites
AntFX

11:15 это в формате datetime = 15 * 60 + 11 * 3600 (60 - число секунд в минуте, 3600 - число секунд в часе). Итого, 11:15 вчера - это iTime(Symbol(), PERIOD_D1, 1) + 15 * 60 + 11 * 3600. 11:15 позавчера - это iTime(Symbol(), PERIOD_D1, 2) + 15 * 60 + 11 * 3600. Правда, выходные и праздники не учитываются.

П.С. iTime - время открытия бара (дневного в данном случае). Для символов, у которых торговый день начинается не в 00:00, не подходит...

Edited by AntFX
  • Thanks 1

1

Link to post
Share on other sites
torgf
3 часа назад, AntFX сказал:

11:15 это в формате datetime = 15 * 60 + 11 * 3600 (60 - число секунд в минуте, 3600 - число секунд в часе). Итого, 11:15 вчера - это iTime(Symbol(), PERIOD_D1, 1) + 15 * 60 + 11 * 3600. 11:15 позавчера - это iTime(Symbol(), PERIOD_D1, 2) + 15 * 60 + 11 * 3600. Правда, выходные и праздники не учитываются.

П.С. iTime - время открытия бара (дневного в данном случае). Для символов, у которых торговый день начинается не в 00:00, не подходит...

Спасибо.

Хочу поставить линию на цену открытия свечи в 11:15 каждый вчерашний день в истории. Не получается. Что неправильно?

  if(!TrendCreate(0,"__"+time[i+1],0,iTime(NULL,PERIOD_D1,i+1),iOpen(NULL,PERIOD_CURRENT,i+iBarShift(NULL,PERIOD_CURRENT, iTime(Symbol(), PERIOD_D1,i+ 1) + 15 * 60 + 11 * 3600,false )),iTime(NULL,PERIOD_D1,i),0,clrRed,STYLE_SOLID,2,false,false,false,false,0)){continue;}

 

Link to post
Share on other sites
DVargo

Для начала бы неплохо научится писать код так, чтобы он был читабельным.

Введите переменные даты и цены и распринтуйте их. тогда сами найдете ошибку.

А в  TrendCreate ставте переменные даты и цены.

 

4 часа назад, AntFX сказал:

Для символов, у которых торговый день начинается не в 00:00, не подходит...

Что мешает сравнивать текущее время со временем начала дня?

А дату D'2018.07.27 11:15' собирать из вычисленного дня и '11:15'

Тогда и субботу с воскресеньем исключить просто.

Link to post
Share on other sites
AntFX
12 часов назад, DVargo сказал:

Что мешает сравнивать текущее время со временем начала дня?

Ничего не мешает


1

Link to post
Share on other sites
torgf
15 часов назад, DVargo сказал:

Для начала бы неплохо научится писать код так, чтобы он был читабельным.

Введите переменные даты и цены и распринтуйте их. тогда сами найдете ошибку.

 

Не найду. На 11:15 пятницы, ставит линию правильно, четверг уже неправильно  дальше в историю неправильно. Куда искать?

datetime dat1,dat2,dat3;
double prise;
int index;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<4) return 0;

   int limit=rates_total-prev_calculated;
   if(limit>1000)
     {
      limit=1000;//rates_total-20;
     }
//--- Цикл расчёта индикатора
   for(int i=limit; i>=0; i--)
     {
      dat1=iTime(NULL,PERIOD_D1,i+1);
      dat2=iTime(NULL,PERIOD_D1,i);
      dat3=iTime(Symbol(), PERIOD_D1,i+ 1) + 15 * 60 + 11 * 3600;
      index=iBarShift(NULL,PERIOD_CURRENT, dat3,false );
      prise=iOpen(NULL,PERIOD_CURRENT,i+index);
      if(!TrendCreate(0,"__"+time[i+1],0,dat1,prise,dat2,0,clrLime,STYLE_SOLID,2,false,false,false,false,0))
        {
         continue;
        }
      //Comment("");
     }
///

//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

Edited by torgf
Link to post
Share on other sites
AntFX
3 минуты назад, torgf сказал:

index=iBarShift(NULL,PERIOD_CURRENT, dat3,false );

prise=iOpen(NULL,PERIOD_CURRENT,i+index);

index - это не смещение относительно i, это смещение относительно нулевого бара.


1

Link to post
Share on other sites
Pirojoque Project
21 час назад, torgf сказал:

Чтобы не писать дату текстом, как сюда, в time программно, поставить время которое написано?

Нужно создать структуру типа MqlDateTime, присвоить её полям необходимые значения и далее использовать там, где необходимо. В вашем случае нужно сконвертировать структуру в простой тип времени datetime и уже эту переменную применять в iBarShift().

 

Пример:

MqlDateTime mqltime; // Время-структура

mqltime.year = 2018; // Устанавливаем год
mqltime.mon = 7; // Устанавливаем месяц
mqltime.day = 30; // Устанавливаем день
mqltime.hour = 11; // Устанавливаем час
mqltime.min = 15; // Устанавливаем минуту

datetime time = StructToTime(mqltime); // Конвертируем время-структуру в обычное время
int n = iBarShift(_Symbol, _Period, time); // Получаем номер бара, захватывающего искомое время

Если нужно организовать какой-либо сдвиг относительно текущего момента, то можно пойти таким путём:

MqlDateTime mqltime; // Время-структура
datetime basetime = TimeCurrent(); // Время, от которого будем отсчитывать сдвиг (здесь — текущее время сервера)

TimeToStruct(basetime, mqltime); // Конвертируем базовое время в структуру
mqltime.day--; // Модифицируем структуру (здесь — ровно день назад)

datetime targettime = StructToTime(mqltime); // Конвертируем время-структуру в искомое время простого формата
int n = iBarShift(_Symbol, _Period, targettime); // Получили номер искомого бара (который был ровно день назад)

Думаю, идея понятна.

Edited by Pirojoque Project
  • Upvote 2
Link to post
Share on other sites
torgf
1 час назад, AntFX сказал:

index - это не смещение относительно i, это смещение относительно нулевого бара.

Спасибо. Убрала i+ , линии на правильной цене.

Link to post
Share on other sites
torgf
35 минут назад, Pirojoque Project сказал:

Думаю, идея понятна.

Вы пишете конкретную дату и время, как взять только время для каждого ЗАКРЫТОГО бара - дня, непонятно.

Link to post
Share on other sites
nasdaq

Как остановить оптимизацию из функции OnTester() ?


Быть честным хочется, но меньше, чем богатым.

Link to post
Share on other sites
AntFX
13 минут назад, nasdaq сказал:

Как остановить оптимизацию из функции OnTester() ?

Остановка оптимизации из эксперта не предусмотрена разработчиками терминала. Функция OnTester нужна для вычисления пользовательского критерия оптимизации, а не управления её ходом


1

Link to post
Share on other sites
Pirojoque Project
20 часов назад, torgf сказал:

Вы пишете конкретную дату и время, как взять только время для каждого ЗАКРЫТОГО бара - дня, непонятно.

Не понимаю проблему. Опишите подробней.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...