Проблема с торговым запросом

Soova  

Можно ли в MQL5 сформировать торговый запрос как в MQL4, в кавычках OrderSend ( в MQL4, это формула OrderModify(); ), самостоятельно прописать данные для запроса, TRADE_ACTION_SLTP и т.д. или, как  посмотреть исходный скрипт формул OrderSend и MqlTradeRequest, в каком файле хранятся скрипты этих формул? Проблема в том, что на хеджинге (проверил, запрос подтверждает хеджинг) запрос формируется как на нетинге, не указывается тикет, формируется запрос на модификацию по символу, а не по тикету.

MqlTradeRequest{  action:TRADE_ACTION_SLTP ... order:0 symb.....

например, открыто 2 позиции с тикетами 2 и 3, идет перебор for( int i= и т.д., при первом заходе модифицируется тикет №2, при втором заходе выбирает тикет №3, в request.position=3, а модифицировать вновь пытается тикет №2, result показывает 2

Vladimir Karputov  
Soova:

Можно ли в MQL5 сформировать торговый запрос как в MQL4, в кавычках OrderSend ( в MQL4, это формула OrderModify(); ), самостоятельно прописать данные для запроса, TRADE_ACTION_SLTP и т.д. или, как  посмотреть исходный скрипт формул OrderSend и MqlTradeRequest, в каком файле хранятся скрипты этих формул? Проблема в том, что на хеджинге (проверил, запрос подтверждает хеджинг) запрос формируется как на нетинге, не указывается тикет, формируется запрос на модификацию по символу, а не по тикету.

например, открыто 2 позиции с тикетами 2 и 3, идет перебор for( int i= и т.д., при первом заходе модифицируется тикет №2, при втором заходе выбирает тикет №3, в request.position=3, а модифицировать вновь пытается тикет №2, result показывает 2

Для начала начните пользовать простой вариант - в котором минимум настроек:

подключаете торговые классы стандартной библиотеки

#include <Trade\PositionInfo.mqh> // работа с позициями
#include <Trade\Trade.mqh>        // торговые операции
#include <Trade\SymbolInfo.mqh>   // класс символа

Тогда простой подсчёт позиций выглядит как:

//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
int CalculateAllPositions()
  {
   int total=0;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
            total++;
//---
   return(total);
  }

а трейлинг позиций так:

//+------------------------------------------------------------------+
//| Trailing                                                         |
//+------------------------------------------------------------------+
void Trailing(const double ma_open_1,
              const double ma_open_signal_bar,
              const double ma_close_1,
              const double ma_close_signal_bar)
  {
   if(InpTrailingStop==0)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(ma_open_1<ma_open_signal_bar)
                 {
                  m_trade.PositionClose(m_position.Ticket());
                  continue;
                 }
               if(InpTrailingStop>0)
                  if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep)
                     if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingStop+ExtTrailingStep))
                       {
                        if(!m_trade.PositionModify(m_position.Ticket(),
                           m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingStop),
                           m_position.TakeProfit()))
                           Print("Modify ",m_position.Ticket(),
                                 " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                                 ", description of result: ",m_trade.ResultRetcodeDescription());
                        continue;
                       }
              }
            else
              {
               if(ma_open_1>ma_open_signal_bar)
                 {
                  m_trade.PositionClose(m_position.Ticket());
                  continue;
                 }
               if(InpTrailingStop>0)
                  if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingStop+ExtTrailingStep)
                     if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingStop+ExtTrailingStep))) || 
                        (m_position.StopLoss()==0))
                       {
                        if(!m_trade.PositionModify(m_position.Ticket(),
                           m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingStop),
                           m_position.TakeProfit()))
                           Print("Modify ",m_position.Ticket(),
                                 " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                                 ", description of result: ",m_trade.ResultRetcodeDescription());
                       }
              }

           }
  }


Код взят из примера Brandy

Soova  
Vladimir Karputov:

Для начала начните пользовать простой вариант - в котором минимум настроек:

подключаете торговые классы стандартной библиотеки

Тогда простой подсчёт позиций выглядит как:

а трейлинг позиций так:


Код взят из примера Brandy

Не имеет значения, запрос формирует и отправляет MqlRequest и OrderSend, в CTrade все еще хуже, он всегда, даже при хеджинге, модифицируется наименьший тикет, не наибольший, не последний, а именно первый и в этом нет никакого смысла, нисколько не проще, у меня формирование приказа занимает 20-30 строк кода и у вас так же, и это без учета тысяч лишних строк кода, нагрузки на проц и времени
Alexey Viktorov  
Soova:
Не имеет значения, запрос формирует и отправляет MqlRequest и OrderSend, в CTrade все еще хуже, он всегда, даже при хеджинге, модифицируется наименьший тикет, не наибольший, не последний, а именно первый и в этом нет никакого смысла, нисколько не проще, у меня формирование приказа занимает 20-30 строк кода и у вас так же, и это без учета тысяч лишних строк кода, нагрузки на проц и времени

В документации есть все примеры и все классы стандартной библиотеки.

