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

 
fxsaber:

Запустите в тестере mt4orders_exampleexpert.mq5

При написании библиотеки был очень далек от полного осознания всей полноты возможных проблем у пользователей. До Вас у всех все получалось без инструкций.

Лаконичные примеры конвертации советников есть не только в описании библиотеки, но и в обсуждении ее - в комментариях (там даже еще понятней).

Спасибо с ilan1_4_strict.mq4 все получилось, но мои еа выдал 75 errors. Ошибки такова рода:


 
Nauris Zukas:

Спасибо с ilan1_4_strict.mq4 все получилось, но мои еа выдал 75 errors. Ошибки такова рода:


как минимум выкиньте всю графическую часть.

зачем она вам вообще в тестере?

 
ivanivan_11:

как минимум выкиньте всю графическую часть.

зачем она вам вообще в тестере?

Это можно, но остается ещё куча ошибок.
 
Nauris Zukas:

Спасибо с ilan1_4_strict.mq4 все получилось, но мои еа выдал 75 errors. Ошибки такова рода:

В обсуждении говорилось и в описании есть такие слова

Данная работа затрагивает только ордерную систему.

Вопрос возможности создания подобной полной библиотеки, когда MQL4-код может работать в MetaTrader 5 без изменений, не решался.

Внимание!

Библиотека содержится только в одном файле - MT4Orders.mqh. Все остальные файлы приложены для примеров использования библиотеки. Для работы с библиотекой эти файлы не нужны.

При переходе MT4->MT5 самое тяжелое препятствие - новая ордерная система. MT4Orders эту сложность убирает полностью. Остальные различия не носят столь отталкивающий эффект. Поскольку они легко переписываются - есть удобные справочные данные на эту тему. Ну и корректность работы библиотеки была продемонстрирована следующим образом

В качестве примера использования было взято (из кодобазы) несколько MT4/5-советников различных типов: пипсовщики, новостники, мартины, мультивалютники и т.д.

Вот так Вы можете писать на MQL5

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

Ошибки, баги, вопросы

fxsaber, 2016.10.20 15:54

#define SLTP (10 * _Point)

#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>

// Через MT5-Стандартную Библиотеку - only MT5
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT5Order( const double Price )
{
  CTrade Trade;
  
  if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
    Trade.SetTypeFilling(ORDER_FILLING_RETURN);

  Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);

  const ulong Ticket = Trade.ResultOrder();
  
  if (Ticket > 0)
  {
    COrderInfo Order;
    
    if (Order.Select(Ticket))
      Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
  }      
}

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

// Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT4Order( const double Price )
{
  const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
  
  if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}


void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
    
    MT5Order(Price); // Через MT5-Стандартную Библиотеку - only MT5
    MT4Order(Price); // Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
    
    FirstRun = false;
  }
}

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

А как писать под MT5 - каждый сам для себя решает. Я, например, использую MT4Orders и в некоторых редких случаях еще и чистый (СБ имеет слабый функционал) MQL5. Оба стиля написания работают параллельно. Но если писать только через MT4Orders, то ордерная система будет кроссплатформенной. Поэтому практикую написание кода, который без изменений запускается на обеих платформах.

 
fxsaber:

 Поэтому практикую написание кода, который без изменений запускается на обеих платформах.

Спасибо! Наверно придется в дальнейшем тоже о таком варианте думать.
 
void Terminal()
{            
int oldticket=0;
int Ticket=0;
   ArrayResize(Mas_LOT,OrdersTotal(),3);
   ArrayInitialize(Mas_LOT,0); 

   for(int i=0; i <= OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){    
      if (OrderSymbol()==Symbol()&& OrderMagicNumber() == Magik){

      
      Mas_LOT[i][0] = OrderTicket();
      Mas_LOT[i][1] = OrderLots();
      Mas_LOT[i][2] = OrderType();
      Mas_LOT[i][3] = (OrderProfit() + OrderSwap() + OrderCommission());
      Mas_LOT[i][4] = OrderStopLoss();
      Mas_LOT[i][5] = OrderOpenPrice();

      Mas_LOT[i][6] = OrderTakeProfit();

}}}}

Вот например ордерный массив из мт4 - вещь очень полезная и удобная для расчётов например усреднённого тейка/стопа, и этотже массив можно в функции модификации и трала скормить, как его лучше под мт5 переделать с использованием библиотеки MT4Orders.mqh или без неё
 
