SetBarsRequired( sbrAll); // C:\Dropbox\AmiBroker Formulas\Formulas\_UKB TDash Project\09JUL2011\TDash-102 From UKB.afl EnableTextOutput( False); TDashVersion = "TDASH-104"; StaticVarSetText( "_TDashVersionName", TDashVersion); #pragma nocache #include ///////////////////////////////////////////////////////////////////////////////////////////////// //################################### END INCLUDE #############################################// ///////////////////////////////////////////////////////////////////////////////////////////////// global TDashSysInit; // TDash path definitions TDashPath = StaticVarGetText( "~TDashPath" ); if ( TDashPath == "" ) { TDashPath = "TDash\\"; fmkdir( TDashPath ); StaticVarSetText( "~TDashPath", TDashPath ); TDashReportsPath = "TDash\\Reports\\"; fmkdir( TDashReportsPath ); StaticVarSetText( "~TDashPathReports", TDashReportsPath ); TDashJSPath = "TDash\\JS\\"; fmkdir( TDashJSPath ); StaticVarSetText( "~TDashJSPath", TDashJSPath ); TDashAFLPath = "TDash\\TDashAFL\\"; fmkdir( TDashAFLPath ); StaticVarSetText( "~TDashAFLPath", TDashAFLPath ); } // Recall parameters that were changed during the previous excecution // so that they can be used in code preceding the button function LeftButtonRelease = Nz( StaticVarGet( "~LeftButtonRelease" ) ); LeftClick = Nz( StaticVarGet( "~LeftClick" ) ); //Left Click is set at end of code LeftDown = Nz( StaticVarGet( "~LeftDown" ) ); ClickSoundOn = Nz( StaticVarGet( "~ClickSoundOn" ) ); TraceOn = Nz( StaticVarGet( "~TraceOn" ) ); QAutoHide = Nz( StaticVarGet( "~QAutoHide" ) ); VoiceOn = Nz( StaticVarGet( "~VoiceOn" ) ); TDashCount = Nz( StaticVarGet( "~TDashCount" ) ); StaticVarSet( "~TDashCount", ++TDashCount); AutoFocus = Nz( StaticVarGet( "~AutoFocus" ) ); QBarType = StaticVarGetText( "~QBarType" ); PatternType = StaticVarGetText( "~PatternType" ); BracketType = StaticVarGetText( "~BracketType" ); ///////////////////////////////////////////////////////////////////// BackGroundColor = colorLightBlue; SetBackgroundColor( BackgroundColor ); SetChartOptions( 0, chartHideQuoteMarker ); GfxSetOverlayMode( 2 ); pxwidth = Status( "pxwidth" ); pxheight = Status( "pxheight" ); MX = GetCursorXPosition( 1 ); MY = GetCursorYPosition( 1 ); PrevOnTDash = Nz( StaticVarGet( "~OnTDash" ) ); OnTDash = !IsNull( MX ) AND !IsNull( MY ); // Accept only mouse action when cursor is inside TDash window EnterTDash = OnTDash > PrevOnTDash; LeaveDash = ONTDash < PrevOnTDash; StaticVarSet( "~OnTDash", OnTDash ); RequestTimedRefresh(0.1); MX = GetCursorXPosition( 1 ); MY = GetCursorYPosition( 1 ); OnTDash = !IsNull(MX) AND !IsNull(MY); TDashWindowNumber = Param( "TDash Window Number", 2, 0, 3, 1 ); if ( NOT OnTDash ) StaticVarSet( "_ActivateOnce", 0 ); ActivateOnce = Nz( StaticVarGet( "_ActivateOnce" ) ); if ( OnTDash AND NOT ActivateOnce AND AutoFocus ) { AB = CreateObject( "Broker.Application" ); if( AB ) { docs = AB.Documents; doc = docs.Item( TDashWindowNumber ); AW = doc.ActiveWindow; AW.Activate(); StaticVarSet( "_ActivateOnce", 1 ); //_TRACE( "Activate Window" ); } else Say( "Wrong window number" ); } LeftClick = LeftClick AND OnTDash; LeftDown = LeftDown AND OnTDash AND NOT LeftClick; PrevLeftButtonState = Nz( StaticVarGet( "~LeftButtonState" ) ); LeftButtonRelease = LeftDown < PrevLeftButtonState AND OnTDash; StaticVarSet( "~LeftButtonState", LeftDown ); // Release is also detected outside TDash window _SECTION_BEGIN( "SYSTEM" ); TradeQty = Param( "Num shares to trade", 100,0,1000,1); StaticVarSet( "~TradeQty", TradeQty ); _SECTION_END(); _SECTION_BEGIN( "WINDOW LAYOUT" ); NumButtonCols = Param( "Number of Button Columns", 3,1,10,1); FontSize = Nz(StaticVarGet( "~FontSize")); NumChar = Param( "Max. Char/Button",7,3,10,1); FontName = ParamList( "Font Name", "ARIAL,Times New Roman,Microsoft Sans Serif,Garamont", 0 ); StaticVarSetText( "~FontName", FontName ); Fontweight = Param( "Font Weight", 500,100,1000,100); GroupSpacing = Param( "Horizontal Group Spacing", 5, 0, 20,1); _SECTION_END(); _SECTION_BEGIN( "GROUP HEADERS" ); TopSpace = Param( "Empty Space above button layout", 1,1,1000,1); GroupDefaultColor = Param( "Group Default Color", BackGroundColor, 0, 64, 1 ); GroupHeaderColor = Param( "Group Header Color (-1 default)", 16, -1, 64, 1 ); GroupTextColor = Param( "Group Text Color", colorWhite, 0, 64, 1 ); HeaderSpace = Param( "Header Space", 5, 0,15, 1 ); HeaderHeight = Param( "Header Height", 16, 0, 30,1); _SECTION_END(); _SECTION_BEGIN( "MARKERS" ); MarkerFontSize = Param( "Marker Font Size", 10, 3,20,1); MArkerXOffset = Param( "Marker X-Offset", 5,0,100, 1); MarkerWidth = Param( "Marker Width", 50,10,200,1); //MArkerAutoModify = ParamToggle( "Marker Auto-Modify", "OFF|ON", 0); MarkerFontSize = 10; MArkerHeight = 16; _SECTION_END(); _SECTION_BEGIN( "QBAR" ); MaxQChar = Param( "Max. Char on QBar", 7,1,10,1); QFontWeight = Param( "QBar Font Weight", 700, 100, 1000,10); QBarXOffset = Param("QBar X-Offset", 100,0,1000,1); QBarWidth = Param( "Qbar Button Width", 50, 1, 100, 1 ); QBarHeight = Param( "QBar Button Height", 40,0, 100, 1); QFrameWidth = Param( "QBar Frame Width", 1,0,10,1); QRadius = Param( "QBar Radius", 3, 0, 50, 1 ); QBarBkColor = ParamColor( "QBar BackGround", colorLightGrey ); _SECTION_END(); _SECTION_BEGIN( "3D Buttons" ); Max3DButtonWidth = Param("Max 3D Button Width", 100,0,200,1); MaxButtonHeight = Param("Max. 3DButton Height", 50,10,100,1); EdgeWidth = Param( "3D Edge width", 3,0,10,1); FontWeight3D = Param( "3D Button Font Weight", 700, 100, 1000,10); HighLightColor = ParamColor( "Select Highlight", colorGold ); ShowHover = ParamToggle( "Hover Indication", "HIDE|SHOW", 0 ); HeaderFormat = 37; //Param("FHeader",37,0,100,1); LabelFormat = 37; //Param("FLabel",37,0,100,1); _SECTION_END(); /////////////////////////////////////////////// POSITION MARKER if( CurrentPos != 0 ) CheckPosMarker( "Position marker tip" ); /////////////////////////////////////////////// QBAR Inactive = False; // for use in all button functions Show = 1; Active = True; GroupName = "QBAR"; QBarXOffset = Max( VarGet( "LastXPos" )+GroupSpacing, QBarXOffset ); AddQBarButton( "BUY", QBarType, QBarType, BGN, BLK, BLK, BGN, Col = 2, QBarXOffset, Show, Active, "Buy "+QBarType+" at Last Price" ); AddQBarButton( "SELL", QBarType, QBarType, RED, BLK, BLK, RED, Col = ++Col, QBarXOffset, Show, Active, "Sell "+QBarType+" at Last Price" ); AddQBarButton( "REV", QBarType, QBarType, BLU, WHT, WHT, BLU, Col = ++Col, QBarXOffset, Show, Active, "Reverse number of shares in current Position" ); /////////////////////////////////////////////// CALC AUTO BUTTON SIZES SSumSpace = Nz( StaticVarGet( "~SumSpace" )); NBR = Nz( StaticVarGet( "~NumButtonRows" ) ); NH = Nz(StaticVarGet( "~NumHeaders")); MBH = ( pxheight - SSumSpace - NH - 1 - TopSpace ) / NBR; MaxButtonHeight = Min( MBH, MaxButtonHeight ); BH = MaxButtonHeight; // rename to shorter names for brevity in button arguments BW = Max3DButtonWidth; PanelWidth = NumButtonCols*BW; X11 = Nz( VarGet( "LastXPos" ) ) + GroupSpacing; // Horizontal start of button pad BW = Min( ( pxwidth - X11 )/NumButtonCols, BW ); /////////////////////////////////////////////// BUTTON LAYOUT if( GroupHeaderColor == -1 ) GroupColor = GroupDefaultColor; else GroupColor = GroupHeaderColor; GroupName = "LAYOUT"; Show = 1; msg = TDashVersion+" ~ "+GroupName + " [W"+NumToStr( TDashWindowNumber+1,1.0)+"]"; DrawGroupHeader( x11, TopSpace, PanelWidth, HeaderSpace, HeaderHeight,msg, GroupColor, GroupTextColor, Show ); Y1 = VarGet( "LastYPos" ) - 1; Active = 1; ShowSetup = Button3D( "TOGGLE", X1 = x11, Y1, BW, BH, GroupName, "SETUP", "HIDE", "SHOW", BLK, YEL, YEL, BLK, Show, Active,"Show SETUP button Group" ); ShowOrderGroup = !Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "ORDERS", "HIDE", "SHOW", YEL, BLK, BLK, YEL, Show, Active, "Show ORDERS button Group" ); ShowCustom = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "CUSTOM", "HIDE", "SHOW", BLK, YEL, YEL, BLK, Show, Active,"Show CUSTOM button Group" ); ShowCharts = Button3D( "TOGGLE", X1 = X11, Y1 += BH, BW, BH, GroupName, "CHARTS", "HIDE", "SHOW", BLK, YEL, YEL, BLK, Show, Active,"Show CHARTS button Group" ); ShowStatus = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "STATUS", "HIDE", "SHOW", BLK, YEL, YEL, BLK, Show, Active,"Show STATUS button Group" ); Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, Show,Active, "" ); /////////////////////////////////////////////// SETUP if ( GroupHeaderColor == -1 ) GroupColor = GroupDefaultColor; else GroupColor = ++GroupColor; Active = 1; GroupName = "SETUP"; Y1 = VarGet( "LastYPos" ); DrawGroupHeader( x11, Y1, PanelWidth, HeaderSpace, HeaderHeight, GroupName, GroupColor, GroupTextColor, ShowSetup); Y1 = VarGet( "LastYPos" ) - 1; Labels = "REPLAY,SIM,REAL"; DataTypeNum = Button3D( "ROTATE", X1 = x11, Y1, BW, BH, GroupName, "DATA", Labels, "", colorLightOrange, BLK, BLK, WHT, ShowSetup, Active, "Selects data type. Only one trade/bar is permitted (this includes reversals). If you want to trade faster please reduce your timeframe." ); StaticVarSetText( "~DataType", StrExtract( Labels, DataTypeNum ) ); SystemInit = Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "TDASH", "INIT", "INIT", YEL, BLK, BLK, YEL, ShowSetup, Active, "Initialize TDash System" ); AutoHide = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "QBAR", "SHOW", "AUTO", PNK, PGN, BLK, BLK, ShowSetup, Active, "When AutoHide is selected the QBar only shows when the cursor is over the vertical QBar area, else it stays where it was last used." ); if( IsNull( StaticVarGet( "~QAutoHide" ) ) ) StaticVarSet( "~QAutoHide", 0 ); else StaticVarSet( "~QAutoHide", AutoHide ); // show QBar on startup to auto-size buttons with QBar-AUTO TipsOn = Button3D( "TOGGLE", X1 = X11, Y1 += BH, BW, BH, GroupName, "TIPS", "OFF", "ON", PNK, PGN, BLK, BLK, ShowSetup, Active, "Turns On/Off Help Tips" ); StaticVarSet( "~TipsOn", TipsOn ); VoiceOn = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "VOICE", "OFF", "ON", PNK, PGN, BLK, BLK, ShowSetup, Active, "Turns On/Off voice confirmation of TDash action" ); StaticVarSet( "~VoiceOn", VoiceOn ); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "VOICE", "TEST", "TEST", YEL, BLK, BLK, YEL, ShowSetup, Active, "Test Voice and clear Voice buffer" ); TraceOn = Button3D( "TOGGLE", X1 = X11, Y1 += BH, BW, BH, GroupName, "TRACE", "OFF", "ON", PNK, PGN, BLK, BLK, ShowSetup, Active, "Turns On/Off Trace output " ); StaticVarSet( "~TraceOn", TraceOn ); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "TRACE", "CLEAR", "CLEAR", YEL, BLK, BLK, YEL, ShowSetup, Active, "Clear AmiBroker Trace Window" ); ClickOn = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "CLICK", "OFF", "ON", PNK, PGN, BLK, BLK, ShowSetup, Active, "Turn On/Off mouse click sound" ); StaticVarSet( "~ClickSoundOn", ClickOn ); //Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowSetup, Active, "" ); Button3D( "TRIGGER", X1 = x11, Y1 += BH, BW, BH, GroupName, "SETTINGS", "SAVE", "SAVE", YEL, BLK, BLK, YEL, ShowSetup, False, "Settings are automatically saved and loaded. This button is to save a special setup (not implemented yet)."); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "SETTINGS", "LOAD", "LOAD", YEL, BLK, BLK, YEL, ShowSetup, False, "Load a previously saved setup"); DeleteArrows = Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "TRADES", "DELETE", "DELETE", YEL, BLK, BLK, YEL, ShowSetup, Active, "Remove, and delete permanently, all trades and arrows" ); AutoFocus = Button3D( "TOGGLE", X1 = X11, Y1 += BH, BW, BH, GroupName, "AUTO", "FOCUS", "FOCUS", PNK, PGN, BLK, BLK, ShowSetup, Active, "Turns On/Off Trace output " ); StaticVarSet( "~AutoFocus", AutoFocus ); Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowSetup,Active, "" ); Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowSetup,Active, "" ); /////////////////////////////////////////////// ORDERS if( GroupHeaderColor == -1 ) GroupColor = GroupDefaultColor; else GroupColor = ++GroupColor; Active = 1; GroupName = "ORDERS"; Y1 = VarGet( "LastYPos" ); DrawGroupHeader( x11, Y1, PanelWidth, HeaderSpace, HeaderHeight, GroupName, GroupColor, GroupTextColor, ShowOrderGroup ); Y1 = VarGet( "LastYPos" ) - 1; // Row 1 Button3D( "TRIGGER", X1 = x11 , Y1, BW, BH, GroupName, "CANCEL", "LAST", "LAST", YEL, BLK, BLK, YEL, ShowOrderGroup,Active, "Cancel last order placed and that is still pending" ); Labels = "LMT,MKT,STP"; //,NONE"; //LMTLAST,MKT,LMTASK,LMTBID"; QBarTypeNum = Button3D( "ROTATE", X1 += BW, Y1, BW, BH, GroupName, "TYPE", Labels, "", colorLightOrange, BLK, BLK, WHT, ShowOrderGroup,active, "Selects QBar Order type. Only LMT,STP, and MKT available at this time. Auto mode set Type based on whether the QBar is above or below the last price." ); StaticVarSetText( "~QBarType", StrExtract( Labels, QBarTypeNum)); Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowOrderGroup,Active, "" ); // Row 2 Button3D( "TRIGGER", X1 = X11, Y1+=BH, BW, BH, GroupName, "CANCEL", "ALL", "ALL", YEL, BLK, BLK, YEL, ShowOrderGroup,Active, "Cancel all pending orders for current ticker" ); Labels = "DEFAULT,MAIN,TARGET,STOP,NONE"; BracketTypeNum = BracketPart = Button3D( "ROTATE", X1 += BW, Y1, BW, BH, GroupName, "BRACKET", Labels, "", colorLightOrange, BLK, BLK, WHT, ShowOrderGroup,InActive , "Enable Bracket orders. Set to NONE to disable Bracket mode. AUTO places three orders using spreads previously saved (Not implemented yet)" ); StaticVarSetText( "~BracketType", StrExtract( Labels, BracketTypeNum )); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "BRACKET", "SAVE", "SAVE", YEL, BLK, BLK, YEL, ShowOrderGroup,InActive, "Saves current Bracket values as default" ); // Row 3 Button3D( "TRIGGER", X1 = x11, Y1 +=BH, BW, BH, GroupName, "CLOSE", "CURRENT", "CURRENT", YEL, BLK, BLK, YEL, ShowOrderGroup,Active, "Closes current position" ); Labels = "#1,#2,#3,NONE"; PatternTypeNum = Button3D( "ROTATE", X1 += BW, Y1, BW, BH, GroupName, "PATTERN", Labels, "", colorLightOrange, BLK, BLK, WHT, ShowOrderGroup, InActive , "Loads a previously saved order pattern, such as a scale in/out setup (Not implemented yet)" ); StaticVarSetText( "~PatternType", StrExtract( Labels, PatternTypeNum )); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "PATTERN", "SAVE", "SAVE", YEL, BLK, BLK, YEL, ShowOrderGroup, InActive, "Saves realtive relative order pattern, such as a scale in/out setup (Not implemented yet)" ); // Row 4 AutoRunBT = Button3D( "TOGGLE", X1 = X11, Y1 += BH, BW, BH, GroupName, "AA BT", "MANUAL", "AUTO", PNK, PGN, BLK, BLK, ShowOrderGroup,Active, "Automatically performs a Backtest, and provides a tradelist, after each order is filled," ); StaticVarSet( "~AutoRunBT", AutoRunBT ); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "RUN", "AA BT", "AA BT", YEL, BLK, BLK, YEL, ShowOrderGroup,Active, "Perform Backtest for trades placed" ); Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "SAVE", "BT RPT", "BT RPT", YEL, BLK, BLK, YEL, ShowOrderGroup,Inactive, "Time-stamp and Backup Backtest Report" ); /////////////////////////////////////////////// CHART if( GroupHeaderColor == -1 ) GroupColor = GroupDefaultColor; else GroupColor = ++GroupColor; Active = 1; GroupName = "CHART"; Y1 = VarGet( "LastYPos" ); X1 = VarGet( "LastXPos" ); DrawGroupHeader( x11, Y1, PanelWidth, HeaderSpace, HeaderHeight, GroupName, GroupColor, GroupTextColor, ShowCharts); Y1 = VarGet( "LastYPos" ) - 1; ShowPriceLines = Button3D( "TOGGLE", X1 = X11, Y1, BW, BH, GroupName, "MARKER", "LINES", "LINES", PNK, PGN, BLK, BLK, ShowCharts,Active, "Show or Hide Order and Position Marker pricelines on chart." ); StaticVarSet( "~ShowPriceLines", ShowPriceLines ); ShowBB = Button3D( "ROTATE", X1 += BW, Y1, BW, BH, GroupName, "BB", "NONE,Pd5,Pd10,Pd15,Pd20,Pd25,Pd30", "", colorLightOrange, BLK, BLK, WHT, ShowCharts,Active, "Show or Hide Bollinger Bands (BB) overlay on main chart (demo only, substitute your own indicator)." ); StaticVarSet( "~ShowBB", ShowBB ); ShowMA = Button3D( "ROTATE", X1 += BW, Y1, BW, BH, GroupName, "MA", "NONE,Pd5,Pd10,Pd15,Pd20,Pd25,Pd30", "", colorLightOrange, BLK, BLK, WHT, ShowCharts,Active, "Shows or Hides Moving Average (MA) overlay on main chart (demo only, substitute your own indicator)." ); StaticVarSet( "~ShowMA", ShowMA ); ShowArrows = Button3D( "TOGGLE", X1 = X11, Y1 += BH, BW, BH, GroupName, "ARROWS", "HIDE", "SHOW", PNK, PGN, BLK, BLK, ShowCharts, Active, "Shows or Hides trade arrows on main chart (demo only, substitute your own indicator)." ); StaticVarSet( "~ShowArrows", ShowArrows ); Showequity = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "EQUITY", "HIDE", "SHOW", PNK, PGN, BLK, BLK, ShowCharts,Active, "Show or Hide Equity plot on main chart." ); StaticVarSet( "~ShowEquity", Showequity ); ShowQty = Button3D( "TOGGLE", X1 += BW, Y1, BW, BH, GroupName, "TRADEQTY", "HIDE", "SHOW", PNK, PGN, BLK, BLK, ShowCharts,Active, "Show or Hide number shares traded on the main chart." ); StaticVarSet( "~ShowQty", ShowQty ); //Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowCharts,Active, "" ); /////////////////////////////////////////////// CUSTOM if ( GroupHeaderColor == -1 ) GroupColor = GroupDefaultColor; else GroupColor = ++GroupColor; Active = 1; GroupName = "CUSTOM"; Y1 = VarGet( "LastYPos" ); X1 = VarGet( "LastXPos" ); DrawGroupHeader( x11, Y1, PanelWidth, HeaderSpace, HeaderHeight, GroupName, GroupColor, GroupTextColor, ShowCustom ); Y1 = VarGet( "LastYPos" ) - 1; ClearAll = Button3D( "TRIGGER", X1 = x11, Y1, BW, BH, GroupName, "CLEAR", "ALL !", "ALL !", YEL, BLK, BLK, YEL, ShowCustom, Active, "Clear, Delete, and Remove permanently, all trades, arrows, positions, Ordermarkers, Static, and persistent variables" ); ClearAll = Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "CLEAR", "STATIC", "STATIC", YEL, BLK, BLK, YEL, ShowCustom, Active, "Clear, Delete, and Remove permanently, all trades, arrows, positions, Ordermarkers, Static, and persistent variables" ); Restart = Button3D( "TRIGGER", X1 += BW, Y1, BW, BH, GroupName, "RESET", "TRADING", "TRADING", YEL, BLK, BLK, YEL, ShowCustom, Active, "Clear, Delete, and Remove permanently, all trades, arrows, positions, Ordermarkers, Static, and persistent variables" ); /////////////////////////////////////////////// STATUS if ( GroupHeaderColor == -1 ) GroupColor = GroupDefaultColor; else GroupColor = ++GroupColor; Active = 1; GroupName = "STATUS"; Y1 = VarGet( "LastYPos" ); X1 = VarGet( "LastXPos" ); DrawGroupHeader( x11, Y1, PanelWidth, HeaderSpace, HeaderHeight, GroupName, GroupColor, GroupTextColor, ShowStatus); Y1 = VarGet( "LastYPos" ) - 1; ClearAll = Button3D( "TRIGGER", X1 = x11, Y1, BW, BH, GroupName, "IBc/TWS", "OK", "OK", PNK, BLK, BLK, PNK, ShowStatus, Active, "Status display" ); Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowStatus,Active, "" ); Button3D( "FILLER", X1 += BW, Y1, BW, BH, GroupName, "", "", "", YEL, BLK, BLK, YEL, ShowStatus,Active, "" ); ///// End Button Layout // TDashAction = ProcessGUI(); //if( TDashAction != "" ) _TRACE( TDashAction ); // collect last values and save in static variables for next execution NumButtonCols = VarGet( "NumButtonCols" ); StaticVarSet( "~NumButtonCols", NumButtonCols ); NBR = VarGet( "NumButtonRows"); StaticVarSet( "~NumButtonRows", NBR ); LastYPosition = VarGet( "LastYPosition" ); StaticVarSet( "~LastYPosition", LastYPos ); NumHeaders = Nz(VarGet( "NumHeaders" )); StaticVarSet( "~NumHeaders", NumHeaders); SumSpace = Nz( VarGet( "SumSpace") ); StaticVarSet( "~SumSpace", SumSpace ); LinkWithMainChart(); ////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////// Bar-Replay Trading /////////////////////////// ////////////////////////////////////////////////////////////////////////////////// function GetNextOrderID() { OID = PersistentVarGetText( "OrderID" ); if ( OID == "" ) OID = "0"; else OID = NumToStr( StrToNum( OID ) + 1, 1.0, False); PersistentVarSetText( "OrderID", OID ); // Update OID Counter PersistentListAdd( "BRPendingList", OID ); // Keep list of OIDs return OID; } function GetBRPendingList() { return PersistentListGet( "BRPendingOrders" ); } function QueueBRAction( OID, Ticker, Action, TradeQty, Type, LMTPrice, STPPrice, TDashType ) { local Ticker; MainLastPrice = Nz( StaticVarGet( "~MainLastPrice" ) ); if ( OID == "" ) OID = GetNextOrderID(); Record = OID + "," + Ticker + "," + Action + "," + TradeQty + "," + Type + "," + LMTPrice + "," + STPPrice + "," + MainLastprice + "," + TDashType ; StaticVarSetText( "~BROrderRecord_" + OID, Record ); StaticVarSetText( "~BROrderStatus_" + OID, "Pending" ); // Order placed PersistentListAdd( "BRPendingOrders", OID ); NoMarker = Nz( StaticVarGet( "~ActiveMarker_" + OID ) ) == 0; if ( Action == "BUY" OR Action == "COVER" ) Color = BGN; else if ( Action == "SELL" OR Action == "SHORT" ) Color = RED; else Color = colorLightGrey; if ( NoMarker ) PlaceOrderMarker( OID, LMTPrice, Color, BLK, BLK, TDashType ); xTrace( "Order placed on Queue: " + Record + ", Color: " + Color ); return OID; } function RemoveOID( OID ) { StaticVarRemove( "~BROrderRecord_"+OID ); StaticVarRemove( "~BROrderStatus_"+OID ); PersistentListRemove( "BRPendingOrders", OID ); } function GetBROrderStatus( OID ) { return StaticVarGetText( "~BROrderStatus_"+OID ); } function SetBROrderStatus( OID, NewStatus ) { StaticVarSetText( "~BROrderStatus_"+OID, NewStatus ); } function xClearBRPendingList() // Not used { StaticVarRemove( "~BROrderRecord_*" ); StaticVarRemove( "~BROrderStatus_*" ); PersistentListAdd( "BRPendingOrders", OID ); } function LogBROrderRecords() // test function { BRPendingList = GetBRPendingList(); if ( BRPendingList != "" ) { xTrace( "" ); for ( P = 0; ( OID = StrExtract( BRPendingList, P ) ) != ""; P++ ) { BROrderStatus = StaticVarGetText( "~BROrderStatus_"+OID ); xTrace( BROrderStatus + " "+OID + ": " + StaticVarGetText( "~BROrderRecord_" + OID ) ); if( BROrderStatus == "" ) RemoveOID( OID ); } xTrace( "" ); } } function DeleteBRPendingList( ListName ) { global TDashPath; Fn = TDashPath + ListName + ".csv"; fh = fdelete( Fn ) ; return fh; } function Placebanner( Text, Color, TextColor ) { global HeaderHeight, X11, HeaderSpace; X1 = MArkerXOffset; Y1 = HeaderSpace; X2 = X11-HeaderSpace; //VarGet( "LastXPos" ); Y2 = Y1 + Max(HeaderHeight,20) + 1; //X3 = Y3 = (Y2-y1); GfxSelectSolidBrush( color); GfxSelectPen( colorBlack, 1); GfxSelectFont( "ARIAL", 10, 500 ); GfxSetTextColor( TextColor ); //GfxRoundRect( X1, Y1, X2, Y2, x3, Y3 ); GfxRectangle( X1, Y1, X2, Y2 ); GfxDrawText( Text, X1, Y1, X2, Y2, 37 ); } function DisplayError( Msg, Color, TextColor ) { global HeaderHeight, X11, HeaderSpace; X1 = MArkerXOffset; Y1 = Max(HeaderHeight,20) + 1; X2 = X11-HeaderSpace; //VarGet( "LastXPos" ); Y2 = Y1 + Max(HeaderHeight,20) + 1; //X3 = Y3 = (Y2-y1); GfxSelectSolidBrush( color); GfxSelectPen( colorBlack, 1); GfxSelectFont( "ARIAL", 10, 500 ); GfxSetTextColor( TextColor ); //GfxRoundRect( X1, Y1, X2, Y2, x3, Y3 ); GfxRectangle( X1, Y1, X2, Y2 ); GfxDrawText( Msg, X1, Y1, X2, Y2, 37 ); } function PlotProfitBar( Tip ) { global BRPosition, MarkerFontSize, MainLastPrice, CurrentPos; PosSign = Nz( StaticVarGet( "~PositionSign" )); LastpriceYPixels = Nz( StaticVarGet( "~MainLastpriceYPixels" ) ); EntryYPixels = Nz( StaticVarGet( "~EntryYPixels" ) ); if ( abs( LastpriceYPixels - EntryYPixels ) >= MArkerHeight/2 ) { if ( PosSign > 0 ) { if ( LastpriceYPixels < EntryYPixels ) Color = colorBrightGreen; else if ( LastpriceYPixels > EntryYPixels ) Color = colorRed; GfxSelectSolidBrush( Color ); GfxSelectPen( Color, 1 ); GfxSetTextColor( Color ); X1 = 0; Y1 = EntryYPixels; X2 = MArkerXOffset; Y2 = LastpriceYPixels; GfxRectangle( X1, Y1, X2, Y2 ); MainLastPrice = Nz( StaticVarGet( "~MainLastPrice" ) ); EntryPrice = Nz( StaticVarGet( "~PosMarkerEntryPrice" ) ); PctProfit = ( MainLastPrice - EntryPrice ) / EntryPrice * 100; DollarProfit = ( MainLastPrice - EntryPrice ) * CurrentPos; GfxTextOut( NumToStr( PctProfit, 1.2 ) + "% [~$"+NumToStr(dollarProfit, 1.2,False)+"]", X2 + 2, Y2 - MarkerFontSize ); OnProfitBar = MX >= X1 AND MX <= X2 AND MY >= Y1 AND MY <= Y2; if ( OnProfitBar ) VarSetText( "Tip", Tip ); } else if ( PosSign < 0 ) { if ( LastpriceYPixels < EntryYPixels ) Color = colorRed; else if ( LastpriceYPixels > EntryYPixels ) Color = colorBrightGreen; GfxSelectSolidBrush( Color ); GfxSelectPen( Color, 1 ); GfxSetTextColor( Color ); X1 = 0; Y1 = EntryYPixels; X2 = MArkerXOffset; Y2 = LastpriceYPixels; GfxRectangle( X1, Y1, X2, Y2 ); MainLastPrice = Nz( StaticVarGet( "~MainLastPrice" ) ); EntryPrice = Nz( StaticVarGet( "~PosMarkerEntryPrice" ) ); PctProfit = ( EntryPrice - MainLastPrice ) / EntryPrice * 100; //_TRACE( "EntryPrice: "+EntryPrice+", MainLastPrice: "+MainLastPrice ); DollarProfit = ( EntryPrice - MainLastPrice ) * CurrentPos; GfxTextOut( NumToStr( PctProfit,1.2) + "% [~$"+NumToStr(dollarProfit, 1.2,False)+"]", X2 + 2, Y2 - MarkerFontSize ); OnProfitBar = MX >= X1 AND MX <= X2 AND MY >= Y1 AND MY <= Y2; if ( OnProfitBar ) VarSetText( "Tip", Tip ); } } } // Mouse action Switch TDashTicker = StaticVarGetText( "~TDashTicker" ); StaticVarSetText( "~TDashCurrentTicker", TDashTicker ); StaticVarSetText( "~AboveQBarMessage", "" ); MainLastPrice = Nz( StaticVarGet( "~MainLastPrice" ) ); QBarPriceLine = Nz( StaticVarGet( "~QBarPriceLine" ) ); DataType = StaticVarGetText( "~DataType" ); AutoRunBT = Nz( StaticVarGet( "~AutoRunBT" )); BracketType = StaticVarGetText( "~BracketType" ); MainOpenPrice = Nz( StaticVarGet( "~MainOpenPrice" ) ); MainLastHighPrice = Nz( StaticVarGet( "~MainLastHighPrice" ) ); MainLastLowPrice = Nz( StaticVarGet( "~MainLastLowPrice" ) ); if ( DataType == "REPLAY" ) { switch ( TDashAction ) { case "~ORDERS,RUN,AA BT": xTrace( "PERFORM BACKTEST" ); PerformBacktest(); break; case "~CUSTOM,CLEAR,ALL !": DeleteComposite( TDashTicker + "~SignalArrays" ); DeleteBRPendingList( "BRPendingList" ); EmptyTDashFolder(); StaticVarRemove( "~*" ); RemovePositionMarker(); break; case "~CUSTOM,CLEAR,STATIC": StaticVarRemove( "~*" ); break; case "~SETUP,TRADES,DELETE": DeleteComposite( TDashTicker + "~SignalArrays" ); break; case "~ORDERS,CLOSE,CURRENT": if ( CurrentPos > 0 ) QueueBRAction( "", TDashTicker, "SELL", CurrentPos, "MKT", MainLastPrice, 0, "CLOSE" ); // OK else if ( CurrentPos < 0 ) QueueBRAction( "", TDashTicker, "COVER", abs( CurrentPos ), "MKT", MainLastPrice, 0, "CLOSE" ); // OK RemovePositionMarker(); break; case "~ORDERS,CANCEL,ALL": BRPendingList = GetBRPendingList(); if ( BRPendingList != "" ) for ( P = 0; ( OID = StrExtract( BRPendingList, P ) ) != ""; P++ ) RemoveOID( OID ); break; case "~CUSTOM,RESET,TRADING": RemovePositionMarker(); BRPendingList = GetBRPendingList(); if ( BRPendingList != "" ) for ( P = 0; ( OID = StrExtract( BRPendingList, P ) ) != ""; P++ ) RemoveOID( OID ); DeleteComposite( TDashTicker + "~SignalArrays" ); PerformBacktest(); _TRACE( "!CLEAR!" ); break; case "~SETUP,TDASH,INIT": DeleteBRPendingList( "BRPendingList" ); break; case "~ORDERS,CANCEL,LAST": BRPendingList = GetBRPendingList(); OIDToRemove = StrExtract( BRPendingList, -2 ); // 3 because the list ends in a comma RemoveOID( OIDToRemove ); break; // QueueBRAction( OID, TDashTicker, Action, TradeQty, Type, LMTPrice, STPPrice, TDashType ) // 8 args ///////////////////////////////////// MKT Orders ////////////////////////////////////// case "~QBAR,BUY,MKT": // Left Click if( CurrentPos < 0 ) QueueBRAction( "", TDashTicker, "COVER", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); else QueueBRAction( "", TDashTicker, "BUY", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); break; case "~QBAR,SELL,MKT": // Left Click if ( CurrentPos > 0 ) QueueBRAction( "", TDashTicker, "SELL", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); else QueueBRAction( "", TDashTicker, "SHORT", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); break; case "~QBAR,REV,MKT": // Left Click QueueBRAction( "", TDashTicker, "REV", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); break; ///////////////////////////////////// LMT Orders ////////////////////////////////////// case "QBAR,BUY,LMT": // Hover if ( QBarPriceLine > MAinLastPrice ) if( CurrentPos < 0 ) StaticVarSetText( "~AboveQBarMessage", "COVER @ MKT !" ); else StaticVarSetText( "~AboveQBarMessage", "BUY @ MKT !" ); if ( QBarPriceLine < MAinLastPrice AND CurrentPos == 0 ) StaticVarSetText( "~AboveQBarMessage", "BUY @ LMT !" ); break; case "QBAR,SELL,LMT": // Hover if ( QBarPriceLine < MAinLastPrice ) if( CurrentPos > 0 ) StaticVarSetText( "~AboveQBarMessage", "SELL @ MKT !" ); else StaticVarSetText( "~AboveQBarMessage", "SHORT @ MKT !" ); if ( QBarPriceLine > MAinLastPrice AND CurrentPos == 0 ) StaticVarSetText( "~AboveQBarMessage", "SHORT @ LMT !" ); break; case "~QBAR,BUY,LMT": // Left Click if ( QBarPriceLine >= MAinLastPrice ) Price = MAinLastPrice; else Price = QBarPriceLine; if( CurrentPos < 0 ) QueueBRAction( "", TDashTicker, "COVER", TradeQty, "LMT", Price, 0, "LMT" ); else QueueBRAction( "", TDashTicker, "BUY", TradeQty, "LMT", Price, 0, "LMT" ); break; case "~QBAR,SELL,LMT": // Left Click if ( QBarPriceLine <= MAinLastPrice ) Price = MAinLastPrice; else Price = QBarPriceLine; if( CurrentPos > 0 ) QueueBRAction( "", TDashTicker, "SELL", TradeQty, "LMT", Price, 0, "LMT" ); else QueueBRAction( "", TDashTicker, "SHORT", TradeQty, "LMT", Price, 0, "LMT" ); break; ///////////////////////////////////// AUTO Typing ////////////////////////////////////// // A Sell Stop order is always placed below the current market price and is typically // used to limit a loss OR protect a profit on a long stock position. A Buy Stop order // is always placed above the current market price. case "QBAR,BUY,AUTO": // Hover if( CurrentPos < 0 ) // Short { if ( QBarPriceLine >= MAinLastPrice ) StaticVarSetText( "~AboveQBarMessage", "COVER @ MKT !" ); else StaticVarSetText( "~AboveQBarMessage", "COVER @ LMT !" ); } else if( CurrentPos > 0 ) // Long { if ( QBarPriceLine >= MAinLastPrice ) StaticVarSetText( "~AboveQBarMessage", "BUY @ MKT !" ); else StaticVarSetText( "~AboveQBarMessage", "BUY @ LMT !" ); } else // In Cash { if ( QBarPriceLine >= MAinLastPrice ) StaticVarSetText( "~AboveQBarMessage", "BUY @ MKT !" ); else StaticVarSetText( "~AboveQBarMessage", "BUY @ LMT !" ); } break; case "QBAR,SELL,AUTO": // Hover if( CurrentPos < 0 ) // Short { if ( QBarPriceLine >= MAinLastPrice ) StaticVarSetText( "~AboveQBarMessage", "SHORT @ LMT !" ); else StaticVarSetText( "~AboveQBarMessage", "SHORT @ MKT !" ); } else if( CurrentPos > 0 ) // Long { if ( QBarPriceLine >= MAinLastPrice ) StaticVarSetText( "~AboveQBarMessage", "SELL @ LMT !" ); else StaticVarSetText( "~AboveQBarMessage", "SELL @ MKT !" ); } else { if ( QBarPriceLine >= MAinLastPrice ) StaticVarSetText( "~AboveQBarMessage", "SELL @ LMT !" ); else StaticVarSetText( "~AboveQBarMessage", "SELL @ MKT !" ); } break; case "~QBAR,BUY,AUTO": // Left Click if ( QBarPriceLine >= MAinLastPrice ) QueueBRAction( "", TDashTicker, "BUY", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); if ( QBarPriceLine < MAinLastPrice ) QueueBRAction( "", TDashTicker, "BUY", TradeQty, "LMT", QBarPriceLine, 0, "LMT" ); break; case "~QBAR,SELL,AUTO": // Left Click if ( QBarPriceLine <= MAinLastPrice ) QueueBRAction( "", TDashTicker, "SELL", TradeQty, "MKT", MainLastPrice, 0, "MKT" ); if ( QBarPriceLine > MAinLastPrice ) QueueBRAction( "", TDashTicker, "SELL", TradeQty, "LMT", QBarPriceLine, 0, "LMT" ); break; ///////////////////////////////////// STP Orders ////////////////////////////////////// case "~QBAR,BUY,STP": QueueBRAction( "", TDashTicker, "BUY", TradeQty, "STP", QBarPriceLine, QBarPriceLine, "STP" ); break; case "~QBAR,SELL,STP": QueueBRAction( "", TDashTicker, "SELL", TradeQty, "STP", QBarPriceLine, QBarPriceLine, "STP" ); break; case "~QBAR,REV,STP": QueueBRAction( "", TDashTicker, "REV", TradeQty, "STP", QBarPriceLine, QBarPriceLine, "STP" ); break; ///////////////////////////////////// REV Orders ////////////////////////////////////// case "~QBAR,REV,MKT": if( CurrentPos < 0 ) QueueBRAction( "", TDashTicker, "REVLONG", TradeQty, "LMT", QBarPriceLine, 0, "REV" ); else if( CurrentPos > 0 ) QueueBRAction( "", TDashTicker, "REVSHORT", TradeQty, "LMT", QBarPriceLine, 0, "REV" ); break; case "~QBAR,REV,LMT": QueueBRAction( "", TDashTicker, "REV", TradeQty, "MKT", QBarPriceLine, 0, "REV" ); break; case "QBAR,REV,STP": if( CurrentPos < 0 ) QueueBRAction( "", TDashTicker, "REVLONG", TradeQty, "STP", QBarPriceLine, 0, "REV" ); else if( CurrentPos > 0 ) QueueBRAction( "", TDashTicker, "REVSHORT", TradeQty, "STP", QBarPriceLine, 0, "REV" ); break; } } // BRPending List: Monitor Pending Action CurrentPos = Nz( StaticVarGet( "~CurrentPosition" ) ); BRPendingList = GetBRPendingList(); if ( BRPendingList != "" ) { for ( P = 0; ( OID = StrExtract( BRPendingList, P ) ) != ""; P++ ) { BROrderStatus = StaticVarGetText( "~BROrderStatus_" + OID ); switch ( BRORderStatus ) { case "": RemoveOID( OID ); // remove empty status strings break; case "Pending": OrderRecord = StaticVarGetText( "~BROrderRecord_" + OID ); TDashTicker = StrExtract( OrderRecord, 1 ); Action = StrExtract( OrderRecord, 2 ); TradeQty = StrToNum( StrExtract( OrderRecord, 3 ) ); Type = StrExtract( OrderRecord, 4 ); LMTPrice = StrToNum( StrExtract( OrderRecord, 5 ) ); STPPrice = StrToNum( StrExtract( OrderRecord, 6 ) ); PlacePrice = StrToNum( StrExtract( OrderRecord, 7 ) ); TDashType = StrToNum( StrExtract( OrderRecord, 8 ) ); ActionType = Action+","+Type; Markerprice = StaticVarGet( "~MainChartPrice_" + OID ); if( LeftClick ) xTrace( "BRPendingList:: ACtionType: "+ ActionType+", Markerprice: "+NumToStr(Markerprice,1.2) ); switch ( ActionType ) { // MKT case "BUY,MKT": AddTradeToComposite( OID, TDashTicker, "BUY", TradeQty, MainLastPrice); // This changes status to "Filled" RemoveOID( OID ); break; case "COVER,MKT": AddTradeToComposite( OID, TDashTicker, "COVER", TradeQty, MainLastPrice); // This changes status to "Filled" RemoveOID( OID ); break; case "SELL,MKT": AddTradeToComposite( OID, TDashTicker, "SELL", TradeQty, MainLastPrice); RemoveOID( OID ); break; case "SHORT,MKT": AddTradeToComposite( OID, TDashTicker, "SHORT", TradeQty, MainLastPrice); RemoveOID( OID ); break; // LMT case "BUY,LMT": if( MainLastLowPrice <= Markerprice ) { AddTradeToComposite( OID, TDashTicker, "BUY", TradeQty, Markerprice); RemoveOID( OID ); } break; case "SELL,LMT": if( MainLastHighPrice >= Markerprice ) { AddTradeToComposite( OID, TDashTicker, "SELL", TradeQty, Markerprice); RemoveOID( OID ); } break; case "COVER,LMT": if( MainLastLowPrice <= Markerprice ) { AddTradeToComposite( OID, TDashTicker, "COVER", TradeQty, Markerprice); RemoveOID( OID ); } break; case "SHORT,LMT": if( MainLastHighPrice >= Markerprice ) { AddTradeToComposite( OID, TDashTicker, "SHORT", TradeQty, Markerprice); RemoveOID( OID ); } break; // STP case "BUY,STP": if( PlacePrice > STPPrice AND MainLastLowPrice <= STPPrice ) { AddTradeToComposite( OID, TDashTicker, "BUY", TradeQty, STPPrice); RemoveOID( OID ); } else if( PlacePrice < STPPrice AND MainLastHighPrice >= STPPrice ) { AddTradeToComposite( OID, TDashTicker, "BUY", TradeQty, STPPrice); RemoveOID( OID ); } break; case "SELL,STP": if( PlacePrice < STPPrice AND MainLastHighPrice >= STPPrice ) { AddTradeToComposite( OID, TDashTicker, "SELL", TradeQty, STPPrice); RemoveOID( OID ); } else if( PlacePrice > STPPrice AND MainLastLowPrice <= STPPrice ) { AddTradeToComposite( OID, TDashTicker, "SELL", TradeQty, STPPrice); RemoveOID( OID ); } break; // REV case "REV,MKT": xTrace( "QBAR,REV,MKT" ); if( CurrentPos < 0 ) AddTradeToComposite( OID, TDashTicker, "REVLONG", TradeQty, MainLastPrice); else if( CurrentPos > 0 ) AddTradeToComposite( OID, TDashTicker, "REVSHORT", TradeQty, MainLastPrice); RemoveOID( OID ); break; case "REV,LMT": AddTradeToComposite( OID, TDashTicker, "COVER", TradeQty, MainLastPrice); RemoveOID( OID ); break; case "REV,STP": AddTradeToComposite( OID, TDashTicker, "SELL", TradeQty, MainLastPrice); RemoveOID( OID ); break; case "REV,AUTO": AddTradeToComposite( OID, TDashTicker, "SELL", TradeQty, MainLastPrice); RemoveOID( OID ); break; default: break; } break; } } } CurrentPos = Nz( StaticVarGet( "~CurrentPosition" ) ); if ( CurrentPos > 0 ) { GoingLongPrice = Nz(StaticVarGet( "~GoingLongPrice" )); PlacePositionMarker( "LONG", GoingLongPrice, BGN, BLK, BLK ); } else if ( CurrentPos < 0 ) { GoingShortPrice = Nz( StaticVarGet( "~GoingShortPrice" )); PlacePositionMarker( "SHORT", GoingShortPrice, RED, BLK, BLK ); } // Monitor markers for dargging activity BRPendingList = GetBRPendingList(); // Process Marker controls if ( BRPendingList != "" ) { for ( P = 0; ( OID = StrExtract( BRPendingList, P ) ) != ""; P++ ) { DisplayOrderMarker( OID ); StaticVarSetText( "~TDashAction", TDashAction ); Price = Nz( StaticVarGet( "~MainChartPrice_" + OID ) ); switch( TDashAction ) { case "~MARKER,"+OID: // CLICK MARKER case "~~MARKER,"+OID: // DRAG MARKER case "~~~MARKER,"+OID: // RELEASE MARKER StaticVarSet( "~MarkerPrice_" + OID, Price ); StaticVarSet( "~MainChartPrice_" + OID, Price ); PersistentvarSet( "MarkerPrice_" + OID, Price ); break; case "~MARKER,"+OID+",-": // DECREMENT MARKERS //Price = Nz( StaticVarGet( "~MainChartPrice_" + OID ) ); Price = Price - 0.01; StaticVarSet( "~MarkerPrice_" + OID, Price ); StaticVarSet( "~MainChartPrice_" + OID, Price ); PersistentvarSet( "MarkerPrice_" + OID, Price ); break; case "~MARKER,"+OID+",+": // INCREMENT MARKERS //Price = Nz( StaticVarGet( "~MainChartPrice_" + OID ) ); Price = Price + 0.01; StaticVarSet( "~MarkerPrice_" + OID, Price ); StaticVarSet( "~MainChartPrice_" + OID, Price ); PersistentvarSet( "MarkerPrice_" + OID, Price ); break; case "~MARKER,"+OID+",X": // CANCEL MARKERS RemoveOID( OID ); break; } } } // End of code if ( OnTDash ) { if ( LeftClick AND ClickSoundOn ) Click(); if ( LeftButtonRelease AND ClickSoundOn ) Click(); } // Show Position banner at top of window CurrentPos = Nz( StaticVarGet( "~CurrentPosition" ) ); PosSign = sign( CurrentPos ); StaticVarSet( "~PositionSign", PosSign ); switch ( PosSign ) { case 1: // Long Color = BGN; TextColor = BLK; PosMsg = TDashTicker + ": LONG " + NumToStr( CurrentPos, 1.0, False ) + " @ " + NumToStr( MainLastPrice, 1.2, False ) + " = " + NumToStr( MainLastPrice * CurrentPos, 1.2, False ); break; case 0: // Cash Color = blk; PosMsg = "IN CASH"; TextColor = WHT; break; case - 1: // Short Color = RED; TextColor = BLK; PosMsg = TDashTicker + ": LONG " + NumToStr( CurrentPos, 1.0, False ) + " @ " + NumToStr( MainLastPrice, 1.2, False ) + " = " + NumToStr( MainLastPrice * CurrentPos, 1.2, False ); break; } if ( !OnTDash OR ( MY > QBarheight + 5 ) ) Placebanner( PosMsg, Color, TextColor ); if( TDashCount < 2 ) // hide gfx calibration steps { GfxSelectSolidBrush( BackGroundColor ); GfxSelectPen( BackGroundColor, 1 ); GfxRectangle( 0, 0, pxwidth, pxheight ); } PlotProfitBar( "This profit bar is Bright-Green when making profit and Red when losing money."+ "Do NOT confuse its color with that used to indicate Long OR Short Positions" ); TipMsg = VarGetText( "Tip" ); ShowTip( BrushColor = colorYellow, OutlineColor = BLK, TextColor = BLK, TipWidth = 150, TipHeight = 100, 8 ); LeftClick = GetCursorMouseButtons() == 9; LeftDown = GetCursorMouseButtons() == 1; StaticVarSet( "~LeftClick", LeftClick ); StaticVarSet( "~LeftDown", LeftDown ); RequestTimedRefresh( 0.1 );