PositionModify имеет перегрузку и отправлять запрос можно и нужно не по символу, а по тикету позиции.

bool  PositionModify(
   const ulong   ticket,     // тикет позиции
   double        sl,         // цена Stop Loss 
   double        tp          // цена Take Profit
   )
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / PositionModify
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / PositionModify
  • www.mql5.com
Успешное окончание работы метода PositionModify(...) не всегда означает успешное совершение торговой операции. Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode(). При...
Soova  
Alexey Viktorov:

В документации есть все примеры и все классы стандартной библиотеки.

PositionModify имеет перегрузку и отправлять запрос можно и нужно не по символу, а по тикету позиции.

Последний абзац Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / PositionModify: "При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionModify изменит позицию с наименьшим тикетом."
Soova  
Alexey Viktorov:

В документации есть все примеры и все классы стандартной библиотеки.

PositionModify имеет перегрузку и отправлять запрос можно и нужно не по символу, а по тикету позиции.

Вы знаете, как посмотреть скрипт формулы? Вроде можно выделить OrderSend, выполнить манипуляции и должен открыться файл с этой формулой. Он отправляет в OrderSend запрос Request без тикетов и ордеров, как OrderSend определяет тикет позиции непонятно
Alexey Viktorov  
Soova:
Вы знаете, как посмотреть скрипт формулы? Вроде можно выделить OrderSend, выполнить манипуляции и должен открыться файл с этой формулой. Он отправляет в OrderSend запрос Request без тикетов и ордеров, как OrderSend определяет тикет позиции непонятно
         //--- установка параметров операции
         request.action  =TRADE_ACTION_SLTP; // тип торговой операции
         request.position=position_ticket;   // тикет позиции
         request.symbol=position_symbol;     // символ 
         request.sl      =sl;                // Stop Loss позиции
         request.tp      =tp;                // Take Profit позиции
         request.magic=EXPERT_MAGIC;         // MagicNumber позиции

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

К сожалению после введения hadge в MT5 не всё в документации исправлено. Видимо вас сбило с толку начало

SL & TP Modification

Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей:

  • action
  • symbol
  • sl
  • tp
  • position


тикет-то тут отсутствует...

Примерно как про того суслика... "Ты суслика видишь?". "Нет." Не видишь, а он есть :))))


Все коды стандартной библиотеки находятся в папке Include


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Взаимодействие клиентского терминала и торгового сервера для проведения операций постановки ордеров производится посредством торговых запросов. Запрос представлен специальной предопределенной структурой MqlTradeRequest, которая содержит все поля, необходимые для заключения торговых сделок. Результат обработки запроса представлен структурой...
Soova  
Alexey Viktorov:

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

К сожалению после введения hadge в MT5 не всё в документации исправлено. Видимо вас сбило с толку начало

тикет-то тут отсутствует...

Примерно как про того суслика... "Ты суслика видишь?". "Нет." Не видишь, а он есть :))))


Все коды стандартной библиотеки находятся в папке Include


Поэтому я хочу попробовать сформировать запрос сам, как было в MQL4: OrderModify(ticket,price, ....), указать тикет, чтобы избежать проблем в будущем, опасность в том, что в запросе на закрытие, тикета тоже нет, пока позиции закрываются вроде нормально, но если он начнет закрывать позиции "от фонаря", то будет беда, попробую найти исходники формул в include
Vladimir Karputov  
Soova:
Поэтому я хочу попробовать сформировать запрос сам, как было в MQL4: OrderModify(ticket,price, ....), указать тикет, чтобы избежать проблем в будущем, опасность в том, что в запросе на закрытие, тикета тоже нет, пока позиции закрываются вроде нормально, но если он начнет закрывать позиции "от фонаря", то будет беда, попробую найти исходники формул в include

Я Вам показал пример выше: абсолютно все функции работают через указание тикета.

Пожалуйста разберитесь.

Soova  
Vladimir Karputov:

Я Вам показал пример выше: абсолютно все функции работают через указание тикета.

Пожалуйста разберитесь.

Вот запрос формируемый request на модификацию,

MqlTradeRequest{  action:TRADE_ACTION_SLTP magic:201010 order:0 symbol:"EURUSD_i" volume:0.0 price:0.0 stoplimit:0.0 sl:1.2322500000000001 
tp:1.2342500000000001 deviation:0 type:ORDER_TYPE_BUY type_filling:ORDER_FILLING_FOK type_time:ORDER_TIME_GT… }

запрос на закрытие

MqlTradeRequest{  action:TRADE_ACTION_DEAL magic:201010 order:0 symbol:"EURUSD_i" volume:0.01 price:1.23227 stoplimit:0.0 sl:0.0 
tp:0.0 deviation:2 type:ORDER_TYPE_SELL type_filling:ORDER_FILLING_FOK type_time:ORDER_TIME_GTC expiration… }

где тикеты?

Vladimir Karputov  
Soova:

Вот запрос формируемый request на модификацию,

запрос на закрытие

где тикеты?

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

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