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

 
Alexey Viktorov #:

В своё время я тоже сходил с ума… Правда это было на МТ4. После прогона тестера смотрю открытые ордера, показания индикаторов и удивляюсь… «Как здесь мог открыться ордер?» Сидеть таращиться в монитор утомительно. Вот и начал делать снимки в момент открытия ордера, чтобы увидеть показания индикаторов… Но теперь язык стал гораздо удобней. А с появлением отладчика вообще все проблемы исчезли.

Я смог придумать один вариант - человек делает нейронку с распознаванием картинок, тогда да - нужны скрины в процессе, без истории с правой части и с масштабированием на момент скриншота.

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

 

После выхода метатестера около 5120 GUI ограничивает максимальное количество созданных агентов половиной потоков процессора, как на приложенной картинке.

Почему так? Я даже не подключаюсь к облаку?

Файлы:
 

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

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

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

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

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//+------------------------------------------------------------------+
#property script_show_inputs
input int Quantity = 3; // Количество последних ордеров
void OnStart()
  {
   if(HistorySelect(0, TimeCurrent()))
     {
      Print("Выбор истории = ", HistorySelect(0, TimeCurrent()));
      int total_deals = HistoryDealsTotal(); // получим количество сделок в списке
      Print("Количество сделок по текущему счёту = ", total_deals); // и выводим значение в журнал
      int total_orders = HistoryOrdersTotal(); // получим количество ордеров в списке
      Print("Количество исторических ордеров = ", total_orders); // и выводим значение в журнал
      for(int i = total_orders - Quantity; i < total_orders; i++) // пройдем в цикле по нужному количеству ордеров
        {
         ulong ticket; // объявим переменную для тикета
         if((ticket = HistoryOrderGetTicket(i)) > 0) // если получили тикет ордера по его номеру в списке
           {
            //--- тогда получим нужные свойства ордера
            double open_price     = HistoryOrderGetDouble(ticket, ORDER_PRICE_OPEN);
            datetime time_setup   = (datetime)HistoryOrderGetInteger(ticket, ORDER_TIME_SETUP);
            datetime time_done    = (datetime)HistoryOrderGetInteger(ticket, ORDER_TIME_DONE);
            string symbol         = HistoryOrderGetString(ticket, ORDER_SYMBOL);
            long order_magic      = HistoryOrderGetInteger(ticket, ORDER_MAGIC);
            long positionID       = HistoryOrderGetInteger(ticket, ORDER_POSITION_ID);
            double initial_volume = HistoryOrderGetDouble(ticket, ORDER_VOLUME_INITIAL);
            string type           = GetOrderType((int)HistoryOrderGetInteger(ticket, ORDER_TYPE));
            //--- и выведм информацию о свойствах ордера
            printf("#ticket %d %s %G %s at %G was set up at %s => done at %s, pos ID=%d",
                   ticket,                   // тикет ордера
                   type,                     // тип
                   initial_volume,           // выставленный объем
                   symbol,                   // символ, по которому выставили
                   open_price,               // указанная цена открытия
                   TimeToString(time_setup), // время установки ордера
                   TimeToString(time_done),  // время исполнения илм удаления
                   positionID                // ID позиции, в которую влилась сделка по ордеру
                  );
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|Функция возвращает строковое наименование типа ордера             |
//+------------------------------------------------------------------+
string GetOrderType(int type)
  {
   string str_type = "неизвестная операция";
   switch(type)
     {
      case(ORDER_TYPE_BUY): return("buy");
      case(ORDER_TYPE_SELL): return("sell");
      case(ORDER_TYPE_BUY_LIMIT): return("buy limit");
      case(ORDER_TYPE_SELL_LIMIT): return("sell limit");
      case(ORDER_TYPE_BUY_STOP): return("buy stop");
      case(ORDER_TYPE_SELL_STOP): return("sell stop");
      case(ORDER_TYPE_BUY_STOP_LIMIT): return("buy stop limit");
      case(ORDER_TYPE_SELL_STOP_LIMIT): return("sell stop limit");
     }
   return(str_type);
  }  
//+------------------------------------------------------------------+
 
Добрый вечер. Тестер стратегий МТ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.