Я пытаюсь создать программу торговли на рынке Форекс, используя 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-й строке
есть ли запрос, который я могу изменить / добавить в триггере, или запрос на обновление, чтобы получить фактический расчет?