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

 
MrBrooklin #:

Спасибо за отклик! Предполагал, что будет выведен, хотя бы, такой код ошибки:

ERR_TRADE_POSITION_NOT_FOUND

4753

Позиция не найдена


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

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

Позиции все найдены! Но ни у одной из найденных позиций нет нужного нам символа.

 
JRandomTrader #:

Позиции все найдены! Но ни у одной из найденных позиций нет нужного нам символа.

Теперь понял. Спасибо!!! Получается, что если есть, хотя бы одна открытая позиция, то код ошибки 4753 никогда не появится.

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

 
MrBrooklin #:

Теперь понял. Спасибо!!! Получается, что если есть, хотя бы одна открытая позиция, то код ошибки 4753 никогда не появится.

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

Появится если написать такое

PositionSelect("мой символ");
 
Alexey Viktorov #:

Появится если написать такое

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

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

 
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). Подскажите, пжл, где опять у меня косяк в коде?

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