Проблема с торговым запросом - страница 2

 
Vladimir Karputov:

Я Вам показал путь для начинающих - через торговые классы. Не хотите - ну что ж, я умываю руки.

Я уже давно прошел период начинающего, именно для них нужны CTradы, чтобы понять как все функционирует, но когда вы нормально поваритесь в MQL5, вы начинаете понимать, что время затрачиваемое на выполнение внешних библиотек и уж тем более нагрузка на систему, делает эти библиотеки инструментом чайников, если вы к 20 экспертам подключите внешние библиотеки, то у вас проц вспотеет, не говоря уже о том, что CTrade, также не указывает тикеты, как по вашему сервер закрывает неидентифицированную позицию, на угад что ли, авось прокатит? CTtade то формирует свои запросы через базовый request и отправляет его через OrderSend, это тото же нос, но только в профиль
 
Soova:
Поэтому я хочу попробовать сформировать запрос сам, как было в MQL4: OrderModify(ticket,price, ....), указать тикет, чтобы избежать проблем в будущем, опасность в том, что в запросе на закрытие, тикета тоже нет, пока позиции закрываются вроде нормально, но если он начнет закрывать позиции "от фонаря", то будет беда, попробую найти исходники формул в include

Внимательней смотрите документацию. Я вам сказал что там есть неточности. Как для модификации так и для закрытия нужно указывать тикет. Это видно в примерах функций что приведены ниже каждого типа запроса.

Вот пример заполнения запроса на закрытие позиции

         //--- установка параметров операции
         request.action   =TRADE_ACTION_DEAL;        // тип торговой операции
         request.position =position_ticket;          // тикет позиции
         request.symbol   =position_symbol;          // символ 
         request.volume   =volume;                   // объем позиции
         request.deviation=5;                        // допустимое отклонение от цены
         request.magic    =EXPERT_MAGIC;             // MagicNumber позиции

Это тоже из примера в документации.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2017.02.08 14:19

// Скрипт позволяет быстро разобраться, как в MT5 формировать соответствующий MT4-аналогу MqlTradeRequest-запрос в MT5-OrderSend.

#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

#include <MT4Orders.mqh>

#define PRINT(A) A; Print(#A + "\n" + ToString(MT4ORDERS::LastTradeRequest) + ToString(MT4ORDERS::LastTradeResult));

#define Point _Point
#define Bid (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID))
#define Ask (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK))

void OnStart()
{
  Print(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
  
  // Открыли позицию
  const int TicketPosition = PRINT(OrderSend(NULL, OP_BUY, 1, Ask, 100, 0, 0, "My Position"))

  if (OrderSelect(TicketPosition, SELECT_BY_TICKET))
  {
    // Установили SL/TP
    PRINT(OrderModify(OrderTicket(), OrderOpenPrice(), Bid - 100 * Point, Bid + 100 * Point, 0))

    // Закрыли позицию
    PRINT(OrderClose(OrderTicket(), OrderLots(), Bid, 100))
  }

  // Установили отложенный ордер
  const int TicketOrder = PRINT(OrderSend(NULL, OP_BUYLIMIT, 1, Ask - 100 * Point, 100, 0, 0, "My Order"))

  if (OrderSelect(TicketOrder, SELECT_BY_TICKET))
  {
    // Удалили ордер
    PRINT(OrderDelete(OrderTicket()))
  }
}
 
Alexey Viktorov:

Внимательней смотрите документацию. Я вам сказал что там есть неточности. Как для модификации так и для закрытия нужно указывать тикет. Это видно в примерах функций что приведены ниже каждого типа запроса.

Вот пример заполнения запроса на закрытие позиции

Это тоже из примера в документации.

Как вставить тикет в запрос формируемый request, почему вы ссылаетесь на документацию, хотя до этого писали, что в документации неточности и ошибки, я без документации могу пошагово проанализировать тот же CTrade, пока времени нет, думал люди смогут помочь, а люди ссылки кидают, я документацию и без ваших подсказок, перед постановкой вопроса изучаю, читать умею, можно ли вручную сформировать запрос в MQL5, в обход request, аналогично тому, как это делалось в MQL4?
 
fxsaber:
Наконец то, дельная информация, а то модеры лишь ссылками кидаются и пургу про внешние библиотеки гонят, голову мылят, спасибо
 
Soova:
Я уже давно прошел период начинающего, именно для них нужны CTradы, чтобы понять как все функционирует, но когда вы нормально поваритесь в MQL5, вы начинаете понимать, что время затрачиваемое на выполнение внешних библиотек и уж тем более нагрузка на систему, делает эти библиотеки инструментом чайников, если вы к 20 экспертам подключите внешние библиотеки, то у вас проц вспотеет, не говоря уже о том, что CTrade, также не указывает тикеты, как по вашему сервер закрывает неидентифицированную позицию, на угад что ли, авось прокатит? CTtade то формирует свои запросы через базовый request и отправляет его через OrderSend, это тото же нос, но только в профиль

Проверка:

советник даёт команду на закрытие позиции и указывает ТИКЕТ:

...
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
...

и смотрим на метод CTrade::PositionClose - входящий параметр "ticket"

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =PositionGetDouble(POSITION_VOLUME);
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }

