{"id":2328,"date":"2011-03-06T15:04:25","date_gmt":"2011-03-06T15:04:25","guid":{"rendered":"http:\/\/www.amibroker.org\/userkb\/?p=2328"},"modified":"2011-04-08T10:31:38","modified_gmt":"2011-04-08T10:31:38","slug":"draft-introducing-order-markers","status":"publish","type":"post","link":"http:\/\/www.amibroker.org\/editable_userkb\/2011\/03\/06\/draft-introducing-order-markers\/","title":{"rendered":"Introducing Order Markers"},"content":{"rendered":"

In the previous post I developed a method to link prices between the TDash window and the Main Chart window. In this post I show how I used this technique to develop “Order Markers” that can be used to modify orders, display order status, and cancel orders. <\/p>\n

In the final TDash Order Markers will be created automatically whenever an order is found Pending. The initial orders will be placed with another tool (the QBar) that will be covered in a subsequent post.<\/p>\n

To test the Order markers you need to create two side-by-side windows in AmiBroker. If you use multiple monitors you can place the Main Chart at the right side of the left monitor, and TDash on left side of the right monitor. This will work fine and gives you a lot of space to work with. However, depending on the monitor sizes and their horizontal positions, the Markers may not appear perfectly at the same height from your desk, however the prices shown and plotted will be accurate.<\/p>\n

To install the programs, first open and copy this TDashInclude.afl<\/a> include file (not listed below due to its size) to the AmiBroker default Include folder. The TDashInclude.afl file is a development version and contains a lot of code that you don’t need at this time – please ignore the unused functions. The include will be cleaned up when the functions all work as they should. Next Apply MainMarkers.afl<\/a> (listed below) to the main chart at the left, and Apply TDashMarkers.afl<\/a> (listed below) to the TDash window at the right. <\/p>\n

The demo code presented here creates three Order Markers, each can be moved by dragging it to a new price level. At start-up the Order markers will be parked at the top of the TDash window, just click on them to activate them. Remember that in the final TDash inactive Order Markers will not show, only Order Markers for Pending orders will show.<\/p>\n

The price line and value displayed on the main chart will track the Order Marker, and the Order Markers will track a changing Y-axis on the Main chart. To allow setting an exact price Increment (+) and Decrement (-) controls are provided on the Marker. To cancel the order click the Cancel control (X). In this test cancel will only gray-out the marker and park it at the top of the TDash window, in the final program a canceled Marker will disappear after the cancellation has been confirmed.<\/p>\n

It should look and work as shown in this video below.<\/p>\n

\n<\/embed><\/object>\n<\/div>\n
<\/span>\/\/ TDashMainMarkers.afl\r\r<\/span>PersistentPath <\/span>= <\/span>StaticVarGetText<\/span>( <\/span>"~PersistentPath" <\/span>); <\/span>\/\/ Global\r<\/span>if ( <\/span>PersistentPath <\/span>== <\/span>"" <\/span>) \r{\r    <\/span>PersistentPath <\/span>= <\/span>"PersistentVariables\\\\"<\/span>;\r    <\/span>fmkdir<\/span>( <\/span>PersistentPath <\/span>);\r    <\/span>StaticVarSetText<\/span>( <\/span>"~PersistentPath"<\/span>, <\/span>PersistentPath <\/span>);\r}\r\rfunction <\/span>PersistentVarRemove<\/span>( <\/span>VarName <\/span>)\r{\r    global <\/span>PersistentPath<\/span>;\r    <\/span>Fn <\/span>= <\/span>PersistentPath <\/span>+ <\/span>VarName <\/span>+ <\/span>".pva"<\/span>;\r    <\/span>fh <\/span>= <\/span>fdelete<\/span>( <\/span>Fn <\/span>) ;\r    return <\/span>fh<\/span>;\r}\r\rfunction <\/span>PersistentVarGet<\/span>( <\/span>VarName <\/span>)\r{\r    global <\/span>PersistentPath<\/span>;\r    <\/span>fh <\/span>= <\/span>fopen<\/span>( <\/span>PersistentPath <\/span>+ <\/span>VarName <\/span>+ <\/span>".pva"<\/span>, <\/span>"r" <\/span>);\r    if ( <\/span>fh <\/span>)\r    {\r        <\/span>String <\/span>= <\/span>fgets<\/span>( <\/span>fh <\/span>);\r        <\/span>fclose<\/span>( <\/span>fh <\/span>);\r        <\/span>Number <\/span>= <\/span>StrToNum<\/span>( String );\r    }\r    else <\/span>Number <\/span>= <\/span>Null<\/span>;\r    return <\/span>Number<\/span>;\r}\r\rfunction <\/span>PersistentVarSet<\/span>( <\/span>VarName<\/span>, <\/span>Number <\/span>)\r{\r    global <\/span>PersistentPath<\/span>;\r    <\/span>String <\/span>= <\/span>NumToStr<\/span>( <\/span>Number <\/span>);\r    <\/span>fh <\/span>= <\/span>fopen<\/span>( <\/span>PersistentPath <\/span>+ <\/span>VarName <\/span>+ <\/span>".pva"<\/span>, <\/span>"w" <\/span>);\r    if ( <\/span>fh <\/span>)\r    {\r        <\/span>fputs<\/span>( <\/span>String<\/span>, <\/span>fh <\/span>);\r        <\/span>fclose<\/span>( <\/span>fh <\/span>);\r    }\r    return <\/span>fh<\/span>;\r}\r\rfunction <\/span>MAinLinkWitTDash<\/span>( <\/span>MArkername <\/span>)\r{\r    <\/span>local xMY<\/span>;\r    <\/span>\/\/ On first run try to get persistent price\r    <\/span>if ( <\/span>IsNull<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~MarkerInit_" <\/span>+ <\/span>MArkerName <\/span>) ) )\r    {\r        <\/span>Price <\/span>= <\/span>PersistentVarGet<\/span>( <\/span>"MainChartPrice_" <\/span>+ <\/span>MarkerName <\/span>);\r        if ( <\/span>Price <\/span>> <\/span>0 <\/span>)\r        {\r            <\/span>Miny <\/span>= <\/span>Status<\/span>( <\/span>"axisminy" <\/span>);\r            <\/span>Maxy <\/span>= <\/span>Status<\/span>( <\/span>"axismaxy" <\/span>);\r            <\/span>PxChartRange <\/span>= <\/span>Status<\/span>( <\/span>"pxchartheight" <\/span>);\r            <\/span>Pricerange <\/span>= <\/span>MaxY <\/span>- <\/span>MinY<\/span>;\r            <\/span>TDashYPixels <\/span>= ( <\/span>MaxY <\/span>- <\/span>Price <\/span>) * <\/span>PxChartRange <\/span>\/ <\/span>Pricerange <\/span>+ <\/span>5<\/span>;\r            <\/span>StaticVarSet<\/span>( <\/span>"~TDashYPixels_" <\/span>+ <\/span>MarkerName<\/span>, <\/span>TDashYPixels <\/span>);\r            <\/span>StaticVarSet<\/span>( <\/span>"~MainChartPrice_" <\/span>+ <\/span>MarkerName<\/span>, <\/span>Price <\/span>);\r            <\/span>StaticVarSet<\/span>( <\/span>"~Exists_" <\/span>+ <\/span>MarkerName<\/span>, <\/span>True <\/span>);\r        }\r        <\/span>StaticVarSet<\/span>( <\/span>"~MarkerInit_" <\/span>+ <\/span>MArkerName<\/span>, <\/span>True <\/span>);\r    }\r\r    <\/span>MArkerEnabled <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~Exists_" <\/span>+ <\/span>MarkerName <\/span>) );\r    if ( <\/span>MArkerEnabled <\/span>)\r    {\r        <\/span>pxWidth <\/span>= <\/span>Status<\/span>( <\/span>"pxWidth" <\/span>);\r        <\/span>Miny <\/span>= <\/span>Status<\/span>( <\/span>"axisminy" <\/span>);\r        <\/span>Maxy <\/span>= <\/span>Status<\/span>( <\/span>"axismaxy" <\/span>);\r        <\/span>pxchartright <\/span>= <\/span>Status<\/span>( <\/span>"pxchartright" <\/span>);\r        <\/span>pxchartbottom <\/span>= <\/span>Status<\/span>( <\/span>"pxchartbottom" <\/span>);\r        <\/span>pxcharttop <\/span>= <\/span>Status<\/span>( <\/span>"pxcharttop" <\/span>);\r        <\/span>PxChartRange <\/span>= <\/span>Status<\/span>( <\/span>"pxchartheight" <\/span>);\r        <\/span>pxheight <\/span>= <\/span>Status<\/span>( <\/span>"pxheight" <\/span>);\r        <\/span>Pricerange <\/span>= <\/span>MaxY <\/span>- <\/span>MinY<\/span>;\r\r        <\/span>\/\/ TDash releases get TDash y-pixel value and convert to price\r        <\/span>if ( <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~LeftButtonRelease" <\/span>) ) )         \r        {\r            <\/span>TDashYPixels <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~TDashYPixels_" <\/span>+ <\/span>MarkerName <\/span>) );        <\/span>\/\/ Y pixels from TDash window\r            <\/span>Price <\/span>= <\/span>Maxy <\/span>- ( <\/span>Pricerange <\/span>\/ <\/span>PxChartRange <\/span>* ( <\/span>TDashYPixels <\/span>- <\/span>5 <\/span>) );\r            <\/span>StaticVarSet<\/span>( <\/span>"~LeftButtonRelease"<\/span>, <\/span>False <\/span>);\r            <\/span>StaticVarSet<\/span>( <\/span>"~MainChartPrice_" <\/span>+ <\/span>MarkerName<\/span>, <\/span>Price <\/span>);\r        }\r        else\r            if ( <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~NowDragging_" <\/span>+ <\/span>MarkerName <\/span>) ) == <\/span>0 <\/span>)     <\/span>\/\/ TDash marker tracks main window\r            <\/span>{\r                <\/span>Price <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~MainChartPrice_" <\/span>+ <\/span>MarkerName <\/span>) );\r                <\/span>TDashYPixels <\/span>= ( <\/span>MaxY <\/span>- <\/span>Price <\/span>) * <\/span>PxChartRange <\/span>\/ <\/span>Pricerange <\/span>+ <\/span>5<\/span>;\r                <\/span>StaticVarSet<\/span>( <\/span>"~TDashYPixels_" <\/span>+ <\/span>MarkerName<\/span>, <\/span>TDashYPixels <\/span>);         <\/span>\/\/ Y pixels calculated from price in main chart\r            <\/span>}\r            else\r                if ( <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~NowDragging_" <\/span>+ <\/span>MarkerName <\/span>) ) )             <\/span>\/\/ Main window tracks TDash window\r                <\/span>{\r                    <\/span>TDashYPixels <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~TDashYPixels_" <\/span>+ <\/span>MarkerName <\/span>) );\r                    <\/span>Price <\/span>= <\/span>Maxy <\/span>- ( <\/span>Pricerange <\/span>\/ <\/span>PxChartRange <\/span>* ( <\/span>TDashYPixels <\/span>- <\/span>5 <\/span>) );\r                    <\/span>StaticVarSet<\/span>( <\/span>"~MainChartPrice_" <\/span>+ <\/span>MarkerName<\/span>, <\/span>Price <\/span>);  <\/span>\/\/ Price for main chart calculated from TDash y pixels\r                <\/span>}\r\r        <\/span>Price <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~MainChartPrice_" <\/span>+ <\/span>MarkerName <\/span>) );\r\r        <\/span>MArkerColor  <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~MarkerColor_" <\/span>+ <\/span>MarkerName <\/span>) );\r        <\/span>MArkerTextColor <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~MarkerTextColor_" <\/span>+ <\/span>MarkerName <\/span>) );\r        <\/span>MArkerPenColor <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~MarkerPenColor_" <\/span>+ <\/span>MarkerName <\/span>) );\r\r        <\/span>GfxSetBkMode<\/span>( <\/span>1 <\/span>);\r        <\/span>GfxSelectPen<\/span>( <\/span>MArkerColor<\/span>, <\/span>1<\/span>, <\/span>1 <\/span>);\r        <\/span>GfxMoveTo<\/span>( <\/span>0<\/span>, <\/span>TDashYPixels <\/span>);\r        <\/span>GfxLineTo<\/span>( <\/span>pxwidth<\/span>, <\/span>TDashYPixels <\/span>);\r\r        <\/span>GfxSetBkMode<\/span>( <\/span>2 <\/span>);\r        <\/span>GfxSetBkColor<\/span>( <\/span>MArkerColor <\/span>);\r        <\/span>GfxSetTextColor<\/span>( <\/span>MArkerTextColor <\/span>);\r        <\/span>GfxSelectFont<\/span>( <\/span>"Lucida Console"<\/span>, <\/span>FontSize <\/span>= <\/span>10<\/span>, <\/span>FontWeight <\/span>= <\/span>700 <\/span>);\r        <\/span>GfxDrawText<\/span>( <\/span>NumToStr<\/span>( <\/span>Price<\/span>, <\/span>1.2<\/span>, <\/span>False <\/span>), <\/span>pxchartright<\/span>, <\/span>TDashYPixels <\/span>- <\/span>FontSize<\/span>, <\/span>pxwidth<\/span>, <\/span>TDashYPixels <\/span>+ <\/span>Fontsize<\/span>, <\/span>37 <\/span>);\r    }\r}\r\rfunction <\/span>DrawQBarPriceLine<\/span>()\r{\r    if( <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~QBarVisible" <\/span>) ) )\r    {\r        <\/span>pxWidth <\/span>= <\/span>Status<\/span>( <\/span>"pxWidth" <\/span>);\r        <\/span>Miny <\/span>= <\/span>Status<\/span>( <\/span>"axisminy" <\/span>);\r        <\/span>Maxy <\/span>= <\/span>Status<\/span>( <\/span>"axismaxy" <\/span>);\r        <\/span>pxchartright <\/span>= <\/span>Status<\/span>( <\/span>"pxchartright" <\/span>);\r        <\/span>pxchartbottom <\/span>= <\/span>Status<\/span>( <\/span>"pxchartbottom" <\/span>);\r        <\/span>pxcharttop <\/span>= <\/span>Status<\/span>( <\/span>"pxcharttop" <\/span>);\r        <\/span>PxChartRange <\/span>= <\/span>Status<\/span>( <\/span>"pxchartheight" <\/span>);\r        <\/span>pxheight <\/span>= <\/span>Status<\/span>( <\/span>"pxheight" <\/span>);\r        <\/span>Pricerange <\/span>= <\/span>MaxY <\/span>- <\/span>MinY<\/span>;\r\r    <\/span>QBarColor  <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~QBarColor" <\/span>) );\r    <\/span>QBarTextColor <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~QBarTextColor" <\/span>) );\r    <\/span>QBarPenColor <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~QBarPenColor" <\/span>) );\r\r    <\/span>QBarColor <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~ActionColor" <\/span>) );\r    <\/span>QBarTextColor <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~ActionTextColor" <\/span>) );\r\r    <\/span>QBarYPixel <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~QBarYPixel" <\/span>) );        <\/span>\/\/ Y pixels from TDash window\r    <\/span>Price <\/span>= <\/span>Maxy <\/span>- ( <\/span>Pricerange <\/span>\/ <\/span>PxChartRange <\/span>* ( <\/span>QBarYPixel <\/span>- <\/span>5 <\/span>) );\r    <\/span>GfxSetBkMode<\/span>( <\/span>1 <\/span>);\r    <\/span>GfxSelectPen<\/span>( <\/span>QBarColor<\/span>, <\/span>1<\/span>, <\/span>1 <\/span>);\r    <\/span>GfxMoveTo<\/span>( <\/span>0<\/span>, <\/span>QBarYPixel <\/span>);\r    <\/span>GfxLineTo<\/span>( <\/span>pxwidth<\/span>, <\/span>QBarYPixel <\/span>);\r\r    <\/span>GfxSetBkMode<\/span>( <\/span>2 <\/span>);\r    <\/span>GfxSetBkColor<\/span>( <\/span>QBarColor <\/span>);\r    <\/span>GfxSetTextColor<\/span>( <\/span>QBarTextColor <\/span>);\r    <\/span>GfxSelectFont<\/span>( <\/span>"Lucida Console"<\/span>, <\/span>FontSize <\/span>= <\/span>10<\/span>, <\/span>FontWeight <\/span>= <\/span>700 <\/span>);\r    <\/span>GfxDrawText<\/span>( <\/span>NumToStr<\/span>( <\/span>Price<\/span>, <\/span>1.2<\/span>, <\/span>False <\/span>), <\/span>pxchartright<\/span>, <\/span>QBarYPixel <\/span>- <\/span>FontSize<\/span>, <\/span>pxwidth<\/span>, <\/span>QBarYPixel <\/span>+ <\/span>Fontsize<\/span>, <\/span>37 <\/span>);\r    }\r}\r\r\r<\/span>_SECTION_BEGIN<\/span>( <\/span>"Global Parameters" <\/span>);\rif ( <\/span>ParamTrigger<\/span>( <\/span>"Clear StaticVar (TEST)"<\/span>, <\/span>"CLEAR" <\/span>) ) <\/span>\/\/ to simulate start up\r<\/span>{\r    <\/span>StaticVarRemove<\/span>( <\/span>"*" <\/span>);\r}\r\rif ( <\/span>ParamTrigger<\/span>( <\/span>"Clear Persistent Var"<\/span>, <\/span>"CLEAR" <\/span>) ) <\/span>\/\/ to simulate start up\r<\/span>{\r    <\/span>PersistentVarRemove<\/span>( <\/span>"MainChartPrice_" <\/span>+ <\/span>"TARGET" <\/span>);\r    <\/span>PersistentVarRemove<\/span>( <\/span>"MainChartPrice_" <\/span>+ <\/span>"MAIN" <\/span>);\r    <\/span>PersistentVarRemove<\/span>( <\/span>"MainChartPrice_" <\/span>+ <\/span>"STPLOSS" <\/span>);\r}\r<\/span>_SECTION_END<\/span>();\r\r<\/span>GfxSetOverlayMode<\/span>( <\/span>0 <\/span>);\r<\/span>MAinLinkWitTDash<\/span>( <\/span>"BUY" <\/span>);\r<\/span>MAinLinkWitTDash<\/span>( <\/span>"MAIN" <\/span>);\r<\/span>MAinLinkWitTDash<\/span>( <\/span>"SELL" <\/span>);\r<\/span>DrawQBarPriceLine<\/span>();\r<\/span>Plot<\/span>( <\/span>C<\/span>, <\/span>""<\/span>, <\/span>colorBlack<\/span>, <\/span>styleBar <\/span>);\r<\/span>RequestTimedRefresh<\/span>( <\/span>0.1 <\/span>);<\/span><\/pre>\n
<\/span>\/\/ TDashMarkers\r#pragma nocache\r#include <TDashInclude.afl>\r\r<\/span>_SECTION_BEGIN<\/span>( <\/span>"TDASH MARKERS" <\/span>);\r<\/span>setBackGroundColor<\/span>( <\/span>ParamColor<\/span>( <\/span>"TDash background"<\/span>, <\/span>colorLightBlue <\/span>) );\r\r<\/span>\/\/ Set default font size\r<\/span>FontSize <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~FontSize" <\/span>) );\r<\/span>FontName <\/span>= <\/span>"ARIAL"<\/span>;\r<\/span>Fontweight <\/span>= <\/span>700<\/span>;\r<\/span>GfxSelectFont<\/span>( <\/span>FontName<\/span>, <\/span>FontSize<\/span>, <\/span>FontWeight <\/span>);\r\r<\/span>\/\/ Columns. Most parameters are for experimentation and can be hard-coded\r<\/span>NumberCols <\/span>= <\/span>Param<\/span>( <\/span>"Number Button Columns"<\/span>, <\/span>8<\/span>, <\/span>1<\/span>, <\/span>20<\/span>, <\/span>1 <\/span>);\r<\/span>ButtonWidth <\/span>= <\/span>Status<\/span>( <\/span>"pxwidth" <\/span>) \/ <\/span>NumberCols<\/span>;\r<\/span>MaxButtonWidth <\/span>= <\/span>Param<\/span>( <\/span>"Max Button Width"<\/span>, <\/span>150<\/span>, <\/span>1<\/span>, <\/span>500<\/span>, <\/span>1 <\/span>);\r<\/span>ButtonWidth <\/span>= <\/span>Min<\/span>( <\/span>ButtonWidth<\/span>, <\/span>MaxButtonWidth <\/span>);\r<\/span>MaxMarkerWidth <\/span>= <\/span>Param<\/span>( <\/span>"Max Button Width"<\/span>, <\/span>150<\/span>, <\/span>1<\/span>, <\/span>500<\/span>, <\/span>1 <\/span>);\r<\/span>MarkerWidth <\/span>= <\/span>Min<\/span>( <\/span>ButtonWidth<\/span>, <\/span>MaxMarkerWidth <\/span>);\r\r<\/span>\/\/ Rows\r<\/span>NumberRows <\/span>= <\/span>Param<\/span>( <\/span>"Number Button Rows"<\/span>, <\/span>20<\/span>, <\/span>1<\/span>, <\/span>50<\/span>, <\/span>1 <\/span>);\r<\/span>ButtonHeight <\/span>= <\/span>Status<\/span>( <\/span>"pxheight" <\/span>) \/ <\/span>NumberRows<\/span>;\r<\/span>MaxButtonHeight <\/span>= <\/span>Param<\/span>( <\/span>"Max Button Height"<\/span>, <\/span>50<\/span>, <\/span>1<\/span>, <\/span>100<\/span>, <\/span>1 <\/span>);\r<\/span>ButtonHeight <\/span>= <\/span>Min<\/span>( <\/span>ButtonHeight<\/span>, <\/span>MaxButtonHeight <\/span>);\r<\/span>MinButtonHeight <\/span>= <\/span>Param<\/span>( <\/span>"Min Button Height"<\/span>, <\/span>50<\/span>, <\/span>1<\/span>, <\/span>100<\/span>, <\/span>1 <\/span>);\r<\/span>ButtonHeight <\/span>= <\/span>Max<\/span>( <\/span>ButtonHeight<\/span>, <\/span>MinButtonHeight <\/span>);\r\r<\/span>MarkerHeight <\/span>= <\/span>ButtonHeight<\/span>;\r\r<\/span>TipsOn <\/span>= <\/span>ParamToggle<\/span>( <\/span>"Help Tips"<\/span>, <\/span>"HIDE|SHOW"<\/span>, <\/span>0 <\/span>);\r<\/span>ShowTips <\/span>= <\/span>ParamToggle<\/span>( <\/span>"Help Tips"<\/span>, <\/span>"HIDE|SHOW"<\/span>, <\/span>0 <\/span>);\r<\/span>ClickSound <\/span>= <\/span>ParamToggle<\/span>( <\/span>"Click Sound"<\/span>, <\/span>"OFF|ON"<\/span>, <\/span>1 <\/span>);\r\r<\/span>SetChartOptions<\/span>( <\/span>0<\/span>, <\/span>chartHideQuoteMarker <\/span>);\r<\/span>GfxSetOverlayMode<\/span>( <\/span>2  <\/span>);\r\r<\/span>\/\/ mouse\r<\/span>MX <\/span>= <\/span>GetCursorXPosition<\/span>( <\/span>1 <\/span>);\r<\/span>MY <\/span>= <\/span>GetCursorYPosition<\/span>( <\/span>1 <\/span>);\r<\/span>LeftClick <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~LeftClick" <\/span>) ); <\/span>\/\/Left Click SV set at end of code\r<\/span>LeftDown <\/span>= <\/span>GetCursorMouseButtons<\/span>() == <\/span>1<\/span>;\r\r<\/span>OnTDash     <\/span>= !<\/span>IsNull<\/span>( <\/span>MX <\/span>) AND !<\/span>IsNull<\/span>( <\/span>MY <\/span>);\r<\/span>LeftClick <\/span>= <\/span>LeftClick <\/span>AND <\/span>OnTDash<\/span>;    <\/span>\/\/ Only accept mouse clicks when cursor is inside TDash window\r<\/span>LeftDown <\/span>= ( <\/span>LeftDown <\/span>OR <\/span>LeftClick <\/span>) AND <\/span>OnTDash<\/span>;\r\r<\/span>PrevLeftButtonState <\/span>= <\/span>Nz<\/span>( <\/span>StaticVarGet<\/span>( <\/span>"~LeftButtonState" <\/span>) );\r<\/span>LeftButtonRelease <\/span>= <\/span>LeftDown <\/span>< <\/span>PrevLeftButtonState <\/span>AND <\/span>OnTDash<\/span>;\r<\/span>StaticVarSet<\/span>( <\/span>"~LeftButtonState"<\/span>, <\/span>LeftDown <\/span>); <\/span>\/\/ Release is also detected outside TDash window\r\r\/\/ testing markers\r<\/span>MArkerTip <\/span>= <\/span>"Drag Price Marker to desired price Level. Click 'X' to cancel, '+' to increment, and '-' to decrement"<\/span>;\r<\/span>ServiceMarkers<\/span>( <\/span>"TARGET"<\/span>, <\/span>colorBrightGreen<\/span>, <\/span>colorBlack<\/span>, <\/span>colorBlack<\/span>, <\/span>MArkerTip <\/span>);\r<\/span>ServiceMarkers<\/span>( <\/span>"MAIN"<\/span>, <\/span>colorBlue<\/span>, <\/span>colorWhite<\/span>, <\/span>colorBlack<\/span>, <\/span>MArkerTip   <\/span>);\r<\/span>ServiceMarkers<\/span>( <\/span>"STPLOSS"<\/span>, <\/span>colorRed<\/span>, <\/span>colorBlack<\/span>, <\/span>colorBlack<\/span>, <\/span>MArkerTip   <\/span>);\r\r<\/span>\/\/ testing\r<\/span>AddRowTogfxTitle<\/span>( <\/span>"                TDashAction: "<\/span>+<\/span>VarGetText<\/span>( <\/span>"TDashAction"<\/span>), <\/span>colorBlack<\/span>, <\/span>FontSize<\/span>=<\/span>10 <\/span>);\r\r<\/span>\/\/ The following lines are always located at the end of the code \r<\/span>ShowTip<\/span>( <\/span>BrushColor <\/span>= <\/span>colorYellow<\/span>, <\/span>OutlineColor <\/span>= <\/span>colorBlack<\/span>, <\/span>TextColor <\/span>= <\/span>colorBlack<\/span>, <\/span>TipWidth <\/span>= <\/span>150<\/span>, <\/span>TipHeight <\/span>= <\/span>100<\/span>, <\/span>8<\/span>, <\/span>TipsOn <\/span>);\r<\/span>LeftClick <\/span>= <\/span>GetCursorMouseButtons<\/span>() == <\/span>9<\/span>;\r<\/span>StaticVarSet<\/span>( <\/span>"~LeftClick"<\/span>, <\/span>LeftClick <\/span>);\r<\/span>RequestTimedRefresh<\/span>( <\/span>0.1 <\/span>);\r<\/span>_SECTION_END<\/span>();<\/span><\/pre>\n","protected":false},"excerpt":{"rendered":"

In the previous post I developed a method to link prices between the TDash window and the Main Chart window. In this post I show how I used this technique to develop “Order Markers” that can be used to modify orders, display order status, and cancel orders. In the final TDash Order Markers will be […]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[141],"tags":[],"_links":{"self":[{"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/posts\/2328"}],"collection":[{"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/comments?post=2328"}],"version-history":[{"count":195,"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/posts\/2328\/revisions"}],"predecessor-version":[{"id":2610,"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/posts\/2328\/revisions\/2610"}],"wp:attachment":[{"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/media?parent=2328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/categories?post=2328"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.amibroker.org\/editable_userkb\/wp-json\/wp\/v2\/tags?post=2328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}