Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
node_modules/
out/
*.db
*.db
.DS_Store
.fleet/
93 changes: 25 additions & 68 deletions build.js
Original file line number Diff line number Diff line change
@@ -1,72 +1,29 @@
const fs = require('fs');
const { exec } = require('child_process');
const path = require('path');
const {exec} = require('child_process');

const dbFolderPath = path.join(__dirname, 'db');
const fileNames = ['account-settings.db']; // Add more file names as needed

// Step one: Delete and recreate the files
function deleteAndRecreateFiles() {
return new Promise((resolve, reject) => {
const deletePromises = fileNames.map((fileName) => {
const filePath = path.join(dbFolderPath, fileName);

return new Promise((resolve, reject) => {
fs.unlink(filePath, (err) => {
if (err && !fs.existsSync(filePath)) {
console.error('Error deleting file:', err);
reject(err);
return;
}
fs.writeFile(filePath, '', (err) => {
if (err) {
console.error('Error recreating file:', err);
reject(err);
return;
}
console.log('Recreated file:', filePath);
resolve();
});
});
});
});

Promise.all(deletePromises)
.then(() => {
resolve();
})
.catch((error) => {
reject(error);
});
});
const runBuildScript = () => {
return new Promise((resolve, reject) => {
exec('yarn run build', (error, stdout, stderr) => {
if (error) {
console.error(`Error executing 'yarn run build' command: ${error.message}`);
reject(error);
return;
}
if (stderr) {
console.error(`Command error: ${stderr}`);
reject(stderr);
return;
}
console.log(`Command output: ${stdout}`);
resolve();
});
});
}

// Step two: Run 'yarn run build' script
function runBuildScript() {
return new Promise((resolve, reject) => {
exec('yarn run build', (error, stdout, stderr) => {
if (error) {
console.error(`Error executing 'yarn run build' command: ${error.message}`);
reject(error);
return;
}
if (stderr) {
console.error(`Command error: ${stderr}`);
reject(stderr);
return;
}
console.log(`Command output: ${stdout}`);
resolve();
});
});
}

// Execute the steps sequentially
deleteAndRecreateFiles()
.then(() => runBuildScript())
.then(() => {
console.log('Build script completed successfully.');
})
.catch((error) => {
console.error('Error encountered:', error);
});
runBuildScript()
.then(() => {
console.log('Build script completed successfully.');
})
.catch((error) => {
console.error('Error encountered:', error);
});
86 changes: 86 additions & 0 deletions client/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8"/>
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"/>
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'"/>
<title>Trader Bruh</title>
<link rel="stylesheet" href="./style.css" type="text/css"/>
</head>

<body>
<main class="fc f-wrap-32">

<div class="Credits">
<div class="fr f-wrap-12">
<img alt="logo" src="../assets/logo-1000.png" class="Logo"/>
<div class="fc">
<p class="Credits-Title">Trader Bruh - v3.0</p>
<p class="Credits-Creator">by @PseudoCode88</p>
</div>
</div>
</div>

<section>
<!-- Data Section-->
<section id="result-panel" class="Wrapper-Position-Size-Result">
<div class="fc f-wrap-24">
<div class="fc">
<p class="label">Position Size (units)</p>
<p class="value" id="label-position-size-units">0</p>
</div>
<div class="fc">
<p class="label">Position Size (USD)</p>
<p class="value" id="label-position-size-usd">$0</p>
</div>
<div class="fc">
<p class="label">Margin (USD)</p>
<p class="value" id="label-margin-usd">$0.00</p>
</div>
</div>
</section>

<!-- Form Section-->
<section class="Wrapper-Position-Size-Form">
<div class="fc f-wrap-24">
<div class="fc f-wrap-8">
<h2>Size Builder</h2>
<p class="Heading-Subtitle">Build your position size based on the stop loss and the risk you defined in
the account settings.</p>
</div>

<div class="fr f-wrap-24">
<div class="strech">
<label for="entry-price">Entry Point</label>
<input type="number" id="entry-price" value="1"/>
</div>

<div class="strech">
<label for="stop-loss">Stop Loss</label>
<input type="number" id="stop-loss" value="1"/>
</div>
</div>

<div class="fr f-wrap-24">
<div class="strech">
<label for="risk-amount">Risk Amount</label>
<input type="number" id="risk-amount" value="1"/>
</div>

<div class="strech">
<label for="leverage">Leverage</label>
<input type="number" step="1" id="leverage" value="10"/>
</div>
</div>
</div>
</section>
</section>


</main>
<script type="text/javascript" src="./script.js"></script>
</body>

</html>
110 changes: 110 additions & 0 deletions client/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
const $ = require('jquery');

let PositionSizeBuilder = ($) => {

let data = {
stopLoss: 0,
entryPrice: 0,
leverage: 1,
risk: 0,
direction: 'long',
positionSizeUnit: 0,
positionSizeUSD: 0,
margin: 0
};

let el = {
textfield: {
stopLoss: $('#stop-loss'),
entryPrice: $('#entry-price'),
leverage: $('#leverage'),
riskAmount: $('#risk-amount')
},
label: {
positionSizeUnit: $('#label-position-size-units'),
positionSizeUSD: $('#label-position-size-usd'),
margin: $('#label-margin-usd')
},
wrapper: {
result: $('#result-panel')
}
}

let eventBindings = () => {
Object.keys(el.textfield).forEach(function (id) {
el.textfield[id].on("keyup", updatePositionSize)
})
}

let getFormData = () => {
const formFields = {
stopLoss: el.textfield.stopLoss,
entryPrice: el.textfield.entryPrice,
leverage: el.textfield.leverage,
risk: el.textfield.riskAmount
};

return Object.entries(formFields).reduce((acc, [key, element]) => {
acc[key] = (element.val()) ? element.val() : '1';
return acc;
}, {});
}

let updatePositionSize = () => {
const formData = getFormData();
const data = calculatePositionSize(formData);
updateData(data);
render();
}

let updateData = (formData) => {
Object.keys(formData).forEach((key) => {
data[key] = formData[key];
})
}

let calculatePositionSize = (data) => {
const { risk, entryPrice, stopLoss, leverage } = data;

const priceDifference = (stopLoss > entryPrice) ? stopLoss - entryPrice : entryPrice - stopLoss;


if (priceDifference === 0) {
data.positionSizeUnit = 0;
data.positionSizeUSD = 0;

} else {
data.positionSizeUnit = risk / Math.abs(priceDifference);
data.positionSizeUSD = (data.positionSizeUnit * entryPrice).toFixed(2);
}

data.margin = ((data.positionSizeUnit * entryPrice) / leverage).toFixed(2);
data.direction = (stopLoss > entryPrice) ? 'short' : 'long'

return data;
}

let render = () => {
const elementsToUpdate = {
positionSizeUnit: Number(data.positionSizeUnit).toFixed(4),
positionSizeUSD: "$" + data.positionSizeUSD,
margin: "$" + data.margin
};

Object.entries(elementsToUpdate).forEach(([elementKey, value]) => {
el.label[elementKey].html(value);
});
}

let init = () => {
eventBindings();
}

return {
init: init
}
}

document.addEventListener('DOMContentLoaded', () => {
PositionSizeBuilder($).init();
});
Loading