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

 
fxsaber #:

Вы используете какое-то древнее, наспех собранное решение.

Много раз пожалел, что выложил его, т.к. оно никакого отношения к MT4Orders не имеет. Просто шло в довесок к примерам. Какой там был заложен смысл - уже не помню. Вникать не хочется.


Вспомнил, что более продуманное решение "конвертации" делал тут.

Сам использую MT4Style только в Order-функциях. Абсолютно не конвертирую остальные штатные MT4-функции для своих работ и вижу такой вариант костыльным. Рекомендую маржинальные функции писать на родных функциях, без попыток конвертации. Посмотрел свой класс по работе с маржой - приличный по размеру mqh-файл. И это только обычный Forex.

Просто у меня задача была сделать компилируемый код для MT4 и MT5 по функциям логики советника, а сам обвес, связанный с окружениям и работой с ордерами преобразовал уже с помощью выше обознавченных инклюдников, или выносил отдельно функции и перерабатывал их под каждую платформу. Проект получился большой, и мне очень помогло Ваше решение, спасибо за труд.

Ошибка у меня оказалось в другом - не верно определялся минимальный размер лота, тут добавил флаги, ранее обход делал без учета Вашего кода (иди MQL4_To_MQL5.mqh не Ваш код?) - компилировалось, но не до конца правильно работало.

#define MODE_BID 9
#define MODE_ASK 10
#define MODE_DIGITS 12
#define MODE_SPREAD 13
#define MODE_STOPLEVEL 14
#define MODE_LOTSIZE 15

#define MODE_POINT 11
#define MODE_TICKVALUE 16
#define MODE_TICKSIZE 17

#define MODE_MAXLOT 18
#define MODE_MINLOT 19
#define MODE_LOTSTEP 20

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));

      case MODE_POINT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_POINT));
       case MODE_TICKVALUE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_SIZE));
      case MODE_TICKSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_VALUE));                 
      case MODE_MAXLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MAX));  
      case MODE_MINLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MIN));  
      case MODE_LOTSTEP:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_STEP));                    
     }

   return(-1);
  }
 
Aleksey Vyazmikin #:

или MQL4_To_MQL5.mqh не Ваш код?

Мой, но совсем давний. Лучше подсмотреть в кимовский mqh, там по MarketInfo более продуманное решение.

 
fxsaber #:

Мой, но совсем давний. Лучше подсмотреть в кимовский mqh, там по MarketInfo более продуманное решение.

Спасибо, посмотрю, пока вроде как работает, продолжу тестировать.

 
fxsaber #:

Особенность представления библиотекой закрытых позиций по сравнению с MT5.


Торговая ситуация.

  1. Открыт BuyLimit на 1 лот.
  2. BuyLimit исполнился частично на 0.4 лота в 12:00.
  3. Позиция на 0.4 лота закрылась в 13:00.
  4. Остаток BuyLimit исполнился - 0.6 лота в 14:00.
  5. Позиция на 0.6 лота закрылась в 15:00.

MT5 покажет, что была одна позиция, которая открылась в 12:00, а закрылась в 15:00. При этом цены открытия/закрытия этой позиции могут быть очень странными.


MT4Orders покажет, что было две позиции: одна открылась в 12:00 и закрылась в 13:00, другая - 14:00-15:00. Цены открытия/закрытия будут адекватными.

Демонстрация реальных ситуаций подобного.

Частичное исполнение.
Частичное исполнение.
  • www.mql5.com
На рынке случаются различные эпизоды с исполнением торговых ордеров. Наверное, важно уметь быстро разобраться в той или иной торговой ситуации. MT5 сохраняет довольно много информации в истории
 
Работа функции OrderCommission() на примере.
 
В таблице исторических MT4-ордеров закрытые позиции гарантированно отсортированы по времени закрытия. Удаленные отложенные ордера - нет.
 
Прошу помочь выявить ошибку в расчете комиссии. Для этого на любых доступных торговых счетах нужно запустить этот скрипт.
// Вычисление и сравнение суммарных комиссии/свопа/прибыли через MT4/MT5-Style.

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh>

#define TOSTRING(A) (#A + " = " + DoubleToString(A, 2))
#define PRINT(A, B) Print(TOSTRING(A) + ", " + TOSTRING(B) + ", " + (string)!NormalizeDouble((A) - (B), 2))

// MT4-Style
void Calc_MT4( double &Commission, double &Swap, double &Profit )
{
  Commission = 0;
  Swap = 0;
  Profit = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Commission += OrderCommission();
      Swap += OrderSwap();
      Profit += OrderProfit();
    }
}

// MT5-Style
void Calc_MT5( double &Commission, double &Swap, double &Profit )
{
  Commission = 0;
  Swap = 0;
  Profit = 0;
  
  if (HistorySelect(0, INT_MAX))  
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (HistoryDealGetInteger(Ticket, DEAL_TYPE) <= DEAL_TYPE_SELL)
      {
        Commission += HistoryDealGetDouble(Ticket, DEAL_COMMISSION);
        Swap += HistoryDealGetDouble(Ticket, DEAL_SWAP);
        Profit += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
      }
    }
}

void OnStart()
{
  if (PositionsTotal())
    MessageBox("The script works when there are no open positions.");
  else
  {
    double Commission_MT4, Swap_MT4, Profit_MT4;
    double Commission_MT5, Swap_MT5, Profit_MT5;
    
    Calc_MT4(Commission_MT4, Swap_MT4, Profit_MT4); // MT4-Style
    Calc_MT5(Commission_MT5, Swap_MT5, Profit_MT5); // MT5-Style
    
    PRINT(Commission_MT4, Commission_MT5);
    PRINT(Swap_MT4, Swap_MT5);
    PRINT(Profit_MT4, Profit_MT5);
  }
}


Он выдаст нечто подобное.

Commission_MT4 = -15591.12, Commission_MT5 = -15591.12, true
Swap_MT4 = -5948.77, Swap_MT5 = -5948.77, true
Profit_MT4 = 34851.13, Profit_MT5 = 34851.13, true


В случае, если в выделенном месте будет false, дайте знать. Спасибо.

 
2023.01.02 13:23:28.780 fxsaber_test (EURCHF,H1)        Commission_MT4 = -2875.33, Commission_MT5 = -2875.29, false
2023.01.02 13:23:28.835 fxsaber_test (EURCHF,H1)        Swap_MT4 = -1051.56, Swap_MT5 = -1051.56, true
2023.01.02 13:23:28.835 fxsaber_test (EURCHF,H1)        Profit_MT4 = 7198.08, Profit_MT5 = 7198.08, true
 
Enrique Dangeroux #:

Вы уверены, что компилировали с этой строкой?

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

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

fxsaber, 2023.01.02 12:24

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
EX5 из телеграма выдает false?
 
Скомпилировано копипастом 1:1, за исключением пропущенных точек с запятой после Swap = 0.