//--- descrição #property description "Script desenha sinais \"Buy\" na janela do gráfico." //--- janela de exibição dos parâmetros de entrada durante inicialização do script #property script_show_inputs //--- entrada de parâmetros do script input color InpColor=C'3,95,172'; // Cores dos sinais //+------------------------------------------------------------------+ //| Criar sinal Buy | //+------------------------------------------------------------------+ bool ArrowBuyCreate(const long chart_ID=0, // ID de gráfico const string name="ArrowBuy", // nome do sinal const int sub_window=0, // índice da sub-janela datetime time=0, // ponto de ancoragem do tempo double price=0, // ponto de ancoragem do preço const color clr=C'3,95,172', // cor do sinal const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de linha (quando destacada) const int width=1, // tamanho da linha (quando destacada) const bool back=false, // no fundo const bool selection=false, // destaque para mover const bool hidden=true, // ocultar na lista de objetos const long z_order=0) // prioridade para o clique do mouse { //--- definir as coordenadas de pontos de ancoragem, se eles não estão definidos ChangeArrowEmptyPoint(time,price); //--- redefine o valor de erro ResetLastError(); //--- criar o sinal if(!ObjectCreate(chart_ID,name,OBJ_ARROW_BUY,sub_window,time,price)) { Print(__FUNCTION__, ": falha ao criar sinal \"Buy\"! Código de erro = ",GetLastError()); return(false); } //--- definir uma cor de sinal ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- definir um estilo de linha (quando destacado) ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- definir um tamanho de linha (quando destacado) ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- exibir em primeiro plano (false) ou fundo (true) ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- permitir (true) ou desabilitar (false) o modo de movimento do sinal com o mouse ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- definir a prioridade para receber o evento com um clique do mouse no gráfico ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- sucesso na execução return(true); } //+------------------------------------------------------------------+ //| Mover ponto de ancoragem | //+------------------------------------------------------------------+ bool ArrowBuyMove(const long chart_ID=0, // ID do gráfico const string name="ArrowBuy", // nome do objeto datetime time=0, // coordenar o ponto de ancoragem do tempo double price=0) // coordenar o ponto de ancoragem do preço { //--- se a posição do ponto não está definida, mover para a barra atual tendo o preço Bid if(!time) time=TimeCurrent(); if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- redefine o valor de erro ResetLastError(); //--- mover o ponto de ancoragem if(!ObjectMove(chart_ID,name,0,time,price)) { Print(__FUNCTION__, ": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError()); return(false); } //--- sucesso na execução return(true); } //+------------------------------------------------------------------+ //| Excluir sinal Buy | //+------------------------------------------------------------------+ bool ArrowBuyDelete(const long chart_ID=0, // ID do gráfico const string name="ArrowBuy") // nome do sinal { //--- redefine o valor de erro ResetLastError(); //--- excluir o sinal if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": falha ao excluir o sinal \"Buy\"! Código de erro = ",GetLastError()); return(false); } //--- sucesso na execução return(true); } //+------------------------------------------------------------------+ //| Verificar valores de ponto de ancoragem e definir valores padrão | //| para aqueles vazios | //+------------------------------------------------------------------+ void ChangeArrowEmptyPoint(datetime &time,double &price) { //--- se o tempo do ponto não está definido, será na barra atual if(!time) time=TimeCurrent(); //--- se o preço do ponto não está definido, ele terá valor Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); } //+------------------------------------------------------------------+ //| Programa Script da função start (iniciar) | //+------------------------------------------------------------------+ void OnStart() { datetime date[]; // array para armazenar datas das barras visíveis double low[]; // array para armazenar preços Baixos das barras visíveis double high[]; // array para armazenar preços Altos das barras visíveis //--- número de barras visíveis na janela do gráfico int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS); //--- alocação de memória ArrayResize(date,bars); ArrayResize(low,bars); ArrayResize(high,bars); //--- preencher o array das datas ResetLastError(); if(CopyTime(Symbol(),Period(),0,bars,date)==-1) { Print("Falha ao copiar valores de tempo! Código de erro = ",GetLastError()); return; } //--- preencher o array dos preços Baixos if(CopyLow(Symbol(),Period(),0,bars,low)==-1) { Print("Falha ao copiar os valores dos preços Baixos! Código de erro = ",GetLastError()); return; } //--- preencher o array dos preços Altos if(CopyHigh(Symbol(),Period(),0,bars,high)==-1) { Print("Falha ao copiar os valores dos preços Altos! Código de erro = ",GetLastError()); return; } //--- criar sinais Buy de ponto de baixa para cada barra visível for(int i=0;i<bars;i++) { if(!ArrowBuyCreate(0,"ArrowBuy_"+(string)i,0,date[i],low[i],InpColor)) return; //--- verificar se o funcionamento do script foi desativado a força if(IsStopped()) return; //--- redesenhar o gráfico ChartRedraw(); // 0.05 segundos de atraso Sleep(50); } //--- mover sinal Buy de ponto alto para cada barra visível for(int i=0;i<bars;i++) { if(!ArrowBuyMove(0,"ArrowBuy_"+(string)i,date[i],high[i])) return; //--- verificar se o funcionamento do script foi desativado a força if(IsStopped()) return; //--- redesenhar o gráfico ChartRedraw(); // 0.05 segundos de atraso Sleep(50); } //--- excluir sinais Buy for(int i=0;i<bars;i++) { if(!ArrowBuyDelete(0,"ArrowBuy_"+(string)i)) return; //--- redesenhar o gráfico ChartRedraw(); // 0.05 segundos de atraso Sleep(50); } //--- } |