Ваши вопросы по языку MQL4

ansol

Местный знаток
Мне не важно что показывает конкретно этот индикатор :facepalm: У меня есть вопрос с которым я обратился сюда

Суть в том, что индикатор(и методика вычислений в нем) зависит от того, как показывается история терминала.
Если в терминале выбрать "Сегодня" или "Последняя неделя", то такая методика будет показывать именно "Сегодня", а вовсе не последний месяц.
Поэтому и предлагается в первый день месяца внести баланс в глоабльные переменные терминала через GlobalVariableSet() и потом проверять и сравнивать текущий баланс с этим значением, полученным через GlobalVariableGet().
 

_SERG_

Активный участник
Мне не важно что показывает конкретно этот индикатор :facepalm: У меня есть вопрос с которым я обратился сюда

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

Yurkov

Почетный гражданин
Суть в том, что индикатор(и методика вычислений в нем) зависит от того, как показывается история терминала.
Если в терминале выбрать "Сегодня" или "Последняя неделя", то такая методика будет показывать именно "Сегодня", а вовсе не последний месяц.
Поэтому и предлагается в первый день месяца внести баланс в глоабльные переменные терминала через GlobalVariableSet() и потом проверять и сравнивать текущий баланс с этим значением, полученным через GlobalVariableGet().

А если так (ограничение по пунктам в месяц):
Добавляем некую переменную Y, присваиваем ей 0. Сделка закрылась, записываем значение Y = X или -X (количество пунктов) в переменную. Закрывается вторая сделка, прибавляем значение к переменной Y=Y+X и так далее, пока Y не станет равна или больше нужного значения, при котором срабатывает запрет на открытие нового ордера до наступления первого числа месяца и тогда Y снова присваиваем 0 и все начинается снова. ???
(Знаю, что при перезапуске советника или терминала переменная обнулится)
 
Последнее редактирование:

_SERG_

Активный участник
А если так (ограничение по пунктам в месяц):
Добавляем некую переменную Y, присваиваем ей 0. Сделка закрылась, записываем значение Y = X или -X (количество пунктов) в переменную. Закрывается вторая сделка, прибавляем значение к переменной Y=Y+X и так далее, пока Y не станет равна или больше нужного значения, при котором срабатывает запрет на открытие нового ордера до наступления первого числа месяца и тогда Y снова присваиваем 0 и все начинается снова. ???
(Знаю, что при перезапуске советника или терминала переменная обнулится)

Да, так оно и делается (+/-), алгоритм называется.

Выучи пару операторов, и кодер - готов.

Есть правда нюансы, надо ещё найти место в том алгоритме куда вставлять будешь, для того алгоритма, который сам написал.
 
Последнее редактирование:

ansol

Местный знаток
А если так (ограничение по пунктам в месяц):
Добавляем некую переменную Y, присваиваем ей 0. Сделка закрылась, записываем значение Y = X или -X (количество пунктов) в переменную. Закрывается вторая сделка, прибавляем значение к переменной Y=Y+X и так далее, пока Y не станет равна или больше нужного значения, при котором срабатывает запрет на открытие нового ордера до наступления первого числа месяца и тогда Y снова присваиваем 0 и все начинается снова. ???
(Знаю, что при перезапуске советника или терминала переменная обнулится)
Нну... Кто ж такое советовать будет именно из-за того, что закрытие терминала или перезапуск советника приведет к сбросу значения.
А глобальная переменная терминала хранится 4 недели, если к ней не обращаться совсем, т.е. никакие перезапуски не напрягают - это раз. И два - ее можно посмотреть и поменять самому по кнопочке F3 в терминале, что иногда удобно бывает.
А что именно вы будет сохранять и увеличивать - ваш выбор. Например, сохранять баланс 1 раз в месяц и сравнивать с текущим проще, ибо текущий без вашего участия изменяется в зависимости от результатов сделок. Это как бы немножко лучше, чем самому что-то куда-то прибавлять, ИМХО.
 