этот тикет мы заполняем поле position структуры m_request.

и отправляем торговый запрос через OrderSend.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.07.11 10:50

// Советник возвращает полностью сформированные торговые запросы (включая ручные)
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + 
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) + 
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

void OnTradeTransaction(   const MqlTradeTransaction&, const MqlTradeRequest& Request, const MqlTradeResult& )
{
  if (Request.action)
    Print(ToString(Request));
}

Если возникает проблема с тем же Filling, запустите этот советник и создайте нужный вам ордер вручную (F9 в терминале). Сформированный торговый запрос будет распечатан советником.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.07.11 11:02

Вручную выставляем


Получаем в логе сформированный торговый запрос

Request.action = TRADE_ACTION_PENDING (5)
Request.magic = 0
Request.order = 157092716
Request.symbol = EURUSD
Request.volume = 0.01
Request.price = 1.13941
Request.stoplimit = 0.0
Request.sl = 1.13926
Request.tp = 1.13955
Request.deviation = 0
Request.type = ORDER_TYPE_BUY_LIMIT (2)
Request.type_filling = ORDER_FILLING_RETURN (2)
Request.type_time = ORDER_TIME_SPECIFIED (2)
Request.expiration = 2017.07.11 12:08:00
Request.comment = 
Request.position = 0
Request.position_by = 0


Модифицируйте Ваши позиции руками и смотрите в логе, как сам Терминал сформировал соответствующие OrderSend.

 
Alexey Viktorov:

Внимательней смотрите документацию. Я вам сказал что там есть неточности. Как для модификации так и для закрытия нужно указывать тикет. Это видно в примерах функций что приведены ниже каждого типа запроса.

Вот пример заполнения запроса на закрытие позиции

Это тоже из примера в документации.

У меня точно такой же запрос, но order остается в ноль, он не меняется, данные из request.position не отображаются в запросе и в этом проблема, ни тикетов, ни ордеров, ни позиций в запросе нет, request формирует запрос не для хеджинга, а для нетинга, возможно надо выполнять проверку на соответствие запроса хеджингу, хотя тикет можно указывать и при нетинге, но request эту наиважнейшую инфу игнорирует

order:0

order:0

2

не тот тикет модифицирует

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Vladimir Karputov:

Проверка:

советник даёт команду на закрытие позиции и указывает ТИКЕТ:

и смотрим на метод CTrade::PositionClose - входящий параметр "ticket"

этот тикет мы заполняем поле position структуры m_request.

и отправляем торговый запрос через OrderSend.

данные из request.position не отображаются в запросе, ордер остается в ноле
 
Soova:
Как вставить тикет в запрос формируемый request, почему вы ссылаетесь на документацию, хотя до этого писали, что в документации неточности и ошибки, я без документации могу пошагово проанализировать тот же CTrade, пока времени нет, думал люди смогут помочь, а люди ссылки кидают, я документацию и без ваших подсказок, перед постановкой вопроса изучаю, читать умею, можно ли вручную сформировать запрос в MQL5, в обход request, аналогично тому, как это делалось в MQL4?

Именно об этом я и говорю, вручную сформировать запрос!!! Именно на примеры ручного формирования запроса я давал ссылки.

А что значит "в обход request"? Зачем изгаляться выворачивая весь язык программирования как это сделал fxsaber в соей библиотеке??? Там ведь как ни крути на выходе точно такое-же заполнение структуры и отправка запроса по правилам mq5, но никак не mql4.

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