Обсуждение реализации советников. - страница 8

 
altec3:

Добрый день!

Пробую написать функцию, определяющую прибыль за текущие сутки:

Подскажите, пожалуйста, как в функции 

указать период, начинающийся с текущих суток. Понятно, что окончание периода to_date=TimeCurrent(), как корректно указать начало периода from_date, чтобы он начинался именно с 00ч:00м:00с текущих суток?

Выбирайте на вкус:

datetime  iTime(
   const string        symbol,          // символ
   ENUM_TIMEFRAMES     timeframe,       // период PERIOD_D1
   int                 shift            // сдвиг
   );
int  CopyTime(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период PERIOD_D1
   int              start_pos,       // откуда начнем 0
   int              count,           // сколько копируем 1
   datetime         time_array[]     // массив для копирования времени открытия. Объявить заранее

Или самый, самый. Который уже предложили.

 
Vladimir Karputov:

Если предположить, что сегодня был хоть один тик, то алгоритм такой: текущее время отправляем в структуру MqlDateTime. Затем в этой структуре обнуляем часы, минуты и секунду. Остаётся отредактированную структуру преобразовать во время:


Результат:

Спасибо! Еще вопрос, если я добавляю функцию:

//+------------------------------------------------------------------+
//|Функция возвращает прибыль за текущие сутки                       |
//+------------------------------------------------------------------+
double Day_Profit()
  {
//--Запрашиваем историю сделок за последнии сутки
   HistorySelect(TimeCurrent()-PeriodSeconds(PERIOD_D1),TimeCurrent());
   uint     total       =HistoryDealsTotal();   // количество сделок в истории
   ulong    ticket      =0;                     // тикет сделки в истории
   long     type        =0;                     // тип сделки
   double   profit      =0.0;                   // финансовый результат сделки
   double   commission  =0.0;                   // коммиссия по сделке
   double   DayProfit   =0.0;                   // прибыль за текущие сутки
//--- for all deals
   for(uint i=0; i<total; i++)
     {
      if((ticket=HistoryDealGetTicket(i))>0)       //--- если имеются сделки, то...
        {
         profit      =HistoryDealGetDouble(ticket,DEAL_PROFIT);
         commission  =HistoryDealGetDouble(ticket,DEAL_COMMISSION);
         if(HistoryDealGetInteger(ticket,DEAL_TYPE)!=DEAL_TYPE_BALANCE)
           {
            DayProfit+=(profit+commission);
           }
        }
     }
   return (DayProfit);
  }
//+------------------------------------------------------------------+

в советник, то каким образом будет происходить обновление периода, за который анализируются сделки? Допустим, если советник работает пару суток, то с наступлением очередных суток период обновиться?

Реализация вышеуказанной функции в советнике:

void OnTick()
  {
   if(Day_Profit()<ProfitMax)
     {
      ExtExpert.OnTick();
     }
   return;
  }
 
altec3:

Спасибо! Еще вопрос, если я добавляю функцию:

в советник, то каким образом будет происходить обновление периода, за который анализируются сделки? Допустим, если советник работает пару суток, то с наступлением очередных суток период обновиться?

Реализация вышеуказанной функции в советнике:

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

Как определить начало суток - Вы уже знаете.

 

Добрый день!

Появилась необходимость в определении спреда по инструменту перед установкой на нем ордера. Среди стандартных библиотек MQL5 имеется класс CSymbolInfo. Тут-то я и задумался, каким образом лучше реализовать данную проверку - через CSymbolInfo или использовать функцию? Специалисты, подскажите, как лучше поступить! Если данный вопрос уже поднимался, то буду очень благодарен если отправите меня в нужном направлении.

 

Добрый день!

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

Например, есть простой советник, который включает в себя два модуля сигнала на основе стохастика (когда главная линия выше сигнальной на 0 и 1 барах - BUY, ниже сигнальной на 0 и 1 барах - SELL) - один на H1, другой на M15. Веса обоих модулей одинаковы, и в советнике пороговое значение на открытие сделки установлено таким образом, что должны учитываться сигналы обоих модулей одновременно. Советник работает на графике с таймфреймом H1. Если посмотреть на скриншот с H1, то все понятно - на последнем и предпоследнем барах главная линия выше сигнальной, поэтому и покупаем. Но на графике M15 я не могу понять, какой бар считать 0, какой 1? Сделка открыта - значит и на М15 условие для сделки должно быть выполнено.

Файлы:
H1.png  43 kb
M15.png  21 kb
 
altec3:

Например, есть простой советник, который включает в себя два модуля сигнала на основе стохастика (когда главная линия выше сигнальной на 0 и 1 барах - BUY, ниже сигнальной на 0 и 1 барах - SELL) - один на H1, другой на M15. 

Нулевой бар - это ЗЛО! Индикатор на истории вы видите рассчитанный как бы на 1 баре - закрытом (ну упрощённо, ежели не принимать во внимание возможность перерисовки). Соответственно и стратегии строите по закрытому бару и в тестере индикатор со старшего ТФ в МТ4 Вам наперед покажет результат даже нулевого бара, как закрытого - т.е. из будущего.
А в итоге разочарование: на графике одно, в тестере другое, а в реалтайме все наоборот.
Поверьте мне на слово, из-за этого потерял полжизни, пока разобрался́, где системная ошибка. Для корректного отображения работы индикаторов старших ТФ на младшем нужен специальный подход, вот с обычно Машкой, например, все просто - умножили период на отношение ТФ и порядок, а вот ежели какие нелинейные вычисления, то тут только имитация расчета на 0 баре.
Я RSI целый год ломал, чтобы он на графике отображал правильно старший ТФ.
Не настаиваю, рекомендую, как минимум использовать сигналы с закрытых баров, особенно со старших по отношению к текущему ТФ, а ещё проверяйте на перерисовку особенно пользовательские индикаторы.
 
altec3:

Добрый день!

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

Например, есть простой советник, который включает в себя два модуля сигнала на основе стохастика (когда главная линия выше сигнальной на 0 и 1 барах - BUY, ниже сигнальной на 0 и 1 барах - SELL) - один на H1, другой на M15. Веса обоих модулей одинаковы, и в советнике пороговое значение на открытие сделки установлено таким образом, что должны учитываться сигналы обоих модулей одновременно. Советник работает на графике с таймфреймом H1. Если посмотреть на скриншот с H1, то все понятно - на последнем и предпоследнем барах главная линия выше сигнальной, поэтому и покупаем. Но на графике M15 я не могу понять, какой бар считать 0, какой 1? Сделка открыта - значит и на М15 условие для сделки должно быть выполнено.

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

Попробуйте добавить ещё один бар только для открытия 0 && 1 && 2. может быть сливы сократятся.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...