Join useThinkScript to post your question to a community of 21,000+ developers and traders.
; Created/Shared by Kevin N altered by SilverWolf
;https://usethinkscript.com/threads/auto-trade-algo-in-tos.7546/page-15#post-116225
; Version Beta .15 - Last Modified: 01-05-23
; streamlined cleaned up script
; INI settings added
; P/l grabbed by Vis2OCR
; Gui upgrades: mini buttons time and chart
; Added three indicator look and agreement to take position
; Single share assurance for futures
; Added TOS position checks
; Added GUI
; Added option to disable pre-buy/sell flatten for quicker entries.
; double tap the flatten button.
; last mod creates a delay after trade closes and new trade allowed
; .07 Added entryPause Added error clearing feature.
; ver .062 Added pause for x number of minutes features.
; Made some adjustments to the screen and added auto status.
; This version to be used with the algo version 5.5 or later.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance [Forced]
#include <Vis2>
CoordMode, ToolTip, Screen
CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
; User Defineable variables
; Use the following to set the vertical and horizontal coordinates for each.
buttonsHorizontal = 1635 ; Horizontal Coordinates, this will be the same for buy, flat, sell.
buyCoord = 155 ; Vertical Coordinates, middle of button
sellCoord = 189 ; Vertical Coordinates, middle of button
flatCoord = 222 ; Vertical Coordinates, middle of button
statusHorizontal = 80 ; The horizontal setting for the status bar
statusCoord = 783 ; The vertical setting for the status bar
tradeLimit = 100 ; How many trades are allowed in clearCounterPeriod before sitting out resetPeriod
resetPeriod = 900 ; In Seconds, if tradeLimit is reached in clearCounterPeriod, how long to wait before another trade
clearCounterPeriod = 1800 ; In Seconds, if tradeLimit is reached in this amount of time, sit out resetPeriod
entryDelay = 5 ; In Seconds, the amount of time that must pass before another entry is allowed
exitDelay = 0 ; In Seconds, Time that must pass after a trade exits before its allowed to buy again.
delayTime = 0 ; In Seconds, the amount of time to wait sleep after buy, short, or flat.
entryPause = 0 ; In Seconds, the amount of seconds to pause before pressing the buy/sell button.
flatBeforeEntry = 0 ; In Seconds, amount of time to wait after pre-buy/sell flatten, if 0 then no pre-buy/sell flatten.
; End user defineable
global status = 0
global statusWord = ???
trades = 0
stopTimer = 0
tosErrors = 0
Checkbox_1 = 1
GoLong = 0
GoShort = 0
; Generated using SmartGUI Creator 4.0
Gui, Destroy
Gui -Caption +ToolWindow +Border +LastFound +AlwaysOnTop -Border +hWndhGUI
;Gui, Color, 313131
Gui, Color, 4b4b4b
;Gui, Font, S7 CDefault Bold, Verdana
Gui, Font, S8 , Verdana
Gui, Add, Button, x2 y0 w50 h24 , Start
Gui, Add, Button, x52 y0 w50 h24 , Pause
Gui, Add, Button, x102 y0 w50 h24 , Settings
Gui, Add, Button, x202 y0 w50 h24 , Trash
Gui, Add, Button, x152 y0 w50 h24 , Refresh
Gui, Add, Button, x252 y0 w50 h24 , Focus
Gui, Add, Button, x302 y0 w30 h24 , 1
Gui, Add, Button, x332 y0 w30 h24 , 2
Gui, Add, Button, x362 y0 w30 h24 , 3
Gui, Add, Button, x392 y0 w30 h24 , 4
Gui, Add, Button, x422 y0 w30 h24 , 5
Gui, Add, Checkbox, x463 y-4 w13 h30 Checked vCheckbox_1 gSubmit_All, OneC
Gui, Add, Button, x487 y0 w50 h24 , Exit
;Gui, Add, Text, x4 y30 w540 h30 cffffff,
Gui, Show, x780 y51 h25 w539, TOS Algo Trading System
Gui, Submit, NoHide
Return
Submit_All:
Gui, Submit, NoHide
Return
ButtonExit:
GuiClose:
ExitApp 2
ButtonPause:
Send Esc
Pause,, 1
tooltip [> ~TOS Algo Trading System is PAUSED~ <], %statusCoord%, %statusHorizontal%
Return
ButtonSettings:
Run, notepad.exe "My TOS ALGO Settings.ini"
Return
ButtonRefresh:
Run, lib/TOS refresh chart
Return
ButtonTrash:
;Run, lib/TOS collect garbage
MouseClick, Left, 720, 60, 1, 0
Sleep 10
MouseClick, Left, 316, 83, 1, 0
Sleep 10
MouseClick, Left, 1700, 120, 1, 0
Sleep 10
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
MouseMove, 1080, 111, 100
Return
ButtonFocus:
;Run, lib/TOS focus
MouseClick, Left, 70, 200, 1, 0
Sleep 10
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
MouseMove, 1080, 111, 100
Return
Return
Button1:
if (Checkbox_1 = 1){
;Run, lib/TOS ActiveTrader
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
MouseMove, 1080, 111, 100
}Else{
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
Run, lib/TOS 4000t
MouseMove, 1080, 111, 100
}
Return
Button2:
if (Checkbox_1 = 1){
;Run, lib/TOS ForexTrader
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 345, 85, 1, 0
MouseMove, 1080, 111, 100
}Else{
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
Run, lib/TOS 2000t
MouseMove, 1080, 111, 100
}
Return
Button3:
if (Checkbox_1 = 1){
;Run, lib/TOS FuturesTrader
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 465, 85, 1, 0
MouseMove, 1080, 111, 100
}Else{
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
Run, lib/TOS 1000t
MouseMove, 1080, 111, 100
}
Return
Button4:
if (Checkbox_1 = 1){
;Run, lib/TOS PairsTrader
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 715, 85, 1, 0
MouseMove, 1080, 111, 100
}Else{
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
Run, lib/TOS 500t
MouseMove, 1080, 111, 100
}
Return
Button5:
if (Checkbox_1 = 1){
;Run, lib/TOS Charts
MouseClick, Left, 535, 62, 1, 0
MouseMove, 1080, 111, 100
}Else{
MouseClick, Left, 255, 62, 1, 0
Sleep 10
MouseClick, Left, 600, 85, 1, 0
Run, lib/TOS 64t
MouseMove, 1080, 111, 100
}
Return
^B:: MouseClick, Left, %buttonsHorizontal%, %buyCoord%, 1, 0
^F:: MouseClick, Left, %buttonsHorizontal%, %flatCoord%, 1, 0
^S:: MouseClick, Left, %buttonsHorizontal%, %sellCoord%, 1, 0
^ESC:: ExitApp
ESC:: Pause
^R:: trades = 0 ;Reset the trades
^T:: stopTimer = 0
^D:: delayFunction(86400,"Waiting") ; 86400 = 1 Day
^F1:: delayFunction(3600,"Pausing for 1 hour")
^F2:: delayFunction(7200,"Pausing for 2 hours")
^F4:: delayFunction(14400,"Pausing for 4 hours")
^0:: status = 0
^1:: status = 1
^2:: status = 2
ButtonStart:
;Main:
a := entryDelay
Toggle := !Toggle
While Toggle {
Sleep 10
a++
b++
IniRead, HowManyIndicatorsVar, My TOS ALGO Settings.ini, Settings, HowManyIndicators, 3
;MsgBox, The value is %HowManyIndicatorsVar%.
HowManyIndicators = %HowManyIndicatorsVar%
IniRead, SingleShareVar, My TOS ALGO Settings.ini, Settings, SingleShare, 1
;MsgBox, The value is %SingleShareVar%.
SingleShare = %SingleShareVar%
if (SingleShare = 1){
;Maintain single share
ImageSearch, FoundX, FoundY, 1300, 125, 1900, 600, *20 *w70 *h26 Images\TwoBuy.tiff
if (ErrorLevel = 0){
status = 1
;Correct and sell one back
MouseClick, Left, %buttonsHorizontal%, %sellCoord%, 1, 0
sleep 2000
}
ImageSearch, FoundX, FoundY, 1300, 125, 1900, 600, *20 *w71 *h26 Images\TwoSell.tiff
if (ErrorLevel = 0){
status = 2
;Correct and buy one back
MouseClick, Left, %buttonsHorizontal%, %buyCoord%, 1, 0
sleep 2000
}
}
status = 1111 ;Reset for Loop
;Get status from TOS
ImageSearch, FoundX, FoundY, 1300, 125, 1900, 600, *20 *w71 *h26 Images\FlatPic.tiff
if (ErrorLevel = 0){
status = 0
;statusWord = Flat
Sleep 11
}
ImageSearch, FoundX, FoundY, 1300, 125, 1900, 600, *20 *w59 *h26 Images\Positive.tiff
if (ErrorLevel = 0){
status = 1
statusWord = Long
Sleep 11
}
ImageSearch, FoundX, FoundY, 1300, 125, 1900, 600, *20 *w58 *h26 Images\Negative.tiff
if (ErrorLevel = 0){
status = 2
statusWord = Short
Sleep 11
}
if (status = 0){ ;Flat! Look for indicators
sleep 11
;Three indicator and buy signal
ImageSearch, FoundX, FoundY, 840, 180, 1111, 245, *20 *w20 *h20 images\BuyLabel.tiff
if (ErrorLevel = 0){
UpBuySignal = 1
}else{
UpBuySignal = 0
}
sleep 11
ImageSearch, FoundX, FoundY, 0, 750, 400, 835, *20 *w15 *h15 images\LowerBuyLabel.tiff
if (ErrorLevel = 0){
Lw1Bsignal = 1
}else{
Lw1Bsignal = 0
}
sleep 11
ImageSearch, FoundX, FoundY, 0, 835, 400, 920, *20 *w15 *h15 images\LowerBuyLabel.tiff
if (ErrorLevel = 0){
Lw2Bsignal = 1
}else{
Lw2Bsignal = 0
}
sleep 11
ImageSearch, FoundX, FoundY, 0, 920, 400, 1000, *20 *w15 *h15 images\LowerBuyLabel.tiff
if (ErrorLevel = 0){
Lw3Bsignal = 1
}else{
Lw3Bsignal = 0
}
sleep 11
if (HowManyIndicators == 3){
BUYvalue := Lw1Bsignal+Lw2Bsignal+Lw3Bsignal
;MsgBox, % "Buy Total: " BUYvalue
}
if (HowManyIndicators == 2){
BUYvalue := Lw2Bsignal+Lw3Bsignal
;MsgBox, % "Buy Total: " BUYvalue
}
if (HowManyIndicators == 1){
BUYvalue := Lw3Bsignal
;MsgBox, % "Buy Total: " BUYvalue
}
if (HowManyIndicators == 0){
BUYvalue := UpBuySignal
;MsgBox, % "Buy Total: " BUYvalue
}
GoLong = 0
if (HowManyIndicators == 3 and BUYvalue == 3){
GoLong = 1
}
if (HowManyIndicators == 2 and BUYvalue == 2){
GoLong = 1
}
if (HowManyIndicators == 1 and BUYvalue == 1){
GoLong = 1
}
if (HowManyIndicators == 0 and BUYvalue == 1){
GoLong = 1
}
;Three indicator and sell signal
ImageSearch, FoundX, FoundY, 840, 180, 1111, 245, *20 *w20 *h20 images\SellLabel.tiff
if (ErrorLevel = 0){
UpSellSignal = 1
}else{
UpSellSignal = 0
}
sleep 11
ImageSearch, FoundX, FoundY, 0, 750, 400, 835, *20 *w15 *h15 images\LowerSellLabel.tiff
if (ErrorLevel = 0){
Lw1Ssignal = 1
}else{
Lw1Ssignal = 0
}
sleep 11
ImageSearch, FoundX, FoundY, 0, 835, 400, 920, *20 *w15 *h15 images\LowerSellLabel.tiff
if (ErrorLevel = 0){
Lw2Ssignal = 1
}else{
Lw2Ssignal = 0
}
sleep 11
ImageSearch, FoundX, FoundY, 0, 920, 400, 1000, *20 *w15 *h15 images\LowerSellLabel.tiff
if (ErrorLevel = 0){
Lw3Ssignal = 1
}else{
Lw3Ssignal = 0
}
sleep 11
if (HowManyIndicators == 3){
SELLvalue := Lw1Ssignal+Lw2Ssignal+Lw3Ssignal
;MsgBox, % "Sell Total: " SELLvalue
}
if (HowManyIndicators == 2){
SELLvalue := Lw2Ssignal+Lw3Ssignal
;MsgBox, % "Sell Total: " SELLvalue
}
if (HowManyIndicators == 1){
SELLvalue := Lw3Ssignal
;MsgBox, % "Sell Total: " SELLvalue
}
if (HowManyIndicators == 0){
SELLvalue := UpSellSignal
;MsgBox, % "Sell Total: " SELLvalue
}
GoShort = 0
if (HowManyIndicators == 3 and SELLvalue == 3){
GoShort = 1
}
if (HowManyIndicators == 2 and SELLvalue == 2){
GoShort = 1
}
if (HowManyIndicators == 1 and SELLvalue == 1){
GoShort = 1
}
if (HowManyIndicators == 0 and SELLvalue == 1){
GoShort = 1
}
statusWord = Flat (L%BUYvalue%|S%SELLvalue%)
;Evaluate and Go Long
if (UpBuySignal == 1 and GoLong == 1 and a >= entryDelay) { ;goLong
if (entryPause > 0) {
k := entryPause
while (k > 0) {
;tooltip Status: Delaying Entry: %k% Seconds, %statusCoord%, %buttonsHorizontal%
sleep 100
k--
}
}
;Click Flatten Button
if (flatBeforeEntry > 0) {
MouseClick, Left, %buttonsHorizontal%, %flatCoord%, 1, 0
delayFunction(flatBeforeEntry, "Flat Before Next Entry")
}
;Click Buy (Long)
MouseClick, Left, %buttonsHorizontal%, %buyCoord%, 1, 0
MouseMove, 1800, 175, 100
status = 1
statusWord = Long
a = 0
trades++
sleep delayTime * 100
}
;Evaluate and Go Short
if (UpSellSignal == 1 and GoShort == 1 and a >= entryDelay) { ;goShort
if (entryPause > 0) {
k := entryPause
while (k > 0) {
;tooltip Status: Delaying Entry: %k% Seconds, %statusCoord%, %buttonsHorizontal%
sleep 100
k--
}
}
;Click Flatten Button
if (flatBeforeEntry > 0) {
MouseClick, Left, %buttonsHorizontal%, %flatCoord%, 1, 0
delayFunction(flatBeforeEntry, "Flat Before Next Entry")
}
;Click Sell (short)
MouseClick, Left, %buttonsHorizontal%, %sellCoord%, 1, 0
MouseMove, 1800, 175, 100
status = 2
statusWord = Short
a = 0
trades++
sleep delayTime * 100
}
}
if (status = 1){ ;Long! Look for close
ImageSearch, FoundX, FoundY, 840, 180, 1111, 245, *20 *w15 *h15 images\MagentaLabel.tiff
if (ErrorLevel = 0){ ;Long Close
;Click Flatten Button
MouseClick, Left, %buttonsHorizontal%, %flatCoord%, 1, 0
MouseMove, 1800, 175, 100
status = 0
sleep delayTime * 100
delayFunction(exitDelay, "Next Entry is Delayed")
}
}
if (status = 2){ ;Short! Look for close
ImageSearch, FoundX, FoundY, 840, 180, 1111, 245, *20 *w15 *h15 Images\LightGreenLabel.tiff
if (ErrorLevel = 0){ ;Short Close
;Click Flatten Button
MouseClick, Left, %buttonsHorizontal%, %flatCoord%, 1, 0
MouseMove, 1800, 175, 100
status = 0
sleep delayTime * 100
delayFunction(exitDelay, "Next Entry is Delayed")
}
}
if (status == 1111){ ;Cannot see TOS! Lost Connection?
statusWord = !! No connection with TOS !!
MsgBox, % "Cannot see TOS! Lost Connection? Status: " status
}
timeLeft := clearCounterPeriod - b
entryTime := FormatSeconds(a)
countdownTime := FormatSeconds(timeLeft)
FormatTime, TimeString,, Time
tooltip Status: %status%-%statusWord% | Entry: %entryTime% | Trades: %trades% of %tradeLimit% | Count: %countDownTime% | Time: %TimeString%, %statusCoord%, %statusHorizontal%
;tooltip Status: %statusWord%, %statusCoord%, %statusHorizontal%
;tooltip
;Gui, Font, S12, Verdana
;Gui, Add, Text, x4 y30 w599 h30 cffffff, Status: %statusWord% | Entry: %entryTime% | Trades: %trades% of %tradeLimit% | Count: %countDownTime% | Time: %TimeString%
;Gui, Add, Text, x5 y29 w500 h30 cffffff, Status: %statusWord%
;Gui, Add, Text, x175 y30 w499 h30 cffffff, Entry: %entryTime% | Trades: %trades% of %tradeLimit% | Count: %countDownTime% | Time: %TimeString%
if (trades >= tradeLimit) {
trades = 0
;Click Flatten Button
MouseClick, Left, %buttonsHorizontal%, %flatCoord%, 1, 0
sleep resetPeriod * 100
j++
if (j == 2 ) {
tooltip Reset Count: %j% Time: %TimeString%, %statusCoord%, %statusHorizontal%
exit
}
}
if (b >= clearCounterPeriod) {
b = 0
trades = 0
}
}
return
FormatSeconds(NumberOfSeconds) ; Convert the specified number of seconds to hh:mm:ss format.
{
time := 19990101 ; *Midnight* of an arbitrary date.
time += NumberOfSeconds, seconds
FormatTime, mmss, %time%, mm:ss
return NumberOfSeconds//3600 ":" mmss
/*
; Unlike the method used above, this would not support more than 24 hours worth of seconds:
FormatTime, hmmss, %time%, h:mm:ss
return hmmss
*/
}
delayFunction(SecondsToWait, Message )
{
k := SecondsToWait
global stopTimer = 1
global statusCoord
global statusHorizontal
while (k > 0)
{
if (stopTimer != 1) {
break
}
timeLeft:= FormatSeconds(k)
tooltip %Message%: %timeLeft%, %statusCoord%, %statusHorizontal%
sleep 1000
k--
}
stopTimer = 0
}
; CTRL - P to get PL popup
^p::
GetPL()
Return
GetPL()
{
;To setup uncomment the msg box. You only want the numbers no letters no symbols or the math wont work.
; P/L coordinates
x := 1705
y := 394
w := 40
h := 25
;MsgBox % OCR([x, y, w, h])
; B/S ? by ? coordinates
x1 := 1571
y1 := 365
w1 := 20
h1 := 30
;MsgBox % OCR([x1, y1, w1, h1])
;Get P/L Day
PLDay := OCR([x, y, w, h])
;Get B/S for the day
BSDay := OCR([x1, y1, w1, h1])
StringTrimLeft, BSDay, BSDay, 2
;Fees
CommissionsNFees = 6.2
;Math to get day Total of fees
BSTotal := BSDay * CommissionsNFees
;msgbox, %BSTotal%
;Math to gey Net Profits
PLTotal := PLDay - BSTotal
;Trim zeros
StringTrimRight, PLTotal, PLTotal, 4
;msgbox, %PLTotal%
MsgBox, 48, Net P/L Total:, Net Profit and Loss for the day: $%PLTotal%
}Return
That code is remnant of @Kevin N script. He would have a much better grasp on how to make that a standalone script..@SilverWolf thanks for sharing the script is there any way you can just give me the entry time as a script
FileAppend, Went long at %A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec%.`n, TradeLog.txt
@Goingdark365 yes it can look at three lower indicators if you setup the coordinates.@SilverWolf are you lookingat 2 lower indicators with this one?
what do you mean by
twobuy.tiff,twosell.tiff
LowerBuyLabel.tiff LowerSellLabel.tiff
[Settings]
HowManyIndicators = 3
SingleShare = 1
Does your strategy keep the label color the whole time or only on one bar?Hallo Algo Traders, inspired by @dap711 I made my first simple auto trader with Macro Recorder. I found it easier since the script watches for specific color in order to activate itself. Here I attach my file with the Macro Recorder script. When the script sees lebel Buy it clicks Buy MKT button, lebel Sell - Sell MKT and Close-Flatten. I have one problem, the scripts clicks numerous time Buy or Sell when there is a signal. Please, help how to enter 1 time per direction. If you improve it, please share it here. The strategy may be any, it reads the colour of the labels. More useful info with label codes and nice made video explanation you may see here: https://usethinkscript.com/threads/moving-average-master-strategy-for-thinkorswim.13975/
P.S. I really like the last script written by @SilverWolf , but it is too complicated for an absolute beginner like me. May be he can make a video with very brief explanations of his code, logic and mainly chart positions of the labels, libraries, numbers in his GUI toolbar, etc.
Code:"Mouse left click";"857, 17"; "Wait for pixel color";"29, 235"; "Wait for pixel color";"29, 235"; "Wait for pixel color";"29, 235"; "Go to label";"Buy"; "Mouse left click";"100, 167"; "Key Down";"Alt"; "Key press";"F"; "Key press";"B"; "Key Up";"Alt"; "Wait";"5000 ms"; "Go to label";"Sell"; "Mouse left click";"285, 167"; "Key Down";"Alt"; "Key press";"F"; "Key Up";"Alt"; "Wait";"5000 ms"; "Go to label";"Close"; "Mouse left click";"193, 167"; "Key Down";"Alt"; "Key press";"S"; "Wait";"5000 ms";
Hi All,There is only one label that we see at a time. Buy, Sell or Close. It distinguishes the color and clicks the Buttons. Very easy and simple, even for an absolute novice like me. For an experienced person like you it will be really easy and fast to make a clicker. To be honest one active bar per time looks for me more logical, we can not buy, sell or close simultaneously. This is my draft clicker as a file, a lot must be improved of course. https://drive.google.com/file/d/15TuKY7B_nbd0LRDuZgkA4Pm5ESFMhoRe/view?usp=sharing
Code:# These are the orders and Labels from the strategy (I plan to use a different strategy, but keep the logic for the labels - one for an action) input ShowAutoKeyLabels = yes; #(I use Macro Recorder to auto trade. Ask me about the setup at [email protected]) #Open the orders on the chart for back testing and optimizing the settings AddOrder(OrderType.BUY_TO_OPEN, diff > diff[1] and low > MA and (if UseVolumeAsFilter then VolStrength>0 else yes) and ShowBackTestPositions, open[-1], BackTestTradeSize, Color.CYAN, Color.CYAN, ""); AddOrder(OrderType.SELL_TO_CLOSE, ( diff < diff[1] or close < MA ) and ShowBackTestPositions, open[-1], BackTestTradeSize, Color.CYAN,Color.CYAN, ""); AddOrder(OrderType.SELL_TO_OPEN, diff < diff[1] and high < MA and (if UseVolumeAsFilter then VolStrength>0 else yes) and ShowBackTestPositions, open[-1], BackTestTradeSize, Color.RED, Color.RED,""); AddOrder(OrderType.BUY_TO_CLOSE, ( diff > diff[1] or close > MA ) and ShowBackTestPositions, open[-1], BackTestTradeSize, Color.RED, Color.RED,""); #Add the signal labels (use with Macro Recorder or not) def OpenOrders = GetQuantity(); AddLabel(ShowAutoKeyLabels and diff[1] > diff[2] and low > MA and OpenOrders < 1 and (if UseVolumeAsFilter then VolStrength>0 else yes), " BUY ", CreateColor(153, 255, 153)); AddLabel(ShowAutoKeyLabels and ( diff[1] < diff[2] or close < MA ) and OpenOrders > 0, " CLOSE ", CreateColor(102, 0, 0)); AddLabel(ShowAutoKeyLabels and diff[1] < diff[2] and high < MA and OpenOrders > -1 and (if UseVolumeAsFilter then VolStrength>0 else yes), " SELL ", CreateColor(255, 102, 102)); AddLabel(ShowAutoKeyLabels and ( diff[1] > diff[2] or close > MA ) and OpenOrders < 0 , " CLOSE ", CreateColor(102, 0, 0));
Does your strategy keep the label color the whole time or only on one bar?
Hallo Algo Traders, inspired by @dap711 I made my first simple auto trader with Macro Recorder. I found it easier since the script watches for specific color in order to activate itself. Here I attach my file with the Macro Recorder script. When the script sees lebel Buy it clicks Buy MKT button, lebel Sell - Sell MKT and Close-Flatten. I have one problem, the scripts clicks numerous time Buy or Sell when there is a signal. Please, help how to enter 1 time per direction. If you improve it, please share it here. The strategy may be any, it reads the colour of the labels. More useful info with label codes and nice made video explanation you may see here: https://usethinkscript.com/threads/moving-average-master-strategy-for-thinkorswim.13975/
P.S. I really like the last script written by @SilverWolf , but it is too complicated for an absolute beginner like me. May be he can make a video with very brief explanations of his code, logic and mainly chart positions of the labels, libraries, numbers in his GUI toolbar, etc.
Code:"Mouse left click";"857, 17"; "Wait for pixel color";"29, 235"; "Wait for pixel color";"29, 235"; "Wait for pixel color";"29, 235"; "Go to label";"Buy"; "Mouse left click";"100, 167"; "Key Down";"Alt"; "Key press";"F"; "Key press";"B"; "Key Up";"Alt"; "Wait";"5000 ms"; "Go to label";"Sell"; "Mouse left click";"285, 167"; "Key Down";"Alt"; "Key press";"F"; "Key Up";"Alt"; "Wait";"5000 ms"; "Go to label";"Close"; "Mouse left click";"193, 167"; "Key Down";"Alt"; "Key press";"S"; "Wait";"5000 ms";
Hallo Algo Traders, inspired by @dap711 I made my first simple auto trader with Macro Recorder. I found it easier since the script watches for specific color in order to activate itself. Here I attach my file with the Macro Recorder script. When the script sees lebel Buy it clicks Buy MKT button, lebel Sell - Sell MKT and Close-Flatten. I have one problem, the scripts clicks numerous time Buy or Sell when there is a signal. Please, help how to enter 1 time per direction. If you improve it, please share it here. The strategy may be any, it reads the colour of the labels. More useful info with label codes and nice made video explanation you may see here: https://usethinkscript.com/threads/moving-average-master-strategy-for-thinkorswim.13975/
P.S. I really like the last script written by @SilverWolf , but it is too complicated for an absolute beginner like me. May be he can make a video with very brief explanations of his code, logic and mainly chart positions of the labels, libraries, numbers in his GUI toolbar, etc.
Code:"Mouse left click";"857, 17"; "Wait for pixel color";"29, 235"; "Wait for pixel color";"29, 235"; "Wait for pixel color";"29, 235"; "Go to label";"Buy"; "Mouse left click";"100, 167"; "Key Down";"Alt"; "Key press";"F"; "Key press";"B"; "Key Up";"Alt"; "Wait";"5000 ms"; "Go to label";"Sell"; "Mouse left click";"285, 167"; "Key Down";"Alt"; "Key press";"F"; "Key Up";"Alt"; "Wait";"5000 ms"; "Go to label";"Close"; "Mouse left click";"193, 167"; "Key Down";"Alt"; "Key press";"S"; "Wait";"5000 ms";
Thanks a lot for your time helping me. Your idea with the Macro Recorder is wonderful. Here is the image of my last settings. The script works with mouse click, because I activated the Hot keys, but on simulation mode they did not work. The logic is simple, the script see the color of the label and clicks Buy, Sell or Flatten. After that the mouse moves back on top to wait for the next color(of the chart label). .
Hi Gilgameash,When approaching "auto trading" I too thought of using the api and a third party to place the orders, but then i thought why over complicate things.
My setup isn't complicated, I have a cheap laptop used only to run TOS and the bot, layout of TOS screen can be permanently saved within the platform (save workspace). All I have to do is have TOS open and click run on the bot and it works just fine, I go about my day
Can you share any additional information How to do auto trading with TOS API and python,as it's not possible in TOS?.I was able to convert this code into python auto trading strategy over the weekend. I will test this week and will report back how good the results are. Even if they are half of what they are on TOS should be a profitable stragety.
Is there a way to test your bot ? ThanksCan you give more information about this clicking Python bot?
I might just post it here out of boredom... original post explained basic everything. And @NellyN is on the right track (though I'm not sure if the "flatten" option works on 'paper money' or 'OnDemand' for testing)Hi Gilgameash,
Do you happen to have any instructions on how to build bot like yours?
This is a pretty simple "dumb" smart bot its a python based program.
the "bot" works perfectly as i envisioned it.
the only variable is the strategy being used to generate the signals(if you have a good strategy script that doesn't repaint, help a brother out).
how it works is pretty simple, see image on basics works and proof that it does.
I might just post it here out of boredom... original post explained basic everything. And @NellyN is on the right track (though I'm not sure if the "flatten" option works on 'paper money' or 'OnDemand' for testing)
pointless update, running the bot on live account for this year trading 500 shares or AAPL with a 80% win rate (100k starting balance) and (116k this weeks closing balance with a Short position open),
might be posing strategy used in correct Forum later.
Sorry for the really slow response, I did not get notified I had messages over here and forgot to check. On my VPS servers, I find 8GB is the sweet spot.Hey @Kevin N Im looking into trying out a VPS solution. Is the lower ram size an issue? To get 16gb ram its $28 a month. Just curious if you had any issues
Thread starter | Similar threads | Forum | Replies | Date |
---|---|---|---|---|
Outside Auto-Trading Solutions for Thinkorswim | Playground | 4 | ||
P | Auto entering password | Playground | 0 | |
R | ToS Trade Button script? | Playground | 5 | |
M | Trade Algo | Playground | 2 | |
M | Daily Watchlist of Stocks to Day Trade Weekly Options For ThinkOrSwim | Playground | 999 |
Start a new thread and receive assistance from our community.
useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.
We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.
If you are new, or just looking for guidance, here are some helpful links to get you started.