Create Account
Log In
Dark
chart
exchange
Premium
Terminal
Screener
Stocks
Crypto
Forex
Trends
Depth
Close
Check out our Dark Pool Levels

SSL
Sasol Limited
stock NYSE ADR

At Close
Jul 17, 2026 3:59:59 PM EDT
11.36USD+4.220%(+0.46)1,055,549
0.00Bid   0.00Ask   0.00Spread
Pre-market
Jul 17, 2026 9:13:30 AM EDT
11.39USD+4.495%(+0.49)2,987
After-hours
Jul 17, 2026 4:10:30 PM EDT
11.37USD+0.088%(+0.01)49,175
OverviewOption ChainMax PainOptionsPrice & VolumeDividendsHistoricalExchange VolumeDark Pool LevelsDark Pool PrintsExchangesShort VolumeShort Interest - DailyShort InterestBorrow Fee (CTB)Failure to Deliver (FTD)ShortsTrendsNewsTrends
SSL Reddit Mentions
Subreddits
Limit Labels     

We have sentiment values and mention counts going back to 2017. The complete data set is available via the API.
Take me to the API
SSL Specific Mentions
As of Jul 18, 2026 6:14:28 PM EDT (3 minutes ago)
Includes all comments and posts. Mentions per user per ticker capped at one per hour.
4 days ago • u/skchan2 • r/thinkorswim • api_renewal • C
**auth.php**
This is the main file to manually grab and store your token for use, store it in the same folder as env.php (ie /scripts). NOTE: The full path should also be whitelisted in your app, ie: [https://www.yourdomain.com/scripts/auth.php](https://www.yourdomain.com/scripts/auth.php)
<?
ini_set('display_errors', 1);
require_once __DIR__ . '/env.php';

$appKey = schwabEnv('SCHWAB_APP_KEY');
$client_secret = schwabEnv('SCHWAB_CLIENT_SECRET');

if (!$appKey || !$client_secret) {
die('Missing Schwab credentials in .env file');
}

$key = base64_encode($appKey.':'.$client_secret);
$auth_header = "Authorization: Basic {$key}";
$thisPage = "https://$_SERVER[HTTP_HOST]$_SERVER[PHP_SELF]";
$tokenURL = "https://api.schwabapi.com/v1/oauth/token";
$redirectUri = urlencode($thisPage);
$currentDate = new DateTime();
$filePath = '/home/yourhost/private/trading/tokens.json';
$expired_refresh = false;
$expired_access = false;

if(file_exists($filePath)) {
echo("File Exists<br><br>");
$handle = fopen($filePath, 'r');
$content = fread($handle, filesize($filePath));
fclose($handle);

$data = json_decode($content, true);
echo("<pre>");
print_r($data);
echo("</pre>");

if(!$data["results"]){
$expired_refresh = true;
}elseif(array_key_exists("error",$data["results"])){
$expired_refresh = true;
}else{
$refresh = $data["results"]['refresh_token']??"";
$access = $data["results"]['access_token']??"";
}

$refreshExp = $data['refreshExp'];
$accessExp = $data['accessExp'];

$checkRefresh = new DateTime();
$checkRefresh->setTimestamp($refreshExp);
$checkAccess = new DateTime();
$checkAccess->setTimestamp($accessExp);

if($currentDate>$checkRefresh){
$expired_refresh = true;
}
if($currentDate>$checkAccess){
$expired_access = true;
}

$intervalRefresh = $currentDate->diff($checkRefresh);
$intervalAccess = $currentDate->diff($checkAccess);
$minutes = ($intervalAccess->days * 24 * 60) + ($intervalAccess->h * 60) + $intervalAccess->i;
?>
<p>Current:<? echo($currentDate->format('Y-m-d H:i:s')); ?></p>
<p>Refresh Expires:<? echo($checkRefresh->format('Y-m-d H:i:s')); ?> [<? echo($intervalRefresh->format('%R%a days')); ?>]</p>
<?
if($expired_refresh){
?>
<p>Refresh Expired!</p>
<?
}else{
?>
<p>Refresh Active!</p>
<?
}
?>
<p>Access Expires:<? echo($checkAccess->format('Y-m-d H:i:s')); ?> [<? echo($minutes.' minutes'); ?>]</p>
<?
if($expired_access){
?>
<p>Access Expired!</p>
<?
}else{
?>
<p>Access Active!</p>
<?
}
?>
<?
}

$authUrl = "https://api.schwabapi.com/v1/oauth/authorize?client_id={$appKey}&redirect_uri={$redirectUri}";

if($expired_refresh){
if(isset($_GET['code'])&&$_GET['code']<>""){
$code = $_GET['code'];
}else{
?>
<h1>Token has expired</h1>
<a href="<? echo($authUrl); ?>" target="_blank">Open in New Window</a><br><br>
<form id="pull-gex" enctype="multipart/form-data" method="get">
<label name="Code Input">Code</th>
<input class="stock-text-box" type="code" name="code"></td>
<input class="stock-form-submit" type="submit"></td>
</form>
<?
exit;
}
$code = urldecode($code);
$headers = array(
$auth_header,
"Content-Type: application/x-www-form-urlencoded"
);
$postfields = "grant_type=authorization_code&code=".$code."&redirect_uri=".$redirectUri;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $tokenURL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; SchwabAPI-Client/1.0)',
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
));
$response = curl_exec($curl);
echo("RESPONSE:".$response);
curl_close($curl);
if(curl_errno($curl)){
echo 'Error:'.curl_errno($curl);
}else{
$data = json_decode($response,true);
echo("Expired Refresh Output:<br><pre>");
print_r($data);
echo("</pre>");
if(isset($data['error'])){
echo 'Error:'.$data['error'];
}else{
$time = $_SERVER['REQUEST_TIME'];
$expire_in = 1200;
if($data){
$expire_in = $data['expires_in'];
}
$extra_data = [
"refresh_token_expires_at" => $time + 86400 * 7,
"access_token_expires_at" => $time + $expire_in,
];
$writeData = [
'refreshExp' => $extra_data["refresh_token_expires_at"],
'accessExp' => $extra_data["access_token_expires_at"],
'results' => $data
];
$jsonData = json_encode($writeData, JSON_PRETTY_PRINT);
if(file_put_contents($filePath, $jsonData)){
echo "JSON data successfully written to {$filePath}";
}else{
echo "Error writing JSON data to {$filePath}";
}
}
}
}else if($expired_access){
$headers = array(
$auth_header,
"Content-Type: application/x-www-form-urlencoded"
);
$jsonBody = [
"grant_type" => "refresh_token",
"refresh_token" => $refresh
];
$jsonArray = http_build_query($jsonBody);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $tokenURL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $jsonArray,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 30,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; SchwabAPI-Client/1.0)',
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
]);
$response = json_decode(curl_exec($curl),true);
echo("Expired Access Output:<br><pre>");
print_r($response);
echo("</pre>");
$err = curl_error($curl);
if ($err) {
echo "cURL Error #:" . $err;
}else{
$time = $_SERVER['REQUEST_TIME'];
$extra_data = [
"refresh_token_expires_at" => $time + 86400 * 7,
"access_token_expires_at" => $time + ($response['expires_in']??-1000000),
];
$writeData = [
'refreshExp' => $extra_data["refresh_token_expires_at"],
'accessExp' => $extra_data["access_token_expires_at"],
'lastRefresh' => $time,
'results' => $response
];
$jsonData = json_encode($writeData, JSON_PRETTY_PRINT);
if(file_put_contents($filePath, $jsonData)){
echo "JSON data successfully written to {$filePath}";
}else{
echo "Error writing JSON data to {$filePath}";
}
}
}else{

?>
<h1>Force Refresh Token</h1>
<a href="<? echo($authUrl); ?>" target="_blank">Open in New Window</a><br><br>
<form id="pull-gex" enctype="multipart/form-data" method="get">
<label name="Code Input">Code</th>
<input class="stock-text-box" type="code" name="code"></td>
<input class="stock-form-submit" type="submit"></td>
</form>
<?
}

