Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1568

 
Vitaly Muzichenko #:

Собственно вопрос:

Как сделать выполнение кода для тех символов, у которых открыта сессия, и не использовать с закрытой сессией.

Спасибо!

Если сессии в спецификации не проставлены или проставлены, но не корректно, что бывает частенько.

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

Если ничего не напутал(что вряд ли), то типа так

if(pTime != iTime(NULL, 0, 1))
  {
   for(int i = 0; i < Sym_count; i++)
     {
      if(cTime != iTime(Sym_arr[i], 0, 1))
        {
         if(iTime(Sym_arr[i], PERIOD_M1, 0) >= iTime(Sym_arr[i], PERIOD_M1, iTime(Sym_arr[i], PERIOD_D1, 0), 1))
            continue;
         flag = false;
         break;
        }


ЗЫ. Конечно напута))) Нужно найденное время отправить в структуру  и уже потом сравнивать часы и минуты.


вот так возможно

if(pTime != iTime(NULL, 0, 1))
  {
   for(int i = 0; i < Sym_count; i++)
     {
      if(cTime != iTime(Sym_arr[i], 0, 1))
        {
         MqlDateTime dtLast, dtCurr;
         TimeToStruct(iTime(Sym_arr[i], PERIOD_M1, iTime(Sym_arr[i], PERIOD_D1, 0), 1), dtLast);
         TimeCurrent(dtCurr);
         if(dtCurr.hour + dtCurr.min * 60 >= dtLast.hour + dtLast.min * 60)
            continue;
         flag = false;
         break;
        }
     }
  }
Монструозно получилось и наверняка долго, но на скорую руку ничего лучше на ум не приходит.
 
Aleksandr Slavskii #:

Если сессии в спецификации не проставлены или проставлены, но не корректно, что бывает частенько.

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

Если ничего не напутал(что вряд ли), то типа так


ЗЫ. Конечно напута))) Нужно найденное время отправить в структуру  и уже потом сравнивать часы и минуты.


вот так возможно

Монструозно получилось и наверняка долго, но на скорую руку ничего лучше на ум не приходит.

Спасибо за внимание!

Есть некоторая проблема: что-то лишнее

