Предыстория:
Скрипт у меня идеологически работает на часовом таймфрейме, пробовал другие периоды, но часовики самый оптимальный вариант. Но при использовании такого большого таймфрейма есть неприятная особенность, скрипт пересчитывается на закрытии бара (При условии, что в параметрах установлено "Интервал пересчета" - "Итервал" другие параметры в расчет не беру, там и накладки на трафик, производительность и пересчете на каждой сделке и т.п.) за час цена может два раза сходить в какую угодно сторону, а закрытие наступит еще через час, короче неприемлемо.
Сама история:
Проблема помогает решить блок "Сжатие", я взял минутки (обновление через минуту, выход еще через минуту, в общем жить можно) сжал график до часа и к сжатию прицепил блок закрытия, а дальше уже моя математика...
Все было хорошо, но сегодня при очередном прогоне параметров задал себе вопрос, почему при подборе параметров trailStop меняется количество сделок, ведь стоп должен влиять на сумму, но не на количество сделок.
Начал сравнивать:
Взял сделал копию скрипта и оба прогнал на одних и тех. же параметрах, оптимизацию делал только по параметру "Стоп лосс" по блоку "Трейл стоп", затем применил параметры с разным количеством сделок.
Вариант 1
Вариант 2
Я опустил колизии в начале списка сделок, т.к. для уменьшения количества сделок использовал параметр "Торговать с бар" и там могли обрезаться сделки у которых, скажем так "остались хвосты" в обрезанном периоде, которых не стало при другом параметре стопа. 06.07.2010 более "чистая" ситуация в этом смысле. Сразу бросилось в глаза время открытия второй и третьей сделки 11:04 и 11:08, напомню скрипт у меня за счет использования сжатия "часовик".
На графике это выглядит вот так.
Вариант 1
Вариант 2
Из графиков видно, что оба скрипта входили на одной и той-же свече, и даже понятно почему закрытие в первом варианте через 3 минуты - маленькое значение стопа, но почему скрипт начал входить в позицию еще через минуту, когда сигнала не было, следующий сигнал может прийти только через 2 часа и это при условии что цена будет активно падать в первый час и еще активней расти во второй.
После недолго изучения кода, который генерит скрипт, мое внимание привлек метод CrossOver (пересечение снизу), явно бага была в нем, т.к. именно он отвечает у меня за подачу сигнала входа в позицию. В документации я описания метода не нашел поэтому воспользовался reflector`ом.
[HandlerCategory("TradeMath"), HandlerName("Cross Over")]
public class CrossOver : IDoubleCompaperHandler, ITwoSourcesHandler, IBooleanReturns, IStreamHandler, IHandler, IDoubleInputs
{
// Methods
public IList<bool> Execute(IList<double> src1, IList<double> src2)
{
int num = Math.Max(src1.Count, src2.Count);
int num2 = Math.Min(src1.Count, src2.Count);
bool[] flagArray = new bool[num];
for (int i = 1; i < num2; i++)
{
flagArray[i] = (src1[i] > src2[i]) && (src1[i - 1] <= src2[i - 1]);
}
return flagArray;
}
}
тут все просто к нам приходят два массива значений, мы сравниваем если значение текущего значения первого массива больше значения второго значения и предыдущее значение первого меньше или равно значения второго массива, то в выходной массив значений записываем флаг true (на словах звучит грозно, но по коду все кристально чисто понятно). Итого на выходе мы имеем примерно следующую картинку 0000010001000 (где 0 - false, 1 - true) вот когда у нас попадается единичка и нет открытой позиции в том-же направлении, то скрипт открывает новую позицию. Чисто теоретически не может быть результата 00000
1110001000, а судя по списку сделок у меня так и вышло.
И тут до меня дошло, скрипт у меня работает на часах, т.е. одна единичка в выходном массиве у меня распространяется на 60 пересчетов скрипта, а из-за низкой комисии позицию успевает выбить по стопу, т.е. обнулился флаг "Есть открытая поза" - вторая часть условия для открытия позиции и так три раза в течение часа.
Для чего это все написал: вопрос разработчикам или просто знающим людям, как обойти? Сильно влияет на статистику количество открытых сделок при выборе оптимальных параметров.
Все остальным для информации "Да так тоже может быть"