Hi all,
I’ve been working on this contract but am stuck and would appreciate any help at all!
I’m trying to build a contract that will calculate the Risk/Reward of a trade setup.
What it does is take 3 inputs from a user:
- Entry Price, e.g. $1000
- Stop Loss, e.g. $900 for longs, $1100 for shorts
- Take Profit, e.g. $1200 for longs, $800 for shorts
Then calculates the:
- Profit Amount: e.g. $1200 - $1000 = $200 (for the long example)
- Loss Amount: e.g. $1000 - $900 = $100 (for the long example)
- “R” i.e. Reward:Risk ratio: e.g. $200 / $100 = 2.
I tried putting this together into a basic skeleton as per this first block of code below. However was not able to get it working properly.
Can anyone please give me some pointers? Greatly appreciated!!
// RiskCalculator.sol is a tool for traders to calculate the Risk/Reward of a trade setup.
/* for LONG: stopLoss < entry < takeProfit
*
* Example LONG:
* entry, stopLoss, takeProfit : 1000, 900, 1200
* profitAmount = 1200 - 1000 = 200
* lossAmount = 1000 - 900 = 100
* rr = 200 / 100 = 2
*/
/* for SHORT: takeProfit < entry < stopLoss
*
* Example SHORT:
* entry, stopLoss, takeProfit : 1000, 1250, 500
* profitAmount = 1000 - 500 = 500
* lossAmount = 1250 - 1000 = 250
* rr = 500 / 250 = 2
*/
pragma solidity 0.8.15;
contract RiskCalculator {
// uint decimals;
uint profitAmount;
uint lossAmount;
uint rr;
function calculateProfitLoss(uint size, uint entry, uint stopLoss, uint takeProfit) public returns(uint, uint, uint) {
if (takeProfit > entry) { // if long
profitAmount = ( size * ((takeProfit / entry) - 1) ); // doesn't work -> can't divide?
lossAmount = ( size * (1 - (stopLoss / entry)) ); // doesn't work
rr = profitAmount / lossAmount;
return(profitAmount, lossAmount, rr);
}
else if (takeProfit < entry) { // if short
profitAmount = ( size * (1 - (takeProfit / entry)) ); // doesn't work -> can't divide?
lossAmount = ( size * ((stopLoss / entry) - 1) ); // doesn't work
rr = profitAmount / lossAmount;
return(profitAmount, lossAmount, rr);
}
else {
return (0,0,0);
}
}
// function calculateLong(uint size, uint entry, uint stopLoss, uint takeProfit) public returns(uint, uint, uint) {
// require(takeProfit > entry, "This is not a long");
// profitAmount = ( size * ((takeProfit / entry) - 1) );
// lossAmount = ( size * (1 - (stopLoss / entry)) );
// rr = profitAmount / lossAmount;
// return(profitAmount, lossAmount, rr);
// }
}
So I went backwards and tried this very simple contract, that works as intended.
However, if I try to add 3 or 4 variables in the same way, and use division in my calculations
e.g. int newVar = ( var1 * ( var2 / var3 - 1 ) )
, things start to break. I’m guessing it could be something to do with not being able to show decimals properly?
Kinda stuck now. Help!
pragma solidity 0.8.15;
contract RiskCalculator {
int entry;
int stopLoss;
function setLong(int _entry) public {
entry = _entry;
}
function getLong() public view returns(int) {
return entry;
}
function setSL(int _stopLoss) public {
stopLoss = _stopLoss;
}
function getSL() public view returns(int) {
return stopLoss;
}
function calculateEntryMinusStopLoss() public returns(int) {
int stop = entry - stopLoss;
return stop; // works fine
}
}