if(cTime != iTime(Sym_arr[i], 0, 1)) {
        MqlDateTime dtLast, dtCurr;
        TimeToStruct(iTime(Sym_arr[i], PERIOD_M1, iTime(Sym_arr[i], PERIOD_D1, 0), 1), dtLast);
        TimeCurrent(dtCurr);
        if(dtCurr.hour + dtCurr.min * 60 >= dtLast.hour + dtLast.min * 60)
          continue;
 
Vitaly Muzichenko #:

Спасибо за внимание!

Есть некоторая проблема: что-то лишнее

Ну да, всё как всегда. Ничего лишнего, просто всё не правильно.

//+------------------------------------------------------------------+
void OnTick(void)
  {
   MqlDateTime dtLast, dtCurr;
   datetime TimeCurr = TimeCurrent(dtCurr);
   datetime TimeDay = iTime(_Symbol, PERIOD_D1, 0);
   int Shift = iBarShift(_Symbol, PERIOD_M1, TimeDay);
   datetime TimeLast = iTime(_Symbol, PERIOD_M1, Shift);
   TimeToStruct(TimeLast, dtLast);

   if(dtCurr.hour * 60 + dtCurr.min >= dtLast.hour * 60 + dtLast.min)
      Print("TimeCurrent ", TimeCurrent(), "; TimeLast ", TimeLast);
  }
//+------------------------------------------------------------------+
TimeCurrent 2024.10.01 23:49:00; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:02; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:04; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:06; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:08; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:11; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:13; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:15; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:17; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:20; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:22; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:24; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:26; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:28; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:31; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:33; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:35; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:37; TimeLast 2024.09.30 23:49:00
 
   if(PositionGetInteger(POSITION_TYPE_BUY)) //в этих двух условиях мне нужно найти
               iq = iq1;

               else

   if(PositionGetInteger(POSITION_TYPE_SELL))
               iq = iq2;
      if (PositionsTotal()==iq)
      
     {
      int ord_total=OrdersTotal(); //это удаление ордеров
   if(ord_total > 0)
     {
      for(int i=ord_total-1;i>=0;i--)
        {
         ulong ticket=OrderGetTicket(i);
         if(OrderSelect(ticket) && OrderGetString(ORDER_SYMBOL)==Symbol())
           {
            CTrade *trade=new CTrade();
            trade.OrderDelete(ticket);
            delete trade;
           }
        }
     }
   }   

У меня есть несколько позиций одновременно одного типа(либо лонг, либо шорт), их количество равняется либо iq1, либо iq2. Выдает ошибку "'PositionGetInteger' - no one of the overloads can be applied to the function"? В общем, мне нужно правильно определить тип любой позиции на данный момент и вставить это в условие

 
statist247 #:

У меня есть несколько позиций одновременно одного типа(либо лонг, либо шорт), их количество равняется либо iq1, либо iq2. Выдает ошибку "'PositionGetInteger' - no one of the overloads can be applied to the function"? В общем, мне нужно правильно определить тип любой позиции на данный момент и вставить это в условие

А вы словами можете пересказать что происходит при выполнении этого кода?

Умный движок форума высветил PositionGetInteger() в описании которого есть ответ на ваш вопрос.

PositionGetInteger

Функция возвращает запрошенное свойство открытой позиции, предварительно выбранной при помощи функции…………………………………

Перед «тем как» надо этот ордер выбрать, затем определить его тип и только потом………………

 
statist247 #:

У меня есть несколько позиций одновременно одного типа(либо лонг, либо шорт), их количество равняется либо iq1, либо iq2. Выдает ошибку "'PositionGetInteger' - no one of the overloads can be applied to the function"? В общем, мне нужно правильно определить тип любой позиции на данный момент и вставить это в условие

Можете прокомментировать, что в этих строчках записано?

   if(PositionGetInteger(POSITION_TYPE_BUY)) //в этих двух условиях мне нужно найти
               iq = iq1;

               else

   if(PositionGetInteger(POSITION_TYPE_SELL))
               iq = iq2;
 
Как сдвинуть график влево в мобильной версии терминала  ? 
[Удален]  
Нужно удерживать палец на пару секунд на пустом поле. Появится вертикальная линия пунктиром на текущем баре. Двинуть график влево, как нужно. Одиночным нажатием по пустому полю сбросить вертикальную линию. Отступ останется
 
Как лучше всего реализовать функциональность торговли по нескольким символам в советнике? Я рассматривал возможность использования двумерного массива или классов. Использование классов и создание объекта для каждой пары символов кажется лучшим подходом, но в настоящее время я сталкиваюсь с проблемами обработки памяти. Следует ли мне сосредоточиться на решении этих проблем с памятью или использовать другой подход?
 
Aleksandr Slavskii #:
   MqlDateTime dtLast, dtCurr;    datetime TimeCurr = TimeCurrent(dtCurr);    datetime TimeDay = iTime(_Symbol, PERIOD_D1, 0);    int Shift = iBarShift(_Symbol, PERIOD_M1, TimeDay);    datetime TimeLast = iTime(_Symbol, PERIOD_M1, Shift);    TimeToStruct(TimeLast, dtLast);    if(dtCurr.hour * 60 + dtCurr.min >= dtLast.hour * 60 + dtLast.min)       Print("TimeCurrent ", TimeCurrent(), "; TimeLast ", TimeLast);

Только добрался до программы.

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


Попробую заменить на SymbolInfoInteger(Sym_arr[i],SYMBOL_TIME) и буду сравнивать с текущим временем + 5 минут.

Спасибо за уделённое время!