rupiter
Зарегистрирован: 16.09.2013
Сообщения: 75
|
Наткнулся на интересный баг. В сети гуляет код системы со случайным входом (взятый из книги Ховарда Банди):
Код: |
SetTradeDelays( 0, 0, 0, 0 );
Stop = 0;
BuyPrice = C;
SellPrice = C;
// Frequency is the number of entries per year.
Frequency = Param( "Entries per Year", 12, 1, 100, 1 ); // 3 - PB, 2 - CPB, 4 - all
// Repeatable is a switch.
// True (1): the sequence of random numbers will be repeated.
// False (0): each sequence is random.
Repeatable = Param( "Repeatable", 0, 0, 1, 1 );
// Seed is the number used to start the random sequence // when repeatable sequences are desired.
Seed = Param( "Seed", 13331, 1, 99999, 1 );
// Generate a fraction, uniformly distributed // between 0.00000 AND 0.99999.
NextRandom = IIf( Repeatable, Random( Seed ), Random() );
Buy = IIf( NextRandom < Frequency / 252, 1, 0 );
// The code for the exit being tested starts here.
//
// HoldBars is the number of bars to wait for exit.
HoldBars = Optimize( "HoldBars", 2, 1, 20, 1);
Sell = BarsSince( Buy ) >= HoldBars;
// The code for the exit being tested ends here.
// Remove extra Buy and Sell signals.
Buy = ExRem( Buy, Sell );
Sell = ExRem( Sell, Buy );
|
Интересно, что код предусматривает переключение режимов (новый набор входов при каждом тесте / один и тот же набор), которое определяется переменной Repeatable, используемой в качестве входного аргумента Seed в функции Random(Seed)... На первый взгляд с кодом все в порядке, и если переключатель Repeatable установлен на 0, то будет запущена функция Random(), то есть без аргумента, что должно приводить к генерации новых входов с каждым новым тестом системы. Но этого не происходит! Методом перебора я нашел, что дело в строчке
Код: |
NextRandom = IIf( Repeatable, Random( Seed ), Random() ); |
причем, переменная NextRandom вообще может нигде не использоваться. Например, здесь:
Цитата: |
SetTradeDelays( 0, 0, 0, 0 );
Stop = 0;
BuyPrice = C;
SellPrice = C;
Frequency = Param( "Entries per Year", 12, 1, 100, 1 );
Repeatable = Param( "Repeatable", 0, 0, 1, 1 );
Seed = Param( "Seed", 13331, 1, 99999, 1 );
NextRandom = IIf(Repeatable, mtRandomA(Seed), mtRandomA());
rand = mtRandomA();
Buy = IIf( rand < 0.5, 1, 0 );
Sell = BarsSince( Buy ) >= 5; |
Здесь NextRandom не используется вообще нигде, но, тем не менее, набор сделок перестает меняться при повторных тестах. Если же эту строчку закомментить, то набор сделок начнет меняться, как и должен. |
|
|