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

Thread: OBJ_TRENDBYANGLE | Linha de Tendência Por Ângulo.

  1. #1 Fechar a publicação
    Banned
    Data de afiliação
    Aug 2018
    Postagens
    342
    Obrigado
    91
    Agradecimentos 522 Tempos em 240 Postagens

    OBJ_TRENDBYANGLE | Linha de Tendência Por Ângulo.

    Linha de Tendência Por Ângulo.

    Name:  objtrendbyangle.png
Views: 104
Size:  5.2 KB

    Observação

    Para Linha de Tendência Por Angulo, é possível determinar o modo de continuação da sua exibição para a direita e/ou à esquerda (de acordo com as propriedades OBJPROP_RAY_RIGHT e OBJPROP_RAY_LEFT).

    Tanto ângulo e coordenadas do segundo ponto de ancoragem podem ser usados para definir a inclinação da linha.

    Exemplo

    O script a seguir cria e movimenta a linha de tendência 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 de Tendência Por Ângulo\"."
    #property description "Coordenadas dos pontos de ancoragem são definidos em percentagem do tamanho da"
    #property description "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="Trend"; // Nome da linha
    input int InpDate1=50; // Data do 1º ponto, %
    input int InpPrice1=75; // Preço do 1º ponto, %
    input int InpAngle=0; // Ângulo de inclinação da linha
    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 InpRayLeft=false; // Continuação da Linha para a esquerda
    input bool InpRayRight=true; // Continuação da Linha para a direita
    input bool InpHidden=true; // Ocultar na lista de objeto
    input long InpZOrder=0; // Prioridade para clicar no mouse
    //+------------------------------------------------------------------+
    //| Criar uma linha de tendência por ângulo |
    //+------------------------------------------------------------------+
    bool TrendByAngleCreate(const long chart_ID=0, // ID do gráfico
    const string name="TrendLine", // nome da linha
    const int sub_window=0, // índice da sub-janela
    datetime time=0, // tempo do ponto
    double price=0, // preço do ponto
    const double angle=45.0, // ângulo de inclinaçã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, // destaque para mover
    const bool ray_left=false, // continuação da linha para a esquerda
    const bool ray_right=true, // continuação da linha para a direita
    const bool hidden=true, // ocultar na lista de objetos
    const long z_order=0) // prioridade para clique do mouse
    {
    //--- criar o segundo ponto para facilitar, arrastando a linha de tendência com o mouse
    datetime time2=0;
    double price2=0;
    //--- definir coordenadas de pontos de ancoragem, se eles não estão definidos
    ChangeTrendEmptyPoints(time,price,time2,price2);
    //--- redefine o valor de erro
    ResetLastError();
    //--- criar uma linha de tendência usando dois pontos
    if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,su b_window,time,price,time2,price2))
    {
    Print(__FUNCTION__,
    ": falha ao criar uma linha de tendência! Código de erro = ",GetLastError());
    return(false);
    }
    //--- alterar o ângulo de inclinação da linha de tendência, quando se muda o ângulo, as coordenadas do segundo
    //--- ponto da linha são redefinidos automaticamente de acordo com o novo valor do ângulo
    ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle) ;
    //--- definir cor da linha
    ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
    //--- definir estilo de 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);
    //--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição da linha à esquerda
    ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ra y_left);
    //--- habilitar (true) ou desabilitar (false) o modo de continuação da exibição da linha à direita
    ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,r ay_right);
    //--- 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);
    }
    //+------------------------------------------------------------------+
    //| Alterar ponto de ancoragem das coordenadas da linha de tendência |
    //+------------------------------------------------------------------+
    bool TrendPointChange(const long chart_ID=0, // ID do gráfico
    const string name="TrendLine", // nome da linha
    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 de tendência
    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);
    }
    //+------------------------------------------------------------------+
    //| Mudar o ângulo de inclinação da linha de tendência |
    //+------------------------------------------------------------------+
    bool TrendAngleChange(const long chart_ID=0, // ID do grafico
    const string name="TrendLine", // nome da linha de tendência
    const double angle=45) // inclinação do ângulo da linha de tendência
    {
    //--- redefine o valor de erro
    ResetLastError();
    //--- mudar o ângulo de inclinação da linha de tendência
    if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,an gle))
    {
    Print(__FUNCTION__,
    ": falha ao mudar a inclinação da linha! Código de erro = ",GetLastError());
    return(false);
    }
    //--- sucesso na execução
    return(true);
    }
    //+------------------------------------------------------------------+
    //| Excluir a linha de tendência |
    //+------------------------------------------------------------------+
    bool TrendDelete(const long chart_ID=0, // ID do gráfico
    const string name="TrendLine") // nome da linha
    {
    //--- redefine o valor de erro
    ResetLastError();
    //--- excluir uma linha de tendência
    if(!ObjectDelete(chart_ID,name))
    {
    Print(__FUNCTION__,
    ": falha ao excluir uma linha de tendência! Código de erro = ",GetLastError());
    return(false);
    }
    //--- sucesso na execução
    return(true);
    }
    //+------------------------------------------------------------------+
    //| Verifique os valores de pontos de ancoragem da linha de tendência|
    //| e definir padrões valores padrão para aqueles vazios |
    //+------------------------------------------------------------------+
    void ChangeTrendEmptyPoints(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);
    //--- coordenadas do segundo ponto auxiliar
    //--- o segundo ponto será 9 barras a esquerda e tendo o mesmo preço
    datetime second_point_time[10];
    CopyTime(Symbol(),Period(),time1,10,second_point_t ime);
    time2=second_point_time[0];
    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)
    {
    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 p1=InpPrice1*(accuracy-1)/100;
    //--- criar uma linha de tendência
    if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
    InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRig ht,InpHidden,InpZOrder))
    {
    return;
    }
    //--- redesenhar o gráfico e esperar por um segundo
    ChartRedraw();
    Sleep(1000);
    //--- agora, mover e girar a linha
    //--- contador de loop
    int v_steps=accuracy/2;
    //--- mover o ponto de ancoragem e alterar o ângulo de inclinação da linha
    for(int i=0;i<v_steps;i++)
    {
    //--- usar o seguinte valor
    if(p1>1)
    p1-=1;
    //--- mover o ponto
    if(!TrendPointChange(0,InpName,date[d1],price[p1]))
    return;
    if(!TrendAngleChange(0,InpName,18*(i+1)))
    return;
    //--- verificar se o funcionamento do script foi desativado a força
    if(IsStopped())
    return;
    //--- redesenhar o gráfico
    ChartRedraw();
    }
    //--- 1 segundo de atraso
    Sleep(1000);
    //--- excluir a partir do gráfico
    TrendDelete(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