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

 
Добрый вечер. Тестер стратегий МТ5. Режим оптимизация. Вкладка Параметры. Как сделать так, чтобы при установке галочки на строку параметра, который должен быть оптимизирован, шрифт этой строки переключался с обычного шрифта на жирный шрифт? 
 
_amba Режим оптимизации. Вкладка "Параметры". Как сделать так, чтобы когда я отмечаю галочкой строку с параметрами, которые нужно оптимизировать, шрифт этой строки переключался с обычного шрифта на жирный?

Это уже происходит! По крайней мере, на моем терминале (сборка 5260, на Windows 10).


 
MrBrooklin #:

Всем доброго вечера и хорошего настроения!

Пытаюсь разобраться с одним вопросом. Допустим есть две сетки ордеров, установленных в обоих направлениях от текущей цены. При движении текущей цены вверх могут активироваться (это идеальный вариант) все отложенные ордера. А могут и не активироваться, но это пока не столь важно. Если активировались все отложенные ордера вверх, то как определить цены первой и последней позиции верхней сетки (на картинке пометил красными стрелками). Это самый важный момент в моём вопросе!!! При движении цены вниз - всё тоже самое.

Подготовил небольшой скрипт, чтобы для начала хотя бы от чего-то оттолкнуться. Да, и ещё один не мало важный момент - количество открытых позиций вверх и вниз может меняться в ходе торгов. Какие будут мысли по этому вопросу? 

С уважением, Владимир.

Если счёт хэдж, то у вас будут открыты позиции для каждой сделки.

Если неттинг, то у вас одна позиция у которой есть время открытия. Запрашиваете историю сделок с времени открытия позиции. Находите первую и последнюю сделку.

Если ордера лимитные, то можно проверять ордера, а если стоп ордера, то лучше проверять цену сделок, так как сделка по стоп ордеру может открыться с проскальзыванием.

Не проверял, но вот как то так вроде.

//+------------------------------------------------------------------+
void OnStart(void)// находит первую и последнюю сделку в позиции на неттинге
  {
   double Price1 = 0, Price2 = 0;
   if(PositionSelect(_Symbol))
     {
      DealsPrice(PositionGetInteger(POSITION_TIME), TimeCurrent(), PositionGetInteger(POSITION_TYPE), Price1, Price2);
      Print("Price1 ", Price1, "; Price2 ", Price1);
     }
  }
//+------------------------------------------------------------------+
void DealsPrice(datetime from_date, datetime to_date, long type, double & Price1, double & Price2)
  {
   if(HistorySelect(from_date, to_date))
      for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
        {
         ulong ticket = HistoryDealGetTicket(i);
         if(ticket > 0)
            if(HistoryDealGetString(ticket, DEAL_SYMBOL) == _Symbol)
               if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_IN)
                  if(HistoryDealGetInteger(ticket, DEAL_TYPE) == type)
                    {
                     Price2 = HistoryDealGetDouble(ticket, DEAL_PRICE);
                     if(Price1 == 0)
                        Price1 = Price2;
                    }
        }
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Если счёт хэдж, то у вас будут открыты позиции для каждой сделки.

Если неттинг, то у вас одна позиция у которой есть время открытия. Запрашиваете историю сделок с времени открытия позиции. Находите первую и последнюю сделку.

Если ордера лимитные, то можно проверять ордера, а если стоп ордера, то лучше проверять цену сделок, так как сделка по стоп ордеру может открыться с проскальзыванием.

Не проверял, но вот как то так вроде.

Спасибо, Александр, за отклик и предоставленный код! Счёт - хедж. Сложность для меня, как раз и состоит в том, что из кучи открытых позиций (допустим пять вверх и пять вниз от текущей цены) нужно будет найти две крайние позиции, как на сетке расположенной вверх от текущей цены, так и на сетке вниз.

За код ещё раз СПАСИБО!

С уважением, Владимир.

 
MrBrooklin #:

Спасибо, Александр, за отклик и предоставленный код! Счёт - хедж. Сложность для меня, как раз и состоит в том, что из кучи открытых позиций (допустим пять вверх и пять вниз от текущей цены) нужно будет найти две крайние позиции, как на сетке расположенной вверх от текущей цены, так и на сетке вниз.

За код ещё раз СПАСИБО!

С уважением, Владимир.

Может так.

//+------------------------------------------------------------------+
void OnStart(void)
  {
   double Up = -DBL_MAX, Dn = DBL_MAX;

   PositionUpDn(0, Up, Dn);
   Print("Type Buy; Up ", Up);
   Print("Type Buy; Dn ", Dn);

   Up = -DBL_MAX; Dn = DBL_MAX;
   PositionUpDn(1, Up, Dn);
   Print("Type Sell; Up ", Up);
   Print("Type Sell; Dn ", Dn);
  }
//+------------------------------------------------------------------+
void PositionUpDn(long type, double& Up, double& Dn)
  {
   for(int i = PositionsTotal() - 1; i >= 0; i--)
      if(PositionGetTicket(i))
         if(PositionGetString(POSITION_SYMBOL) == _Symbol)
            if(PositionGetInteger(POSITION_TYPE) == type)
              {
               double priceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
               if(Up < priceOpen)
                  Up = priceOpen;
               if(Dn > priceOpen)
                  Dn = priceOpen;
              }
  }
//+------------------------------------------------------------------+
 
MrBrooklin #:

Всем доброго вечера и хорошего настроения!

Пытаюсь разобраться с одним вопросом. Допустим есть две сетки ордеров, установленных в обоих направлениях от текущей цены. При движении текущей цены вверх могут активироваться (это идеальный вариант) все отложенные ордера. А могут и не активироваться, но это пока не столь важно. Если активировались все отложенные ордера вверх, то как определить цены первой и последней позиции верхней сетки (на картинке пометил красными стрелками). Это самый важный момент в моём вопросе!!! При движении цены вниз - всё тоже самое.

Подготовил небольшой скрипт, чтобы для начала хотя бы от чего-то оттолкнуться. Да, и ещё один не мало важный момент - количество открытых позиций вверх и вниз может меняться в ходе торгов. Какие будут мысли по этому вопросу? 

С уважением, Владимир.

Владимир, на случай перезапуска советника в OnInit() перебираем все открытые позиции… 

А дальше работает функция OnTradeTransaction в которой сравнивается цена и если это следующая позиция, то переменная принимает это значение.

Проверку символа и магика вставишь сам.

double priceMax=0.0,
       priceMin=DBL_MAX;
/*******************Expert initialization function*******************/
int OnInit()
 {
  int posTotal = PositionsTotal();
  for(int i=posTotal; i-- > 0;)
   {
    ulong posTicket = PositionGetTicket(i);
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
      priceMax=fmax(priceMax,PositionGetDouble(POSITION_PRICE_OPEN));
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
      priceMin=fmin(priceMin,PositionGetDouble(POSITION_PRICE_OPEN));
   }
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
 }/******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    HistoryDealSelect(trans.deal);
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)
     {
      if(trans.deal_type == DEAL_TYPE_BUY)
        priceMax = fmax(priceMax, trans.price);
      if(trans.deal_type == DEAL_TYPE_SELL)
        priceMin = fmax(priceMin, trans.price);
     }
   }
 }/******************************************************************/
 
Fernando Carreiro #:

Это уже происходит! По крайней мере, на моем терминале (сборка 5260, на Windows 10).


В том то и дело, что я написал простенький советник, и у меня шрифт под галочкой не становится жирным. Но есть чужой советник (скачал на пробу демоверсию) и там как раз я и увидел как шрифт становится жирным. У меня тоже сборка 5260, на Windows 10.
 
Aleksandr Slavskii #:

Может так.

Сегодня на работе и пока не получается заняться кодом. Спасибо, Вам Александр. Завтра обязательно попробую.

С уважением, Владимир.

 
Alexey Viktorov #:

Владимир, на случай перезапуска советника в OnInit() перебираем все открытые позиции… 

А дальше работает функция OnTradeTransaction в которой сравнивается цена и если это следующая позиция, то переменная принимает это значение.

Проверку символа и магика вставишь сам.

Привет, Алексей! Спасибо тебе за содействие! На счёт MathMax и MathMin тоже думал, но ещё не было времени реализовать. Завтра после работы обязательно займусь кодом. )

С уважением, Владимир.

 
_amba #:
В том то и дело, что я написал простенький советник, и у меня шрифт под галочкой не становится жирным. Но есть чужой советник (скачал на пробу демоверсию) и там как раз я и увидел как шрифт становится жирным. У меня тоже сборка 5260, на Windows 10.
Нашел, почему параметры, которые надо оптимизировать, под галочкой не переключаются на жирный шрифт.  У меня используется переменная input group. Если её убрать, то переключение на жирный шрифт работает нормально.