Вопрос для человека, хорошо разбирающегося в математике

 

Если движение цены следует случайному движению (а этот форум будет пуст, если все будут думать, что это так), сколько пунктов должен взять/проиграть трейдер, чтобы иметь те же шансы, что и в рулетке? В данном случае мы предположим европейское колесо с 36 номерами и одним 0. Ставка - это ставка Even Money по принципу Odds vs Even, выплата 1 к 1. Очевидно, что при выпадении 0/зеленого вы проиграете. Таким образом, в основном 0 или зеленый служат в качестве спредов. И мы будем считать, что спреды равны 1 пипсу.

Я считаю, что если я ищу тейк-профит в 1 пип, то стоп-лосс должен быть в 1 пип. Предполагая, опять же, что нет предубеждения, в какую сторону пойдет цена, тогда я буду играть с коэффициентом, который намного хуже, чем в рулетке. Я даже не думаю, что поиск 10-пипсового стоплосса против 10-пипсового тейкпрофита делает торговлю лучшим вариантом. На днях мне удалось найти ответ в своей голове, но сегодня я забыл, + я не был уверен в своей математике в любом случае :).

Кто-нибудь, пожалуйста, помогите мне, так как у меня есть гипотеза для проверки/симуляции. Спасибо.

 

Я не силен в статистике... но я не думаю, что можно приравнивать спред и 0 на колесе. Спред оплачивается независимо от выигрыша или проигрыша. 0 на колесе означает, что если вы играете на красное или черное, у вас меньше 50% шансов на победу. 18:19 или 48,65%.

Я думаю, что вы ищете, какие сделки дадут эффективную ставку выигрыша 48,65% из-за эффекта спреда. Я думаю, если бы ваша сделка составляла 20 пунктов, а спред - 1 пункт, это дало бы вам то, что вы ищете... риск = 21 награда 20... Я думаю, не цитируйте меня ;-)

 

Приятно, что вы думаете иначе, и это один из основных вопросов, на которые я пытаюсь ответить, потому что я считаю, что это можно приравнять. Я знаю, что на каждый доллар, который вы ставите в рулетке, приходится ожидаемый убыток, который равен разнице между вашим коэффициентом выигрыша и коэффициентом 50/50. Например, если на колесе нет ни одного 0/зеленого, то в долгосрочной перспективе вы будете играть в равной игре. Однако при шансах всего в 48,65% вы будете постоянно терять что-то вроде $1,35 на каждые поставленные $100.

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

Следующий шаг - провести несколько симуляций. В первом случае я использую случайные сделки и ищу 20-пунктовый стоплосс и 20-пунктовый тейкпрофит (конечно, без учета спреда в 1 пункт общий убыток составит 21 пункт, что, надеюсь, создаст шансы, которые я ищу). Очевидно, что чем больше сделок/образцов в рамках этого теста, тем лучше. Хм, интересно, кто-нибудь думает, что это не даст схожих результатов по сравнению с рулеткой?

 
ubzen: Хм, интересно, кто-нибудь думает, что это не даст таких же результатов по сравнению с рулеткой?
Да, потому что в трейдинге есть много вещей, которые скрыты против ставки. Например, размещение сделки - это движущаяся цель, и она может не состояться, в то время как поле на столе рулетки не движется. Есть много вещей, которые могут испортить торговлю и которые невозможно смоделировать, но каждая из них направлена против прибыли.
 

Итак, ребята, у нас есть некоторые данные.

color   Color;
double  Sl; 
double  Tp;
double  Pips;
double  Price;

void start(){
    if(OrdersTotal()==0){
        int Dir=MathRand()%2;
        Pips=Point; if(Digits==3){Pips=0.01;}if(Digits==5){Pips=0.0001;}
        if(Dir==0){Price=Ask; Sl=Ask-20*Pips; Tp=Ask+20*Pips; Color=Blue;}
        if(Dir==1){Price=Bid; Sl=Bid+20*Pips; Tp=Bid-20*Pips; Color=Red;}
        int Ticket=OrderSend(Symbol(),Dir,0.1,Price,999,0,0,"",0,0,Color);
        if(Ticket>-1){
            if(OrderSelect(Ticket, SELECT_BY_TICKET)){
                OrderModify(Ticket,OrderOpenPrice(),Sl,Tp,0,Color);
}   }   }   }

Конечно, здесь есть несколько 19,9-кратных прибылей и убытков. Однако процент прибыльных сделок говорит сам за себя.

 

Получается даже хуже, чем в рулетке, но это связано со стандартными ошибками, или что там нужно для статистики подушки безопасности. Кто-то другой может провести его и получить немного больше или меньше значений, однако я считаю, что математическое ожидание такое же, как и в рулетке. Если это не напугает трейдера, который этого не знал, то больше ничего не поможет.

