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

 
Vitaly Muzichenko:

Это последняя версия библиотеки?

Да.

 

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

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

fxsaber, 2017.02.16 15:16

С помощью этого скрипта удалось найти проблемы с исполнением в MT5. Рекомендую проверять свою связку Терминал+Торговый Сервер и, в случае проблем, сообщать в Сервисдеск.

 


Обновленный скрипт в приложении. Быстро находит, например, такие проблемы

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
Файлы:
 

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

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

Andrey Khatimlianskii, 2018.06.06 01:53

// 30.05.2018
//   Add: Ускорена работа с историей торговли, выбрана золотая середина реализаций между производительностью и
//        потреблением памяти - важно для VPS. Используется стандартная Generic-библиотека.
//        Если не хочется использовать Generic-библиотеку, то доступен старый режим работы с историей.
//        Для этого нужно ДО MT4Orders-библиотеки прописать строку
//
//        #define MT4ORDERS_FASTHISTORY_OFF // Выключаем быструю реализацию истории торговли - не используем Generic-библиотеку.

Работа с длинной историей теперь просто летает!

Проверка Generic-выигрыша в цифрах
#define MT4ORDERS_FASTHISTORY_OFF // Выключаем быструю реализацию истории торговли - не используем Generic-библиотеку.
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


Результат без Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


Результат с Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


На истории с 10К сделок и 20К ордеров Generic-вариант в ~30 раз быстрее. Чем больше торговая история, тем заметнее ускорение.

 

Извините, я не могу говорить по-русски. Я использую 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
Причина обращения: