Ищу функцию вычисления размера лота.

 

Очень хочется иметь функцию для вычисления размера лота в зависимости от заданного размера стоплосса и суммы в валюте депозита.

Например перед входом в сделку вычисляем стоплосс, допустим он равен 50 пунктов и желаем рискнуть не более чем 200 баксами. Вот эти 2 параметра загняем в функцию, которая вычисляет необходимый при этом размер лота.

Буду признателен если у кого есть подобное, дабы не изобретать велосипед

 
Dezil писал(а) >>

Например перед входом в сделку вычисляем стоплосс, допустим он равен 50 пунктов и желаем рискнуть не более чем 200 баксами. Вот эти 2 параметра загняем в функцию, которая вычисляет необходимый при этом размер лота.

200/(MarketInfo(Symbol(),MODE_TICKVALUE)*(50+MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_POINT)))
 
Здравствуйте.

double avd.OperationVolume      ;

string avs.Symbol    = "EURUSD" ;
double avd.VARLimit  = 200.00   ;
int    avi.VARPoints = 50       ;
int    avi.Command   = OP_BUY   ;

//<init>
int    init
 (//<0>
){//<1>

avd.OperationVolume = amd.OperationVolume ( avs.Symbol , avd.VARLimit , avi.VARPoints , avi.Command ) ;

}//</init>


//<amd.OperationVolume>
double amd.OperationVolume
 (//<4>
       string aas.Symbol    ,
       double aad.VARLimit  ,
       int    aai.VARPoints ,
       int    aai.Command
){//<24>

double ald.VolumeStep      = MarketInfo ( aas.Symbol , MODE_LOTSTEP        )                        ;
double ald.MinimalVolume   = MarketInfo ( aas.Symbol , MODE_MINLOT         )                        ;
double ald.NominalLot      = MarketInfo ( aas.Symbol , MODE_LOTSIZE        )                        ;
double ald.NominalMargin   = MarketInfo ( aas.Symbol , MODE_MARGINREQUIRED )                        ;
double ald.NominalTick     = MarketInfo ( aas.Symbol , MODE_TICKVALUE      )                        ;
double ald.QuoteTick       = MarketInfo ( aas.Symbol , MODE_TICKSIZE       )                        ;
double ald.QuotePoint      = MarketInfo ( aas.Symbol , MODE_POINT          )                        ;

double ald.MinimalMargin   = ald.NominalMargin   * ald.MinimalVolume                                ;
double ald.MinimalTick     = ald.NominalTick     * ald.MinimalVolume                                ;
double ald.MinimalPoint    = ald.MinimalTick     * ald.QuotePoint    / ald.QuoteTick                ;
int    ali.PositionPoints  = MathRound           ( ald.MinimalMargin / ald.MinimalPoint )           ;

double ald.VARPositions    = aai.VARPoints * 1.0 / ali.PositionPoints                               ;
double ald.MarginLimit     = avd.VARLimit        / ald.VARPositions                                 ;
double ald.VolumeLimit     = ald.MarginLimit     / ald.NominalMargin                                ;

double ald.OperationVolume = 0                                                                      ;

if   ( ald.VolumeLimit    >= ald.MinimalVolume )
     { int ali.Steps       = MathFloor ( ( ald.VolumeLimit - ald.MinimalVolume ) / ald.VolumeStep ) ;
       ald.OperationVolume = ald.MinimalVolume + ald.VolumeStep * ali.Steps                         ; }

Alert  ( " "                                                                                      ) ;
Alert  ( "ald.OperationVolume = " , ald.OperationVolume , " " , "lots"                            ) ;
Alert  ( "Output :"                                                                               ) ;
Alert  ( " "                                                                                      ) ;
Alert  ( "ald.MinimalVolume   = " , ald.MinimalVolume   , " " , "lots"                            ) ;
Alert  ( "ald.VolumeStep      = " , ald.VolumeStep      , " " , "lots"                            ) ;
Alert  ( "ald.VolumeLimit     = " , ald.VolumeLimit     , " " , "lots"                            ) ;
Alert  ( "ald.MarginLimit     = " , ald.MarginLimit     , " " , AccountCurrency ()                ) ;
Alert  ( "aad.VARLimit        = " , aad.VARLimit        , " " , AccountCurrency ()                ) ;
Alert  ( "ald.VARPositions    = " , ald.VARPositions    , " " , "positions"                       ) ;
Alert  ( "aai.VARPoints       = " , aai.VARPoints       , " " , "points"                          ) ;
Alert  ( "ali.PositionPoints  = " , ali.PositionPoints  , " " , "points"                          ) ;
Alert  ( "ald.MinimalPoint    = " , ald.MinimalPoint    , " " , AccountCurrency ()                ) ;
Alert  ( "ald.MinimalMargin   = " , ald.MinimalMargin   , " " , AccountCurrency ()                ) ;
Alert  ( "Processing :"                                                                           ) ;
Alert  ( " "                                                                                      ) ;
Alert  ( "aai.Command         = " , aai.Command                                                   ) ;
Alert  ( "aai.VARPoints       = " , aai.VARPoints       , " " , "points"                          ) ;
Alert  ( "aad.VARLimit        = " , aad.VARLimit        , " " , AccountCurrency ()                ) ;
Alert  ( "aas.Symbol          = " , aas.Symbol                                                    ) ;
Alert  ( "Input :"                                                                                ) ;
Alert  ( " "                                                                                      ) ;
Alert  ( "AccountCurrency ()  = " , AccountCurrency ()                                            ) ;

return ( ald.OperationVolume )                                                                      ;

}//</amd.OperationVolume>
 




С уважением,
Ais.
 
Ais писал(а) >>

С уважением,

Нифига себе навернул.

 
Dezil писал(а) >>

Очень хочется иметь функцию для вычисления размера лота в зависимости от заданного размера стоплосса и суммы в валюте депозита.

Например перед входом в сделку вычисляем стоплосс, допустим он равен 50 пунктов и желаем рискнуть не более чем 200 баксами. Вот эти 2 параметра загняем в функцию, которая вычисляет необходимый при этом размер лота.

Буду признателен если у кого есть подобное, дабы не изобретать велосипед

Функция настолько проста, что лучше изобрети.

 
// в индикаторе:
// можно сделать как эктерны...
double ММПРОЦЕНТ=5; // процент допустимой потери от одной сделки
int    ММСТОПЫ=100; // уровень стопов от цены открытия
//...
double ТИКЦЕНА=MarketInfo(Symbol(),MODE_TICKVALUE);
if(MarketInfo(Symbol(),MODE_TICKVALUE)==0) ТИКЦЕНА=1;// это лишь исключить дление на 0
//...
double РЕКОМЛОТ=1/ТИКЦЕНА*(AccountFreeMargin()/100*ММПРОЦЕНТ/ММСТОПЫ);
GlobalVariableSet("ГЛОТ",NormalizeDouble(РЕКОМЛОТ,2));
//----------------------------------------------

// в скрипте на открытие считываем рекомендуемый обьём:
double ГЛОТ=GlobalVariableGet("ГЛОТ");
// Открыть бай на текущем графике 
int ticket=OrderSend(Symbol(),OP_BUY,ГЛОТ,Ask,100,
Ask-100*Point,Ask+100*Point,"",0,0,CLR_NONE);

Индикатор постоянно на графике, и формирует рекомендованй обьём на открытие,

затем передаёт в глобальную переменную "ГЛОТ"

*

Для открытия пользуюсь скриптом, самый обычный, за тем лишь исключением

что считывает глоб.перепенную "ГЛОТ" и подставляет в обьём...

*

Нормализовано для дилингов с минилотом 0.01 (два знака после запятой).

Без проблем реализуется проверка на соответствие конкретного символа,

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

 
Dezil писал (а) >>

Очень хочется иметь функцию для вычисления размера лота в зависимости от заданного размера стоплосса и суммы в валюте депозита.

Например перед входом в сделку вычисляем стоплосс, допустим он равен 50 пунктов и желаем рискнуть не более чем 200 баксами. Вот эти 2 параметра загняем в функцию, которая вычисляет необходимый при этом размер лота.

Буду признателен если у кого есть подобное, дабы не изобретать велосипед

Мне очень нравится следующая идея!

берем 3 торговых стратегии  -  т к для чемпионата разрешено 3 ордера!

то считаем, что торгует у нас 3 независимые стратеги ( конечно мы каждую отлаживали и настраивавли  тестировали оптимизировали )

берем 10000 / 3  получаем  3333.33 =  каждая стратегия исходит из того что видит изначально 3333.33 

значит каждой стратегии  можно отдать стартовый баланс равный 3333.33

следовательно лот считается исходя из баланса 3333.33 

---

если стратегия  заработает к этим 3333.33 то пусть и оперирует своим лимитом равным 3333.33 + (ТО ЧТО ОНА СМОГА ЗАРАБОТАТЬ)

Если у Вас одна из трех стратегий начнет сливать  то БОЛЬШЕ чем 3333.33 от стартового баланса она не сольет!

  если она сольет она просто останавливается! т к не имеет права залазить в балансы двух других стратегий

остануться в запасе еще 2 стратегии!  которые могут реально и вполне реально вытянуть в + и даже может в хроший +

---

такой разумный подход использовал БЕТТЕР чемпион 2007 (  в принципе  он опубликовал  метод  своего ММ )

мне очень понравился этот подход!

---

еще можно по прошествии некоторого времени остановить неудачную стратегию и отдать оставшийся баланс двум остальным

но для этого необходимо провести хороший анализ  - если все три идут с плюсом я бы не тормозил и не передавал другим ТСкам 


 
YuraZ писал (а) >>

Мне очень нравится следующая идея!

берем 3 торговых стратегии - т к для чемпионата разрешено 3 ордера!

то считаем, что торгует у нас 3 независимые стратеги ( конечно мы каждую отлаживали и настраивавли тестировали оптимизировали )

берем 10000 / 3 получаем 3333.33 = каждая стратегия исходит из того что видит изначально 3333.33

Конечно идея не оригинальная, но я в своём советнике сделал именно так. За исключением того, что он у меня мультивалютный - на 3 парах соответсвенно.

Была ещё идея сделать универсальную торговую стратегию, но к сожалению к чемпионату не успел. Видимо это сверх задача. Поэтому в этом году не участвую, не хочу повторять ошибки прошлого чемпа))

 

Легко представить себе ситуацию, когда система просела и вылезла за отведенные ей 3333.33, но потом пошла вверх. На чампе такое произойдет с большой вероятностью, т.к. ММ должен быть агрессивным (иначе светит не больше 100-го места). Так вот, эта система будет прикончена как раз в тот момент, когда она уменьшила депо на максимально возможную величину. Оставшиеся две системы запросто могут после этого также просесть. Последствия должны быть понятны. Хотя первая система в это время могла выйти из просадки и наработать плюс на балансе для всех трех подсистем.


Так что позитивность такого подхода весьма субьективна.
 
bstone писал (а) >>

Легко представить себе ситуацию, когда система просела и вылезла за отведенные ей 3333.33, но потом пошла вверх. На чампе такое произойдет с большой вероятностью, т.к. ММ должен быть агрессивным (иначе светит не больше 100-го места). Так вот, эта система будет прикончена как раз в тот момент, когда она уменьшила депо на максимально возможную величину. Оставшиеся две системы запросто могут после этого также просесть. Последствия должны быть понятны. Хотя первая система в это время могла выйти из просадки и наработать плюс на балансе для всех трех подсистем.


Так что позитивность такого подхода весьма субьективна.

 ММ с данным подходом стоял в советнике который победил

и скажем так этим все сказанно

 
bstone писал (а) >>

Хотя первая система в это время могла выйти из просадки и наработать плюс на балансе для всех трех подсистем.


Система также в это время могла и не выйти из просадки и с таким же успехом слить баланс всех подсистем.

ММ можно настроить таким образом, что система если и будет сливать, то очень медленно, дабы не прикончить баланс в ноль за три месяца.

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