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

 
MrBrooklin #:

Привет, Алексей! Одно уточнение. PositionSelect() нужно вместо цикла использовать или опять чего-то недопонял?

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

Да как угодно можно написать, главное, для получения ошибки, вписать несуществующий символ…

 
Alexey Viktorov #:

Да как угодно можно написать, главное, для получения ошибки, вписать несуществующий символ…

Тока не кидай в меня тапками!!! Не получается получить код ошибки. ((((

void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   string symb = "BrooklinUSDrfd";
   PositionSelect(symb);
   PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = ", symb, GetLastError());
  }

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

 
MrBrooklin #:
Ошибка = "
Там должен спецификатор стоять %lu
 
Artyom Trishkin #:
Там должен спецификатор стоять

Спасибо, Артём! Всё заработало!!! Всем ОГРОМНОЕ спасибо!

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

 

Короче говоря, решил проблему, описанную здесь, другим способом:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   if(!PositionSelect(_Symbol))
      PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = %lu", _Symbol, GetLastError());
   int pos_total = PositionsTotal(); // объявим переменную для хранения количества открытых позиций
   if(pos_total > 0) // если есть открытые позиции
     {
      for(int i=0; i<pos_total; i++) // запустим цикл и переберём все открытые позиции
        {
         if(PositionGetSymbol(i) == _Symbol) // выберем все открытые позиции по текущему символу
           {
            ulong  pos_id = PositionGetInteger(POSITION_IDENTIFIER);
            double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = PositionGetDouble(POSITION_TP);
            double pos_sl = PositionGetDouble(POSITION_SL);
            PrintFormat("Позиция #%d цена = %G тейк-профит = %G стоп-лосс = %G", pos_id, pos_price, pos_tp, pos_sl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

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

 

Всем доброго вечера!

Пытаюсь создать функцию открывающую дополнительную позицию (пока без стопа и тейка) к уже имеющейся открытой позиции. Написал код:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Pos_Buyl()
  {
   for(int i=pos_total-1; i<pos_total; i++) // ищем последнюю по списку открытую позицию
     {
      PositionGetTicket(i); // получим тикет позиции по индексу в списке открытых позиций
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && // если совпадает символ открытой позиции
         PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && // если совпадает тип открытой позиции
         PositionGetInteger(POSITION_MAGIC) == Magic_Number) // и если совпадет мэджик
        {
         double pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN); // объявим и инициализируем переменную для цены открытой позиции
         if(// тут задано условие для открытия позиции)
           {
            double new_price_pos=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            trade.Sell(0.01,_Symbol,new_price_pos,0,0);
           }
        } 
     }
  }

но он почему-то не видит открытую позиции. Пробовал найти проблему отладчиком, но он после запуска цикла сразу вылетает из функции не видя того, что прописано внутри неё. Точку останова ставил на PositionGetTicket(i). Подскажите, пжл, где опять у меня косяк в коде?

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

 
MrBrooklin #:

Всем доброго вечера!

Пытаюсь создать функцию открывающую дополнительную позицию (пока без стопа и тейка) к уже имеющейся открытой позиции. Написал код:

но он почему-то не видит открытую позиции. Пробовал найти проблему отладчиком, но он после запуска цикла сразу вылетает из функции не видя того, что прописано внутри неё. Точку останова ставил на PositionGetTicket(i). Подскажите, пжл, где опять у меня косяк в коде?

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

Чему равен pos_total?

 
Alexey Viktorov #:

Чему равен pos_total?

Привет, Алексей! Переменная pos_total=PositionsTotal(), просто она была задана на глобальном уровне. Сейчас перенёс внутрь функции и оказалось, что проблема была именно в этом. Всё заработало. А чё за фигня? Вообще не понял прикола!!!

Сейчас ради эксперимента ещё раз вынес pos_total на глобальный уровень и снова перестало работать, а когда вставил внутрь функции - работает, как надо! Просто чудеса какие-то, ну, по крайней мере для меня!!! )))

Получается, что переменную на глобальном уровне нельзя инициализировать функцией? Так, что ли?

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

 
MrBrooklin #:

Привет, Алексей! Переменная pos_total=PositionsTotal(), просто она была задана на глобальном уровне. Сейчас перенёс внутрь функции и оказалось, что проблема была именно в этом. Всё заработало. А чё за фигня? Вообще не понял прикола!!!

Сейчас ради эксперимента ещё раз вынес pos_total на глобальный уровень и снова перестало работать, а когда вставил внутрь функции - работает, как надо! Просто чудеса какие-то, ну, по крайней мере для меня!!! )))

Получается, что переменную на глобальном уровне нельзя инициализировать функцией? Так, что ли?

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

Иногда можно, но не каждую. В этом случае, когда ты запускаешь советник, он ещё не видит открытые позиции и переменная равна нулю…

Собственно я вчера экспериментировал с выборкой позиций и пришёл к выводу, что  PositionsTotal() нужна исключительно для определения количества позиций. А это количество нужно только для ограничения цикла.

Вот такой цикл

  int i = 0;
  while(bool(posTicket = PositionGetTicket(i)) && !IsStopped())
   {
    string posSymbol = PositionGetString(POSITION_SYMBOL);
    double posPrice = PositionGetDouble(POSITION_PRICE_OPEN),
           pos_tp = PositionGetDouble(POSITION_TP),
           pos_sl = PositionGetDouble(POSITION_SL);
    printf("%s Ticket %d цена = %g тейк-профит = %g стоп-лосс = %g", posSymbol, posTicket, posPrice, pos_tp, pos_sl);
    i++;
   }


работает даже если перед ним получить список ордеров или сделок из истории. На днях проверю будет-ли мешать выборка отложенных ордеров.


А в твоём случае проще написать без цикла

      PositionGetTicket(PositionsTotal()-1); // получим тикет позиции

если тебе надо последнюю позицию…

 
Alexey Viktorov #:
В этом случае, когда ты запускаешь советник, он ещё не видит открытые позиции и переменная равна нулю…

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

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