Never Risk Too Much on a Trade Again in DAS Trader Pro
The script(s) featured in this episode are provided below for educational and reference purposes. Trading stocks, options, futures, and other financial instruments involves substantial risk of loss and is not suitable for all investors. You may lose some or all of your invested capital. Always review and thoroughly test any code in a simulator before using it in a live trading environment.
This video is provided by YouTube. It is blocked until you accept functional cookies.
Important!
Some of these scripts may also rely on scripts created in previous episodes. Any
updates to scripts will be shown below, but any scripts left unchanged would need to
be sourced from the episode they were featured in. It is recommended to watch all
videos in this series in order, that way you can piece together a working system
with a good understanding of all the connected parts.
OBJECT_INIT_STOP (NEW) (This script was introduced in this episode)
//OBJECT_INIT_STOP
$TRADE.STOP = newUserObj();
$TRADE.STOP.FLEX_LEVEL = 0.20;
$TRADE.STOP.TRIGGER = 0;
$TRADE.STOP.STATIC_LEVEL = 0;
$TRADE.STOP.VALUE = 0;
$TRADE.STOP.LAST_VALUE = 0;
$TRADE.STOP.OFFSET = 0.10;
$TRADE.STOP.MAX_DOLLAR_RISK = 50;
OBJECT_INIT_TRADE
This script is from a previous episode. Changes have been marked in the file so you can follow what was adjusted in this episode.
//OBJECT_INIT_TRADE
if (GetVar("$TRADE")==0) $TRADE=0;//+ ADDED/ADJUSTED THIS LINE
if (!IsObj($TRADE)) $TRADE = newUserObj();
$TRADE.DAILYEMA200 = 0;
$TRADE.DAILYEMA200_LAST = 0;
$TRADE.DAILYSMA200 = 0;
$TRADE.DAILYSMA200_LAST = 0;
$TRADE.TIME_ON_TICKER = 0;
$TRADE.CHART_LAST_SYMB = "";
$TRADE.LAST_PL = 1234;
$TRADE.LAST_SHARES = 0;
$TRADE.LAST_GAIN_LOSS = 0;
$TRADE.LAST_AVERAGE = 0;
$TRADE.LAST_PER_SHARE = 0;
$TRADE.BUY_AT_TARGET = 0;
$TRADE.BUY_SPREAD = 0.10;
$TRADE.ALLOW_AVERAGE_DOWN = 0;
ExecHotkey("OBJECT_INIT_TRACKING");
ExecHotkey("OBJECT_INIT_STOP");//+ ADDED THIS LINE
OBJECT_LOAD_TIME
This script is from a previous episode. Changes have been marked in the file so you can follow what was adjusted in this episode.
//OBJECT_LOAD_TIME
if (GetVar("$TIME")==0) $TIME=0;
if (!IsObj($TIME)) $TIME = newUserObj();
$TIME.SECONDS = GetSecond();
$TIME.TIME_MINUTES_SECONDS = $TIME.SECONDS / 60;
$TIME.TIME_MINUTES = Round($TIME.TIME_MINUTES_SECONDS,0);
$TIME.ONLY_SECONDS = $TIME.SECONDS - (($TIME.TIME_MINUTES - 1) * 60);
$TIME.TIME_HOURS=$TIME.SECONDS/3600;
if ($TIME.TIME_HOURS > 9.5 && $TIME.TIME_HOURS < 16) {
$TIME.REGULAR_HOURS=1;
} else {
$TIME.REGULAR_HOURS=0;
}
//+ ADDED THE FOLLOWING LINES
//Bar Objects
$bar0 = $chart_1m.GetBar(0);
$bar1 = $chart_1m.GetBar(-1);
$bar2 = $chart_1m.GetBar(-2);
$bar3 = $chart_1m.GetBar(-3);
$bar4 = $chart_1m.GetBar(-4);
$bar5 = $chart_1m.GetBar(-5);
$bar6 = $chart_1m.GetBar(-6);
$bar7 = $chart_1m.GetBar(-7);
$bar8 = $chart_1m.GetBar(-8);
$TIME.DATETIME_BAR0=SubString($bar0.Time, 0, 4) + "/" + SubString($bar0.Time, 4, 6) + "/" + SubString($bar0.Time, 6, 8) + " " + SubString($bar0.Time, 9, 19);
$TIME.DATETIME_BAR1=SubString($bar1.Time, 0, 4) + "/" + SubString($bar1.Time, 4, 6) + "/" + SubString($bar1.Time, 6, 8) + " " + SubString($bar1.Time, 9, 19);
$TIME.DATETIME_BAR2=SubString($bar2.Time, 0, 4) + "/" + SubString($bar2.Time, 4, 6) + "/" + SubString($bar2.Time, 6, 8) + " " + SubString($bar2.Time, 9, 19);
$TIME.DATETIME_BAR3=SubString($bar3.Time, 0, 4) + "/" + SubString($bar3.Time, 4, 6) + "/" + SubString($bar3.Time, 6, 8) + " " + SubString($bar3.Time, 9, 19);
$TIME.DATETIME_BAR4=SubString($bar4.Time, 0, 4) + "/" + SubString($bar4.Time, 4, 6) + "/" + SubString($bar4.Time, 6, 8) + " " + SubString($bar4.Time, 9, 19);
$TIME.DATETIME_BAR5=SubString($bar5.Time, 0, 4) + "/" + SubString($bar5.Time, 4, 6) + "/" + SubString($bar5.Time, 6, 8) + " " + SubString($bar5.Time, 9, 19);
$TIME.DATETIME_BAR6=SubString($bar6.Time, 0, 4) + "/" + SubString($bar6.Time, 4, 6) + "/" + SubString($bar6.Time, 6, 8) + " " + SubString($bar6.Time, 9, 19);
$TIME.DATETIME_BAR7=SubString($bar7.Time, 0, 4) + "/" + SubString($bar7.Time, 4, 6) + "/" + SubString($bar7.Time, 6, 8) + " " + SubString($bar7.Time, 9, 19);
$TIME.DATETIME_BAR8=SubString($bar8.Time, 0, 4) + "/" + SubString($bar8.Time, 4, 6) + "/" + SubString($bar8.Time, 6, 8) + " " + SubString($bar8.Time, 9, 19);
CHART_TIMER_DRAW_STOP (NEW) (This script was introduced in this episode)
//CHART_TIMER_DRAW_STOP
if ($TRADE.STOP.FLEX_LEVEL > 0 || $TRADE.STOP.STATIC_LEVEL > 0){
if ($TRADE.STOP.LAST_VALUE != $TRADE.STOP.VALUE || $TRADE.STOP.LAST_VALUE == 0 || $TRADE.STOP.FLEX_LEVEL > 0 ){
if ($montage_window.POS == 0){
//not in a trade (BID or ASK up to you / spread)
$TRADE.STOP.VALUE = $montage_window.BID - $TRADE.STOP.FLEX_LEVEL;
} else {
//in a trade
$TRADE.STOP.VALUE = $montage_window.AVGCost - $TRADE.STOP.FLEX_LEVEL;
}
if ($TRADE.STOP.STATIC_LEVEL > 0){
$TRADE.STOP.VALUE = $TRADE.STOP.STATIC_LEVEL;
}
if (IsObj($chart_1m.GetTrendline("StopText"))){
$chart_1m.GetTrendline("StopText").Delete();
}
if (IsObj($chart_1m.GetTrendline("StopLine"))){
$chart_1m.GetTrendline("StopLine").Delete();
}
//RISK TEXT FROM SHARES DASHBOARD BUTTON
$shares_to_buy = Round($DASHBOARD.getCustButObj("SHARES").Text,0);
if ($montage_window.POS == 0){
$risk_value = Round((($montage_window.ASK - $TRADE.STOP.VALUE)*$shares_to_buy),2);
} else {
$risk_value = Round((($montage_window.AVGCost - $TRADE.STOP.VALUE)*$shares_to_buy),2);
}
$risk_text = $shares_to_buy + " Shares ($-" + $risk_value + ")";
$chart_1m.CreateTrendline("HorizLine, Price=" + $TRADE.STOP.VALUE + ", Name=StopLine, LineStyle=DashDotLine, LineWidth=5, Color=#FF0000, LabelTextColor=#000000, LabelBGColor=#FF0000");
$chart_1m.ConfigTrendLine Text DashLine:0,0,0:1:255,0,0:255,255,255;
$chart_1m.CreateTrendline("Text, Price=" + $TRADE.STOP.VALUE + ", Price1=" + ($TRADE.STOP.VALUE) + ", Time=" + $TIME.DATETIME_BAR0 + ", Time1=" + $TIME.DATETIME_BAR8 + ", Transparency=-162, Fill=1, Name=StopText, LineStyle=2, LineColor=#FF0000, LineWidth=1, Text=" + $risk_text);
}
} else {
//delete line if no stop set
if (IsObj($chart_1m.GetTrendline("StopText"))){
$chart_1m.GetTrendline("StopText").Delete();
}
if (IsObj($chart_1m.GetTrendline("StopLine"))){
$chart_1m.GetTrendline("StopLine").Delete();
}
$TRADE.STOP.VALUE = 0;
}
if ($TRADE.STOP.LAST_VALUE != $TRADE.STOP.VALUE){
ExecHotkey("SELL_STOP");
}
if (IsObj($DASHBOARD.getCustButObj("StopPrice"))){
$DASHBOARD.getCustButObj("StopPrice").Text = $TRADE.STOP.VALUE;
}
$TRADE.STOP.LAST_VALUE = $TRADE.STOP.VALUE;
TIMER_PL_UPDATE
This script is from a previous episode. Changes have been marked in the file so you can follow what was adjusted in this episode.
//TIMER_PL_UPDATE
$ACCOUNT=GetAccountObj($ACCOUNT_NUMBER);
ExecHotkey("CHART_TIMER_DRAW_STOP");//+ ADDED THIS LINE
ExecHotkey("TRACK_TRADES_ACTIVE");
//+ ADDED THE FOLLOWING 7 LINES
if ($TRADE.STOP.TRIGGER > 0 && $montage_window.POS > 0){
//wait 2 seconds to trigger stop
if ($TRADE.STOP.TRIGGER > 2){
ExecHotkey("SELL_STOP");
}
$TRADE.STOP.TRIGGER = $TRADE.STOP.TRIGGER + 1;
}
//calculate profit or loss on last trade
if ($ACCOUNT.Realized != $TRADE.LAST_PL && $TRADE.LAST_PL != 1234){
$TRADE.LAST_GAIN_LOSS = $ACCOUNT.Realized - $TRADE.LAST_PL;
$TRADE.LAST_PER_SHARE = 0;
if ($TRADE.LAST_SHARES > 0){
$TRADE.LAST_PER_SHARE = Round(($TRADE.LAST_GAIN_LOSS / $TRADE.LAST_SHARES), 2);
MsgLog("Per Share: " + $TRADE.LAST_PER_SHARE);
}
if ($ACCOUNT.Realized < $TRADE.LAST_PL){
//LOSS
$tmp_var_name = "$loss" + $chart_1m.SYMBOL;
if (GetVar($tmp_var_name)==0) SetVar($tmp_var_name, 0);
$this_symbol_loss = GetVar($tmp_var_name);
$this_symbol_loss = $this_symbol_loss + 1;
SetVar($tmp_var_name, $this_symbol_loss);
if ($this_symbol_loss > 2){
Speak($this_symbol_loss + " Losses " + $chart_1m.SYMBOL);
}
} else {
//GAIN
}
ExecHotkey("TRACK_TRADES_LAST");
}
//Update PL
$TRADE.LAST_PL = $ACCOUNT.Realized;
if (IsObj($montage_window)){
$TRADE.LAST_AVERAGE = $montage_window.AVGCost;
$TRADE.LAST_SHARES = $montage_window.POS;
}
//detect current stock losses and block if 3
$tmp_var_name = "$loss" + $chart_1m.SYMBOL;
if (GetVar($tmp_var_name)==0) SetVar($tmp_var_name, 0);
$this_symbol_loss = GetVar($tmp_var_name);
if (IsObj($DASHBOARD.getCustButObj("STOCK_BLOCKED"))){
if ($this_symbol_loss > 2){
$DASHBOARD.getCustButObj("STOCK_BLOCKED").Text = "BLOCKED";
$DASHBOARD.getCustButObj("STOCK_BLOCKED").BkColor = Color("Red");
} else {
$DASHBOARD.getCustButObj("STOCK_BLOCKED").Text = "";
$DASHBOARD.getCustButObj("STOCK_BLOCKED").BkColor = Color("Gray");
}
}
SELL_STOP (NEW) (This script was introduced in this episode)
//SELL_STOP
if ($montage_window.POS > 0){
$montage_window.CXL ALLSYMB SELL;
$montage_window.TradeWndStyle=Stop;
$montage_window.SYMBOL=$chart_1m.SYMBOL;
$montage_window.Route="STOP";
if ($TIME.REGULAR_HOURS == 1){
//REGULAR HOURS
$montage_window.StopType="Market";
} else {
//PRE MARKET
$montage_window.StopType="LimitP";
}
$montage_window.Price=Round($TRADE.STOP.VALUE, 2) - $TRADE.STOP.OFFSET;
$montage_window.StopPrice=Round($TRADE.STOP.VALUE, 2);
$montage_window.ACCOUNT=$ACCOUNT_NUMBER;
$montage_window.SShare=$montage_window.POS;
$montage_window.Share=$montage_window.SShare;
$montage_window.TIF=DAY+;
$montage_window.SELL=SEND;
}
$TRADE.STOP.TRIGGER = 0;
$TRADE.STOP.LAST_VALUE = 0;
STOP_05_ADD (NEW) (This script was introduced in this episode)
//STOP_05_ADD
if ($TRADE.STOP.STATIC_LEVEL > 0){
//if static level set - maintain level
if ($montage_window.POS > 0){
$TRADE.STOP.FLEX_LEVEL = $montage_window.AVGCost - $TRADE.STOP.STATIC_LEVEL;
} else {
$TRADE.STOP.FLEX_LEVEL = $montage_window.ASK - $TRADE.STOP.STATIC_LEVEL;
}
}
//set floating stop
$TRADE.STOP.FLEX_LEVEL = $TRADE.STOP.FLEX_LEVEL + 0.05;
//clear static stop
$TRADE.STOP.STATIC_LEVEL = 0;
$TRADE.STOP.LAST_VALUE = 0;
STOP_05_SUBTRACT (NEW) (This script was introduced in this episode)
//STOP_05_SUBTRACT
if ($TRADE.STOP.STATIC_LEVEL > 0){
//if static level set - maintain level
if ($montage_window.POS > 0){
$TRADE.STOP.FLEX_LEVEL = $montage_window.AVGCost - $TRADE.STOP.STATIC_LEVEL;
} else {
$TRADE.STOP.FLEX_LEVEL = $montage_window.ASK - $TRADE.STOP.STATIC_LEVEL;
}
}
//set floating stop
$TRADE.STOP.FLEX_LEVEL = $TRADE.STOP.FLEX_LEVEL - 0.05;
//catch negative
if ($TRADE.STOP.FLEX_LEVEL < 0){
$TRADE.STOP.FLEX_LEVEL = 0;
}
//clear static stop
$TRADE.STOP.STATIC_LEVEL = 0;
$TRADE.STOP.LAST_VALUE = 0;
STOP_BAR0 (NEW) (This script was introduced in this episode)
//STOP_BAR0
//set static stop
$TRADE.STOP.STATIC_LEVEL = $bar0.Lo;
$TRADE.STOP.LAST_VALUE = 0;
STOP_BAR1 (NEW) (This script was introduced in this episode)
//STOP_BAR1
//set static stop
$TRADE.STOP.STATIC_LEVEL = $bar1.Lo;
$TRADE.STOP.LAST_VALUE = 0;
STOP_BAR2 (NEW) (This script was introduced in this episode)
//STOP_BAR2
//set static stop
$TRADE.STOP.STATIC_LEVEL = $bar2.Lo;
$TRADE.STOP.LAST_VALUE = 0;
CHART_UPDATE
This script is from a previous episode. Changes have been marked in the file so you can follow what was adjusted in this episode.
//CHART_UPDATE (runs every time chart object updates data)
if ($TRADE.CHART_LAST_SYMB != $chart_1m.SYMBOL){
$TRADE.CHART_LAST_SYMB = $chart_1m.SYMBOL;
$TRADE.TIME_ON_TICKER = 0;
$TRADE.DAILYSMA200 = 0;
$TRADE.DAILYEMA200 = 0;
MsgLog("Changed Ticker: " + $chart_1m.SYMBOL);
ExecHotkey("DETECT_STOCK_COUNTRY");
$TRADE.BUY_AT_TARGET = 0;
ExecHotkey("OBJECT_INIT_STOP");//+ ADDED THIS LINE
}
$TRADE.TIME_ON_TICKER = $TRADE.TIME_ON_TICKER + 1;
BUY_ASK
This script is from a previous episode. Changes have been marked in the file so you can follow what was adjusted in this episode.
//BUY_ASK
$shares_to_buy = Round($DASHBOARD.getCustButObj("SHARES").Text,0);
//+ ADDED THE FOLLOWING 11 LINES
if ($TRADE.STOP.STATIC_LEVEL != 0){
if ($shares_to_buy > ($TRADE.STOP.MAX_DOLLAR_RISK / ($montage_window.BID - $TRADE.STOP.STATIC_LEVEL))){
//reduce share size
$shares_to_buy = Round(($TRADE.STOP.MAX_DOLLAR_RISK / ($montage_window.BID - $TRADE.STOP.STATIC_LEVEL)),0);
}
} else if ($TRADE.STOP.FLEX_LEVEL != 0){
if ($shares_to_buy > ($TRADE.STOP.MAX_DOLLAR_RISK / $TRADE.STOP.FLEX_LEVEL)){
//reduce share size
$shares_to_buy = Round(($TRADE.STOP.MAX_DOLLAR_RISK / $TRADE.STOP.FLEX_LEVEL),0);
}
}
$montage_window.Share=$shares_to_buy;
if ($TRADE.BUY_AT_TARGET > 0){
if ($TRADE.BUY_AT_TARGET >= $montage_window.ASK){
$montage_window.Price=$TRADE.BUY_AT_TARGET + $TRADE.BUY_SPREAD;
} else {
$montage_window.Price=$TRADE.BUY_AT_TARGET;
}
$montage_window.StopPrice=$TRADE.BUY_AT_TARGET;
$montage_window.Route="STOP";
if ($TIME.REGULAR_HOURS == 1){
$montage_window.StopType="Limit";
} else {
$montage_window.StopType="LimitP";
}
} else {
$montage_window.Route="Limit";
$montage_window.Price=$montage_window.ASK;
}
$montage_window.ACCOUNT=$ACCOUNT_NUMBER;
$montage_window.TIF=DAY+;
$montage_window.BUY=SEND;
$TRADE.BUY_AT_TARGET = 0;
$TRADE.STOP.TRIGGER = 1;//+ ADDED THIS LINE
TIMER
This script is from a previous episode. Changes have been marked in the file so you can follow what was adjusted in this episode.
//TIMER
ExecHotkey("OBJECT_LOAD_TIME");
if ($TRADE.TIME_ON_TICKER > 2 && $TRADE.DAILYEMA200 == 0){
//EMA200 comes from daily chart
ExecHotkey("EMA200");
}
//- REMOVED THE FOLLOWING LINE
//$bar0 = $chart_1m.GetBar(0);
ExecHotkey("ANALYZE_MACD");
ExecHotkey("DASHBOARD");
ExecHotkey("TIMER_PL_UPDATE");
ExecHotkey("TIMER_BUY_TARGET");
ExecHotkey("CHART_TIMER_DRAW_BUY_TARGET");
Disclaimer:
This is an independent project and is not affiliated with or endorsed by DASTrader.com.
The tool is currently under development and intended for educational and experimental purposes only,
including improving the experience of working with DAS hotkey scripting (e.g., code validation,
highlighting, and structure).
It does not execute trades, provide trading signals, or offer financial advice. Any scripts created or used
with DAS Trader remain the sole responsibility of the user.
Trading involves significant risk. You are fully responsible for verifying all scripts, commands, and
behavior before using them in a live trading environment.
This tool is provided “as-is” with no guarantees of accuracy, completeness, or reliability. Use at your own
risk. Always test thoroughly in a simulator before live trading.