?>
sentiment 0.99
5 days ago • u/Human-Version6973 • r/technicalanalysis • judas_swing_explained_simply_liquidity_sweep • B
https://preview.redd.it/agr4qtsyn5dh1.png?width=1402&format=png&auto=webp&s=49f4eccee5d3443007c709ee720cbe72875c6491
I've been studying ICT/SMC concepts and made this simple visual explanation of Judas Swing.
My understanding:
• Price first sweeps liquidity (BSL or SSL).
• Retail traders enter on the breakout.
• Smart Money reverses the market.
• A BOS (Break of Structure) confirms the real direction.
• Entry can be taken on the FVG or Order Block retest.
Bearish Judas Swing:
BSL Sweep → Retail Trap → BOS → Sell
Bullish Judas Swing:
SSL Sweep → Retail Trap → BOS → Buy
Questions:
1. Is this explanation accurate?
2. Would you add any confirmation before entering?
3. How do you identify a high-probability Judas Swing in live markets?
I'd appreciate any feedback or corrections.
sentiment -0.26
4 days ago • u/skchan2 • r/thinkorswim • api_renewal • C
**auth.php**
This is the main file to manually grab and store your token for use, store it in the same folder as env.php (ie /scripts). NOTE: The full path should also be whitelisted in your app, ie: [https://www.yourdomain.com/scripts/auth.php](https://www.yourdomain.com/scripts/auth.php)
<?
ini_set('display_errors', 1);
require_once __DIR__ . '/env.php';

$appKey = schwabEnv('SCHWAB_APP_KEY');
$client_secret = schwabEnv('SCHWAB_CLIENT_SECRET');

if (!$appKey || !$client_secret) {
die('Missing Schwab credentials in .env file');
}

$key = base64_encode($appKey.':'.$client_secret);
$auth_header = "Authorization: Basic {$key}";
$thisPage = "https://$_SERVER[HTTP_HOST]$_SERVER[PHP_SELF]";
$tokenURL = "https://api.schwabapi.com/v1/oauth/token";
$redirectUri = urlencode($thisPage);
$currentDate = new DateTime();
$filePath = '/home/yourhost/private/trading/tokens.json';
$expired_refresh = false;
$expired_access = false;

if(file_exists($filePath)) {
echo("File Exists<br><br>");
$handle = fopen($filePath, 'r');
$content = fread($handle, filesize($filePath));
fclose($handle);

$data = json_decode($content, true);
echo("<pre>");
print_r($data);
echo("</pre>");

if(!$data["results"]){
$expired_refresh = true;
}elseif(array_key_exists("error",$data["results"])){
$expired_refresh = true;
}else{
$refresh = $data["results"]['refresh_token']??"";
$access = $data["results"]['access_token']??"";
}

$refreshExp = $data['refreshExp'];
$accessExp = $data['accessExp'];

$checkRefresh = new DateTime();
$checkRefresh->setTimestamp($refreshExp);
$checkAccess = new DateTime();
$checkAccess->setTimestamp($accessExp);

if($currentDate>$checkRefresh){
$expired_refresh = true;
}
if($currentDate>$checkAccess){
$expired_access = true;
}

$intervalRefresh = $currentDate->diff($checkRefresh);
$intervalAccess = $currentDate->diff($checkAccess);
$minutes = ($intervalAccess->days * 24 * 60) + ($intervalAccess->h * 60) + $intervalAccess->i;
?>
<p>Current:<? echo($currentDate->format('Y-m-d H:i:s')); ?></p>
<p>Refresh Expires:<? echo($checkRefresh->format('Y-m-d H:i:s')); ?> [<? echo($intervalRefresh->format('%R%a days')); ?>]</p>
<?
if($expired_refresh){
?>
<p>Refresh Expired!</p>
<?
}else{
?>
<p>Refresh Active!</p>
<?
}
?>
<p>Access Expires:<? echo($checkAccess->format('Y-m-d H:i:s')); ?> [<? echo($minutes.' minutes'); ?>]</p>
<?
if($expired_access){
?>
<p>Access Expired!</p>
<?
}else{
?>
<p>Access Active!</p>
<?
}
?>
<?
}

$authUrl = "https://api.schwabapi.com/v1/oauth/authorize?client_id={$appKey}&redirect_uri={$redirectUri}";

if($expired_refresh){
if(isset($_GET['code'])&&$_GET['code']<>""){
$code = $_GET['code'];
}else{
?>
<h1>Token has expired</h1>
<a href="<? echo($authUrl); ?>" target="_blank">Open in New Window</a><br><br>
<form id="pull-gex" enctype="multipart/form-data" method="get">
<label name="Code Input">Code</th>
<input class="stock-text-box" type="code" name="code"></td>
<input class="stock-form-submit" type="submit"></td>
</form>
<?
exit;
}
$code = urldecode($code);
$headers = array(
$auth_header,
"Content-Type: application/x-www-form-urlencoded"
);
$postfields = "grant_type=authorization_code&code=".$code."&redirect_uri=".$redirectUri;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $tokenURL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; SchwabAPI-Client/1.0)',
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
));
$response = curl_exec($curl);
echo("RESPONSE:".$response);
curl_close($curl);
if(curl_errno($curl)){
echo 'Error:'.curl_errno($curl);
}else{
$data = json_decode($response,true);
echo("Expired Refresh Output:<br><pre>");
print_r($data);
echo("</pre>");
if(isset($data['error'])){
echo 'Error:'.$data['error'];
}else{
$time = $_SERVER['REQUEST_TIME'];
$expire_in = 1200;
if($data){
$expire_in = $data['expires_in'];
}
$extra_data = [
"refresh_token_expires_at" => $time + 86400 * 7,
"access_token_expires_at" => $time + $expire_in,
];
$writeData = [
'refreshExp' => $extra_data["refresh_token_expires_at"],
'accessExp' => $extra_data["access_token_expires_at"],
'results' => $data
];
$jsonData = json_encode($writeData, JSON_PRETTY_PRINT);
if(file_put_contents($filePath, $jsonData)){
echo "JSON data successfully written to {$filePath}";
}else{
echo "Error writing JSON data to {$filePath}";
}
}
}
}else if($expired_access){
$headers = array(
$auth_header,
"Content-Type: application/x-www-form-urlencoded"
);
$jsonBody = [
"grant_type" => "refresh_token",
"refresh_token" => $refresh
];
$jsonArray = http_build_query($jsonBody);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $tokenURL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $jsonArray,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 30,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; SchwabAPI-Client/1.0)',
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
]);
$response = json_decode(curl_exec($curl),true);
echo("Expired Access Output:<br><pre>");
print_r($response);
echo("</pre>");
$err = curl_error($curl);
if ($err) {
echo "cURL Error #:" . $err;
}else{
$time = $_SERVER['REQUEST_TIME'];
$extra_data = [
"refresh_token_expires_at" => $time + 86400 * 7,
"access_token_expires_at" => $time + ($response['expires_in']??-1000000),
];
$writeData = [
'refreshExp' => $extra_data["refresh_token_expires_at"],
'accessExp' => $extra_data["access_token_expires_at"],
'lastRefresh' => $time,
'results' => $response
];
$jsonData = json_encode($writeData, JSON_PRETTY_PRINT);
if(file_put_contents($filePath, $jsonData)){
echo "JSON data successfully written to {$filePath}";
}else{
echo "Error writing JSON data to {$filePath}";
}
}
}else{

?>
<h1>Force Refresh Token</h1>
<a href="<? echo($authUrl); ?>" target="_blank">Open in New Window</a><br><br>
<form id="pull-gex" enctype="multipart/form-data" method="get">
<label name="Code Input">Code</th>
<input class="stock-text-box" type="code" name="code"></td>
<input class="stock-form-submit" type="submit"></td>
</form>
<?
}

