Используя данные вида:
CurrencyPair Bid/Ask Price Quantity
BCH/ETH ask 1,4965 0,3
BCH/ETH bid 1,49 0,000728
находящиеся в MySQL db (отправлю заинтересовавшимся), а также используя значение комиссии, которая составляет 0.18% за каждое действие обмена, реализовать и перевести написанный ниже псевдокод в java (с использованием Maven проекта).
По исполнению алгоритма, должен отобразится кратчайший путь обмена (см. псевдокод ниже). Выгодные предложения по обмену, с точки зрения алгоритма, уже созданы. Проверить работоспособность при подаче значений am1=0.1, 0.5, 1, 2,5,10.
Вспомогательные функции:
double internal_exchange(int cur1, double am1, int cur2, int exch_agent)
/*Вычисляет объем валюты cur2, который можно получить в обменнике exch_agent
в обмен на am1 единиц валюты cur2*/
{/*Делаем выборку предложений обмена валюты cur1 на cur2, отсортированную по обменному курсу; выборка должна быть с учетом комиссии*/
double res = 0;
while (am1>0 и предложения остались) {Пока цель истратить am1 не достигнута и предложения остались выбираем из выборки самое выгодное предложение (с самым выгодным отношением объемов валют);
/*Пример:
пара USD/BTC - (имея 1btc, хотим купить USD)
cur1=BTC, cur2=USD, am1 = 1.0
Имеется предложение - агент хочет купить 0.1 BTC за 1200$
Тогда v1=0.1, v2=1200
получаем v1 – объем валюты 1, v2 – объем валюты 2;*/
if v1>am1{ //заявка агента исполняется частично (cur1 кончилось; процесс завершится)
res+=v2/v1*am1; //считаем пропорционально, сколько добавится валюты-результата
am1=0; //исходная валюта истрачена
}
else {//заявка агента исполняется полностью (cur1 осталось; процесс продолжается)
res+=v2; //добавляем валюту-результат
am1-=v1; вычитаем потраченное количество исходной валюты}
удаляем обработанное предложение из выборки
}
return res;
}
struct op_root{ //информация о состоянии до операции
int cur; //тип валюты
double am; //количество
int exch; //обменник
}
#define EXCH_TIME 2 //Время на обмен
#define FINISH_TIME 250 //Время жизни проекта (количество тиков/часов)
Основная функция:
void internal_chains_build(int cur0, int am0, exch_agent e)
/*Функция строит наилучшие возможные результаты по обменнику e*/
T=FINISH_TIME
//Нужно объявить структуру типа такой int M[0..Т][0..nС]
//M[i][j] - количество валюты типа j, которое может быть получено путем обменов к моменту i
//Нужно объявить структуру типа такой op_root O [0..Т][0..nС]
//O[i][j] - код и количество валюты, которое предшествует в смысле операций получению количества M[i][j]
//Инициализация
for(int i=0;i0;i-=EXCH_TIME)
печать(O[i][cc].cur, O[i][cc].am);
cc=O[i][cc].cur;
}