Короче, идем дальше. Следующим логическим шагом, когда я узнал об этом раньше, было сделать симуляцию случайных чисел в mql4, чтобы посмотреть, выпадут ли они где-нибудь между 0-36, и если это четное число, добавить 1$ к моей текущей сумме (начиная со 100,000$) или вычесть 1$, если нечетное или 0. Но это будет пустой тратой времени, потому что все и их мамы знают шансы в рулетке. А если и не знают, то могут просто найти их в Интернете. Поэтому я просто пропущу этот шаг.

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

 

Хорошо, я все еще жду предложений на мой вышеупомянутый вопрос. В основное время я собираюсь предложить 2 системы. Одну из них я буду называть "Система 14" с сайта http://forex-strategies-revealed.com/simple/simple-trading-with-daily-range. А вторую я буду называть Oscar's Grind с сайта http://www.blackjackforumonline.com/content/Betting_Systems_Oscars_Blackjack_System.htm.

Несколько слов о системе 14: Это была самая отзывчивая тема в продвинутом разделе сайта, которую я смог найти. Она выглядит довольно простой в кодировании, и многие постеры считают ее победителем.

Несколько слов об OscarGrind: Игроки в адванс не любят даже слышать слово "прога". Однако, если это говорит автор, которого я очень уважаю (хотя он и не говорит, что это обязательно), я готов попробовать в этом контексте.

Я продолжу, закодирую и опубликую свою интерпретацию обеих систем. Ловушкой для System-14 здесь, вероятно, является тот факт, что я буду заставлять ее использовать 20-пипсовый SL-TP. Ловушка для OscarGrind заключается в том, как определить размер ордеров, чтобы искать только одну единицу после победы. Но держите пальцы скрещенными, ребята, прибыльная система может быть подтверждена в ближайшее время.

 

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

int     Magic_S14=14;
double  Sl; 
double  Tp;
double  Pips;
double  Price;
color   Color;
bool    Pen_Mode;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void start(){
    if(!isNewBar() && !Pen_Mode){return(0);}
    Pips=Point; 
    if(Digits==3){Pips=0.01;} 
    if(Digits==5){Pips=0.0001;}
    Check_Pending_Order_Condition();
    Set_Trigger_Market_Order_SlTp();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool isNewBar(){ static datetime LastBar;
    datetime CurBar=iTime(Symbol(),PERIOD_D1,0);
    if(LastBar !=CurBar){LastBar=CurBar; return(true);}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double Percent25_Previous_24Hours_Move(){
    double High_=iHigh(Symbol(),PERIOD_D1,1); double Low_=iLow(Symbol(),PERIOD_D1,1);
    double Total_Move=High_-Low_; double Percent_25=NormalizeDouble(Total_Move*0.25,Digits); 
    return(Percent_25);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Check_Pending_Order_Condition(){
    if(Count_Orders_Magic_Symbol_Only()==0){
        int Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL);
        double Percent_25=Percent25_Previous_24Hours_Move();
        if(Percent_25<Stop_Level*Pips){Percent_25=Stop_Level*Pips;}
        OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+Percent_25,999,0,0,"",Magic_S14,0,Blue);
        OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-Percent_25,999,0,0,"",Magic_S14,0,Red);
        if(Count_Orders_Magic_Symbol_Type(1)==2){Pen_Mode=true;}
        else{Print("Twin_OrderSend_Failed_Error=",GetLastError());}
}   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int Count_Orders_Magic_Symbol_Only(){
    int Ans;
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic_S14
        && OrderSymbol()==Symbol()){Ans++;}
    }return(Ans);
    //~~~~~~~~~~~~~~~~~~~~
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int Count_Orders_Magic_Symbol_Type(int x){
    int Ans;
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic_S14
        && OrderSymbol()==Symbol()
        && OrderType()>x){Ans++;}
    }return(Ans);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool Set_Trigger_Market_Order_SlTp(){
    if(!Pen_Mode){return(0);}
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic_S14
        && OrderSymbol()==Symbol()
        && (OrderType()==0 || OrderType()==1)
        ){int Ot=OrderTicket(); double Op=OrderOpenPrice(); bool Res;
            if(OrderType()==OP_BUY){Res=OrderModify(Ot,Op,Op-20*Pips,Op+20*Pips,0,Blue);}else
            if(OrderType()==OP_SELL){Res=OrderModify(Ot,Op,Op+20*Pips,Op-20*Pips,0,Red);}
            if(!Res){Print("Setting_Sl_Tp_Failed_Error=",GetLastError()); return(Res);}
    }   }
    if(Res){
        for(    i=OrdersTotal()-1; i>=0; i--){
            if(OrderSelect(i, SELECT_BY_POS)
            && OrderMagicNumber()==Magic_S14
            && OrderSymbol()==Symbol()
            && (OrderType()==4 || OrderType()==5)
            ){
                Res=OrderDelete(OrderTicket());
                if(!Res){Print("Pending_Delete_Failed_Error=",GetLastError()); return(Res);}
                if(Res){Pen_Mode=false;} return(Res);
}   }   }   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Ну что ж, "Оскар Граунд" на Forex - это полный провал. Полагаю, что здесь не обнаружено никакой голи-грааля. Тем не менее, следует обратить внимание на некоторые моменты. Если вы торгуете по случайной системе, имеете спреды 1-3, и ищете тейк-профит в пределах <60 пунктов, вам лучше сыграть в казино в рулетку. Если вы используете прогрессии (мартингейл или другие), то это просто вопрос времени, пока вы не разоритесь, особенно если у вас плохое прогнозирование. Более сильное прогнозирование может быть лучшим способом получить шансы в вашу пользу.

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