?>
sentiment 0.99
5 days ago • u/Human-Version6973 • r/technicalanalysis • judas_swing_explained_simply_liquidity_sweep • B
https://preview.redd.it/agr4qtsyn5dh1.png?width=1402&format=png&auto=webp&s=49f4eccee5d3443007c709ee720cbe72875c6491
I've been studying ICT/SMC concepts and made this simple visual explanation of Judas Swing.
My understanding:
• Price first sweeps liquidity (BSL or SSL).
• Retail traders enter on the breakout.
• Smart Money reverses the market.
• A BOS (Break of Structure) confirms the real direction.
• Entry can be taken on the FVG or Order Block retest.
Bearish Judas Swing:
BSL Sweep → Retail Trap → BOS → Sell
Bullish Judas Swing:
SSL Sweep → Retail Trap → BOS → Buy
Questions:
1. Is this explanation accurate?
2. Would you add any confirmation before entering?
3. How do you identify a high-probability Judas Swing in live markets?
I'd appreciate any feedback or corrections.
sentiment -0.26


Share
About
Pricing
Policies
Markets
API
Info
tz UTC-4
Connect with us
ChartExchange Email
ChartExchange on Discord
ChartExchange on X
ChartExchange on Reddit
ChartExchange on GitHub
ChartExchange on YouTube
© 2020 - 2026 ChartExchange LLC