Как сказать советнику чтобы за день он торговал только 1 раз

 

Здравствуйте уважаемые трейдеры программисты! Я в mql программировании новичок и по этому у меня возникают вопросы на очень обычные для профи вещи.


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

 

для мт4

if (day!=TimeDay(TimeCurrent()))
      {
      day=TimeDay(TimeCurrent());
      
      // открываем сделку
      
      }

для мт5

MqlDateTime currTime=TimeToStruct(TimeCurrent());
   if (day!=currTime.day)
      {
      day=currTime.day);
      
      // открываем сделку
      
      }
 
Taras Slobodyanik:

для мт4

для мт5

ИМХО. Такой способ годится, если советник работает по ценам открытия Д1. А у топикстартёра сделка открывается не на открытии дня, а где то внутри дня.

Подойдёт функция KimIV:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(true);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(true);
            }
          }
        }
      }
    }
  }
  return(false);
}

Условие для открытия сделки:

if(!isTradeToDay("0", -1, Magic)) 

 
khorosh:

ИМХО. Такой способ годится, если советник работает по ценам открытия Д1. А у топикстартёра сделка открывается не на открытии дня, а где то внутри дня.

Подойдёт функция KimIV:

Условие для открытия сделки:

if(!isTradeToDay("0", -1, Magic)) 

Благодарен за помощ. Работает!
 
fx_aist:
Благодарен за помощ. Работает!

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

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


Вы имеете ввиду при открытии сделки устанавливать в 1 глобальную переменную терминала, а на открытии дня сбрасывать её?

Можно и так.

 
Aleksei Radchenko:

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

if (day!=TimeDay(TimeCurrent()))
      {
      
      // проверяем условие открытия
          {
          //если условие подходит, открываем сделку — и изменяем флаг day
          day=TimeDay(TimeCurrent());
          }

      }
обновил.
 
Taras Slobodyanik:


Извиняюсь, сразу не понял. Можно использовать. Только вам надо было более четко показать, что строка  day=TimeDay(TimeCurrent()); должна выполняться только при открытии сделки, т.е. внутри фигурных скобок условия открытия.
 
Taras Slobodyanik:

для мт4

для мт5

а как сделать так чтоб  1 раз в сутки советник брал 1 раз в 00:00 показание индикатора с пред идущего дня к примеру PivotPoint максимум и минимум ну и на их данных, советник работал весь день не меняя показания индикатора,а на следующий день снова обновлял показания индикатора и так же сам советник продолжал работать ?

 
Alex Pirate:

а как сделать так чтоб  1 раз в сутки оно брало 1 раз показание индикатора с пред идущего дня к примеру пивотпоинт максимум и минимум ну и на их данных советник работал весь день не меняя показания а на следуйщий день снова обновлял показания индикатора и так же? 

Брать данные с дневного ТФ. Хотя тогда непонятно, почему в течение дня эти показания меняются. Не должны.

 
Ihor Herasko:

Брать данные с дневного ТФ. Хотя тогда непонятно, почему в течение дня эти показания меняются. Не должны.   к сожалению меняются...( и он пересчитывает всё по новой... пробовал писал функцию с количеством свечей и потом типа такой -   double MinPrice  = iLow (Symbol(),PERIOD_D1,1);  double MaxPrice  = iHigh(Symbol(),PERIOD_D1,1); по идее он как то должен определить день и на 1 свечке нового дня выдать результат...но! он на второй свечке меняется и тянет за собой этот дневной показатель( ... надо как то установить так чтоб определение вершин и низов происходило в 00:01 и выдавало результат который не изменялся до следующего дня...тогда было бы прекрасно

Причина обращения: