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

 
fxsaber:

Ниже код, который компилируется без предупреждений под MQL4/5

Спасибо @Andrey Voytenko за предложение такого решения!

Для чего этот хак?

 
Rashid Umarov:

Для чего этот хак?

В примере закомментированы long-типы. Если их оставить, то в MQL5 и NoStrict-MQL4 не будет предупреждений. Но в strict-MQL4  - возникнут.

Чтобы можно было писать кроссплатформенные библиотеки без соответствующих Warnings, и добавлен данный функционал.

Пользоваться им совершенно не требуется. Это дополнительное удобство для тех, перед кем может встать кроссплатформенная задача подобного рода.

 

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

Робот из МТ4 на МТ5

fxsaber, 2018.03.08 09:27

// https://www.mql5.com/ru/code/16006
#define  MT4_TICKET_TYPE // Обязываем OrderSend и OrderTicket возвращать значение такого же типа, как в MT4 - int.
#include <MT4Orders.mqh>
#include <MQL4_To_MQL5.mqh>

int Hour( void )
{
  return((int)((TimeCurrent() % (24 * 3600)) / 3600));
}

int Minute( void )
{
  return((int)((TimeCurrent() % 3600) / 60));
}

#include "super-signals-channel.mq4" // https://www.mql5.com/ru/forum/231135#comment_6751304
 

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

В примере видно, что при срабатывании TP/SL исходный комментарий "Hello World!" заменяется полностью на свой в MT5 - "tp 1.23614".

В MT4 же в таких ситуациях комментарий становится, вроде, такого вида "Hello World!tp 1.23614". Нужно ли так же делать в MT4Orders?

Т.е. правильно/удобно ли, чтобы при SL/TP/MO закрытиях комментарий ордера в истории был комбинацией комментария при открытии и закрытии, как это происходит в MT4?

 
fxsaber:

В примере видно, что при срабатывании TP/SL исходный комментарий "Hello World!" заменяется полностью на свой в MT5 - "tp 1.23614".

В MT4 же в таких ситуациях комментарий становится, вроде, такого вида "Hello World!tp 1.23614". Нужно ли так же делать в MT4Orders?

Т.е. правильно/удобно ли, чтобы при SL/TP/MO закрытиях комментарий ордера в истории был комбинацией комментария при открытии и закрытии, как это происходит в MT4?

я бы предложил что-то наподобие:

Original_Comment[tp: 1.23614] (т.к. иногда есть необходимость парсинга комментария)

с логом нештатных ситуаций, когда длина комментария выходит за лимиты

 
fxsaber:

В примере видно, что при срабатывании TP/SL исходный комментарий "Hello World!" заменяется полностью на свой в MT5 - "tp 1.23614".

В MT4 же в таких ситуациях комментарий становится, вроде, такого вида "Hello World!tp 1.23614". Нужно ли так же делать в MT4Orders?

Т.е. правильно/удобно ли, чтобы при SL/TP/MO закрытиях комментарий ордера в истории был комбинацией комментария при открытии и закрытии, как это происходит в MT4?

OrderComment, как и OrderCommission, в библиотеке и сейчас очень медленный (заметно на множественных вызовах). Понятно, что как раз из-за специфики МТ5 (разделение этих данных на 2 сделки).

Может, просто добавить OrderCommentOpen? Ну, или сделать совсем универсальный вариант: OrderCommentOpen, OrderCommentClose и OrderComment, пытающийся эмулировать поведение МТ4.

Я пока задумываюсь о кэше для тяжелых OrderCommission и OrderComment, или для собственного списка сделок, что в моем конкретном случае — суть одно и то же.

 
Andrey Khatimlianskii:

OrderComment, как и OrderCommission, в библиотеке и сейчас очень медленный (заметно на множественных вызовах). Понятно, что как раз из-за специфики МТ5 (разделение этих данных на 2 сделки).

На реал-тайме сказываться не должно.

Может, просто добавить OrderCommentOpen? Ну, или сделать совсем универсальный вариант: OrderCommentOpen, OrderCommentClose и OrderComment, пытающийся эмулировать поведение МТ4.

Возможно, и стоит добавить. Сейчас это можно сделать так (для исторических MT4-ордеров)

