Недавно я наткнулся на занимательное видео из разряда «Чтобы быстро стать богатым нужно всего лишь...». Видео начинается пафосным пересчитыванием солидной пачки денег и демонстрированием приличного счета. Далее парень показывает стратегию, которая основана на фразе «Ну вот смотрите на график, тут видно».
Однако я человек скромный, а потому решил прежде чем пойти за своими лярдами сначала проверить данную стратегию математически и программно. Ниже вы можете посмотреть, что из этого вышло.
Опишу сначала «Стратегию» (Я не уверен, что могу скинуть ссылку на видео здесь, но сделаю это в комментариях при необходимости). Парень предлагал нам переключить график на японские свечи а затем просто ставить на тот же курс, каким закрылась предыдущая свеча. То есть если прошлый отрезок в 5 минут закрылся в минус, то и сейчас ставим на минус. В случае же проигрыша в следующий раз удваиваем ставку.
Эх, как же мне нравятся умники со стратегией Мартингейла. Но перейдем к делу.
Начнем с декомпозиции задачи:
- Необходимо написать скрипт, который преобразует график в строку вида OOGGO, где O — Orange, G — Green. То есть падение и рост.
- Далее необходимо на этой строке смоделировать стратегию и собрать статистику.
- Проанализировать результаты и сделать вывод.
Пишем анализатор графика
На сайте график представляет из себя SVG элемент. Конечно, мы можем анализировать его прямо там, однако для начала я предпочту работать у себя в собственном проекте. В конце концов, нам бы сначала убедиться в действенности стратегии, а уже потом писать робота, который методами click() будет фармить наше «богатство»
Коментарии сразу после кода.
function turnToString(img) {
var canvas = document.createElement('canvas'); //(1)
var ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0, img.width, img.height);
img.remove();
document.body.appendChild(canvas);
var result = [];
var isLocked = false;
var imgData = ctx.getImageData(0,0,canvas.width,canvas.height).data;
for(var i = 0;i<canvas.width;i++) {
var mainColor = "N";
for(var j = 0;j<canvas.height;j++) { //(2)
var colorIndexes = getColorIndexes(i,j,canvas.width);
var redPartIndex= colorIndexes[0];
var greenPartIndex= colorIndexes[1];
if (imgData[redPartIndex] > 120) {
mainColor = "O";
break;
}
if (imgData[greenPartIndex] > 120) {
mainColor = "G";
break;
}
}
if (isLocked == false && mainColor == "G") { //(3)
result.push("G");
isLocked = true;
}
if (isLocked == false && mainColor == "O") {
result.push("O");
isLocked = true;
}
if (mainColor == "N") {
isLocked = false;
}
console.log("Yet another line")
}
return result.join("");
}
Код getColorIndexes, получающий индексы цветов нужного пикселя.
function getColorIndexes(x,y,width) {
var R = 4*(width*y + x);
return [R,R+1,R+2];
}
Напомню, массив Uint8ClampedArray , возвращаемый функцией getImageData — это просто набор цветов и альфа каналов пикселей подряд. Он может содержать миллионы позиций, однако о скорости работы переживать не приходится, т.к. в гугле работают замечательные парни, которые сделали из V8 машину по обработке структур данных.
Все просто.
1) Заменяем картинку на канвас. Смело вмешиваемся в DOM, т.к. это локальный проект, и в таком виде куда-либо перекочевать он не сможет никак.
2) Итерируемся через массив пикселей по столбцам. Смотрим на красную и зеленую составляющие пикселя в KGB RGB. Если они превышают некий уровень (С большим запасом), значит останавливаем проход через столбец. Main color присваиваем нужную букву.
3) Смотрим, была ли данная свеча уже учтена. Признаком учтённости считаем isLocked равный true. Если же цвет не был обнаружен и переменная сохранила начальное значение «N», значит мы наткнулись на промежуток между свечами, что означает необходимость сбросить значение isLocked
Profit! Теперь мы можем загрузить график!
Я даже вывел результаты под соответствующими свечками и, как мы можем видеть, все работает в штатном режиме.
Эмулируем стратегию
Перейдем ко второй части. Теперь наша задача полученную строку пропустить через функцию, которая будет эмулировать данную стратегию.
function basicProfitAnalisis(mask) {
var maskInUse = mask;
var result = [0,0];
var currentBet = 50;
var baseBet = 50;
var maxBet = baseBet;
var totalSum = 0;
var multiplier = 0.82;
for(var i = 1;i<maskInUse.length;i++) {
if (maskInUse[i] == maskInUse[i-1]) {
result[0]++; //Счетчик побед.
totalSum += currentBet*multiplier;
currentBet = baseBet;
} else {
result[1]++; //Счетчик поражений.
totalSum -= currentBet;
currentBet *= 2;
if (currentBet > maxBet) {
maxBet = currentBet;
}
}
}
document.getElementById("betsWon").innerHTML += result[0];
document.getElementById("betsLost").innerHTML += result[1];
if (totalSum >= 0) {
document.getElementById("pureChange").innerHTML += `<font
color='green'>${totalSum}</font>`;
} else {
document.getElementById("pureChange").innerHTML += `<font color='red'>${totalSum}
</font>`;
}
document.getElementById("maxBet").innerHTML += maxBet;
setCookie("totalSum", parseInt(getCookie("totalSum"))+totalSum, 365);
}
Этот код совсем прост. Итерируемся по полученной строке, начиная со второго символа. Каждый раз сравниваем текущий символ с предыдущим. Если он не равен ему, значит мы проиграли — вычитаем сумму ставки из текущего изменения начальной суммы и удваиваем ставку. Если же мы выиграли, добавляем к изменению ставку, умноженную на коэффициент (Самый большой на этом сайте — 0.82, его и возьмём) и сбрасываем ставку до базового уровня. Затем просто выводим результат и добавляем сумму в куки, чтобы не считать вручную.
Также помним о том, что математика и Теория Вероятностей любят шутить шутки. Очень любят шутить шутки. Ну очень любят шутить шутки. А потому ведем учет максимальной ставки через maxBet (Это, пожалуй, самый интересный пункт статистики, который может вас удивить. А может и нет).
Ну что же, запустим тот же график, на котором проверяли корректность работы функции-анализатора.
Хм. Немного не повезло, бывает. Еще.
Как там говорится? Второй раз — совпадение?
Третий вроде закономерность… Но мне-то, конечно, просто не везет. Так всегда.
Но он же показывал деньги, не мог же он лгать.
А может он эти деньги на таких как я заработал?
О! Все видели? Чакра удачи открылась. Сейчас вот еще немного поиграю и пойду выбирать особняк и жену — модель.
Вы знаете, деньги не главное.
Статистика и выводы.
Понятное дело, я не могу загрузить сюда все тесты, которые я проводил, но вот статистика по последним 10-и:
- Положительных тестов: 1 из 10.
- Выиграно денег: 2663.
- Изменение начальной суммы при бесконечно большом счете: -274484.
- Максимальная ставка: 819 200 (!!!).
На самом деле, рынок в стабильной стадии — это настолько сложная структура, где на ценообразование может оказывать влияние то, какой пастой чистит зубы Сатья Наделла, что на таких коротких промежутках, как 5 минут, можно вообще говорить о случайности. А у случайности, простите, вообще трудно выигрывать.
То есть в данном случае мы имеем чистую стратегию Мартингейла. Однако по этой стратегии нельзя выигрывать. Это не философский камень. Играя по ней достаточно долго, мы просто перераспределяем движение денег так, что выигрываем очень часто, но мало, а проигрываем редко, но много. В лучшем случае матожидание такой системы равно 0. Однако же в рулетке, например, существует помимо красного и черного еще и зеро, что снижает шанс угадать цвет до 48.65% (Зеро — 2.7%). У трейдеров тоже есть своё «Зеро» — коэффициент. Он сильно разнится от актива к активу. Я взял максимальный — 0.82 для курса доллар/евро. Однако даже с ним выход в плюс становится невозможным.
Уже сам тот факт, что казино или любая подобная организация существует, говорит нам о том, что в среднем компания получает больше денег, чем отдает.
Но как же так? ведь это выглядело так правдоподобно на видео! Да, выглядело. Точно также, как самолет выглядит как самый опасный вид транспорта для большинства. Или как задачи имеют тенденцию выглядеть простыми и очевидными постфактум. Увы, но вот с таким листом только лишь подтвержденных когнитивных искажений, человек является весьма посредственным наблюдателем. Именно поэтому мы и формализуем различные процессы, придумываем строгие алгоритмы, активно сотрудничаем с компьютером в решении задач.
Всем нам хочется верить, что где-то там есть способ зарабатывать деньги и/или славу, ничего не делая, а наш мозг лишь услужливо дорисовывает нам картину мира в котором это реально. Мы буквально хотим быть обманутыми.
Система не сможет существовать, если не будет иметь механизмов самоподдержки и регуляции. Все мы давно знаем, почему нельзя напечатать много денег для всех. Такая система попросту бы рухнула! Поэтому и нельзя стать богатым, лёжа на диване. Вы должны сконвертировать своё время, силы и мотивацию в то, что хотите получить.
Это такая простая истина, но большинство продолжает верить в бесчисленное множество мошеннических и околомошеннических схем, казино и лотереи.
Попрошу особенно отметить, я не сказал, что на тех же бинарных опционах невозможно заработать. Я лишь имел ввиду, что не существует в природе легких стратегий для этого. Вы сможете стабильно зарабатывать только если научитесь проводить тех. анализ, будете иметь набор компаний, с акциями которых вы близко знакомы (У разных компаний свои особенности движения акций), будете уметь управлять рисками… Можно ли всему этому научиться быстро? А самолет можно научиться садить за пару дней?
Также попрошу отметить, что я всего лишь новичок как в вашем сообществе, так и вообще в программировании, а потому прошу нещадно тыкать лицом во все сколь бы то ни было серьезные изъяны. Впрочем, не думаю, что вам нужно приглашение :)
Ну и напоследок о когнитивных искажениях.