Прошу помощь в связи с переходом в Финам

 

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

Вторая проблема - робот несколько лет исправно работавший в БКС и Открытии перестал открывать ШОРТЫ. В журнале пишет "invalid stops" . Величины котировок, стопов и профитов при этом корректные. ЛОНГИ при идентичном коде открываются нормально без ошибок.

         double sl=m_symbol.Bid()+ExtStopLoss;
         double tp=m_symbol.Bid()-ExtTakeProfit;
       OpenSell(sl,tp,ExLots);
         if(InpLots==Pos_volume || maxlots==0) {Trade_eneble=0;}
        return;
//+------------------------------------------------------------------+
//| Open Sell position                                               |
//+------------------------------------------------------------------+
void OpenSell(double sl,double tp,double lots)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

   lots=ExLots;
   if(lots==0.0)
      return;
//
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
   double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),lots,m_symbol.Bid(),ORDER_TYPE_SELL);

   if(check_volume_lot!=0.0)
      if(check_volume_lot>=lots)
        {
         if(m_trade.Sell(lots,NULL,m_symbol.Bid(),sl,tp))
           {
            if(m_trade.ResultDeal()==0)
              {
               Print("Sell -> true. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription());
              }
            else
              {
               Print("Sell -> false. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription());
              }
           }
         else
           {
            Print("Sell -> true. Result Retcode: ",m_trade.ResultRetcode(),
                  ", description of result: ",m_trade.ResultRetcodeDescription());
           }
        }
  }
 
возвращаемое значение orderSend должно быть проверено. Как????
 
KENT3004:

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

                double K1,K2=0;
                if (!SymbolInfoMarginRate(_Symbol,ORDER_TYPE_BUY,K1,K2)) Print ("Проблемы с коэффициентами маржи");
                if (K1<=0 || K1>1) K1=1;

Вам нужен K1. Если он равен 1, значит вы рассчитываете на покупку по номиналу.

 

На фьючерсах К1 был равен 1 в БКС и Открытии, поэтому этот коэффициент был не нужен. Номинал там был указан уже с учетом ГО. У Финам  значение коэффициента маржи на фьючерсах обычно в пределах 0.15-0.25, вот его и не удается никак получить.

Не все так просто. Эта функция может быть расположена только в "global" или в обозначенном разделе. Скорее всего именно с этим связано, что никак не получается получить абсолютное значение. 

Rukhzoramo Qurbonnazarova #:

Проблема с ордерами ШОРТ была из разряда "сам дурак". Хорошо, что редко так "клинит" мозги.

 

Вы бы привели что-ли логи, что возвращает SymbolInfoMarginRate и SymbolInfoDouble(...SYMBOL_MARGIN...), потому что заявления типа "к результату не привели" слишком неопределенные.

Также есть функция OrderCheck, которая в структуре MqlTradeCheckResult возвращает маржу.

 
KENT3004 #:

На фьючерсах К1 был равен 1 в БКС и Открытии, поэтому этот коэффициент был не нужен. Номинал там был указан уже с учетом ГО. У Финам  значение коэффициента маржи на фьючерсах обычно в пределах 0.15-0.25, вот его и не удается никак получить.

Не все так просто. Эта функция может быть расположена только в "global" или в обозначенном разделе. Скорее всего именно с этим связано, что никак не получается получить абсолютное значение. 

Проблема с ордерами ШОРТ была из разряда "сам дурак". Хорошо, что редко так "клинит" мозги.

Если не затруднит, запустите советничка. Там разные варианты расчёта маржи, интересно узнать есть ли среди них правильный для финама.

Файлы:
Margin.mq5  24 kb
 

Во блин. Пропала возможность править коммент. Жаль.

Дополнение к посту выше, в открывашке правильно показывал маржу на фьючерсах, пятый вариант.

Счёта в финаме у меня пока ещё нет.


Ага ещё и сов не правильный прикрепился, но теперь не поменять.

Вот этот вроде правильный.


P.S. Мне уже написали, что всё не правильно :(

Файлы:
Margin.mq5  27 kb
 

Это все не то.  Имеем вот такой расчет возможного количества лотов при котором  не надо следить за средствами. Количество контрактов открывается в зависимости от состояния счета и свободных средств. Недостаток в том, что InpGO приходится в начале торгового дня вводить вручную, а величина эта динамическая и может в течении этого дня меняться. Единственная функция имеющая доступ к "коэффициенту маржи" это SymbolInfoMarginRate, имеющая специфические требования к использованию. Вот с этим мне и не удается справиться. Результат желательно видеть визуально в момент инициализации робота, а уж динамическое изменение рассчитывать при каждом открытии сделки. Такой расчет был бы универсален для всех брокеров и рынков где используется "гарантийное обеспечение".

InpLots - макс. количество заданное пользователем

Pos_volume - открыто контрактов


       double One_Lots = MathFloor(SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL)); // начальная маржа для открытия 1 лота

// --- Расчет максимального размера лота

       double Free = AccountInfoDouble(ACCOUNT_MARGIN_FREE);   //свободные средства   

       double maxlots = MathFloor(NormalizeDouble(Free*InpRisk/100/(One_Lots*InpGO),2)); //где InpRisk - ограничение в % используемых средств, InpGO - коэфф. маржи.

     if(total==0)

       {

           if(InpLots<maxlots)

             {ExLots=InpLots;}   

           if(InpLots>=maxlots)

             {ExLots=maxlots;}

       }

     if(Buy_opened)

       {

           if((InpLots<=Pos_volume) || (maxlots<1))  

             {ExLots=0;}

           if(InpLots>Pos_volume && maxlots>=1 && maxlots<=(InpLots-Pos_volume))

             {ExLots=maxlots;}         

           if(InpLots>Pos_volume && maxlots>=1 && maxlots>(InpLots-Pos_volume))

             {ExLots=InpLots-Pos_volume;}

       }

     if(Sell_opened)

       {

           if((InpLots<=Pos_volume) || (maxlots<1)) 

             {ExLots=0;}

           if(InpLots>Pos_volume && maxlots>=1 && maxlots<=(InpLots-Pos_volume))

             {ExLots=maxlots;}         

           if(InpLots>Pos_volume && maxlots>=1 && maxlots>(InpLots-Pos_volume))

             {ExLots=InpLots-Pos_volume;}           

       }



 
KENT3004 #:

 Единственная функция имеющая доступ к "коэффициенту маржи" это SymbolInfoMarginRate, имеющая специфические требования к использованию.

Что в ней специфического?


Ещё такой вопрос, ГО в открывашке и в финаме было одинаковое?

 
Aleksandr Slavskii #:

Что в ней специфического?


Ещё такой вопрос, ГО в открывашке и в финаме было одинаковое?

ориентир по ГО находится не у брокера, а на сайте Мосбиржи

если что то не так, можно смело задавать вопрос брокеру на тему - почему не совпадает?

 
Stanislav Korotky #:

Вы бы привели что-ли логи, что возвращает SymbolInfoMarginRate и SymbolInfoDouble(...SYMBOL_MARGIN...), потому что заявления типа "к результату не привели" слишком неопределенные.

Также есть функция OrderCheck, которая в структуре MqlTradeCheckResult возвращает маржу.

Ничего не возвращает. Даже корректно расположить и написать SymbolInfoMarginRate что бы не выдавало ошибок не получается. С SymbolInfoDouble и "начальной маржой" проблем нет.

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