Форум трейдеров » Психология торговли и методы управления капиталом » Управление капиталом - Программы и библиотеки
+ Подписаться
  1. Управление капиталом - Программы и библиотеки

    Добрый день, уважаемые форумчане!

    Этим постом я открываю ветку, посвященную различным программам и подключаемым библиотекам, помогающим в работе с ММ.

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

    Среднее геометрическое считается по формуле:
    Код:
    P=P*(1+f*(-deals[i]/Worst))
    , где
    deals[] - массив сделок в пипсах
    Worst - максимальный убыток в пипсах
    f - доля счета, которой мы рискуем в сделке


    Оптимальное F ищется только в режиме теста советника путем перебора значений (заранее предсказать "оптимальное F" не получится, можно только предполагать :) )

    Для подключения библиотеки нужно:
    1) Скопировать файл optimalf.mqh в папку ../Broco Trader/experts/include
    2) Вставить в начало своего эксперта
    Код:
    #include <optimalf.mqh>
    3) Удалить в своем эксперте функцию deinit(). Причем полностью. Обычно там никаких функций нет, если там что-то есть - обращайтесь в личку - помогу.
    Функция обычно имеет такой вид (удалить все, включая скобки, и все что внутри):
    Код:
    void deinit() 
       {      
          
       }
    3) Для работы библиотеки нужно вставить GetLots() в функции выставления ордеров в своем эксперте (в функции OrderSend()) там, где должен стоять размер лота. Пример:
    Код:
    OrderSend(Symbol(),OP_BUY,GetLots(),Ask,3,0,0,NULL,magic,0,Red);
    Для штатной работы эксперта (без поиска "оптимального F") нужно всего лишь убрать GetLots() из кода и исключить #include <optimalf.mqh>, и все будет работать по прежнему.

    Вуаля! После тестирования эксперта выскочит окно с искомой информацией, также информация дублируется в закладке "Журнал". В случае, если эксперт получил убыток, то, конечно же, об оптимальном F не может быть и речи :D

    Пожелания и дополнения приветствуются.

    Код (файл целиком можно скачать ниже):
    PHP код:
    //+------------------------------------------------------------------+
    //|                                                     optimalf.mqh |
    //|              Алексей Кияница (special thanks for Anton Trefolev) |
    //+------------------------------------------------------------------+
    //######################################################################################################################################
    #property copyright "Алексей Кияница"
    #property link      "http://www.procapital.ru/forumdisplay.php?f=387"
    #include <WinUser32.mqh>
    #import "user32.dll"
    int     MessageBoxA(int hWnd ,string szText,string szCaption,int nType);
    //######################################################################################################################################
    extern double    Worst=0;        // максимальный убыток в пунктах
    extern bool      MMoff=true;      // Фиксированный объем сделок
    extern double    F=0.1;             // доля, в случае MMoff=true
    //######################################################################################################################################
    double deals[];
    //################################################Среднее геометрическое################################################################
    double GMean (double deals [], double f)
    {
       
    double N ArraySize (deals) ;
       
    double Worst deals [ArrayMinimum (deals)];
       
    double P ;
       
       if (
    Worst == 0) return (1);
       
       for (
    int i=0i<Ni++)
          {
             
    P*=1+f*(-deals[i]/Worst);
          }      
       return (
    MathPow(P1/N)); 
    }
    //##################################################Оптимальное F#######################################################################   
    double OptimalF (double deals [])
    {
       
    double mean [2] ;
       
    double f ;

       
    0.5 ;
       
    mean [0] = GMean (dealsf) ;
       
    mean [1] = GMean (deals0.01) ;

       if (
    mean [1] > mean [0])
          while (
    mean [1] > mean [0])
             { 
                
    mean [0] = mean [1] ; 
                
    0.01 
                
    mean [1] = GMean (deals0.01) ; 
             }
       else
          while (
    mean [0] > mean [1])
             { 
                
    mean [1] = mean [0] ;
                
    0.01 
                
    mean [0] = GMean (dealsf) ; 
             
                if (
    0.02)
                   break ; 
             }

       if (
    mean [1] > mean [0]) 
          {
             
    mean [0] = mean [1] ;
             
    f+= 0.01 ;
          }

       if (
    == 0.02)
          { 
             

             
    mean [0] = 
          }
       return (
    f) ;
    }
    //#######################################################Убыток в пунктах###############################################################
    int PipsProfit (int ticket)
    {
       if (
    OrderSelect (ticketSELECT_BY_TICKET))
          switch (
    OrderType ())
             {
                case 
    OP_BUY:  return (NormalizeDouble ((OrderClosePrice () - OrderOpenPrice ()) / Point0)) ;
                case 
    OP_SELL: return (NormalizeDouble ((OrderOpenPrice () - OrderClosePrice ()) / Point0)) ;
             }
          
       return (
    0) ;
    }
    //######################################################################################################################################
    int Worst (double deals [])
    {
       return (
    deals [ArrayMinimum (deals)]) ;
    }
    //######################################################################################################################################
    int deinit ()
    {
       
    int total OrdersHistoryTotal () ;
       
       if (
    total 0)
       {
          
    ArrayResize (dealstotal) ;
          
          for (
    int i 0total++)
          {
             
    OrderSelect (iSELECT_BY_POSMODE_HISTORY) ;
             
    deals [i] = PipsProfit (OrderTicket ()) ;
          }
                                
          if (
    OptimalF (deals) > 0.01)
             {  
                
    MessageBoxA(NULL,StringConcatenate ("Наихудшая сделка в пунктах  = "DoubleToStr (Worst (deals), 0),
                    
    "\nСреднее геометрическое      = "DoubleToStr (GMean (dealsOptimalF (deals)), 4),
                    
    "\nОптимальное F = "DoubleToStr (OptimalF (deals), 2),
                    
    "\nКоличество сделок  = "ArraySize (deals)), "Optimal F"MB_OK);  
                    
                Print (
    "") ;
                Print (
    "Наихудшая сделка в пунктах = "DoubleToStr (Worst (deals), 0));
                Print (
    "Среднее геометрическое = "DoubleToStr (GMean (dealsOptimalF (deals)), 4));
                Print (
    "Оптимальное F = "DoubleToStr (OptimalF (deals), 2));
                Print (
    "Количество сделок = "ArraySize (deals));     
             
             }
          else  
             {
                Print (
    "Оптимальное F = 0.00");
                
    MessageBoxA(NULL,"Оптимальное F = 0.00""Optimal F"MB_OK);
             }
       }
    }
    //######################################################################################################################################
    double GetLots ()
    {
       
    double Margin     MarketInfo (Symbol (), MODE_MARGINREQUIRED);
       
    double FreeMargin AccountFreeMargin ();
       
    double Balance    AccountBalance ();
       
    double TickValue  MarketInfo(Symbol (), MODE_TICKVALUE);
       
       
       if (
    MMoff) return (F);
          
       if (
    Worst >= || 0.1 || 1.0 || IsTesting())  return (0.1) ;
          
       return (
    MathMin ((FreeMargin/Margin  0.1), (NormalizeDouble (Balance/((-Worst*TickValue)/F), 2) ))) ;
    }
    //###################################################################################################################################### 
    Вложения Вложения
    Недоступно! Pro 0
    Поделиться
    Просмотров: 9,438
  2. По поводу возможных ошибок, так же - в личку.
  3. Итак, продолжим.

    Один из рекомендованных мной подключаемых модулей - mt4mm. На нашем форуме обсуждается в этой ветке - http://www.procapital.ru/showthread.php?t=8999.
    Чтобы не прыгать туда-сюда, выложу все файлы для работы здесь.
    Скриншот:

    Описание:
    Подключаемый модуль (plugin) для МТ4, который в интерактивном режиме позволяет расчитать размер лота по выбранному инструменту в зависимости от текущего баланса (или эквити) и лимита потерь, а затем выставить с указанными параметрами ордер (или несколько ордеров одновременно для одного инструмента).

    Скачать плагин mt3mm rc 5
    Скачать системную библиотеку - если модуль не запускается, выдавая ошибку 126.

    Мои комментарии:
    Отличный инструмент для повседневной работы. Можно поставить значения SL, TP и после нажатия кнопки Ок, ордер исполнится, а позже автоматически установятся значения SL и TP. Также ордеру можно присвоить Magic Number, что невозможно при ручном выставлении ордеров. Плюс ко всему визуальная наглядность все параметров - на высоте. Жаль, что автор прекратил поддержку плагина.

Вверх
РегистрацияX

чтобы писать, читать, комментировать