How to Install Thinkorswim Trading Platform on Ubuntu 24.04/22.04

This tutorial will show you how to install the Thinkorswim trading platform on Ubuntu 24.04/22.04 desktop, so you can trade stocks.

ThinkorSwim Features

  • It allows you to trade stocks, options, options on futures, ETFs, futures, and forex.
  • Free level 2 data.
  • Economic data straight from the Fed.
  • Trade select securities 24 hours a day, 5 days a week. Available securities include FXI, SPY, EEM, GLD, SLV, DIA, UNG, TLT, IWM, QQQ, USO, SH, RWM, PSQ, AGG, DOG, EWA, EFA, EWJ, IJH, VTI, XLF, XLE, and XLK.
  • Practice paper trading with the paperMoney feature.
  • Track and modify your watchlist, orders, and alerts, including saved orders.
  • Live stream programming from TD Ameritrade Network and CNBC
  • Custom alerts: Choose from pre-selected lists of popular events or create your own using a powerful array of parameters.
  • Market Maker Move: Determine which stocks may be making big moves by tracking the expected magnitude of price movement based on market volatility.
  • Market Monitor: In real time, view the whole market displayed in easy-to-read heat mapping and graphics.
  • Available for Windows, Mac, Linux, Android and iOS

Step 1: Create a Brokerage Account

Thinkorswim was developed by TD Ameritrade, which was one of the big four stock brokerage firms in the United States. It was acquired by Charles Schwab in 2020.

  • U.S. traders should open a brokerage account at Charles Schwab. There’s no minimum deposit requirement to use the Thinkorwim trading platform for U.S. person.
  • If you are not a U.S. person, then you should go to the international client signup page. Note that you will need to deposit at least $25,000 in order to use its services.
  • If you don’t want to trade real money right away, Thinkorswim allows you to create a simulated trading account to practice trading before using real money. It’s free for everyone.

Step 2: Install Java on Ubuntu Desktop

Thinkorswim is written with the Java programming language. We need to install the Java runtime environment to use the Thinkorswim software.

sudo apt install openjdk-17-jre

Next, check your Java version.

java -version

Sample output:

openjdk version "17.0.11" 2024-04-16
OpenJDK Runtime Environment (build 17.0.11+9-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 17.0.11+9-Ubuntu-122.04.1, mixed mode, sharing)

If you have already installed other versions of Java, then run the following command to set Java 17 as the default version.

sudo update-alternatives --config java

Sample output.

There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1111      manual mode
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      manual mode

Press <enter>  to keep the current choice[*], or type selection number: 

If you don’t use Java 17, then Thinkorswim may throw out an error message when it starts up.

Install Thinkorswim on Ubuntu Desktop

Go to the official page to download the install script for Linux. You can also download it from the command line.

wget https://mediaserver.thinkorswim.com/installer/InstFiles/thinkorswim_installer.sh

Then run the following command to install it.

bash thinkorswim_installer.sh

The install wizard will appear. First, choose your language.

Language Selection_thinkorswim

Then choose your accounty type. For this tutorial, I’m going to use a free trial account.

Setup - thinkorswim desktop

Next, agree to the license agreement.

thinkorswim license agreement

After that, choose whether you want to install Thinkorswim for yourself or for all users on the computer. I recommend installing only for yourself, because you don’t want others to mess with your stock trading.

Setup - thinkorswim desktop install only for the current user

Thinkorswim will be installed to your home directory, which is great.

install thinkorswim linux to home directory

It will create a desktop icon, so you can easily launch it next time.

install thinkorswim linux to home directory

After the setup wizard finishes installing Thinkorswim, you can launch it.

launch thinkorswim

Upon first launch, it will check if there’s any software update.

thinkorswim updater

Now you can login. (Note: Thinkorswim is under maintenance on the weekend.) Click the gear icon to choose your account type (Schwab, TD Ameritrade, Guest Pass). If you want to use the paperMoney feature for simulated trading, then choose the TD Ameritrade account type. Market data will be delayed 20 minutes for simulated trading.

Logon to thinkorswim paperMoney

Thinkorswim interface.

Thinkorswim linux user interface

