-- More information about this indicator can be found at: --http://fxcodebase.com/code/viewtopic.php?f=28&t=61403 --+------------------------------------------------------------------+ --| Copyright © 2018, Gehtsoft USA LLC | --| http://fxcodebase.com | --+------------------------------------------------------------------+ --| Developed by : Mario Jemic | --| mario.jemic@gmail.com | --+------------------------------------------------------------------+ --| Support our efforts by donating | --| Paypal: https://goo.gl/9Rj74e | --| BitCoin : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF | --| BitCoin Cash: 1BEtS465S3Su438Kc58h2sqvVvHK9Mijtg | --| Ethereum : 0x8C110cD61538fb6d7A2B47858F0c0AaBd663068D | --| LiteCoin : LLU8PSY2vsq7B9kRELLZQcKf5nJQrdeqwD | --+------------------------------------------------------------------+ function Init() indicator:name("GAUGE"); indicator:description("GAUGE"); indicator:requiredSource(core.Bar); indicator:type(core.Oscillator); indicator.parameters:addGroup("Table display parameters"); indicator.parameters:addInteger("font_size", "Font Size", "", 10); indicator.parameters:addColor("font_color", "Font Color", "", core.rgb(128, 128, 128)); indicator.parameters:addColor("font_color_buy", "Buy Font Color", "", core.rgb(0, 255, 0)); indicator.parameters:addColor("font_color_sell", "Sell Font Color", "", core.rgb(255, 0, 0)); indicator.parameters:addGroup("Analog display parameters"); indicator.parameters:addInteger("analog_font_size", "Font Size", "", 7); indicator.parameters:addInteger("analog_clock_gap", "Clock Gap", "", 30); indicator.parameters:addInteger("analog_clock_size", "Clock Size", "", 150); indicator.parameters:addColor("analog_clock_shape" , "Clock Shape Color", "", core.rgb(0, 0, 0)); indicator.parameters:addColor("analog_clock_hands" , "Clock Hands Color", "", core.rgb(0, 0, 0)); indicator.parameters:addColor("analog_font_color", "Font Color", "", core.rgb(0, 0, 0)); indicator.parameters:addColor("analog_color_buy", "Buy Color", "", core.rgb(189, 236, 182)); indicator.parameters:addColor("analog_color_sell", "Sell Color", "", core.rgb(255,133,151)); indicator.parameters:addColor("analog_color_neutral", "Neutral Color", "", core.rgb(128, 128, 128)); indicator.parameters:addColor("analog_force_color_buy", "Force Buy Color", "", core.rgb(31,117,21)); indicator.parameters:addColor("analog_force_color_sell", "Force Sell Color", "", core.rgb(143,36,71)); end local source; local font_size = 10; local font_color; local analog_font_size = 10; local analog_font_color; local analog_color_buy; local analog_color_sell; local analog_color_neutral; local analog_force_color_buy; local analog_force_color_sell; local analog_clock_gap; local analog_clock_size; local analog_clock_shape; local analog_clock_hands; function Prepare(onlyName) source = instance.source; local name = profile:id() .. "(" .. source:name() .. ")"; instance:name(name); if onlyName then return ; end font_size = instance.parameters.font_size; font_color = instance.parameters.font_color; analog_font_size = instance.parameters.analog_font_size; analog_font_color = instance.parameters.analog_font_color; analog_color_buy = instance.parameters.analog_color_buy; analog_color_sell = instance.parameters.analog_color_sell; analog_color_neutral = instance.parameters.analog_color_neutral; analog_force_color_buy = instance.parameters.analog_force_color_buy; analog_force_color_sell = instance.parameters.analog_force_color_sell; analog_clock_gap = instance.parameters.analog_clock_gap; analog_clock_size = instance.parameters.analog_clock_size; analog_clock_shape = instance.parameters.analog_clock_shape; analog_clock_hands = instance.parameters.analog_clock_hands; instance:ownerDrawn(true); end function Update(period, mode) end local init = false; local FONT_ID = 1; local ANALOG_FONT_ID = 10; local ANALOG_BRUSH_BUY = 11; local ANALOG_BRUSH_SELL = 12; local ANALOG_BRUSH_FORCE_BUY = 13; local ANALOG_BRUSH_FORCE_SELL = 14; local ANALOG_BRUSH_NEUTRAL = 15; local captionNeutral = "NEUTRAL"; local captionBUY = "BUY"; local captionSELL = "SELL"; local captionFORCEBUY = "FORCE BUY"; local captionFORCESELL = "FORCE SELL"; function createColumn(x, y) local col_1 = {}; col_1.x = x; col_1.y = y; col_1.max_width = 0; function col_1:DrawText(context, text, color) local width, height = context:measureText(FONT_ID, text, 0); context:drawText(FONT_ID, text, color or font_color, -1, self.x, self.y, self.x + width, self.y + height, 0); self.y = self.y + height * 1.5; self.max_width = math.max(self.max_width, width); end return col_1; end function round(num, idp) if idp and idp>0 then local mult = 10^idp return math.floor(num * mult + 0.5) / mult end return math.floor(num + 0.5) end -- 4 instruments -- rsi, 1. ma/price, 1. MA / 2. MA, DMI function GetAction (index) local Count=0; --[[ if RSI[index].DATA[RSI[index].DATA:size()-1 ] > 50 then Count=Count+1; elseif RSI[index].DATA[RSI[index].DATA:size()-1 ] < 50 then Count=Count-1; end ]] return Count; end function DrawAnalog(context, _x, _y, caption, index) local fontHeight = context:pointsToPixels(analog_font_size); local counter = {} counter["Buy"] = 0; counter["Neutral"] = 0; counter["Sell"] = 0; counter["-"] = 0; local action = GetAction(index); if action == 1 then counter["Buy"] = counter["Buy"] + 1; elseif action == 0 then counter["Neutral"] = counter["Neutral"] + 1; elseif action == -1 then counter["Sell"] = counter["Sell"] + 1; elseif action == nil then counter["-"] = counter["-"] + 1; end counter["ALL"] = counter["Buy"] + counter["Neutral"] + counter["Sell"]; local direction = 0; local count = 0; local brush = ANALOG_BRUSH_NEUTRAL; local captionResult = captionNeutral; local captionResultColor = analog_color_neutral; if counter["Buy"] ~= counter["Sell"] then if counter["Buy"] > counter["Sell"] then direction = -1 ; count = counter["Buy"]; if count >= counter["ALL"]/2 then brush = ANALOG_BRUSH_FORCE_BUY; captionResult = captionFORCEBUY; captionResultColor = analog_force_color_buy; else brush = ANALOG_BRUSH_BUY; captionResult = captionBUY; captionResultColor = analog_color_buy end else direction = 1; count = counter["Sell"]; if count >= counter["ALL"]/2 then brush = ANALOG_BRUSH_FORCE_SELL; captionResult = captionFORCESELL; captionResultColor = analog_force_color_sell; else brush = ANALOG_BRUSH_SELL; captionResult = captionSELL; captionResultColor = analog_color_sell; end end end local xCell, yCell, xWidth; local x1, y1, x2, y2, x, y; local clockGap = analog_clock_gap; local clockSize = analog_clock_size; local xWidth = clockGap * 2 + clockSize; xCell = _x + clockGap; yCell = _y + clockGap; -- draw clocks x1 = xCell + clockGap; x2 = x1 + clockSize; y1 = yCell + fontHeight; y2 = y1 + clockSize; x = (x1 + x2) / 2; y = (y1 + y2) / 2; --gauge background context:drawArc(4, brush, x1, y1, x2, y2, x, y, x1, y); context:drawEllipse(3, 6, x - clockSize/100, y -clockSize/100, x + clockSize/100, y +clockSize/100); local r = clockSize / 2; local hx, hy, mx, my; for i = 1, 24, 2 do if i <= 6 or i >= 18 then hx, hy = math2d.polarToCartesian(r, toAngle(i, 24)); mx, my = math2d.polarToCartesian(r * 0.85, toAngle(i, 24)); hx = hx + x; hy = hy + y; mx = mx + x; my = my + y; --gauge divisions context:drawLine(2, mx, my, hx, hy); end end mx, my = math2d.polarToCartesian(r * 3 / 4, toAngle(count * direction , count ~= counter["ALL"] and (counter["ALL"]) * 4 or (counter["ALL"] + 1) * 4));--indisize *4 mx = mx + x; my = my + y; --gauge needle context:drawLine(3, x, y, mx, my); context:drawText(FONT_ID, caption, font_color, -1, xCell, _y, xCell + xWidth, _y + context:pointsToPixels(font_size), context.CENTER); context:drawText(ANALOG_FONT_ID, captionNeutral, analog_color_neutral, -1, xCell, yCell - clockSize/20, xCell + xWidth, yCell + fontHeight, context.CENTER); local capX = x - clockSize/4 - string.len(captionBUY) * fontHeight; context:drawText(ANALOG_FONT_ID, captionBUY, analog_color_buy, -1, capX, yCell + clockSize/15, capX + string.len(captionBUY) * fontHeight, yCell + clockSize/15 + fontHeight, context.LEFT); capX = x + clockSize/4; context:drawText(ANALOG_FONT_ID, captionSELL, analog_color_sell, -1, capX, yCell + clockSize/15, capX + string.len(captionBUY) * fontHeight, yCell + clockSize/15 + fontHeight, context.RIGHT); capX = x - clockSize/3 - string.len(captionFORCEBUY) * fontHeight; context:drawText(ANALOG_FONT_ID, captionFORCEBUY, analog_force_color_buy, -1, capX, yCell + clockSize/3, capX + string.len(captionFORCEBUY) * fontHeight, yCell + clockSize/3 + fontHeight, context.LEFT); capX = x + clockSize/3 context:drawText(ANALOG_FONT_ID, captionFORCESELL, analog_force_color_sell, -1, capX, yCell + clockSize/3, capX + string.len(captionFORCESELL) * fontHeight, yCell + clockSize/3 + fontHeight, context.RIGHT); context:drawText(FONT_ID, captionResult, captionResultColor, -1, xCell, yCell + 2*clockSize/3, xCell + xWidth, yCell + 2*clockSize/3 + context:pointsToPixels(font_size), context.CENTER); context:drawText(ANALOG_FONT_ID, counter["Buy"], analog_color_buy, -1, x - clockSize/2, yCell + 4*clockSize/5, x - clockSize/2 + clockSize, yCell + 4*clockSize/5 + fontHeight, context.LEFT); context:drawText(ANALOG_FONT_ID, counter["Neutral"], analog_color_neutral, -1, x - clockSize/2, yCell + 4*clockSize/5, x - clockSize/2 + clockSize, yCell + 4*clockSize/5 + fontHeight, context.CENTER); context:drawText(ANALOG_FONT_ID, counter["Sell"], analog_color_sell, -1, x - clockSize/2, yCell + 4*clockSize/5, x - clockSize/2 + clockSize, yCell + 4*clockSize/5 + fontHeight, context.RIGHT); context:drawText(ANALOG_FONT_ID, captionBUY:lower(), analog_color_buy, -1, x - clockSize/2, yCell + 9*clockSize/10, x - clockSize/2 + clockSize, yCell + 9*clockSize/10 + fontHeight, context.LEFT); context:drawText(ANALOG_FONT_ID, captionNeutral:lower(), analog_color_neutral, -1, x - clockSize/2, yCell + 9*clockSize/10, x - clockSize/2 + clockSize, yCell + 9*clockSize/10 + fontHeight, context.CENTER); context:drawText(ANALOG_FONT_ID, captionSELL:lower(), analog_color_sell, -1, x - clockSize/2, yCell + 9*clockSize/10, x - clockSize/2 + clockSize, yCell + 9*clockSize/10 + fontHeight, context.RIGHT); return x + clockSize/2 + string.len(captionFORCESELL) * fontHeight , y; end function toAngle(value, totalValues) return value / totalValues * 2 * math.pi - math.pi / 2; end function Draw(stage, context) if stage ~= 2 then return; end if not init then context:createFont(FONT_ID, "Arial", 0, context:pointsToPixels(font_size), 0); context:createFont(ANALOG_FONT_ID, "Arial", 0, context:pointsToPixels(analog_font_size), 0); context:createSolidBrush(ANALOG_BRUSH_BUY, analog_color_buy); context:createSolidBrush(ANALOG_BRUSH_SELL, analog_color_sell); context:createSolidBrush(ANALOG_BRUSH_FORCE_BUY, analog_force_color_buy); context:createSolidBrush(ANALOG_BRUSH_FORCE_SELL, analog_force_color_sell); context:createSolidBrush(ANALOG_BRUSH_NEUTRAL, analog_color_neutral); context:createPen(3, context.SOLID, 3, core.rgb(0, 0, 0)); context:createSolidBrush(6, core.rgb(0, 0, 0)); init = true; end local x1, y1, x2, y2; ---x1, y1 = DrawAnalog(context, 50, 20 ,Instrument[1], 1); x1, y1 = DrawAnalog(context, 50, 20 ,"1. Gauge", 1); x2, y2 = DrawAnalog(context, x1, 20, "2. Gauge", 2); x3, y3 = DrawAnalog(context, x2, 20 ,"3. Gauge", 3); x4, y4 = DrawAnalog(context, x3, 20, "4. Gauge", 4); end