Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2650

 
Подскажите, пожалуйста, правильно ли я собрал конструкцию для следущей логики:

Если хотя бы одна позиция сегодня была открыта, то....

    //--- Дата начала текущего дня
    datetime d = iTime(_Symbol, PERIOD_D1, 0); 

    //--- запрашиваем всю историю
    if (!HistorySelect(d, TimeCurrent()))
      {
        Print("HistorySelect() failed. Error ", GetLastError());
        return;
      }     
    
    //--- Переменная для хранения количества закрытых позиций(?)
    int deal_total = 0;    
    
    //--- общее количество в списке сделок
    int deals=HistoryDealsTotal();
    //--- теперь обработаем каждую сделку
    ulong deal_ticket;            // тикет сделки
    ulong order_ticket;           // тикет ордера,по которому была совершена сделка
    datetime transaction_time;    // время совершения сделки 
    long deal_type ;              // тип торговой операции
    long position_ID;             // идентификатор позиции
    string deal_description;      // описание операции
    double volume;                // объем операции
    string symbol;                // по какому символу была сделка
    
    datetime date_min = TimeCurrent();
    for(int i=0;i<deals;i++)
      {
        deal_ticket=               HistoryDealGetTicket(i);
        volume=                    HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
        transaction_time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
        order_ticket=              HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
        deal_type=                 HistoryDealGetInteger(deal_ticket,DEAL_TYPE);
        symbol=                    HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
        position_ID=               HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
        
        /*
        Print("");
        Print(deal_ticket);
        Print(volume);
        Print(transaction_time);
        Print(order_ticket);
        Print(deal_type);
        Print(position_ID);
        Print(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY));
        */
        
        //--- Ищем самую раннюю, но в текущий день        
        if ((transaction_time > d) && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
          {
            if (date_min < transaction_time) first_pos_time = transaction_time;  
          }
        //--- Если нет, то флаг свободный
        else first_pos_time = 0;
     }

Сделка и позиция - это одно и тоже? (по времени)
 
Ivan Butko #:
Подскажите, пожалуйста, правильно ли я собрал конструкцию для следущей логики:

Если хотя бы одна позиция сегодня была открыта, то....


Сделка и позиция - это одно и тоже? (по времени)
Позы при закрытии перекрывают встречной.в итоге путаница,так как он их тоже считает.Проверу нужно ставить,что поза является выходом из рынка и её Профит !0 поищи в документации
 
Ivan Butko #:
Подскажите, пожалуйста, правильно ли я собрал конструкцию для следущей логики:

Если хотя бы одна позиция сегодня была открыта, то....


Сделка и позиция - это одно и тоже? (по времени)

типа этого можно обыгрывать это с МТ4 подход, true false флагами и DEAL использовать, там может уже будет IN OUT если надо будет....

Только "Полезные функции от KimIV". - Функция GetTypeLastOpenPos. Эта функция возвращает тип последней открытой позиции или -1. Более точный отбор учитываемых позиций задается внешними
Только "Полезные функции от KimIV". - Функция GetTypeLastOpenPos. Эта функция возвращает тип последней открытой позиции или -1. Более точный отбор учитываемых позиций задается внешними
  • 2011.02.18
  • www.mql5.com
Более точный отбор учитываемых позиций задается внешними параметрами sy - Наименование рыночного инструмента. Значение по умолчанию -1 означает любой идентификатор. Эта функция возвращает флаг убыточности последней закрытой позиции. Значение по умолчанию - означает любой рыночный инструмент
 
Arch #:
Позы при закрытии перекрывают встречной.в итоге путаница,так как он их тоже считает.Проверу нужно ставить,что поза является выходом из рынка и её Профит !0 поищи в документации
Roman Shiredchenko #:

типа этого можно обыгрывать это с МТ4 подход, true false флагами и DEAL использовать, там может уже будет IN OUT если надо будет....

Благодарю вас За ответы

 
Ivan Butko #:
Подскажите, пожалуйста, правильно ли я собрал конструкцию для следущей логики:

Если хотя бы одна позиция сегодня была открыта, то....


Сделка и позиция - это одно и тоже? (по времени)

Вернёт true если сегодня была хоть одна сделка. 

bool Deal()
  {
   if(HistorySelect(iTime(_Symbol, PERIOD_D1, 0), TimeCurrent()))
      return(HistoryDealsTotal() > 0);
   return false;
  }

Позиция это две сделки.


ЗЫ. Упс, неувязочка. Вернёт любую сегодняшнюю сделку.

ЗЫЫ.

bool Deal()
  {
   if(HistorySelect(iTime(_Symbol, PERIOD_D1, 0), TimeCurrent()))
      for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
        {
         ulong ticket = HistoryDealGetTicket(i);
         if(ticket > 0)
            if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_IN)
               return true;
        }
   return false;
  }
 
