Библиотеки: MT4Orders - страница 24

 

Yes, I know that true is returned when calling OrderSelect() directly after the opening of the position.

In this case we have an open MQL5 position and the library finds the position when calling OrderSelect().

This is done in the internal function SelectByExistingTicket() of the library.


But the key point is that OrderSelect(ticket) returns false when the MQL5 position is closed by stop loss or take profit.

Please execute my test code to verify it (if your broker doesn't accept so close SL and TP, please make them wider in order to avoid rejection of the OrderSend()).

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

But the key point is that OrderSelect(ticket) returns false when the MQL5 position is closed by stop loss or take profit.

Еще раз прочтите часть моего подробного ответа

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

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

fxsaber, 2018.08.06 14:21

Все правильно. Подробности описаны здесь.

Вы можете сделать PositionTicket = OrderSend(OP_BUY, 2 lots) и OrderClose(0.2 lots) + OrderClose(0.3 lots). Тогда получите в Истории торгов две закрытые "позиции" (0.2/0.3 lots) и одну еще открытую позицию (1.5 lots) с тикетом равным PositionTicket. Это особенность MT5. Поэтому неправильно в режиме SELECT_BY_TICKET+MODE_HISTORY выбирать позицию по ее POSITION_ID в Истории торгов.


Запоминание тикетов - это плохой стиль, хоть и популярен. Правильно - когда на каждом событии торговый робот считывает все окружение с чистого листа.


ЗЫ Вот здесь показана примерно такая же ситуация, как описана выше


В результатах видно, что была открыта позиция с тикетом == 2. Затем она дважды закрылась, создав тем самым две закрытые "позиции" в Истории торгов. Их тикеты другие, но при этом у обеих этих "позиций" OrderTicketOpen == 2. Т.е. Вы должны понимать, что если в MT5 закрываете позицию, то ее исторический тикет не совпадает с real-time.


Обратите внимание, что в MT5 даже коментарии при закрытии одной и той же real-time позиции разные: "Hello World!" и "tp 1.23614".

Невозможно в MT5 однозначно выбрать закрытую MT4-позицию по POSITION_ID, т.к. в MT5 одновременно может быть несколько MT4-позиций с одним и тем же POSITION_ID.

 

Кто использует для конвертации MT4 -> MT5 файл mql4_to_mql5.mqh из поставки MT4Orders, удалите из него этот кусок кода

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

Тестируем 'CopyTicks'

fxsaber, 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)

официально с MT5 buiild 1860 эта часть кода не актуальна.

Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
  • 2018.06.14
  • www.mql5.com
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий15 июня 2018 года будет опубликов...
 

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

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

fxsaber, 2017.06.14 11:30

// Список изменений:
// 14.06.2017:
//   Add: Добавлены асинхронные аналоги MQL4-торговым функциям: OrderSendAsync, OrderModifyAsync, OrderCloseAsync, OrderDeleteAsync.
//        Возвращают соответствующий Result.request_id в случае удачи, иначе - 0.

Хороший пример использования этих функций лежит в описании к другой библиотеке. Показанный подход позволяет полноценно задействовать MQL4-style (включая возможность остаться в своей On-функции) в асинхронном режиме.

TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 

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

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

fxsaber, 2018.09.11 15:58

// Закрывает позиции через лимитные ордера
bool CloseAll()
{
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      Res &= (OrderType() > OP_SELL) ? OrderDelete(OrderTicket())
                                     : OrderSend(OrderSymbol(), OrderType() ? OP_BUYLIMIT : OP_SELLLIMIT , OrderLots(), OrderClosePrice(), 100, 0, 0) && false;
    
  return(Res);
}

То же самое с помощью СБ

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

bool CloseAll()
{
  static CTrade Trade;
  static CPositionInfo Position;
  
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    Res &= Trade.OrderDelete(OrderGetTicket(i));
    
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if (Position.SelectByIndex(i))    
      Res &= (Position.PositionType() ?  Trade.BuyLimit(Position.Volume(), Position.PriceCurrent(), Position.Symbol())
                                      : Trade.SellLimit(Position.Volume(), Position.PriceCurrent(), Position.Symbol())) && false;
    
  return(Res);
}


