Генератор свечек форекса

Lumix
Дата: 14.11.2017 13:30:59
Взяли заказ на написание эмулятора форекса. Написали генератор свечек, но что-то по внешнему виду как-то неестественно выглядят. Подскажите, может, кто сталкивался, как сгенерировать поток цен, более-менее похожий на реальный форекс.

Суть задачи такая.
Форекс - это торговля валютой. Каждую секунду заключаются сотни и тысячи сделок.
Например, пусть за 1 секунду было совершено 15 сделок по ценам:
105, 106, 104, 103, 108, 109, 112, 106, 105, 103, 100, 102, 107, 109, 108

В этом случае:
цена открытия свечи = 105
цена закрытия свечи = 108
самая высокая цена за прошедшую секунду = 112
самая низкая цена за прошедшую секунду = 100

Сама свеча будет белая (растущая), потому что цена закрытия выше, чем цена открытия.

Вот и получается, что пишем генератор, который генерит последовательность из 4-х цифр: открытие, закрытие, хай и лоу. А будучи составлены вместе получается типичный график форекса.

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

Может есть идеи, как построить алгоритм, чтобы итоговая картинка получалась более-менее похожей на реальный форекс? Разумеется, это задача не на отрисовку свечей, не на работу с графикой, а на генерацию комплектов чисел.
Alexander A. Sak
Дата: 14.11.2017 14:01:02
Наверное, заказчик хочет разглядеть там тренды, волны Эллиота и прочие магические артефакты из мира технического анализа. Возьмите цены за последние несколько лет и гоняйте их со случайного места.
Areostar
Дата: 14.11.2017 14:03:01
фид цен поищите в сети!
x1ca4064
Дата: 14.11.2017 14:17:46
Lumix
Может есть идеи, как построить алгоритм, чтобы итоговая картинка получалась более-менее похожей на реальный форекс? Разумеется, это задача не на отрисовку свечей, не на работу с графикой, а на генерацию комплектов чисел.


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

Если не устроит, можно использовать генератор второго порядка...
По хорошему, нужно придумать правильный критерий "похожести" сгенерированных данных на реальные, а можно попробовать нейросети (генератор и дискриминатор).

А сейчас как генератор сделан?
Цена закрытия и отрытия должны совпадать?
S.G.
Дата: 14.11.2017 18:26:31
Lumix
Вот и получается, что пишем генератор, который генерит последовательность из 4-х цифр: открытие, закрытие, хай и лоу. А будучи составлены вместе получается типичный график форекса.

Фигово то, что получившийся генератор генерит какой-то противоестественный график.
Генератор генерирует случайные числа?
Тогда вам надо разобраться, какому распределению вероятностей принадлежат реальные потоки цен.
Берете нечто реальное и строите график распределения вероятностей.
Lumix
Дата: 14.11.2017 19:35:21
Alexander A. Sak
Наверное, заказчик хочет разглядеть там тренды, волны Эллиота и прочие магические артефакты из мира технического анализа. Возьмите цены за последние несколько лет и гоняйте их со случайного места.


Заказчик за такое денег не даст.
Скажет, что мы смухлевали.
Он заказывал генератор, а мы ему исторические данные подсовываем.
Нехорошо так делать. Неэтично.

S.G.
Тогда вам надо разобраться, какому распределению вероятностей принадлежат реальные потоки цен.


Совет, конечно, хороший. :-)
Но в нашей команде такую задачу осилить некому. Это надо в математике шибко шарить.

x1ca4064
Я не разбираюсь в форекс.


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

x1ca4064
По хорошему, нужно придумать правильный критерий "похожести" сгенерированных данных на реальные, а можно попробовать нейросети (генератор и дискриминатор).


Проще отказаться от заказа.
Мы программисты, а не финансовые аналитики, не статистики и не математики.

x1ca4064
А сейчас как генератор сделан?


Просто рандомом числа генерятся.

open = open ? rand(100, 200) : close;
close = rand(100, 200);
high = rand (max(open, close), max(200, open, close));
low = rand (min(open, close), min(100, open, close));
деятель
Дата: 14.11.2017 19:54:19
генерите случайный гауссовый шум от -1 до 1 суммируете нарастающим итогом потом режете на кусочки по 100 приращений и на каждом считаете первое-макс-мин-последнее
Alexander A. Sak
Дата: 14.11.2017 20:02:37
Lumix
Проще отказаться от заказа.
Мы программисты, а не финансовые аналитики, не статистики и не математики.


Отказывайтесь пока не поздно.
С таким критерием -- "что-то оно неестественно выглядит" -- можно мозги клевать вечно и программистам и математикам.
Lumix
Дата: 14.11.2017 20:09:22
деятель
генерите случайный гауссовый шум от -1 до 1 суммируете нарастающим итогом потом режете на кусочки по 100 приращений и на каждом считаете первое-макс-мин-последнее


Блин, вот бы ваш совет еще на русский перевести, вообще было бы замечательно...
Если серьзено.
Я не понял, какие конкретно программные операции выполнять, чтобы выполнить ваш совет.

 total = 0;
for (0 ... 100)
{
    gausShum = rand(-1, 1); // тут будет например 0.07
    total += gausShum;
}
total /= 100;
...???


В общем, не смог осилить перевод вашего совета на практику.
kealon(Ruslan)
Дата: 14.11.2017 23:38:42
Lumix,

может наведёт на мысль, очень хорошая функция:
https://geektimes.ru/post/294963/

гауса можно нагенерить по простому если "Преобразование Бокса — Мюллера"
function NormalDev(const AEngine: IHepRandomEngine):RandFloat;
var v1,v2,r:RandFloat;
begin
  //Преобразование Бокса — Мюллера
  repeat
     v1:= 2.0 * AEngine.flat() - 1.0;
     v2:= 2.0 * AEngine.flat() - 1.0;
     r:=sqr(v1)+sqr(v2);
  until r<=1;
  {$IFDEF OriginalGauss}
  Result:=v1*sqrt(-2*ln(r)/r);
  {$ELSE}
  Result:=(v1+v2)*sqrt(-ln(r)/r);
  {$ENDIF}
end;

AEngine.flat() здесь можно взять как (1-random())

PS: генерить случайные числа случайно - нельзя