string OrderCommentOpen()
{
  return(HistoryDealSelect(OrderTicketOpen()) ? HistoryDealGetString(OrderTicketOpen(), DEAL_COMMENT) : NULL);
}

string OrderCommentClose()
{
  return(HistoryDealSelect(OrderTicket()) ? HistoryDealGetString(OrderTicket(), DEAL_COMMENT) : NULL);
}

Я пока задумываюсь о кэше для тяжелых OrderCommission и OrderComment, или для собственного списка сделок, что в моем конкретном случае — суть одно и то же.

Если делать кэш, то для всей истории. И делать это лучше на основе Generic-библы, наверное. Минус только один - память выжирать будет на VPS.

MQ хорошо поработали над историей в Тестере - быстрой стала. Когда ее ускорили, мысли на тему кэширования ушли (были сырые варианты библы), т.к. не увидел, что получится существенно ускорить. Более того, у меня не получилось придумать ТС для Тестера, в которой бы история торгов серьезно влияла на логику.

Кешировать же для реал-тайма Историю нельзя - она может правиться задним числом. Да и к чему в реал-тайме экономия микросекунд?

 
fxsaber:

На реал-тайме сказываться не должно.

Возможно, и стоит добавить. Сейчас это можно сделать так (для исторических MT4-ордеров)

Если делать кэш, то для всей истории. И делать это лучше на основе Generic-библы, наверное. Минус только один - память выжирать будет на VPS.

MQ хорошо поработали над историей в Тестере - быстрой стала. Когда ее ускорили, мысли на тему кэширования ушли (были сырые варианты библы), т.к. не увидел, что получится существенно ускорить. Более того, у меня не получилось придумать ТС для Тестера, в которой бы история торгов серьезно влияла на логику.

Кешировать же для реал-тайма Историю нельзя - она может правиться задним числом. Да и к чему в реал-тайме экономия микросекунд?

Если правильно понял, то у меня одна ТС работает: в определённое время начинаем входить в рынок по сигналу, в итоге несколько бай и селл, в конце сессии закрываем всё как есть. На следующий день идём по кругу, но лоты уже рассчитываем по истории закрытия последней сессии, то есть лезем в историю и смотрим, закрыли прибыль, или какой-то убыток.
То есть, без доступа к истории - ТС не пригодна к использованию.

 
Vitaly Muzichenko:

Если правильно понял, то у меня одна ТС работает: в определённое время начинаем входить в рынок по сигналу, в итоге несколько бай и селл, в конце сессии закрываем всё как есть. На следующий день идём по кругу, но лоты уже рассчитываем по истории закрытия последней сессии, то есть лезем в историю и смотрим, закрыли прибыль, или какой-то убыток.
То есть, без доступа к истории - ТС не пригодна к использованию.

В той фразе ключевым было слово "серьезно". Понятно, что история торгов может вклиниваться в торговую логику. Вопрос в ТС, которая начинает заметно тормозить в Тестере от обращения к ней.

 
fxsaber:

На реал-тайме сказываться не должно.

Возможно, и стоит добавить. Сейчас это можно сделать так (для исторических MT4-ордеров)

Если делать кэш, то для всей истории. И делать это лучше на основе Generic-библы, наверное. Минус только один - память выжирать будет на VPS.

MQ хорошо поработали над историей в Тестере - быстрой стала. Когда ее ускорили, мысли на тему кэширования ушли (были сырые варианты библы), т.к. не увидел, что получится существенно ускорить. Более того, у меня не получилось придумать ТС для Тестера, в которой бы история торгов серьезно влияла на логику.

Кешировать же для реал-тайма Историю нельзя - она может правиться задним числом. Да и к чему в реал-тайме экономия микросекунд?

Вы как-то показывали код, который ищет на истории похожие "паттерны".

Вот вам и простейшая ТС с глубокой историей:

Смотрим текущую "форму-паттерн" цены за определённое время от "сейчас" до "немного в прошлое (торговый день например)", ищем все похожие паттерны цены на истории, классифицируем их по "степени совпадения", отбираем несколько наиболее совпадающих участков такой "картинки" в истории. Анализируем историю с виртуальными входами-выходами и получаем рекомендации по входам/выходам на текущее состояние. Можно даже назначить по итогам анализа исторических паттернов "вес" для каждой рекомендации.