Now you can create a watchlist and place orders. For more information on how to use the Thinkorswim trading platform, you can watch educational videos on the official YouTube channel, and use the Thinkorswim learning center.

Other Useful Stock Trading Tools

Install Thinkorswim on Fedora

The process is roughly the same. You need to install Java 17.

sudo dnf install java-17-openjdk

Then run the following command to choose Java 17 as the default Java version.

sudo update-alternatives --config java

Then download the install script.

wget https://mediaserver.thinkorswim.com/installer/InstFiles/thinkorswim_installer.sh

And run the following command to install it.

bash thinkorswim_installer.sh

Enable AutoStartup

Open the “Startup Application” app and click the + button, then add the command /home/username/thinkorswim/thinkorswim to the startup list (Replace username with your real username).

Wrapping Up

I hope this tutorial helped you install Thinkorswim on Linux.

Rate this tutorial
[Total: 9 Average: 4.9]

15 Responses to “How to Install Thinkorswim Trading Platform on Ubuntu 24.04/22.04

  • Xiao Guoan (Admin)
    6 months ago

    You can use this method to install Thinkorswim on almost any Linux distribution, as long as Java 17 can be installed on your system.

    Although Thinkorswim says you need Zulu JDK, I always use OpenJDK from the default Linux repository and it runs perfectly.

  • Is there way to set Java version 11 for thinkorswim only and let everything else run the latest?

    great article. very helpful. thanks

    • reikred
      1 month ago

      I think you mean to say use java 17 for thinkorswim, not java 11.

      /usr/lib/jvm/java-17-openjdk-amd64/bin/java works today

      /usr/lib/jvm/java-11-openjdk-amd64/bin/java does NOT work today.

  • This helped me out, thanks. I’ve been running ToS on Ubuntu 20.04 for quite a long time without any issues. Suddenly though, it wouldn’t launch, and instead it would end with a dialog error saying “Zulu OpenJDK 17.0.10 is required to start the application. Please update Java and ensure it is the first JRE available in your system path.”

    When I checked sudo update-alternatives --config java, it showed that the currently selected version was /usr/lib/jvm/zulu-21-amd64/bin/java…. which confused me at first, because I couldn’t understand why it would complain about needing version 17, when I already had a superseding version installed.

    And then it clicked: I need to install the older version. I was assuming that later/newer openjdk versions would be backwards compatible, and that was a faulty belief.

    So I just installed the apt package suggested in this post, openjdk-17-jre, and then used the update-alternatives command to select that version. After that I was able to launch ToS again and it ran perfectly.

    Thank you again! I had searched several times already and this post is the one that made me realize that I should just try to install that older version.

  • Thanks for the guide. I did all steps right (same guide on the official ToS website. Enabled Java 17 but I still got this error. Does anyone have any experience with it?

    • Same issue, had it working once but never got the main screen, just saw the ALT-F? comments, reinstalled now can’t get it to work again. Ubuntu24, openjdk17, downgrading to U22 and trying.

    • I hit my head on the wall for like a day on this one. I thought there may have been some files that thinkorswim left behind and that’s why reinstalling broke it.

      The version that the `thinkorswim_installer.sh` installs needs Zulu 11, once you start thinkorswim, it updates to a newer version that needs Zulu 17. Which I must have installed to run the latest version. After uninstalling and reinstalling, you need to remove zulu 17 and make sure you have zulu 11 still

      make sure your default version is zulu11 with `java –version`

      run the installer, start it up and have it update, it’ll error saying it needs zulu 17, reinstall zulu 17, rerun the TOS bin, great success

      • Thanks AVG that worked. It took some back and forth with the java –config but it finally worked. zulu 17 causes all the problems it seems. Zulu11 to get it installed, after first error when starting change zulu config, updates may seem locked up, just let it run.
        working with this setup:
        There are 2 choices for the alternative java (providing /usr/bin/java).

        Selection Path Priority Status
        ————————————————————
        * 0 /usr/lib/jvm/zulu-17-amd64/bin/java 2175200 auto mode
        1 /usr/lib/jvm/zulu-11-amd64/bin/java 2116600 manual mode
        2 /usr/lib/jvm/zulu-17-amd64/bin/java 2175200 manual mode

        Press to keep the current choice[*], or type selection number:

  • Same issue TOS does’nt like jar-17 thing … called Schwab…they told me to pound sand!!!!!!! need some developers/programmers to fix this for us !!!!!!!!!!!!!!!!!!11

  • Kartik Subbarao
    3 weeks ago

    @Martin @Willis @TazMan Two things:

    1) Make sure java -version looks something like this:

    openjdk version "17.0.12" 2024-07-16 LTS
    OpenJDK Runtime Environment Zulu17.52+17-CA (build 17.0.12+7-LTS)
    OpenJDK 64-Bit Server VM Zulu17.52+17-CA (build 17.0.12+7-LTS, mixed mode, sharing)
    

    2) Check your thinkorswim.vmoptions file and make sure it has the necessary --add-opens options. Here is an example from a working file:

    -Xmx1536m
    -Xms32m
    -Djava.util.Arrays.useLegacyMergeSort=true
    -Dapplication.oauth.enabled=true
    -Djdk.util.jar.version=10
    -DTimeDef.timeZone=America/New_York
    -Dawt.useSystemAAFontSettings=lcd_hrgb
    -Dsun.net.http.allowRestrictedHeaders=true
    -Dsun.java2d.uiScale.enabled=false
    --illegal-access=permit
    -Djxbrowser.linux.deps.check.off=true
    -classpath/p launcher-first.jar
    -Djxbrowser.logging.level=INFO
    -Dcom.devexperts.qd.qtp.maxMessageSize=2147483647
    --add-opens=java.base/java.lang=ALL-UNNAMED
    --add-opens=java.base/java.io=ALL-UNNAMED
    --add-opens=java.base/java.math=ALL-UNNAMED
    --add-opens=java.base/java.net=ALL-UNNAMED
    --add-opens=java.base/java.text=ALL-UNNAMED
    --add-opens=java.base/java.util=ALL-UNNAMED
    --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
    --add-opens=java.base/sun.security.util=ALL-UNNAMED
    --add-opens=java.base/sun.net.www.protocol.http=ALL-UNNAMED
    --add-opens=java.base/sun.net.www.protocol.https=ALL-UNNAMED
    --add-opens=java.desktop/java.awt=ALL-UNNAMED
    --add-opens=java.desktop/java.awt.color=ALL-UNNAMED
    --add-opens=java.desktop/java.awt.peer=ALL-UNNAMED
    --add-opens=java.desktop/java.beans=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.colorchooser=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.plaf.metal=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.table=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.text=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.text.html.parser=ALL-UNNAMED
    --add-opens=java.desktop/javax.swing.tree=ALL-UNNAMED
    --add-opens=java.desktop/sun.awt=ALL-UNNAMED
    --add-opens=java.desktop/sun.awt.image=ALL-UNNAMED
    --add-opens=java.desktop/sun.awt.windows=ALL-UNNAMED
    --add-opens=java.desktop/sun.java2d=ALL-UNNAMED
    --add-opens=java.desktop/sun.java2d.loops=ALL-UNNAMED
    --add-opens=java.desktop/sun.swing=ALL-UNNAMED
    --add-opens=java.desktop/sun.swing.table=ALL-UNNAMED
    --add-opens=java.desktop/sun.print=ALL-UNNAMED
    --add-opens=java.desktop/com.sun.java.swing=ALL-UNNAMED
    --add-opens=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED
    --add-opens=java.desktop/com.apple.eawt=ALL-UNNAMED
    --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED
    --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
    --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
    
  • Failed to get field handle to update java.library.path
    in
    suit.log

    so… how to fix?

    05.08.24 14:50:09:273 suit INFO: [com.devexperts.jnlp.Launcher] Current suit jar is /home/user/thinkorswim/suit/1979.1.503/tos-suit-1979.1.503.jar
    05.08.24 14:50:09:284 suit INFO: [com.devexperts.jnlp.Launcher] App root is /home/user/thinkorswim
    05.08.24 14:50:09:316 suit INFO: [UpdateManager-9309] UpdateManager.main - thread name changed: oldName=com.devexperts.jnlp.Launcher
    05.08.24 14:50:09:318 suit INFO: [UpdateManager-9309] ForceUseJreDllsFix: Started
    05.08.24 14:50:09:320 suit INFO: [UpdateManager-9309] ForceUseJreDllsFix: OS is not Windows, finished
    05.08.24 14:50:09:323 suit INFO: [UpdateManager-9309] Failed to get field handle to update java.library.path
    05.08.24 14:50:09:336 suit INFO: [UpdateManager-9309] OS Type is LINUX
    05.08.24 14:50:09:358 suit INFO: [UpdateManager-9309] OS: linux X86-64, JRE: X86-64, JRE vendor is Ubuntu, JRE version is 17.0.12
    05.08.24 14:50:09:359 suit INFO: [UpdateManager-9309] Using vmoptions: /home/user/thinkorswim/thinkorswim.vmoptions
    05.08.24 14:50:09:363 suit INFO: [UpdateManager-9309] AppInfo: nativeLauncherName=thinkorswim
    05.08.24 14:50:09:366 suit INFO: [UpdateManager-9309] SystemPropertyFix: VMOptions is up-to-date
    
    • client.out

      Exception in thread "UpdateManager-9309" java.lang.reflect.InvocationTargetException
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
      	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
      	at com.devexperts.jnlp.Launcher.run(Launcher.java:32)
      	at java.base/java.lang.Thread.run(Thread.java:840)
      Caused by: java.lang.IllegalAccessError: class com.devexperts.jnlp.utils.URLManager$1 (in unnamed module @0x5a51575) cannot access class sun.security.util.HostnameChecker (in module java.base) because module java.base does not export sun.security.util to unnamed module @0x5a51575
      	at com.devexperts.jnlp.utils.URLManager$1.checkHostName(URLManager.java:71)
      	at com.devexperts.jnlp.utils.URLManager$1.checkHostNames(URLManager.java:59)
      	at com.devexperts.jnlp.utils.URLManager$1.verify(URLManager.java:48)
      	at java.base/sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:662)
      	at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:603)
      	at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187)
      	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1686)
      	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1610)
      	at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529)
      	at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:308)
      	at com.devexperts.jnlp.updater.HttpResponse.(HttpResponse.java:26)
      	at com.devexperts.jnlp.updater.HttpRequest.doRequest(HttpRequest.java:84)
      	at com.devexperts.jnlp.updater.HttpRequest.doGetRequest(HttpRequest.java:65)
      	at com.devexperts.jnlp.utils.Utils.getVersion(Utils.java:209)
      	at com.devexperts.jnlp.updater.ModuleManager.isUptodate(ModuleManager.java:404)
      	at com.devexperts.jnlp.UpdateManager.isModuleUptodate(UpdateManager.java:155)
      	at com.devexperts.jnlp.UpdateManager.main(UpdateManager.java:430)
      
      • That looks like java issues.
        running this command what do you get?

        sudo update-alternatives –config java

  • icebrian
    2 weeks ago

    Have always run TOS on Linux, recently am running into issues, stuck at “installing updates” but nothing happens, then eventually I get:

    Checking for new version of suit
    Problem when connecting to https://162.93.113.203
    java.net.SocketTimeoutException
    	at java.base/java.net.SocksSocketImpl.rem....
    

    I’ve been playing with thinkorswim.vmoptions, even using example above, but always same thing.

    Curiously, if I run using “sudo” it runs just fine.

    Anyone have any idea?

    • icebrian
      2 weeks ago

      Ah, apparently if I disable “Network Proxy” in System Settings for Gnome, TOS starts up normaly.

Leave a Comment

  • Comments with links are moderated by admin before published.
  • Your email address will not be published.
  • Use <pre> ... </pre> HTML tag to quote the output from your terminal/console.
  • Please use the community (https://community.linuxbabe.com) for questions unrelated to this article.
  • I don't have time to answer every question. Making a donation would incentivize me to spend more time answering questions.

The maximum upload file size: 2 MB. You can upload: image. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here