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

 

Извините, я не могу говорить по-русски. Я использую Google переводчик.

Несколько дней назад я нашел эту очень интересную библиотеку. Но у меня есть одна проблема: я отправляю рыночный ордер через OrderSend () и сохраняю билет, возвращенный OrderSend (). Через некоторое время ударяют стоп-лоссы или получают прибыль. Затем я пытаюсь выбрать заказ через OrderSelect(билет, SELECT_BY_TICKET) с этим билетом. В MQL4 порядок будет найден в истории. Но используя эту библиотеку с MQL5, OrderSelect не удастся.

Я немного посмотрел в коде MT4orders.mqh. MT4ORDERS::SelectByTicket () вызывает SelectByExistingTicket(), который терпит неудачу, а затем SelectByHistoryTicket(), который я ожидаю добиться. В SelectByHistoryTicket() функция HistoryDealSelect() обычно возвращает false (кроме, может быть, в тесте), потому что билет является идентификатором позиции, а не билетом сделки. ::HistoryOrderSelect () возвращает true, потому что билет совпадает с билетом in-order (и идентификатором позиции) (я использую MT5 в режиме хеджирования). Но MT4HISTORY::IsMT4Order(Ticket) возвращает false. Я ожидаю, что он вернется. Функция вернет true, если идентификатор позиции будет равен нулю. Но я вижу, что как в тесте, так и в реальном счете идентификатор позиции не равен нулю и равен биту заказа в порядке.

Любая помощь приветствуется.

 
winloosewin:

Несколько дней назад я нашел эту очень интересную библиотеку. Но у меня есть одна проблема: я отправляю рыночный ордер через OrderSend () и сохраняю билет, возвращенный OrderSend (). Через некоторое время ударяют стоп-лоссы или получают прибыль. Затем я пытаюсь выбрать заказ через OrderSelect(билет, SELECT_BY_TICKET) с этим билетом. В MQL4 порядок будет найден в истории. Но используя эту библиотеку с MQL5, OrderSelect не удастся.

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

Вы можете сделать 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 в Истории торгов.


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


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

Forum on trading, automated trading systems and testing trading strategies

Libraries: MT4Orders

fxsaber, 2018.04.14 09:10

Example

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


Result

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2 buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2 buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2 buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3 sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3 sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3 sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2 buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4 sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4 sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4 sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4 sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

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


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

 
winloosewin:

Извините, я не могу говорить по-русски. Я использую Google переводчик.

Несколько дней назад я нашел эту очень интересную библиотеку. Но у меня есть одна проблема: я отправляю рыночный ордер через OrderSend () и сохраняю билет, возвращенный OrderSend (). Через некоторое время ударяют стоп-лоссы или получают прибыль. Затем я пытаюсь выбрать заказ через OrderSelect(билет, SELECT_BY_TICKET) с этим билетом. В MQL4 порядок будет найден в истории. Но используя эту библиотеку с MQL5, OrderSelect не удастся.

Я немного посмотрел в коде MT4orders.mqh. MT4ORDERS::SelectByTicket () вызывает SelectByExistingTicket(), который терпит неудачу, а затем SelectByHistoryTicket(), который я ожидаю добиться. В SelectByHistoryTicket() функция HistoryDealSelect() обычно возвращает false (кроме, может быть, в тесте), потому что билет является идентификатором позиции, а не билетом сделки. ::HistoryOrderSelect () возвращает true, потому что билет совпадает с билетом in-order (и идентификатором позиции) (я использую MT5 в режиме хеджирования). Но MT4HISTORY::IsMT4Order(Ticket) возвращает false. Я ожидаю, что он вернется. Функция вернет true, если идентификатор позиции будет равен нулю. Но я вижу, что как в тесте, так и в реальном счете идентификатор позиции не равен нулю и равен биту заказа в порядке.

Любая помощь приветствуется.

To fully understand your machine translation, please attach the text in English.

 

I have found this very interesting library some days ago. But I have one problem: I send a market order via OrderSend() and store the ticket returned by OrderSend(). After some time the stop loss or take profit is hit. Then I try to select the order via
OrderSelect(ticket, SELECT_BY_TICKET) with this ticket. In MQL4 the order would be found in the history. But using this library with MQL5, OrderSelect doesn't succeed.

I looked a bit in the code of MT4orders.mqh . MT4ORDERS::SelectByTicket() calls SelectByExistingTicket() which fails and then SelectByHistoryTicket() which I would expect to succeed. In SelectByHistoryTicket() the function HistoryDealSelect() generally returns false (except maybe in the tester) because the ticket is the position identifier and not the deal ticket.   ::HistoryOrderSelect() returns true because the ticket is the same as the ticket of the in-order (and the position identifier) (I use MT5 in hedging mode). But MT4HISTORY::IsMT4Order(Ticket) returns false. I would expect it to return true. The function would return true if the position identifier would be zero. But I see that both in the tester and in a real account the position identifier is not zero - and equal to the order ticket of the in-order.

In other words: I don't understand why in the function MT4HISTORY::IsMT4Order() is the following code (returns true if the position id is zero):

    return(/*(::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) > 0) ||*/ !::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));

In the following I attach my test code:

void OnTick()
{
   PrintChangesOfMQL5OrderSystemState();

   int total=OrdersTotal();

   double bid = MarketInfo(Symbol(), MODE_BID);
   double ask = MarketInfo(Symbol(), MODE_ASK);

   static int state=0;
   static ulong ticket = 0;

   switch(state)
   {
      case 0:
         ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
         state=1;
         break;

      case 1:
         if(0==total)
         {
            bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
            if(false==res)
            {
               Print("OrderSelect failed with ticket: ", (string)ticket);
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));
               
               ExpertRemove();
            }
         }
         break;
   }
}

PrintChangesOfMQL5OrderSystemState() is a streightforward function that prints the state of the MQL5 order system each time when a change has been detected.

Here is the output of the test code (run on the tester):

EURUSD  bid=1.087360   ask=1.087860
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in


--------------------
EURUSD  bid=1.087350   ask=1.087850
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert
Order:    ticket: 0  position_id: 0  MAGIC: 0  buy  open_price: 0.000000  volume: 0.000000  cur_vol=0.000000  type=buy  reason=client

Position: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  reason=expert

--------------------
EURUSD  bid=1.087330   ask=1.087830
263207 EURUSD 2016.01.03 00:00:16  

HistDeal: ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  opened by order: 3  type=sell  reason=stop loss  entry=out
HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  cur_vol=0.000000  type=sell  reason=stop loss
HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert

--------------------

OrderSelect failed with ticket:  2
ORDER_POSITION_ID =  2
HistoryDealSelect true    MT4HISTORY::IsMT4Deal false
HistoryOrderSelect true    MT4HISTORY::IsMT4Order false    ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2


You can see that HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) returns 2 and not zero. This is the reason why MT4HISTORY::IsMT4Order() returns false.



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


In other words: I don't understand why in the function MT4HISTORY::IsMT4Order() is the following code (returns true if the position id is zero):

In the following I attach my test code:

PrintChangesOfMQL5OrderSystemState() is a streightforward function that prints the state of the MQL5 order system each time when a change has been detected.

Here is the output of the test code (run on the tester):


You can see that HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) returns 2 and not zero. This is the reason why MT4HISTORY::IsMT4Order() returns false.

Вы совсем не понимаете, что ордер в MT5 и в MT4 - разные сущности.

 
fxsaber:
Вам был дан ответ выше.


Вы совсем не понимаете, что ордер в MT5 и в MT4 - разные сущности.

I understand the order systems of MQL5 and of MQL4 and their differences.


fxsaber:
Поэтому неправильно в режиме SELECT_BY_TICKET+MODE_HISTORY выбирать позицию по ее POSITION_ID в Истории торгов.

Yes, I know that the MQL5 function HistoryOrderSelect() expects a ticket and not a position identifier.

But my test code is valid MQL4 code (except for the calls of MQL5 functions HistoryOrderSelect() and HistoryDealSelect())

and in MQL4 the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) returns true as expected.

As far as I know, the purpose of the library is to emulate the MQL4 order system as good as possible on MQL5. So, I would expect that with

the library the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) also returns true.

I have looked at the code and tried to find out why it returns false.

First: As I work on a MQL5 hedging System, the function

ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);

assigns to the variable 'ticket' the order ticket that is equal to the (future) position identifier in MQL5 hedge. This can be seen in the code

    return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order is a feature of MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (::PositionSelect(MT4ORDERS::LastTradeRequest.symbol) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // HistoryDealSelect в MT4ORDERS::OrderSend
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

of the function MT4OrderSend(). The following is returned:

(long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order is a feature of MT5-Hedge

When analysing what the library does when executing the code

bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);

I see that the function SelectByHistoryTicket() is executed with the ticket that I have stored in the variable 'ticket'.

In this function the function HistoryOrderSelect(ticket) is called - with the ticket that is equal to the order ticket and the position identifier.

With my MQL4 OrderSelect() call I do not call HistoryOrderSelect(ticket) myself - it's in the library.

Only in my test code I call HistoryOrderSelect(ticket) and HistoryDealSelect(ticket) directly in order to see what happens inside of the library:

/* The following is MQL5 and not MQL4 code - only for checking what happens inside of the library: */
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));


To make it short: According to the return value of OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) the library does not emulate the

MQL4 order system on MQL5 correctly.

 
winloosewin:

 MQL4 the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) returns true as expected.

As far as I know, the purpose of the library is to emulate the MQL4 order system as good as possible on MQL5. So, I would expect that with

the library the function OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) also returns true.

I have looked at the code and tried to find out why it returns false.

Вы ошибаетесь. Запустите этот советник в Тестере

#include <MT4Orders.mqh>
#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (_P(OrderSelect(_P(OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0)), SELECT_BY_TICKET)))
  {
    OrderPrint();
    _P(OrdersTotal());    
  }
  
  ExpertRemove();  
}


Результат

2018.08.07 10:47:20.340 2018.08.01 00:00:00   instant buy 1.00 EURUSD at 1.16905 (1.16895 / 1.16905 / 1.16895)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal #2 buy 1.00 EURUSD at 1.16905 done (based on order #2)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal performed [#2 buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.340 2018.08.01 00:00:00   order performed buy 1.00 at 1.16905 [#2 buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0) = 2
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSelect(_P(OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0)),SELECT_BY_TICKET) = true
2018.08.07 10:47:20.347 2018.08.01 00:00:00   #2 2018.08.01 00:00:00 buy 1.00 EURUSD 1.16905 0.00000 0.00000 1.16895 0.00 0.00 -10.00 0
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 11: OrdersTotal() = 1
2018.08.07 10:47:20.347 2018.08.01 00:00:00   ExpertRemove() function called
 

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 года будет опубликов...