March 9, 2008
Button Rotate
A ButtonRotate function is like a ParamToggle() but with multiple states. The ButtonRotate function returns the label displayed on the button, and selects the next label each time you click the button. In the example below the ButtonRotate is used to select the next action, which can be Buy, Sell, Short, Cover, Cash, or Reverse. The end result of using this function is similar to using the ParamList() however it is much quicker to use. When the action is selected the order can be transmitted using the Transmit ButtonTrigger().The function returns the displayed label; sometimes the label can be used directly in PlaceOrder(), at other times you may have to use an if() comparison to know which action to perform. For debugging purposes the Title shows the returned values:
The ButtonRotate() is listed below for discussion. There is no need to copy this because it is included in the Include file at the end of this post.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function ButtonRotate( LabelStr, BackColorStr, TextColorStr ) { global ColNumber, RowNumber, ColName, ColExpanded; if ( ColExpanded ) { ColName = VarGetText( "ColName" ); RowNumber = Nz( kStaticVarGet( "RowNumber" + ColName ) ) + 1; kStaticVarSet( "RowNumber" + ColName, RowNumber ); Rotate = GetButtonClick( ColNumber, RowNumber ); if ( Rotate OR IsNull( StaticVarGet("RotateInit"+ ColName + RowNumber ) ) ) { RotateIndex = Nz( kStaticVarGet( "RotateIndex" + ColName + RowNumber ) ); if ( StrExtract( LabelStr, RotateIndex + 1) != "" ) RotateIndex++; else RotateIndex = 0; kStaticVarSet( "RotateIndex" + ColName + RowNumber, RotateIndex ); Label = StrExtract( LabelStr, RotateIndex ); if ( StrExtract( BackColorStr, RotateIndex ) == "" ) BackColor = StrToNum( StrExtract( BackColorStr, 0 ) ); else BackColor = StrToNum( StrExtract( BackColorStr, RotateIndex ) ); if ( StrExtract( TextColorStr, RotateIndex ) == "" ) TextColor = StrToNum( StrExtract( TextColorStr, 0 ) ); else TextColor = StrToNum( StrExtract( TextColorStr, RotateIndex ) ); kStaticVarSetText( "Label" + ColName + RowNumber, Label ); kStaticVarSet( "TextColor" + ColName + RowNumber, TextColor ); kStaticVarSet( "BackColor" + ColName + RowNumber, BackColor ); StaticVarSet("RotateInit"+ ColName + RowNumber, True); } } Label = kStaticVarGetText( "Label" + ColName + RowNumber); return Label; } |
Referring to the above code you’ll see the usual ColExpanded variable that determines whether this button will be displayed. A RotateInit var is used to detect whether the button has been initialized, i.e., whether is was assigned colors and text. Each time the function is called the RotateIndex incremented. This index is used to extract the proper label and color from the csv encoded options in the string argument for the function.
The code below demonstrates how the ButtonRotate is used. Note that for brevity I used digits to indicate colors. You can also use constants like ColorRed, ColorBlue, etc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <ControlPanelInclude-004.afl> global ColNumber; RequestTimedRefresh(1); ButtonHeight = Param("Button Height",20,5,200,1); ButtonWidth = Param("Button Width",120,5,200,1); PanelYoffset = Param("Button Row Offset (px)",10,0,Status("pxheight"),1); PanelXoffset = Param("Button Column Offset (px)",10,0,Status("pxwidth"),1); FontRatio = Param("Font: ButtonHeight ratio",2,1,20,0.1); DoubleClickInterval = Param("Double Click Max. Interval",330,1,1000,1); ButtonColumnBegin( "1" ); ButtonHeader( "HEADER", colorBlue, colorBlue,colorWhite); ButtonText( "TRADING ENABLED", colorYellow, colorBlue); Action=ButtonRotate( "BUY,SELL,SHORT,COVER,CASH,REVERSE", "6,5,1,3,2,4", "2,3,4,5,6,1" ); Transmit = ButtonTrigger( "TRANSMIT", colorBrightGreen, colorRed, colorBlack); ButtonColumnEnd( ); ClickCoordinates = Nz(StaticVarGet("ClickCoordinates")); switch( ClickCoordinates ) { case 101: // Perform Button task 101 here break; case 102: // Perform Button task 102 here break; // etc. } Plot(C,"",1,128); Title = "\n"+ "Button Coordinates: "+ClickCoordinates+"\n"+ "Action: "+Action+"\n"+ "Transmit: "+Transmit; |
As always, here follows the revised Include file with the ButtonRotate() included.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | // ControlPanelInclude-004.afl procedure kStaticVarSet( SName, SValue ) { ChartID = GetChartID(); InIndicator = Status("Action") == 1; if( InIndicator ) StaticVarSet(Sname+ChartID, Svalue); } function kStaticVarGet( SName ) { ChartID = GetChartID(); Var = StaticVarGet(Sname+ChartID); return Var; } procedure kStaticVarSetText( SName, SValue ) { ChartID = GetChartID(); InIndicator = Status("Action") == 1; if( InIndicator ) StaticVarSetText(Sname+ChartID, Svalue); } function kStaticVarGetText( SName ) { ChartID = GetChartID(); return StaticVarGetText(Sname+ChartID); } function NewColumn() { VarSet("ColNumber", 0); } function GetButtonClick( ColNumber, RowNumber ) { global PanelYoffset, PanelXoffset, ButtonHeight, ButtonWidth; LButtonDown = GetCursorMouseButtons() == 9; Click = False; if( LButtonDown ) { ULButtonX = PanelXoffset + (ColNumber-1) * ButtonWidth; LRButtonX = ULButtonX + ButtonWidth; ULButtonY = (RowNumber -1) * ButtonHeight + PanelYoffset; LRButtonY = ULButtonY + ButtonHeight; MouseCoord = Nz(StaticVarGet("ClickCoordinates")); if( MouseCoord == 0 AND LButtonDown ) { MousePx = GetCursorXPosition( 1 ); MousePy = GetCursorYPosition( 1 ); if( MousePx > ULButtonX AND MousePx < LRButtonX AND MousePy > ULButtonY AND MousePy < LRButtonY ) { StaticVarSet("ClickCoordinates",ColNumber*100+RowNumber); Click = 1; } } } return Click; } function ButtonColumnBegin( ColName ) { global FontRatio, ColName, ColNumber, ButtonHeight, ButtonWidth, PanelXoffset, PanelYoffset, Colname; ColNumber = VarGet("ColNumber"); if( IsEmpty( ColNumber ) ) { VarSet("ColNumber",1); StaticVarSet("ClickCoordinates",0); } else VarSet("ColNumber", ++ColNumber); ColName = ColName+GetChartID(); kStaticVarSet("RowNumber"+ColName, 0); VarSetText("ColName",ColName); GfxSetOverlayMode( 0 ); GfxSelectFont( "Tahoma", ButtonHeight/FontRatio, 800 ); GfxSelectPen( colorBlack ); GfxSetBkMode( 1 ); } function ButtonHeader( Label, backColor1, BackColor2, TextColor) { global ColNumber, RowNumber, ColExpanded, Colname; RowNumber = Nz(kStaticVarGet("RowNumber"+ColName))+1; kStaticVarSet("RowNumber"+ColName, RowNumber); SingleClick = GetButtonClick( ColNumber, RowNumber ); BackColor = backColor1; ColExpanded = Nz(kStaticVarGet(ColName+"ColExpanded")); if( SingleClick ) { BackColor = backColor2; ColExpanded = Nz(kStaticVarGet(ColName+"ColExpanded")); if( ColExpanded ) kStaticVarSet(ColName+"ColExpanded", False); else kStaticVarSet(ColName+"ColExpanded", True); } ColExpanded = Nz(kStaticVarGet(ColName+"ColExpanded")); kStaticVarSetText("Label"+ColName+RowNumber, Label); kStaticVarSet("TextColor"+ColName+RowNumber, TextColor); kStaticVarSet("BackColor"+ColName+RowNumber, backColor); } function ButtonText( Label, backColor, TextColor) { global ColNumber, RowNumber, Colname; ColExpanded = Nz(kStaticVarGet(ColName+"ColExpanded")); if( ColExpanded ) { ColName = VarGetText("ColName"); RowNumber = Nz(kStaticVarGet("RowNumber"+ColName))+1; kStaticVarSet("RowNumber"+ColName, RowNumber); kStaticVarSetText("Label"+ColName+RowNumber, Label); kStaticVarSet("TextColor"+ColName+RowNumber, TextColor); kStaticVarSet("BackColor"+ColName+RowNumber, backColor); } } function ButtonTrigger( Label, backColor1, BackColor2, TextColor) { global ColNumber, RowNumber, ColName; ColExpanded = Nz(kStaticVarGet(ColName+"ColExpanded")); if( ColExpanded ) { ColName = VarGetText("ColName"); RowNumber = Nz(kStaticVarGet("RowNumber"+ColName))+1; kStaticVarSet("RowNumber"+ColName, RowNumber); Trigger = GetButtonClick( ColNumber, RowNumber ); if( Trigger ) BackColor = backColor2; else BackColor = backColor1; kStaticVarSetText("Label"+ColName+RowNumber, Label); kStaticVarSet("TextColor"+ColName+RowNumber, TextColor); kStaticVarSet("BackColor"+ColName+RowNumber, backColor); } else Trigger = 0; return Trigger; } function ButtonRotate( LabelStr, BackColorStr, TextColorStr ) { global ColNumber, RowNumber, ColName, ColExpanded; if ( ColExpanded ) { ColName = VarGetText( "ColName" ); RowNumber = Nz( kStaticVarGet( "RowNumber" + ColName ) ) + 1; kStaticVarSet( "RowNumber" + ColName, RowNumber ); Rotate = GetButtonClick( ColNumber, RowNumber ); if ( Rotate OR IsNull( StaticVarGet("RotateInit"+ ColName + RowNumber ) ) ) { RotateIndex = Nz( kStaticVarGet( "RotateIndex" + ColName + RowNumber ) ); if ( StrExtract( LabelStr, RotateIndex + 1) != "" ) RotateIndex++; else RotateIndex = 0; kStaticVarSet( "RotateIndex" + ColName + RowNumber, RotateIndex ); Label = StrExtract( LabelStr, RotateIndex ); if ( StrExtract( BackColorStr, RotateIndex ) == "" ) BackColor = StrToNum( StrExtract( BackColorStr, 0 ) ); else BackColor = StrToNum( StrExtract( BackColorStr, RotateIndex ) ); if ( StrExtract( TextColorStr, RotateIndex ) == "" ) TextColor = StrToNum( StrExtract( TextColorStr, 0 ) ); else TextColor = StrToNum( StrExtract( TextColorStr, RotateIndex ) ); kStaticVarSetText( "Label" + ColName + RowNumber, Label ); kStaticVarSet( "TextColor" + ColName + RowNumber, TextColor ); kStaticVarSet( "BackColor" + ColName + RowNumber, BackColor ); StaticVarSet("RotateInit"+ ColName + RowNumber, True); } } Label = kStaticVarGetText( "Label" + ColName + RowNumber); return Label; } function ButtonColumnEnd() { global ButtonHeight, ButtonWidth, PanelYoffset, PanelXoffset, ColNumber, RowNumber, ColName; ChartIDStr = NumToStr(GetChartID(),1.0,False); ULButtonX = PanelXoffset + (ColNumber-1) * ButtonWidth; LRButtonX = ULButtonX + ButtonWidth; for( Row = 1; Row <= RowNumber; Row++ ) { ULButtonY = (Row-1) * ButtonHeight + PanelYoffset; LRButtonY = ULButtonY + ButtonHeight; Label = kStaticVarGetText("Label"+ColName+Row); TextColor = Nz(kStaticVarGet("TextColor"+ColName+Row)); BackColor = Nz(kStaticVarGet("BackColor"+ColName+Row)); GfxSelectSolidBrush( BackColor); GfxRectangle( ULButtonX, ULButtonY, LRButtonX, LRButtonY ); GfxSetBkColor( BackColor); GfxSetTextColor( TextColor ); GfxDrawText( Label, ULButtonX, ULButtonY, LRButtonX, LRButtonY, 32 | 1 | 4); } } |
Filed by Herman at 10:52 pm under Real-Time Control-Panels
No Comments