Aleksey Semenov:
как его лучше под мт5 переделать с использованием библиотеки MT4Orders.mqh
Добавить
#include <MT4Orders.mqh>
 
Пример кроссплатформенности

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

Новая версия платформы MetaTrader 5 build 1525: Представление истории в виде позиций и улучшение тестера

fxsaber, 2017.01.27 19:20

Запускаем кроссплатформенный скрипт

// MQL4&5-code

#property strict

#include <MT4Orders.mqh>

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && (OrdersTotal() == 0) &&
      (OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0) > 0))
  {
    const double Lots[] = {0.6, 0.3, 0.1};
    
    for (int i = 0; i < ArraySize(Lots); i++)    
      if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick))
        OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);

    const int Total = OrdersHistoryTotal();
    
    for (int i = 0; i < Total; i++)
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        OrderPrint();  
  }
}

Сначала на MT5-Hedge. Получаем такую симпатичную MT4-распечатку

#114769046 2017.01.27 19:57:25 balance 0.00  1 0 0 2017.01.27 19:57:11 0 0.00 0.00 50000.00 0
#114769087 2017.01.27 19:57:25 buy 0.60 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -5.40 0
#114769088 2017.01.27 19:57:25 buy 0.30 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -2.70 0
#114769089 2017.01.27 19:57:25 buy 0.10 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:26 1.06829 0.00 0.00 -0.90 0

и классический отчет

Ордера
Время открытияОрдерСимволТипОбъемЦенаS / LT / PВремяСостояниеКомментарий
2017.01.27 19:57:25131208025EURUSDbuy1.00 / 1.001.068382017.01.27 19:57:25filled
2017.01.27 19:57:25131208027EURUSDsell0.60 / 0.601.068292017.01.27 19:57:25filled
2017.01.27 19:57:25131208030EURUSDsell0.30 / 0.301.068292017.01.27 19:57:25filled
2017.01.27 19:57:26131208031EURUSDsell0.10 / 0.101.068292017.01.27 19:57:26filled
Сделки
ВремяСделкаСимволТипНаправлениеОбъемЦенаОрдерКомиссияСвопПрибыльБалансКомментарий
2017.01.27 19:57:11114769046balance0.000.0050 000.0050 000.00
2017.01.27 19:57:25114769085EURUSDbuyin1.001.068381312080250.000.000.0050 000.00
2017.01.27 19:57:25114769087EURUSDsellout0.601.068291312080270.000.00-5.4049 994.60
2017.01.27 19:57:25114769088EURUSDsellout0.301.068291312080300.000.00-2.7049 991.90
2017.01.27 19:57:26114769089EURUSDsellout0.101.068291312080310.000.00-0.9049 991.00

  

В качестве подтверждения, запускаем этот же скрипт на MT4.

Классический MT4-отчет

Closed Transactions:
TicketOpen TimeTypeSizeItemPriceS / LT / PClose TimePriceCommissionTaxesSwapProfit
1700392462017.01.27 20:00:41balanceDeposit50 000.00
1700392872017.01.27 20:00:57buy0.60eurusd1.068540.000000.000002017.01.27 20:00:571.068360.000.000.00-10.80
  to #170039289
1700392892017.01.27 20:00:57buy0.30eurusd1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-5.40
  to #170039290
1700392902017.01.27 20:00:57buy0.10eurusd1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-1.80
  from #170039289

И распечатка лога скипта

#170039246 2017.01.27 20:00:41 balance 0.01  0 0 0 2017.01.27 20:00:41 0 0.00 0.00 50000.00 Deposit 0
#170039287 2017.01.27 20:00:57 buy 0.60 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:57 1.06836 0.00 0.00 -10.80 to #170039289 0
#170039289 2017.01.27 20:00:57 buy 0.30 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -5.40 to #170039290 0
#170039290 2017.01.27 20:00:57 buy 0.10 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -1.80 from #170039289 0

Хорошо видно, что лог скрипта в MT4 и MT5 совпадает - кроссплатформенность пашет.

 

ЗЫ Если логику скрипта написать под MT5 через СБ, то работать корректно скрипт не сможет. В общем, даже сложно сказать, как на MT5 написать такую простую MQL4-логику.

 

не работает выбор по символу и маджику

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

 не работает OrderSelect  не выбирает ордер (тикет по индексу) для работы с ним, простой пример во вложении и он не работает на мт5 почему-то

Файлы:
Причина обращения: