MT5 стал доступен в Финам - страница 26

 
Reks13 #:
В финаме или БКС реально прописать комиссию для тестера стратегий

для Финама вставьте к себе в эксперта код (по главным функциям). В тестере комиссия будет списываться после каждой сделки. Настроено на акции и фьючерсы на акции МОЕКС под мой тариф.

Код ужал как смог...

ENUM_SYMBOL_CALC_MODE type_symbol;
double min_volume;
double tick_value;
double tick_size;
double con_size;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   long tmp_type=0;
   if(!SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE,tmp_type))
      return(INIT_FAILED);

   type_symbol = (ENUM_SYMBOL_CALC_MODE)tmp_type;

   if(!SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN,min_volume))
      return(INIT_FAILED);

   if(!SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE,tick_size))
      return(INIT_FAILED);

   if(!SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE,tick_value))
      return(INIT_FAILED);

   if(!SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE,con_size))
      return(INIT_FAILED);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//Списываем комиссию со счета в тестере
   if(MQLInfoInteger(MQL_TESTER))
     {
      //--- если транзакция не является результатом добавления сделки в историю - завершаемся
      if((ENUM_TRADE_TRANSACTION_TYPE)trans.type!=TRADE_TRANSACTION_DEAL_ADD)
         return;

      if(trans.symbol != _Symbol)
         return;

      if(trans.deal_type != DEAL_TYPE_BUY && trans.deal_type != DEAL_TYPE_SELL)
         return;

      
      /*    ulong magic = (ulong)HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
            if(magic != m_magic)
               return;*/
      

      // если всё же сделка - начинаем процедуру списания комиссии
      if(!HistoryDealSelect(trans.deal))
         return;

      datetime deal_time = datetime(HistoryDealGetInteger(trans.deal, DEAL_TIME));
      long ticket_order = HistoryDealGetInteger(trans.deal, DEAL_ORDER);
      datetime time_order = datetime(HistoryOrderGetInteger(ticket_order,ORDER_TIME_SETUP));

      double commission=0;

      //сравниваем время сделки и время ордера - если разница менн 2 сек - вход по рынку
      if(deal_time>time_order+2)
         commission = Comission(trans.price, trans.volume,true);
      else
         commission = Comission(trans.price, trans.volume,false);

      if(commission>0)
         TesterWithdrawal(commission);
     }
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(AccountInfoDouble(ACCOUNT_BALANCE));
  }
//+------------------------------------------------------------------+
//|Возвращяет комиссию                                               |
//+------------------------------------------------------------------+
double Comission(double _price,
                 double _volume,
                 bool flag_limit=true) //по умолчанию сделка мейкера
  {
   double commission=0;

   switch(type_symbol)
     {
      case(SYMBOL_CALC_MODE_EXCH_STOCKS):  //Акция (0,035% + 0,02 % от оборота = 0,055%)
        {
         commission=(0.035+0.02)*_price*con_size*_volume/100; //комиссия брокера и биржи
         break;
        }
      case(SYMBOL_CALC_MODE_EXCH_FUTURES):  //Фьючерс на акции
        {
         commission=0.45*_volume/min_volume; //комиссия брокера

         if(!flag_limit)
            commission+=_volume*0.01*(0.011385+0.008415)*_price*tick_value/tick_size; //https://www.moex.com/s93#komiss1
         break;
        }
     }
   return(commission);
  }
Reks13 #:
В финаме эквити не показывает. Прыгает только зеленая шкала баланса. Кто то победил это?

Не уверен, что такое поведение возможно исправить. Так настроены символы брокера. В тестере корректно только значение баланса.

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

 
Reks13 #:
В финаме или БКС реально прописать комиссию для тестера стратегий?  В БКС тестер работает и эквити показывает, но комиссию как не крутил, никак не учитывает. В финаме эквити не показывает. Прыгает только зеленая шкала баланса. Кто то победил это?

Комиссия учитывается точно также, как и в Открытии. Эквити не победить.

 
Пытаюсь рассчитать маржу стандартной функцией OrderCalcMargin по акциям и фьючам. Вмегда получается равной нулю. Как это лечится?

Проверял на Сбере и фьюче SiH3.
 
inetstar #:
Пытаюсь рассчитать маржу стандартной функцией OrderCalcMargin по акциям и фьючам. Вмегда получается равной нулю. Как это лечится?

Проверял на Сбере и фьюче SiH3.

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

Некорректный расчет ГО (из-за новых изменений в риск-параметрах биржи)

Andrey Miguzov, 2022.06.09 02:45

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

По Финаму проверял - МТ5 учитывает и проверяет так же как в скрипте. 

По Открытию постараюсь завтра проверить - там по фьючерсу есть различия между рыночными и лимитными ордерами. Видится, что МТ5 проверяет при открытии позиции средства по рыночному, а не по лимитному.

 

Вот эта картинка теперь у меня выглядит так:

Запущен у брокера JSC Investment Company FINAM на символе EDZ2
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES
Минимальный лот: 1.00
Для покупки необходимо: 10386.86
Для продажи необходимо: 10837.91

Запущен у брокера JSC Investment Company FINAM на символе EDM2
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES
Минимальный лот: 1.00
Для покупки необходимо: 7729.22
Для продажи необходимо: 8045.21

Запущен у брокера JSC Investment Company FINAM на символе EDU2
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES
Минимальный лот: 1.00
Для покупки необходимо: 8588.08
Для продажи необходимо: 8901.28

Скрипт:

//+--------------------------------------------------------------------------+
//| Скрипт показывает размер необходимых средств для открытия позиции
//+--------------------------------------------------------------------------+
void OnStart()
  {
   double initial_margin = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL);

   double k_initial_margin_buy = 0;
   double k_maintenance_margin_buy = 0;

   double k_initial_margin_sell = 0;
   double k_maintenance_margin_sell = 0;

   SymbolInfoMarginRate(_Symbol, ORDER_TYPE_BUY, k_initial_margin_buy,k_maintenance_margin_buy);
   SymbolInfoMarginRate(_Symbol, ORDER_TYPE_SELL, k_initial_margin_sell,k_maintenance_margin_sell);

   double price_buy = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double price_sell = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if (price_buy<DBL_EPSILON || price_sell<DBL_EPSILON)
   {
   MqlRates rates[1];
   CopyRates(_Symbol,PERIOD_CURRENT,0,1,rates);
   price_buy = rates[0].close;
   price_sell = rates[0].close;
   }

   double contract_size = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);

   double min_lot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);

   string broker_name= TerminalInfoString(TERMINAL_COMPANY);

   double margin_buy=0;
   double margin_sell=0;

   ENUM_SYMBOL_CALC_MODE type_symbol = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE);

   if(broker_name=="JSC Investment Company FINAM")
     {
      if(type_symbol==SYMBOL_CALC_MODE_EXCH_STOCKS)
        {
         margin_buy = price_buy*contract_size*k_initial_margin_buy;
         margin_sell = price_sell*contract_size*k_initial_margin_sell;
         
      /* //Ещё один вариант
         if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,min_lot,price_buy,margin_buy))
         Print("Ошибка в OrderCalcMargin!");
         
         if(!OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,min_lot,price_sell,margin_sell))
         Print("Ошибка в OrderCalcMargin!");       */      
        }

      if(type_symbol==SYMBOL_CALC_MODE_EXCH_FUTURES)
        {
         margin_buy = initial_margin*k_initial_margin_buy;
         margin_sell = initial_margin*k_initial_margin_sell;                       
        }
      }
      
   if(broker_name=="АО ''Открытие Брокер''")
     { 
      if(type_symbol==SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX)
        {
         margin_buy = price_buy*contract_size*1.0;
         margin_sell = price_sell*contract_size*1.0;
        }
     
      if(type_symbol==SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS)
        {
         if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,min_lot,price_buy,margin_buy))
         Print("Ошибка в OrderCalcMargin!");
         
         if(!OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,min_lot,price_sell,margin_sell))
         Print("Ошибка в OrderCalcMargin!");
        }
     }      

   Print("--------------- Старт работы скрипта " + MQLInfoString(MQL_PROGRAM_NAME) +  " -----------------");
   Print("Запущен у брокера ", broker_name," на символе ", _Symbol);
   Print("Cпособ вычисления величины залоговых средств: ", EnumToString(type_symbol));
   Print("Минимальный лот: ", DoubleToString(min_lot, 2));
   Print("Для покупки необходимо: ", DoubleToString(margin_buy, 2));
   Print("Для продажи необходимо: ", DoubleToString(margin_sell, 2));
   Print("+++++++++++++++ Завершение работы скрипта " + MQLInfoString(MQL_PROGRAM_NAME) +  " ++++++++++++");
  }

Добавлено:

Уже после того как выложил, наткнулся на раздел в справке:

Для акций

Для фьючерсов

Там подробно с примерами всё разжёвано, раньше не видел...

Вот от этого сообщения в теме прочитайте ещё 3 сообщения ниже - очень подробно расписывал.

Единственно, чтобы скрипт работал - проверьте имя брокера в вашем терминале - зависит от того, каким терминалом пользуетесь

 

2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    --------------- Старт работы скрипта MarginCalc -----------------
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Запущен у брокера АО ''Открытие Брокер'' на символе RTS-3.23
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_OPTIONS
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Минимальный лот: 1.00
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Для покупки необходимо: 49596.28
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Для продажи необходимо: 50067.14
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    +++++++++++++++ Завершение работы скрипта MarginCalc ++++++++++++


 
JRandomTrader #:

2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    --------------- Старт работы скрипта MarginCalc -----------------
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Запущен у брокера АО ''Открытие Брокер'' на символе RTS-3.23
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_OPTIONS
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Минимальный лот: 1.00
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Для покупки необходимо: 49596.28
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    Для продажи необходимо: 50067.14
2023.01.19 12:45:21.896    MarginCalc (RTS-3.23,M15)    +++++++++++++++ Завершение работы скрипта MarginCalc ++++++++++++

Как раз видно из скрина и логов - насколько при входе "по рынку" нужно больше средств, чем при входе лимитиком по цене, близкой к текущей. 

Если ORDER_TYPE_BUY поменять на ORDER_TYPE_BUY_LIMIT - будут числа, почти такие как на картинке.

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

По поводу способа вычисления величины залоговых средств в ошибках на форуме писал - некорректно  EnumToString() работает. На самом деле SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS, а не SYMBOL_CALC_MODE_EXCH_OPTIONS. В отладчике если запустить - видно будет.

 
Есть ли у Финама способ получить дату экспирации фьючерса? SymbolInfoInteger("SiH3", SYMBOL_EXPIRATION_TIME) возвращает 0.
 
Ребят, интересует возможность торговать на мосбирже через МТ5 на демо счёте. В финам сказали, что демо счёт завести у них нельзя. Есть ли какие-то обходные пути зарегить демо счёт в МТ5 финам? Может знает кто. Либо может кто знает, другого брокера, где можно завести демо и трейдить на Рос. акциях в МТ5 или МТ4 даже.
 
tuviran #:
Ребят, интересует возможность торговать на мосбирже через МТ5 на демо счёте. В финам сказали, что демо счёт завести у них нельзя. Есть ли какие-то обходные пути зарегить демо счёт в МТ5 финам? Может знает кто. Либо может кто знает, другого брокера, где можно завести демо и трейдить на Рос. акциях в МТ5 или МТ4 даже.
В Открытии демо-счета есть.
 
Dmitriy Skub #:
В Открытии демо-счета есть.

знал бы зараенее, сразу бы там был а не по теме

причем прогу писал на реале на  свой страх и риск, т.к. тоже не в курсе что демка есть

Причина обращения: