photo
+ Responder ao Tópico
Resultados de 1 a 1 de 1

Thread: OBJ_ARROWED_LINE | Linha de seta.

  1. #1 Fechar a publicação
    Banned
    Data de afiliação
    Aug 2018
    Postagens
    343
    Obrigado
    91
    Agradecimentos 206 Tempos em 138 Postagens

    OBJ_ARROWED_LINE | Linha de seta.

    Linha de seta.

    Name:  objarrowedline.png
Views: 54
Size:  3.9 KB

    Exemplo:

    O seguinte script cria e move uma linha de seta no gráfico. Funções especiais têm sido desenvolvidas para criar e alterar as propriedades do objeto gráfico. Você pode utilizar estas funções "as is" em seus próprios aplicativos.

    //--- descrição
    #property description "Script desenha objeto gráfico \" linha Arrowed\"."
    #property description "Coordenadas de ponto de ancoragem são definidas em porcentagem de"
    #property description "tamanho da 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 string InpName="ArrowedLine"; // Nome da linha
    input int InpDate1=35; // Data do 1º ponto, %
    input int InpPrice1=60; // Preço do 1º ponto, %
    input int InpDate2=65; // Data do 2º ponto, %
    input int InpPrice2=40; // Preço do 2º ponto, %
    input color InpColor=clrRed; // Cor da linha
    input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Estilo da linha
    input int InpWidth=2; // Largura da linha
    input bool InpBack=false; // Linha de fundo
    input bool InpSelection=true; // Destaque para mover
    input bool InpHidden=true; // Ocultar na lista de objeto
    input long InpZOrder=0; // Prioridade para clicar no mouse
    //+------------------------------------------------------------------+
    //| Criar uma linha de setas pelas coordenadas determinadas |
    //+------------------------------------------------------------------+
    bool ArrowedLineCreate(const long chart_ID=0, // ID do gráfico
    const string name="ArrowedLine", // nome da linha
    const int sub_window=0, // índice da sub-janela
    datetime time1=0, // primeiro ponto de tempo
    double price1=0, // primeiro ponto de preço
    datetime time2=0, // segundo ponto de tempo
    double price2=0, // segundo ponto de preço
    const color clr=clrRed, // cor da linha
    const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo da linha
    const int width=1, // largura da linha
    const bool back=false, // no fundo
    const bool selection=true, // destacar para mover
    const bool hidden=true, // ocultar na lista de objeto
    const long z_order=0) // prioridade para clicar no mouse
    {
    //--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
    ChangeArrowedLineEmptyPoints(time1,price1,time2,pr ice2);
    //--- redefine o valor de erro
    ResetLastError();
    //--- criar uma linha de setas pelas coordenadas determinadas
    if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,su b_window,time1,price1,time2,price2))
    {
    Print(__FUNCTION__,
    ": falha ao criar uma linha de seta! Código de erro = ",GetLastError());
    return(false);
    }
    //--- definir cor da linha
    ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
    //--- definir o estilo de exibição da linha
    ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style );
    //--- definir a largura da linha
    ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width );
    //--- exibir em primeiro plano (false) ou fundo (true)
    ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
    //--- habilitar (true) ou desabilitar (false) o modo do movimento da seta com o mouse
    //--- ao criar um objeto gráfico usando a função ObjectCreate, o objeto não pode ser
    //--- destacado e movimentado por padrão. Dentro deste método, o parâmetro de seleção
    //--- é verdade por padrão, tornando possível destacar e mover o objeto
    ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE, selection);
    ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,se lection);
    //--- ocultar (true) ou exibir (false) o nome do objeto gráfico na lista de objeto
    ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidd en);
    //--- definir a prioridade para receber o evento com um clique do mouse no gráfico
    ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_or der);
    //--- sucesso na execução
    return(true);
    }
    //+------------------------------------------------------------------+
    //| Mover o ponto de ancoragem da linha de seta |
    //+------------------------------------------------------------------+
    bool ArrowedLinePointChange(const long chart_ID=0, // ID do gráfico
    const string name="ArrowedLine", // nome da linha
    const int point_index=0, // índice do ponto de ancoragem
    datetime time=0, // coordenada do ponto de ancoragem de tempo
    double price=0) // coordenada do ponto de ancoragem de 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 ponto de ancoragem da linha
    if(!ObjectMove(chart_ID,name,point_index,time,pric e))
    {
    Print(__FUNCTION__,
    ": falha ao mover o ponto de ancoragem! Código de erro = ",GetLastError());
    return(false);
    }
    //--- sucesso na execução
    return(true);
    }
    //+------------------------------------------------------------------+
    //| A função remove a linha de setas a partir do gráfico |
    //+------------------------------------------------------------------+
    bool ArrowedLineDelete(const long chart_ID=0, // ID do gráfico
    const string name="ArrowedLine") // nome da linha
    {
    //--- redefine o valor de erro
    ResetLastError();
    //--- deletar uma linha de seta
    if(!ObjectDelete(chart_ID,name))
    {
    Print(__FUNCTION__,
    ": falha ao criar uma linha de seta! Código de erro = ",GetLastError());
    return(false);
    }
    //--- sucesso na execução
    return(true);
    }
    //+------------------------------------------------------------------+
    //| Conferir valores dos pontos de ancoragem e definir valores padrão|
    //| para aqueles vazios |
    //+------------------------------------------------------------------+
    void ChangeArrowedLineEmptyPoints(datetime &time1,double &price1,
    datetime &time2,double &price2)
    {
    //--- se o tempo do primeiro ponto não está definido, será na barra atual
    if(!time1)
    time1=TimeCurrent();
    //--- se o preço do primeiro ponto não está definido, ele terá valor Bid
    if(!price1)
    price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
    //--- se o tempo do segundo ponto não está definido, está localizado a 9 barras deixadas a partir da segunda
    if(!time2)
    {
    //--- array para receber o tempo de abertura das últimos 10 barras
    datetime temp[10];
    CopyTime(Symbol(),Period(),time1,10,temp);
    //--- definir o segundo ponto 9 barras a esquerda do primeiro
    time2=temp[0];
    }
    //--- se o preço do segundo ponto não está definido, é igual ao primeiro ponto
    if(!price2)
    price2=price1;
    }
    //+------------------------------------------------------------------+
    //| Programa Script da função start (iniciar) |
    //+------------------------------------------------------------------+
    void OnStart()
    {
    //--- verificar a exatidão dos parâmetros de entrada
    if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
    InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
    {
    Print("Erro! Valores incorretos dos parâmetros de entrada!");
    return;
    }
    //--- número de barras visíveis na janela do gráfico
    int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
    //--- tamanho do array de preço
    int accuracy=1000;
    //--- arrays para armazenar data e valores de preço para serem usados
    //--- para definir e alterar as coordenadas de pontos de ancoragem da linha
    datetime date[];
    double price[];
    //--- alocação de memória
    ArrayResize(date,bars);
    ArrayResize(price,accuracy);
    //--- 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 de preços
    //--- encontrar os maiores e menores valores do gráfico
    double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
    double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
    //--- definir uma etapa de mudança de um preço e preencher o array
    double step=(max_price-min_price)/accuracy;
    for(int i=0;i<accuracy;i++)
    price[i]=min_price+i*step;
    //--- definir os pontos para desenhar a linha
    int d1=InpDate1*(bars-1)/100;
    int d2=InpDate2*(bars-1)/100;
    int p1=InpPrice1*(accuracy-1)/100;
    int p2=InpPrice2*(accuracy-1)/100;
    //--- criar uma linha de seta
    if(!ArrowedLineCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
    InpColor,InpStyle,InpWidth,InpBack,InpSelection,In pHidden,InpZOrder))
    {
    return;
    }
    //--- redesenhar o gráfico e esperar por um segundo
    ChartRedraw();
    Sleep(1000);
    //--- agora, mover os pontos de ancoragem da linha
    //--- contador de loop
    int v_steps=accuracy/5;
    //--- mover o segundo ponto de ancoragem vertical
    for(int i=0;i<v_steps;i++)
    {
    //--- usar o seguinte valor
    if(p2<accuracy-1)
    p2+=1;
    //--- mover o ponto
    if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
    return;
    //--- verificar se o funcionamento do script foi desativado a força
    if(IsStopped())
    return;
    //--- redesenhar o gráfico
    ChartRedraw();
    }
    //--- mover o primeiro ponto de ancoragem vertical
    for(int i=0;i<v_steps;i++)
    {
    //--- usar o seguinte valor
    if(p1>1)
    p1-=1;
    //--- mover o ponto
    if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
    return;
    //--- verificar se o funcionamento do script foi desativado a força
    if(IsStopped())
    return;
    //--- redesenhar o gráfico
    ChartRedraw();
    }
    //--- meio segundo de atraso
    Sleep(500);
    //--- contador de loop
    int h_steps=bars/2;
    //--- mover ambos os pontos de ancoragem na horizontal, ao mesmo tempo
    for(int i=0;i<h_steps;i++)
    {
    //--- usar os seguintes valores
    if(d1<bars-1)
    d1+=1;
    if(d2>1)
    d2-=1;
    //--- deslocar os pontos
    if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
    return;
    if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
    return;
    //--- verificar se o funcionamento do script foi desativado a força
    if(IsStopped())
    return;
    //--- redesenhar o gráfico
    ChartRedraw();
    // 0.03 segundos de atraso
    Sleep(30);
    }
    //--- 1 segundo de atraso
    Sleep(1000);
    //--- deletar uma linha de seta
    ArrowedLineDelete(0,InpName);
    ChartRedraw();
    //--- 1 segundo de atraso
    Sleep(1000);
    //---
    }

    Though trading on financial markets involves high risk, it can still generate extra income in case you apply the right approach. By choosing a reliable broker such as InstaForex you get access to the international financial markets and open your way towards financial independence. You can sign up here.


  2. The Following User Says Thank You to forumforex For This Useful Post:

    Não registrado (1 )

+ Responder ao Tópico

Permissões de postagens

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts