Esta classe foi projetada para criar botões interativos com vários estados no gráfico de preços.
Ela foi desenvolvida para uma competição organizada pela generosa TheXpert. Somos gratos.

Uma demonstação da classe CBtn
Métodos de classe
Create(long chart_id,int sub_wnd,string name,int x,int y,int dx,int dy) - cria um botão com parâmetros:
Resources(string img_up,string img_up_active="",string img_dn="",string img_dn_active="",string img_up_disable="",string img_dn_disable="",string img_mask="") - define as imagens para diferentes estados do botão:
SetUseMask(ENUM_USEMASK mask,int x=0,int y=0) - ajusta a máscara pela cor do pixel específico; a máscara é formada a partir da imagem padrão do botão sem pressão:
SetUseMask(ENUM_USEMASK mask,uint acolor) -define a máscara pela cor; a máscara é formada a partir da imagem padrão do botão sem pressão:
SetCorner(ENUM_BASE_CORNER corner) - define o canto do gráfico onde o botão ficará ancorado
SetAnchor(ENUM_ANCHOR_POINT anchor) - define o tipo de âncora
SetX(int x) - define a coordenada X
SetY(int y) - define a coordenada Y
SetXY(int x,int y) - método único de configuração das coordenadas X e Y
On(bool state) - define o estado do botão ("true" para pressionado, "false" para sem pressão)
Enable(bool state) - habilitar/desabilitar o botão
Paint(void) - desenhar o botão
Event(int id,long lparam,double dparam,string sparam) - os eventos são transmtidos pelo botão, todos os eventos são duplicados pela função OnChartEvent
GetX(void) - obtem a coordenada X
GetY(void) - obtem a coordenada Y
GetEnable(void) - obtem o estado habilitado/desabilitado
GetOn(void) - obtem o estado pressionado/ sem pressão
GetCorner(void) - obtem o canto do gráfico onde o botão ficará ancorado
GetAnchor(void) - obtem o tipo de âncora
AddText(int x,int y,string font_name,int font_size,color text_color,string text) - adiciona texto para o botão
Text(string text) - atualiza o texto do botão (não funciona sem chamar AddText(...) )
Criando um botão
Por padrão, o botão criado tem os seguintes parâmetros:
Configurando a máscara do botão
Por padrão, o botão é criado como normal sem pressão. Pixels transparentes servem como um máscara.
Exemplo
//+------------------------------------------------------------------+ //| 3dButtons.mq5 | //| Copyright 2015, fyords | //| https://login.mql5.com/ru/users/fyords | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, fyords" #property link "https://www.mql5.com/en/users/fyords" #property version "1.01" //+------------------------------------------------------------------+ //| Insert resources | //+------------------------------------------------------------------+ #resource "img\\200_1.bmp" #resource "img\\200_2.bmp" #resource "img\\200_3.bmp" #resource "img\\200_4.bmp" #resource "img\\200_5.bmp" #resource "img\\200_6.bmp" //+------------------------------------------------------------------+ #include "Class.mqh" //+------------------------------------------------------------------+ enum Adjust { UpperLeft, UpperRight, LowerLeft, LowerRight }; //+------------------------------------------------------------------+ //| Input property | //+------------------------------------------------------------------+ input Adjust adj_corner=UpperLeft; //Corner //+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ CBtn *btn[]; int num_buttons; //+------------------------------------------------------------------+ //| Initialization function | //+------------------------------------------------------------------+ int OnInit() { long wnd=ChartID(); int sub_wnd=ChartWindowOnDropped(); ArrayFree(btn); int n=0; num_buttons=0; for(int y=0;y<3;y++) { for(int x=0;x<3;x++) { ArrayResize(btn,n+1); btn[n]=new CBtn; btn[n].Create(wnd,sub_wnd,"3dButtons_"+(string)MathRand(),x*152+10,y*152+10,200,200); btn[n].Resources("img\\200_1.bmp","img\\200_2.bmp","img\\200_3.bmp","img\\200_4.bmp","img\\200_5.bmp","img\\200_6.bmp"); btn[n].AddText(80,80,"Arial",25,clrWhite,"Button"+(string)(n+1)); switch(adj_corner) { case UpperLeft: btn[n].SetAnchor(ANCHOR_LEFT_UPPER); btn[n].SetCorner(CORNER_LEFT_UPPER); break; case UpperRight: btn[n].SetAnchor(ANCHOR_RIGHT_UPPER); btn[n].SetCorner(CORNER_RIGHT_UPPER); break; case LowerLeft: btn[n].SetAnchor(ANCHOR_LEFT_LOWER); btn[n].SetCorner(CORNER_LEFT_LOWER); break; case LowerRight: btn[n].SetAnchor(ANCHOR_RIGHT_LOWER); btn[n].SetCorner(CORNER_RIGHT_LOWER); break; } btn[n].Paint(); n++; } } ChartRedraw(); num_buttons=ArraySize(btn); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { for(int i=0;i<num_buttons;i++) delete btn[i]; ArrayFree(btn); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { for(int i=0;i<num_buttons;i++) btn[i].Event(id,lparam,dparam,sparam); }
Traduzido do russo pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/ru/code/12637
Candle Time End and Spread
O indicador mostra conjuntamente o spread em andamento e o tempo que falta para fechar a barra (candlestick).
AFL_Winner_Signal
O indicador AFL_Winner_Signal mostra informação da tendência atual e sinais baseados no indicador AFL_Winner indicator.
Class СBmpButtonTransparent
Uma classe para um botão transparente.
Risk Manager
O Expert Advisor controla e limita a perda global para a conta e a perda para cada transação, Inclue um Trailing Stop para a conta.