int     Magic_OG;
color   Color;
double  Sl; 
double  Tp;
double  Pips;
double  Price;
double  Lots;
double  Bank_Hi;
double  Last_OrSize;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void start(){
    if(Count_Orders_Magic_Symbol_Only()==0){
        if(AccountEquity()>Bank_Hi){Bank_Hi=AccountEquity();}
        int Dir=MathRand()%2;
        Pips=Point; if(Digits==3){Pips=0.01;}if(Digits==5){Pips=0.0001;}
        if(Dir==0){Price=Ask; Sl=Ask-20*Pips; Tp=Ask+20*Pips; Color=Blue;}
        if(Dir==1){Price=Bid; Sl=Bid+20*Pips; Tp=Bid-20*Pips; Color=Red;}
        Alert(Lot_Size());
        int Ticket=OrderSend(Symbol(),Dir,Lot_Size(),Price,999,0,0,"",0,0,Color);
        if(Ticket>-1){
            if(OrderSelect(Ticket, SELECT_BY_TICKET)){
                OrderModify(Ticket,OrderOpenPrice(),Sl,Tp,0,Color);
}   }   }   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int Count_Orders_Magic_Symbol_Only(){
    int Ans;
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic_OG
        && OrderSymbol()==Symbol()){Ans++;}
    }return(Ans);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double Lot_Size(){
    double BkrLotStep=     MarketInfo(Symbol(),MODE_LOTSTEP);
    double BrkMiniLot=     MarketInfo(Symbol(),MODE_MINLOT);
    double BrkMaxiLot=     MarketInfo(Symbol(),MODE_MAXLOT);
    double Tick_Value=     MarketInfo(Symbol(),MODE_TICKVALUE);
    double Tick_Sizes=     MarketInfo(Symbol(),MODE_TICKSIZE);
    if(Digits==2 || Digits==3){ int Pips_2Real=100;}
    if(Digits==4 || Digits==5){ Pips_2Real=10000;}
    double Pip_Values=Tick_Value / (Tick_Sizes*Pips_2Real);
    double AE=AccountEquity();
    bool isLastWin=His_LasOrdWin_Magic_Symbol_Only();
    if(!isLastWin){Lots=Last_OrSize;}
    if( isLastWin && AE>=Bank_Hi){Lots=0.1;}
    if( isLastWin && AE <Bank_Hi){Lots=Last_OrSize+0.1;
        double Target=20+Bank_Hi-AE;
        if(Lots*Pip_Values*20>Target){
            for(double i=Lots; i>BrkMiniLot; i-=BkrLotStep){
                if(i*Pip_Values*20<=Target){Lots=i; break;}
    }   }   }
    if(Lots>BrkMaxiLot){Lots=BrkMaxiLot;}
    if(Lots<BrkMiniLot){Lots=BrkMiniLot;} return(Lots);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool His_LasOrdWin_Magic_Symbol_Only(){
    if(OrdersHistoryTotal()==0){return(true);}
    for(int i=OrdersHistoryTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()==Magic_OG
        && OrderSymbol()==Symbol()){
            Last_OrSize=OrderLots();
            if(OrderProfit()>0){return(true);}
}   }   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

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

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

Пример:

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

Теперь вы получаете модификатор на: 47/ActualWinningRage

А размер лота будет (47/ActualWinningRage)*lotsize

 

Я только что проснулся и решил попробовать этот подход.

Действительно, грубый трюк. Я думаю, что в какой-то степени он преследует то, что уже знает :). Система рулетки действительно потерпела меньше убытков. Так что, я думаю, это один из способов улучшить систему. Я также буду считать это формой отрицательной прогрессии. Код управления капиталом приведен ниже, также не без ошибок.

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double Lot_Size(int Switch){
    static int Saved_His_Total; 
    int His_Total=OrdersHistoryTotal();
    if(His_Total==0){return(0.1);}
    if(Saved_His_Total != His_Total){
        Saved_His_Total=His_Total;
        for(int i=His_Total; i>=0; i--){
            if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
            && OrderMagicNumber()==Magic
            && OrderSymbol()==Symbol()
            ){
                static int Trade_Total; Trade_Total++;
                static int Buy_Wins; static int Sel_Wins;
                static int Buy_Loss; static int Sel_Loss;
                static double Buy_Profit, Buy_Losses;
                static double Sel_Profit, Sel_Losses;
                if(OrderType()==OP_BUY && OrderProfit()>0){
                    Buy_Wins++; Buy_Profit+=OrderProfit();}
                if(OrderType()==OP_BUY && OrderProfit()<=0){
                    Buy_Loss++; Buy_Losses+=OrderProfit();}
                if(OrderType()==OP_SELL && OrderProfit()>0){
                    Sel_Wins++; Sel_Profit+=OrderProfit();}
                if(OrderType()==OP_SELL && OrderProfit()<=0){
                    Sel_Loss++; Sel_Losses+=OrderProfit();} break;
        }   }
        double Win_Total = Buy_Wins + Sel_Wins;
        double Loss_Total = Buy_Loss + Sel_Loss;
        double Profit_Total = Buy_Profit + Sel_Profit;
        double Losses_Total = Buy_Losses + Sel_Losses;
        if(Win_Total !=0){double Avg_Profit = Profit_Total / Win_Total;}
        if(Loss_Total!=0){double Avg_Losses = Losses_Total / Loss_Total;}
        if(Trade_Total !=0){double W2L_Ratio = Win_Total / Trade_Total;}
        if(Trade_Total !=0){double L2W_Ratio = Loss_Total / Trade_Total;}
        if(Avg_Losses !=0){double P2L_Ratio = Avg_Profit / Avg_Losses;}
        if(Avg_Losses !=0){double Kd=Avg_Profit/Avg_Losses;}
        //~~~~~~~~~~~~~~~~~~~~~
        if(W2L_Ratio !=0){double RvRoulette=(0.47/W2L_Ratio)*0.1;}
        //~~~~~~~~~~~~~~~~~~~~~
        //http://www.trader-soft.com/money-management/index.html
        if(Kd !=0){double Kelly=(W2L_Ratio-L2W_Ratio)/(Avg_Profit/Avg_Losses);}
        if(P2L_Ratio!=0){double Optimal_f=((P2L_Ratio + 1)*W2L_Ratio-1)/P2L_Ratio;}
        //~~~~~~~~~~~~~~~~~~~~~
        if(Trade_Total==0){return(0.1);}
        if(Switch=='R'){return(RvRoulette);}
        if(Switch=='K'){return(Kelly);}
        if(Switch=='F'){return(Optimal_f);}
        //~~~~~~~~~~~~~~~~~~~~~
    }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Я включил Kelly и Optimal F, потому что у меня уже была статистика для их расчета. Никогда не рекомендуется использовать их на маленьких выборках, имо <100. Также они выражаются в долях банка к риску, поэтому вам нужно взять маржу вашего счета (я предпочитаю) * k или f * ваш_риск_аппетит (обычно 0.5). Затем вам нужно убедиться, что Lots*Pip_Values*Stop_Loss<=Target, у меня вроде как есть пример этого в одном из кодов выше.

Двигаясь дальше, вот результаты для предложения Zzuegg. Интересно, сможет ли он превратить нашу безубыточную Систему-14 в победителя?

Bars in test                        812652
Ticks modelled                      10091174
Modelling quality                   n/a
Mismatched charts errors            22023
Initial deposit                     100000.00
Total net profit                    -37756.90 The Losses decreased vs -41832
Gross profit                        391593.03
Gross loss                          -429349.92
Profit factor                       0.91
Expected payoff                     -0.83
Absolute drawdown                   38180.64
Maximal drawdown                    38280.06 (38.24%)
Relative drawdown                   38.24% (38280.06)
Total trades                        45448
Short positions (won %)             22883 (47.54%)
Long positions (won %)              22565 (47.90%)
Profit trades (% of total)          21687 (47.72%)
Loss trades (% of total)            23761 (52.28%)
Largest profit trade                46.00
loss trade                          -42.00
Average profit trade                18.06
loss trade                          -18.07
        Maximum
consecutive wins (profit in money)  17 (306.11)
consecutive losses (loss in money)  14 (-251.89)
        Maximal
consecutive profit (count of wins)  306.11 (17)
consecutive loss (count of losses)  -259.64 (13)
        Average
consecutive wins        2
consecutive losses      2