Ivan Butko #:
Подскажите, пожалуйста, правильно ли я собрал конструкцию для следущей логики:

Если хотя бы одна позиция сегодня была открыта, то....


Сделка и позиция - это одно и тоже? (по времени)

Можно реализовать требуемую логику примерно так:

//+------------------------------------------------------------------+
//| Проверка наличия открытой сегодня позиции                        |
//+------------------------------------------------------------------+
bool HasTodayPosition() {
   datetime dayTime = TimeCurrent() / (24 * 3600) * (24 * 3600); // Время начала дня
   datetime openTime = 0;                          // Время открытия позиции
   ulong ticket;                                   // Тикет позиции
   int positionsTotal = PositionsTotal();          // Всего открыто позиций

   for(int i = positionsTotal - 1; i >= 0 ; i--) { // Для всех индексов открытых позиций в порядке от последней
      ticket = PositionGetTicket(i);               // Выбираем позицию по индексу
      if(ticket > 0                                // Если позиция выбрана успешно
            && PositionGetInteger(POSITION_TIME, openTime)) { // и время открытия получено, то
            
         //PrintFormat(__FUNCTION__" | Position[%d] with #%I64u opened today at %s",
         //            i, ticket, TimeToString(openTime, TIME_DATE | TIME_MINUTES | TIME_SECONDS));
                     
         if(openTime >= dayTime) {                 // Если оно больше времени начала дня,
            return true;                           // то есть открытая сегодня позиция
         } else {
            break;                                 // иначе их уже быть не может
         }
      }
   }

   return false;  // не нашли сегодняшних позиций
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick() {
   if(HasTodayPosition()) {
      // Есть открытая сегодня позиция
      PrintFormat(__FUNCTION__" | There is today's position", 0);
   }
}

Сделка и позиция - разные вещи. Подробности в документации.

P.S. Прошу прощения, не точно понял задачу. Этот код проверяет, что хотя бы одна позиция сегодня была открыта И ещё остаётся открытой. Иначе смотрите пост выше от Aleksandr Slavskii

Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и...
 
Aleksandr Slavskii #:

Вернёт true если сегодня была хоть одна сделка. 

Позиция это две сделки.


ЗЫ. Упс, неувязочка. Вернёт любую сегодняшнюю сделку.

ЗЫЫ.

Yuriy Bykov #:

Можно реализовать требуемую логику примерно так:

Сделка и позиция - разные вещи. Подробности в документации.

P.S. Прошу прощения, не точно понял задачу. Этот код проверяет, что хотя бы одна позиция сегодня была открыта И ещё остаётся открытой. Иначе смотрите пост выше от Aleksandr Slavskii

Благодарю Вас за реализацию

 

Приветствую. Подскажите, пожалста: если из робота добавить на график используя ChartIndicatorAdd стоковую iMA, то можно ли изменить ее цвет? И если да, то как? 

В роботе используется несколько МА, хотелось-бы одну выделить.

 

Добрый день! 

Подскажите, пожалуйста, смотрю свойства ордера, а вывод идёт не названиями, а числами. Как понять в таблице  ENUM_ORDER_STATE  какой номер какому состоянию соответствует? Ставлю ордер - состояние 1, удаляю - 9. Не подходит по таблице. 

void  OnTrade ()  { Print ( " ORDER_STATE " + OrderGetInteger( ORDER_STATE ) ) ; 
                  }

Или может так и идут по порядку с 0 по 9 как в таблице?

 
Александр #:

Добрый день! 

Подскажите, пожалуйста, смотрю свойства ордера, а вывод идёт не названиями, а числами. Как понять в таблице  ENUM_ORDER_STATE  какой номер какому состоянию соответствует? Ставлю ордер - состояние 1, удаляю - 9. Не подходит по таблице. 

Или может так и идут по порядку с 0 по 9 как в таблице?

см. EnumToString в документации