Последнее редактирование:

Yurkov

Почетный гражданин
Нну... Кто ж такое советовать будет именно из-за того, что закрытие терминала или перезапуск советника приведет к сбросу значения.
А глобальная переменная терминала хранится 4 недели, если к ней не обращаться совсем, т.е. никакие перезапуски не напрягают - это раз. И два - ее можно посмотреть и поменять самому по кнопочке F3 в терминале, что иногда удобно бывает.

Думаю простой переменной будет достаточно в моем случае. Терминал стоит на VPS. Мне нужно проверить в тестере стоит ли вообще заморачиваться.
 

ansol

Местный знаток
Думаю простой переменной будет достаточно в моем случае. Терминал стоит на VPS. Мне нужно проверить в тестере стоит ли вообще заморачиваться.

Хозяин - барин.
Возьмите баланс в вашу переменную BALANCE = AccountBalance() при Day() == 1 и потом сравнивайте его с текущим AccountBalance()
 

officialboob

Элитный участник
Может кто подскажет код? Нужно запретить советнику торговать при достижении определенного процента прибыли и чтоб это ограничение действовало до начала следующего месяца, и потом вновь повторялось.


Это не для новичков.

Пользовательские функции вставлять умеете?

Код будет выглядеть так (надо протестить):


PHP:
void OnTick()
{ 

double LastCalendarMonthProfit=GetProfitFromDateInCurrency(Symbol(),-1,Magic,TimeCurrent()-((TimeDay(TimeCurrent())*3600*24)+(TimeHour(TimeCurrent())*3600)+(TimeMinute(TimeCurrent())*60))); //Результат закрытых позиций с 1 числа до конца месяца  

bool EquityPercent=(LastCalendarMonthProfit*100)/(AccountBalance()-LastCalendarMonthProfit) < 10; //Если прибыль меньше 10% == true

if (EquityPercent) //Если прибыль меньше 10% == true
result=OrderSend(...); //Открываемся

}



PHP:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 
Последнее редактирование:

officialboob

Элитный участник
Это я понял)
Вот эти строчки мне не помогут?
PHP:
bool OrderOpenBuy(int & aReturnedTicket,double aLots,double aSL,double aTP)
и
PHP:
bool OrderOpenSell(int & aReturnedTicket,double aLots,double aSL,double aTP)



Перед запросом на открытие ордера нужно поставить дополнительное условие

PHP:
if (EquityPercent) {

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

}
 

vlad_123

Местный знаток
Может кто подскажет код? Нужно запретить советнику торговать при достижении определенного процента прибыли и чтоб это ограничение действовало до начала следующего месяца, и потом вновь повторялось.
Я еще понимаю попытки ограничить просадки, но вот прибыль - это да... :facepalm:
 

Yurkov

Почетный гражданин
Я еще понимаю попытки ограничить просадки, но вот прибыль - это да... :facepalm:

Грубый пример:
В первой половине месяца прибыль составила 5%, во второй был получен убыток -4%. В общей сложности прибыль = 1%. Если бы стояло ограничение 5%, то не был бы получен убыток во второй половине месяца.
Это не для новичков.
С простой переменной и ограничением по пунктам проще? )
 
Последнее редактирование:

officialboob

Элитный участник
С простой переменной и ограничением по пунктам проще? )


Я только что написал готовый код. Чтобы его вставить в сову надо сделать 3 действия:

1. Скопировать условие if (EquityPercent) пред открытием,
2. Скопировать функцию в подвал,
3. Скопировать расчет LastCalendarMonthProfit и EquityPercent в любое место до запроса условий на открытие ордера (например, в самое начало совы сразу после void OnTick() ).

Проще этого уже ничего не будет.
 
Последнее редактирование:

zQuant

Местный житель
officialboob все правильно написал... Особенно для тестера это самый лучший вариант...
А потом, опять же, как правильно подсказали, если историю в терминале не будешь ограничивать сильно, то и в реале будет работать...
 
Верх