Получение прибыли по акциям путем расчета (сумма покупки * курс) - (курс продажи * сумма) методом FIFO MYSQL - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь создать программу торговли на рынке Форекс, используя Java в качестве переднего плана и Mysql в качестве базы данных, в настоящее время возникает проблема расчета прибылей / убытков путем суммирования (сумма покупки * ставка) - (сумма продажи * ставка).У меня есть 2 таблицы (Buy & Sell), которые обновляются в зависимости от того, введу ли я Транзакцию в транзакции транзакции, и разделитель в SellTable, который обновляет таблицу покупки акции всякий раз, когда я «вставляю данные» в SellTable,

ДляПример У меня есть вход Buy на моем BuyTable, который был вставлен из моей Java-программы.

> select * from TableBuy;

+ -------------------- + ------------- + -------------------- + ------------- + ------------------- + --------- + ----------------- + ---------------------- + ------------- + -------------- +
| TransactionCode      | TraderId      | TransactionTime      | Currency      | Balance Bought      | Rate      | Sold Balance      | Remaining Balance      | SellRate      | Processed      |
+ -------------------- + ------------- + -------------------- + ------------- + ------------------- + --------- + ----------------- + ---------------------- + ------------- + -------------- +
| 1                    | 32547AND      | 2019-05-07 15:41:14  | USD           | 100                 | 9650      | 100               | 0                      | 9700          | Y              |
| 2                    | 32547AND      | 2019-05-07 15:41:41  | USD           | 50                  | 9600      | 25                | 25                     | 9700          | Y              |
+ -------------------- + ------------- + -------------------- + ------------- + ------------------- + --------- + ----------------- + ---------------------- + ------------- + -------------- +
2 rows

, акции которого были обновлены с помощью триггера, созданного на моей SellTable, вот разделитель и SellTable, триггер которых в основном обновляет таблицу покупок оставшегося баланса и баланс продаж, как показано выше в таблице покупок

> select * from SellTable;

+ -------------------- + ------------- + -------------------- + ------------- + ----------------- + ------------- +
| TransactionCode      | TraderId      | TransactionDate      | Currency      | Balance Sold      | SellRate      |
+ -------------------- + ------------- + -------------------- + ------------- + ----------------- + ------------- +
| 1                    | 32547AND      | 2019-05-07 15:47:00  | USD           | 125               | 9700          |
+ -------------------- + ------------- + -------------------- + ------------- + ----------------- + ------------- +
1 rows

DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `Test`.`fifosell`$$
create trigger `Test`.`fifosell` BEFORE INSERT on `Test`.`SellTable`
for EACH ROW BEGIN
DECLARE AMOUNT INT;
SET AMOUNT=NEW.'Balance Sold';
SET @RATE =New.SellRate;
SET @ID=(SELECT TransactionCode FROM BuyTable WHERE Currency=NEW.Currency AND TraderId=NEW.TraderId AND TransactionDate=(SELECT TransactionDate FROM BuyTable WHERE Currency=NEW.Currency AND TraderId=NEW.TraderId AND 'Remaining Balance'>0 LIMIT 1) AND Remaining Balance>0 LIMIT 1);
SET @REMAIN=(SELECT 'Remaining Balance' FROM TableBuy WHERE TransactionCode =@ID);
SET @Currency=NEW.Currency;
REPEAT
IF(@REMAIN>AMOUNT) THEN
UPDATE BuyTable SET 'Remaining Balance'=@REMAIN-AMOUNT, 'Sold Balance'='Sold Balance'+AMOUNT, SellRate = @Rate , Processed = 'N' WHERE TransactionCode=@ID AND Currency=@Currency;
SET AMOUNT=0;
END IF;
IF (@REMAIN<AMOUNT) THEN
UPDATE TableBuy SET 'Remaining Balance'=0,'Sold Balance'='Sold Balance'+AMOUNT , SellRate = @Rate , Processed = 'N' WHERE TransactionCode=@ID AND Currency=@Currency;
SET AMOUNT=AMOUNT-@REMAIN;
SET @ID=(SELECT TransactionCode FROM BuyTable WHERE Currency=NEW.Currency AND TraderId=NEW.TraderId AND TransactionDate=(SELECT TransactionDate FROM BuyTable WHERE Currency=NEW.Currency AND TraderId=NEW.TraderId AND 'Remaining Balance'>0 LIMIT 1) AND Remaining Balance>0 LIMIT 1);
SET @REMAIN=(SELECT 'Remaining Balance' FROM TableBuy WHERE TransactionCode =@ID);
IF(@REMAIN=AMOUNT) THEN
UPDATE TableBuy SET 'Remaining Balance'=0,'Sold Balance'='Sold Balance'+AMOUNT, SellRate = @Rate , Processed = 'N' WHERE TransactionCode=@ID AND Currency=@Currency;
SET AMOUNT=0;
END IF;
UNTIL AMOUNT=0
END REPEAT;
END;
$$
DELIMITER ;

