PositionSelect код ошибка 4753 - страница 4

 
Alexey Viktorov:

Ну и ладно. Значит я не зная, случайно получаю.


Ну тогда можно сделать так:

public: // Функции которые вызываются сразу после того, как был выставлен ордер или открыта позиция
  // Тикет позиции
  ulong getPosition(){
    return request.position;
  }
  
  ...

В Кодобазу добавлять исходник смысла не вижу, так как по функционалу он похож на CTrade из стандартной библиотеки. Можно писать свои классы на основе него и таким образом работать с торговыми функциями.

P.S. Никогда бы не подумал, что OrderSend тикет позиции возвращает в запрос.
Файлы:
 
Alexey Viktorov:

Ну и ладно. Значит я не зная, случайно получаю.

Посмотрел СБ, нет там изменений Request.position. Загадку не разгадал. Штатный OrderSend Request не меняет, т.к. компилируется

void OnStart()
{
  const MqlTradeRequest Request = {0};
  MqlTradeResult Result;
  
  OrderSend(Request, Result); // OK
}
 
Mihail Matkovskij:

P.S. Никогда бы не подумал, что OrderSend тикет позиции возвращает в запрос.

Это не так.

 
fxsaber:

Это не так.

Если верить исходному коду CTrade и примеру Алексея, то так оно и есть.

//+------------------------------------------------------------------+
//| Open position                                                    |
//+------------------------------------------------------------------+
bool CTrade::PositionOpen(const string symbol,const ENUM_ORDER_TYPE order_type,const double volume,
                          const double price,const double sl,const double tp,const string comment)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- check
   if(order_type!=ORDER_TYPE_BUY && order_type!=ORDER_TYPE_SELL)
     {
      m_result.retcode=TRADE_RETCODE_INVALID;
      m_result.comment="Invalid order type";
      return(false);
     }
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.symbol   =symbol;
   m_request.magic    =m_magic;
   m_request.volume   =volume;
   m_request.type     =order_type;
   m_request.price    =price;
   m_request.sl       =sl;
   m_request.tp       =tp;
   m_request.deviation=m_deviation;
//--- check order type
   if(!OrderTypeCheck(symbol))
      return(false);
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
   m_request.comment=comment;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

Осталось проверить...

 
Mihail Matkovskij:

Если верить исходному коду CTrade и примеру Алексея, то так оно и есть.

Осталось проверить...

Даже там указано

bool CTrade::OrderSend(const MqlTradeRequest &request,MqlTradeResult &result)
 
fxsaber:

Даже там указано

Как это не странно, но функция OrderSend возвращает позицию в запрос. Только что изменил код в своем торговом эксперте. Но, тем не менее, ошибка 4753 никуда не делась. Только теперь тикет позиции стал отображаться, при отладке, как #404, а на графике та же позиция показывается как #409. Таким образом, советник по прежнему теряет позиции, несмотря на то, что я получаю их из  request.position.

 
Mihail Matkovskij:

Как это не странно, но функция OrderSend возвращает позицию в запрос.

Проверочный код показал, что не меняет

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static int Count = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
      
  const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0);
  
  if (PositionsTotal() && ((PositionGetTicket(0) != Ticket) ||
                           MT4ORDERS::LastTradeRequest.position || // Убедились, что Request.position не меняется - нулевой.
                           (PositionGetTicket(0) != MT4ORDERS::LastTradeResult.order))) // На хедже это условие должно срабатывать всегда.
    DebugBreak();
  
  if (Count++ > 1000)
    ExpertRemove();
}


Ни разу не остановился дебаг. Заодно показано, что Result.order равен тикету открываемой позиции на хедже.

 
fxsaber:

Проверочный код показал, что не меняет


Ни разу не остановился дебаг. Заодно показано, что Result.order равен тикету открываемой позиции на хедже.

Ну, во первых, подобное случается только иногда. Во вторых, я применяю свой исходник, где использованы API MQL5, а не библиотека МТ4. В MQL4 таких багов нет, конечно же. Там только тикеты ордеров, а не тикеты ордеров, позиций и сделок.

Но как решить проблему с потерей позиции в MQL5? Вопрос остаётся открытым.

 
Mihail Matkovskij:

Ну, во первых, подобное случается только иногда. Во вторых, я применяю свой исходник, где использованы API MQL5, а не библиотека МТ4. В MQL4 таких багов нет, конечно же. Там только тикеты ордеров, а не тикеты ордеров, позиций и сделок.

Но как решить проблему с потерей позиции в MQL5? Вопрос остаётся открытым.

Вы как будто специально не видите. Это MQL5:

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0);
}
 
Mihail Matkovskij:

Я понял. Но API MQL5 оптимизированы по времени выполнения. Что очень хорошо для оптимизации торговых роботов. А здесь идет использование переделанных функций на подобии  MQL4. Ни разу не использовал данную библиотеку.

Зачем тогда фантазируете?

Сравнение скорости где-то в обсуждении было, потерь там нет (а иногда и ускорение можно получить).

Причина обращения: