Матожидание - ничто, управление капиталом и риском - все!

Существует идиотское утверждение о том, что якобы для управления капиталом и риском необходима торговая система с положительным математическим ожиданием. Вот что пишет об этом Ральф Винс в своей книжонке \"Математика управления капиталом\":
Матожидание - ничто, управление капиталом и риском - все!
\"В отношении управления капиталом очень важно понимать, что при игре с отрицательным ожиданием нет схемы управления деньгами, которая может сделать вас победителем.

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

Приведу рабочий код МТС для MetaTrader4, который работает по вышеизложенному принципу:

//+-----------------------------------------------------------------------------+
//| NeuroMoneyManagement.mq4 |
//| Copyright c 2006, Yury V. Reshetov |
//| http://bigforex.biz|
//+-----------------------------------------------------------------------------+
#property copyright \"Copyright c 2006, Yury V. Reshetov http://bigforex.biz\"
#property link \"http://bigforex.biz\"

//---- input parameters
extern int x1 = 61;
extern int x2 = 184;
extern int x3 = 92;
extern int x4 = 7;
extern double MaximumRisk = 0.82;
// StopLoss level
extern double sl = 50;
extern int MagicNumber = 888;
static int prevtime = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start() {

//---- check new bar

if (Time[0] == prevtime) return(0);
prevtime = Time[0];

//---- check allowed for trade

if (IsTradeAllowed()) {
RefreshRates();
} else {
prevtime = Time[1];
return(0);
}

// --- indexed variable
int i = 0;

// check for opened position
int total = OrdersTotal();
for (i = 0; i < total; i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
// check for symbol & magic number
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
// found opened position - exit
return(0);
}
}

//--- check for type last position
total = OrdersHistoryTotal();
int op = OP_BUY;
for (i = 0; i 0) lt = getLots();
ticket = OrderSend(Symbol(), OP_BUY, lt, Ask, 3, Bid - sl * Point, Bid + sl * Point, \"NeuroMM\", MagicNumber, 0, Blue);
if (ticket < 0) {
Sleep(30000);
prevtime = Time[1];
}
} else { // short
if (perceptron() < 0) lt = getLots();
ticket = OrderSend(Symbol(), OP_SELL, lt, Bid, 3, Ask + sl * Point, Ask - sl * Point, \"NeuroMM\", MagicNumber, 0, Red);
if (ticket < 0) {
Sleep(30000);
prevtime = Time[1];
}
}
//--- exit
return(0);
}
//+--- The PERCEPRRON ---+
// a perceiving and recognizing function

double perceptron() {
double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 = iAC(Symbol(), 0, 0);
double a2 = iAC(Symbol(), 0, 7);
double a3 = iAC(Symbol(), 0, 14);
double a4 = iAC(Symbol(), 0, 21);
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}

//+--------------Calculate optimal lot size -------------------------+

double getLots() {
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
int round = MathAbs(MathLog(minlot) / MathLog(10.0)) + 0.5;
double lot = minlot;
//---- select lot size
lot = NormalizeDouble(AccountFreeMargin() * MaximumRisk / 1000.0, round);
if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) {
lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), round);
}
if(lot maxlot) lot = maxlot;
//---- return lot size
return(lot);
}

Принципы оптимизации МТС такие же, как и у его предшественника - AI:

Входные параметры:

x1, x2, x3, x4 - от 0 до 200 с шагом 1
MaximumRisk - от 0.01 до 1 с шагом 0.01
sl - от 10 до 70 с шагом 5

Скачать исходники советника можно ЗДЕСЬ

Посмотреть результаты бектеста можно ЗДЕСЬ. Оптимизация и тестирование проводилось на котировках взятых по OnDemand с реального счета ДЦ \"SystemForex\".
Если тактика применения нейронных сетей в качестве регулятора для управления капиталом и риском способна дать профит даже на заведомо убыточной торговой стратегии и даже вообще без всякой стратегии, то появляется резон ее прикладного применения к стратегиям профитным. Вот пример такого советника: МТС \"NeuroMACDwithMM\"