У каждого стиля свои плюсы и минусы.

 

Проверить библиотеку можно на этом советнике.

 
// Список изменений:
// 02.11.2018
//   Fix: Цена открытия MT4-позиции до ее срабатывания теперь не может быть нулевой.
//   Fix: Учтены редкие особенности исполнения некоторых торговых серверов.
 
fxsaber:

Первый пункт сформулирован непонятно. Как было и как стало?

 
Stanislav Korotky:

Первый пункт сформулирован непонятно. Как было и как стало?

Выставили открывающий позицию маркет-ордер. В момент, пока он не исполнен, библиотека его видит, как MT4-позицию. Ранее OrderOpenPrice() этой "позиции" была равна нулю. Сейчас - текущей цене.

Запустите этот советник на ForexTimeFXTM-Demo01
#include <MT4Orders.mqh>
#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  static ulong PrevTimeMsc = 0;
  
  if (OrderSelect(0, SELECT_BY_POS))
  {
    const ulong TimeMsc = OrderOpenTimeMsc();
    
    if (PrevTimeMsc != TimeMsc)
    {
      Print(TimeToString(TimeMsc / 1000, TIME_SECONDS) + "." + IntegerToString(TimeMsc % 1000, 3, '0'));
      _P(OrderOpenPrice());
      _P(OrderClosePrice());
      
      OrderPrint();
    }
    
    PrevTimeMsc = TimeMsc;
  }    
}


И руками откройте позицию. Советник распечатает

2018.11.02 16:04:51.280 16:04:58.039
2018.11.02 16:04:51.280 void OnTimer(), Line = 17: OrderOpenPrice() = 1.14187
2018.11.02 16:04:51.280 void OnTimer(), Line = 18: OrderClosePrice() = 1.14187
2018.11.02 16:04:51.280 #2212865052 2018.11.02 16:04:58 sell 1.00 EURUSD 1.14187 0.00000 0.00000 1.14187 0.00 0.00 0.00 0
2018.11.02 16:04:51.440 16:04:58.151
2018.11.02 16:04:51.440 void OnTimer(), Line = 17: OrderOpenPrice() = 1.14187
2018.11.02 16:04:51.440 void OnTimer(), Line = 18: OrderClosePrice() = 1.1419
2018.11.02 16:04:51.440 #2212865052 2018.11.02 16:04:58 sell 1.00 EURUSD 1.14187 0.00000 0.00000 1.14190 -1.75 0.00 -2.63 0


Ранее в выделенных местах были нули.


Лог этой ситуации самого Терминала

2018.11.02 16:04:51.200 Trades  '35269132': market sell 1.00 EURUSD
2018.11.02 16:04:51.260 Trades  '35269132': accepted market sell 1.00 EURUSD
2018.11.02 16:04:51.270 Trades  '35269132': market sell 1.00 EURUSD placed for execution
2018.11.02 16:04:51.380 Trades  '35269132': order #2212865052 sell 1.00 / 1.00 EURUSD at market done in 181.043 ms
2018.11.02 16:04:51.380 Trades  '35269132': deal #2210313578 sell 1.00 EURUSD at 1.14187 done (based on order #2212865052)
 

@fxsaber

Можно пример как заставить этого mt5 советника работать на mt4orders?

https://www.mql5.com/ru/code/17464

5_8 MACross
5_8 MACross
  • www.mql5.com
Kijun Sen Robot Использует индикаторы: Ichimoku, MA, SAR. Оптимизирован для валютных пар: GBPUSD и EURUSD c периодом M30. Полное описание см. в коде. TDI-2_Cloud_HTF Индикатор TDI-2 с возможностью изменения таймфрейма индикатора во входных параметрах.