на втором входе Sell в SellTable, триггер обновляет Balance и SellRate второй строки BuyTable, которая имеет баланс от 25 Balance до 0, затем я обновляю столбец ProfitLoss на TransactionsTable с помощьюзапрос на обновление ниже

> select * from SellTable;

+ -------------------- + ------------- + -------------------- + ------------- + ----------------- + ------------- +
| TransactionCode      | TraderId      | TransactionDate      | Currency      | Balance Sold      | SellRate      |
+ -------------------- + ------------- + -------------------- + ------------- + ----------------- + ------------- +
| 1                    | 32547AND      | 2019-05-07 15:47:00  | USD           | 125               | 9700          |
| 2                    | 32547AND      | 2019-05-07 16:49:15  | USD           | 25                | 9900          |
+ -------------------- + ------------- + -------------------- + ------------- + ----------------- + ------------- +
2 rows


> select * from BuyTable;

+ -------------------- + ------------- + -------------------- + ------------- + ------------------- + --------- + ----------------- + ---------------------- + ------------- + -------------- +
| TransactionCode      | TraderId      | TransactionTime      | Currency      | Balance Bought      | Buy Rate  | Sold Balance      | Remaining Balance      | SellRate      | Processed      |
+ -------------------- + ------------- + -------------------- + ------------- + ------------------- + --------- + ----------------- + ---------------------- + ------------- + -------------- +
| 1                    | 32547AND      | 2019-05-07 15:41:14  | USD           | 100                 | 9650      | 100               | 0                      | 9700          | Y              |
| 2                    | 32547AND      | 2019-05-07 15:41:41  | USD           | 50                  | 9600      | 50                | 0                      | 9900          | Y              |
+ -------------------- + ------------- + -------------------- + ------------- + ------------------- + --------- + ----------------- + ---------------------- + ------------- + -------------- +
2 rows

Это мой запрос на обновление столбца ProfitLoss на вкладке транзакций

UPDATE TransactionsTable SET ProfitLoss =(select sum(SellRate* 'Sold Balance') - sum(Buy Rate * 'Sold Balance') From BuyTable Where SellRate='9700' AND TraderId ='32547AND' AND Processed = 'Y') ORDER BY TransactionCode DESC LIMIT 1;

У меня проблемы с получением новой нормы прибыли или убытка при вводе другогоselldata на моем SellTable, как показано в таблице транзакций ниже

> select * from TransactionsTable;

+ -------------------- + ------------- + -------------------- + ----------------- + ------------ + --------- + ----------- + ----------- + ----------- +
| TransactionCode      | TraderID      | TransactionDate      | CurrencyCode      | BuySell      | Rate      | Amount      | Profit      | Remark      |
+ -------------------- + ------------- + -------------------- + ----------------- + ------------ + --------- + ----------- + ----------- + ----------- +
| 1                    | 32547AND      | 2019-05-07 15:41:14  | USD               | B            | 9650      | 100         |             |             |
| 2                    | 32547AND      | 2019-05-07 15:41:41  | USD               | B            | 9600      | 50          |             |             |
| 3                    | 32547AND      | 2019-05-07 15:47:00  | USD               | S            | 9700      | 125         | 7500        |             |
| 4                    | 32547AND      | 2019-05-07 16:49:15  | USD               | S            | 9900      | 25          | 15000       |             |
+ -------------------- + ------------- + -------------------- + ----------------- + ------------ + --------- + ----------- + ----------- + ----------- +
4 rows

Согласно методу FIFO, последняя строка в TransactionsTable должна иметь 25 * (9900-9600), что должно привести к 7500, где 25 * 9600Остаток выкупленного баланса со второго ряда и 25 * 9900 у сна 4-й строке

есть ли запрос, который я могу изменить / добавить в триггере, или запрос на обновление, чтобы получить фактический расчет?

...