Вопросы по программированию в МТ4

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 23 мар 2017, 11:29

Что-то у меня терминал не обновляется. Так что не знаю что ответить.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 23 мар 2017, 11:32

Я уже было начал думать, что в коде какой-то ляп, но кол-во цифр после запятой в размере лота по проверенной функции, которую мы на форуме однажды обсуждали и разрабатывали (с логарифмом что). Хм... Еще покручу код, может что-то в самом МКУЭль изменили надо почитать что за изменения в этом билде. :ne_vi_del:
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 24 мар 2017, 08:20

Ошибок в коде не нашел, видимо, при перезапуске терминала на сервере произошли какие-то "флуктуации". Следить, конечно, нужно за автоматикой. А про указанный билд еще вообще ничего нет в инете.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вопросы по программированию в МТ4

Сообщение serjloskut » 10 апр 2017, 16:21

Добрый день, коллеги. В "муках" познания mql4 вот такой вопрос появился. Как ограничить работу советника по месячной прибыли (в процентах)?
Например 1 апреля был запущен советник на счете в 1000 уе. Нам нужно, чтобы как только эквити (именно эквити) увеличится на 5%, советник прекратил работу до начала следующего месяца. Как только начинается следующий месяц, советник принимается за работу, пока эквити не будет увеличено еще на 5% и т.д.
Единоразово ограничить - проблем не возникает. А вот как сделать, чтоб советник сам понимал, когда остановиться каждый месяц без моего вмешательства?
Аватар пользователя
serjloskut
 
Сообщений: 107
Зарегистрирован: 11 авг 2016, 04:28
Средств на руках: 13.40 Доллар
Откуда: Иркутск
Группа: Базовая
Благодарил (а): 31 раз.
Поблагодарили: 30 раз.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 10 апр 2017, 16:29

serjloskut писал(а):Добрый день, коллеги. В "муках" познания mql4 вот такой вопрос появился. Как ограничить работу советника по месячной прибыли (в процентах)?
Например 1 апреля был запущен советник на счете в 1000 уе. Нам нужно, чтобы как только эквити (именно эквити) увеличится на 5%, советник прекратил работу до начала следующего месяца. Как только начинается следующий месяц, советник принимается за работу, пока эквити не будет увеличено еще на 5% и т.д.
Единоразово ограничить - проблем не возникает. А вот как сделать, чтоб советник сам понимал, когда остановиться каждый месяц без моего вмешательства?

Ограничение по времени указывается в условии.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вопросы по программированию в МТ4

Сообщение serjloskut » 10 апр 2017, 17:10

Haos писал(а):
serjloskut писал(а):Добрый день, коллеги. В "муках" познания mql4 вот такой вопрос появился. Как ограничить работу советника по месячной прибыли (в процентах)?
Например 1 апреля был запущен советник на счете в 1000 уе. Нам нужно, чтобы как только эквити (именно эквити) увеличится на 5%, советник прекратил работу до начала следующего месяца. Как только начинается следующий месяц, советник принимается за работу, пока эквити не будет увеличено еще на 5% и т.д.
Единоразово ограничить - проблем не возникает. А вот как сделать, чтоб советник сам понимал, когда остановиться каждый месяц без моего вмешательства?

Ограничение по времени указывается в условии.

То что в условии это понятно. Я не могу просто сообразить, как программно обозначить баланс или эквити на начало месяца, чтобы было с чем сравнивать
Аватар пользователя
serjloskut
 
Сообщений: 107
Зарегистрирован: 11 авг 2016, 04:28
Средств на руках: 13.40 Доллар
Откуда: Иркутск
Группа: Базовая
Благодарил (а): 31 раз.
Поблагодарили: 30 раз.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 10 апр 2017, 17:26

Определить баланс на начала месяца как разность между текущим балансом, закрытыми позами за месяц и состоянием по средствам.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вопросы по программированию в МТ4

Сообщение serjloskut » 10 апр 2017, 17:55

Haos писал(а):Определить баланс на начала месяца как разность между текущим балансом, закрытыми позами за месяц и состоянием по средствам.

Все верно. Именно по этой логике я и иду. Вы на сколько я знаю это реализовали в BigBoss. Но там идет ограничение на день, с этим у меня не возникло проблем.
Закрытые позы за месяц как посчитать? Здесь нужен счетчик, которые будет складывать результат по закрытым позам, если их OrderCloseTime() >= Х, где Х - дата (и время) первого дня месяца. Можно конечно вручную вбить дату и время, но хотелось бы, чтоб советник сам определял это.
Аватар пользователя
serjloskut
 
Сообщений: 107
Зарегистрирован: 11 авг 2016, 04:28
Средств на руках: 13.40 Доллар
Откуда: Иркутск
Группа: Базовая
Благодарил (а): 31 раз.
Поблагодарили: 30 раз.

Вопросы по программированию в МТ4

Сообщение serjloskut » 10 апр 2017, 18:00

Если только собрать Дату и время по кусочкам? Т.е. сначала вернуть значение года, потом вернуть значение месяца, сложить это все воедино (типа "[значение года]."+"[значение месяца]."+"01"+" 00:00"), и запихать в StringToTime() ?
Аватар пользователя
serjloskut
 
Сообщений: 107
Зарегистрирован: 11 авг 2016, 04:28
Средств на руках: 13.40 Доллар
Откуда: Иркутск
Группа: Базовая
Благодарил (а): 31 раз.
Поблагодарили: 30 раз.

Re: Вопросы по программированию в МТ4

Сообщение Haos » 10 апр 2017, 18:20

Вы получаете из ф-ии TimeCurrent() номер текущего месяца и год.
int m=TimeMonth(TimeCurrent());
...
Формируете дату из строковых кусков "01"+<найденный номер месяца>+<год>. Да, еще разделитель точка. Получили дату начала месяца. Далее использовать можно кимовскую ф-ию (не помню уже - выкладывалась она или нет):

Код: выделить все
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

Потом учитываете профит по открытым позам и готово. Сразу советую правильный стиль программирования - всё формируйте в виде отдельных функций, а не лепите одним сплошняком.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron