Como desenhar uma linha de referência a cada 10 Pips

 

Aqui está um roteiro prático que eu uso o tempo todo. Ele desenha referencelinas a cada 10 pips para me ajudar a medir o movimento no mercado. Eu estava realmente frustrado tentando descobrir isso olhando os preços no lado direito da tela, então criei um roteiro. O roteiro poderia ser um bom para os iniciantes praticarem o desenho de objetos.

int start()
{  
    int nLines = 40;                                   // Number of total line to draw
    double lineInterval = 0.0010;                      // Interval between lines
    ObjectsDeleteAll(0,OBJ_HLINE);                     // Clear all the lines from the window - CAREFUL!
    double normPrice = NormalizeDouble(Close[1],3);    // Current price is rounded to nearest "10"
    for (int ix = 0; ix < nLines; ix++)                // Loop span number of times
        {
            ObjectCreate("tensLines"+ix, OBJ_HLINE, 0, 0, normPrice+((ix-(nLines/2))*lineInterval));    // Place half above and half below the current price
            ObjectSet("tensLines"+ix,OBJPROP_COLOR,DarkSlateGray);      // Make the lines look better
        }
    return(0); //All done
}
 
MisterDog:

Aqui está um roteiro prático que eu uso o tempo todo. Ele desenha referencelinas a cada 10 pips para me ajudar a medir o movimento no mercado. Eu estava realmente frustrado tentando descobrir isso olhando os preços no lado direito da tela, então criei um roteiro. O roteiro poderia ser um bom para os iniciantes praticarem o desenho de objetos.

Fazer dele um CI não script, calcular a partir de 0 não a partir de preço próximo, desenhar somente na parte visível do gráfico (WinPriceMax() e sua irmã), atualizá-lo quando o preço ultrapassar o limite (no seu caso, intervalo de linha = 10 pips), usar OBJ_RECTANGLE em vez de OBJ_HLINE.

Ele será sincronizado em todos os gráficos abertos.

:D

 

Ou . . transforme-o em um Indicador . . necessita de um pouco mais de código para que seja atualizado apenas no início de uma nova barra . .

int deinit()
   {
   for (int ix = 0; ix < nLines; ix++) // delete my horizontal lines
      {
      ObjectDelete("tensLines"+ix);
      }
   return(0);
   }


int start()
   {  
   int nLines = 40;                                   // Number of total line to draw
   double lineInterval = 0.0010;                      // Interval between lines
   double normPrice = NormalizeDouble(Close[1],3);    // Current price is rounded to nearest "10"

   for (int ix = 0; ix < nLines; ix++)                // Loop span number of times
      {
      if(ObjectFind("tensLines"+ix) < 0) 
         ObjectCreate("tensLines"+ix, OBJ_HLINE, 0, 0, normPrice+((ix-(nLines/2))*lineInterval));    // Place half above and half below the current price

      else ObjectSet("tensLines"+ix, OBJPROP_PRICE1, normPrice+((ix-(nLines/2))*lineInterval));
      ObjectSet("tensLines"+ix,OBJPROP_COLOR,DarkSlateGray);      // Make the lines look better
      }
   return(0); //All done
   }
 
onewithzachy:

Faça um CI não script, calcule a partir de 0 não a partir de preço próximo, desenhe somente na parte visível do gráfico (WinPriceMax() e sua irmã), atualize-o quando o preço ultrapassar o limite (no seu caso, intervalo de linha = 10 pips), use OBJ_RECTANGLE ao invés de OBJ_HLINE.

Ele será sincronizado em todos os gráficos abertos.

:D


Tudo isso faz sentido exceto a parte "OBJ_RECTANGLE ao invés de OBJ_HLINE". Por que retângulos?
 
RaptorUK:

Ou . . transforme-o em um Indicador . . necessita de um pouco mais de código para que seja atualizado apenas no início de uma nova barra . .


Sim, claro - muito melhor. Diga-me, existe alguma forma de usar uma espécie de "wildcard" para coisas como o ObjectDelete? Eu gostaria de fazer algo assim, ObjectDelete("tensLines "*); em outras palavras, apagar qualquer coisa que comece com "tensLines".
 
MisterDog:

Tudo isso faz sentido exceto a parte "OBJ_RECTANGLE ao invés de OBJ_HLINE". Por que retângulos?

Eu tenho essa coisa de gridy por anos, eu nunca vejo preços no lado direito de qualquer maneira, provavelmente você não gosta de retângulo, use WindowsBarsPerChart() e talvez WindowsFirstVisibleBar().

Veja na parte inferior direita do gráfico, é 25/341. Isso significa que a grade é de 25 pips e a altura do gráfico é de 341 pips.

:D

 
onewithzachy:

Eu tenho essa coisa de gridy por anos, eu nunca vejo preços no lado direito de qualquer maneira, provavelmente você não gosta de retângulo, use WindowsBarsPerChart() e talvez WindowsFirstVisibleBar().

Veja na parte inferior direita do gráfico, é 25/341. Isso significa que a grade é de 25 pips e a altura do gráfico é de 341 pips.

:D

Na verdade, gosto da maneira como você tem isso disposto com as barras. É fácil para os olhos. Você diz: "você nunca vê preços no lado certo de qualquer maneira". Muitas vezes me perguntei por que com apenas duas opções, comprar ou vender, tenho 50% de chances, mas estou errado 80% do tempo. ;-)
 
MisterDog:
Eu realmente gosto da maneira como você tem isso disposto com as barras. É fácil para os olhos. Você diz: "você nunca vê preços no lado certo de qualquer maneira". Muitas vezes me perguntei por que com apenas duas opções, comprar ou vender, tenho 50% de chances, mas estou errado 80% do tempo. ;-)

O mesmo aqui ...

:D

 
MisterDog:
Na verdade, gosto da maneira como você tem isso disposto com as barras. É fácil para os olhos. Você diz: "você nunca vê preços no lado certo de qualquer maneira". Muitas vezes me perguntei por que com apenas duas opções, comprar ou vender, tenho 50% de chances, mas estou errado 80% do tempo. ;-)

Isso é muito fácil de responder . . . assumindo que o que vi nos testes EAs seja verdade. Se você tiver um risco de 20 e uma recompensa de 80 (ou proporção semelhante), posso ver como você pode ter uma taxa de ganho de 20%. . não é tão simples assim porque você tem que levar em conta o Spread se estiver fazendo pequenos negócios ...
 
comzachy, estou apenas começando a montar seugráfico de estilo OBJ_RECTANGLE. Você mencionou "WindowsBarsPerChart() e talvez WindowsFirstVisibleBar()". Ainda estou tendo dificuldades para descobrir como fazer as barras funcionarem do lado esquerdo da tela para o lado direito. Mas eu gosto do layout! Alguma pista de como fazer isso?
 
MisterDog:
urantezachy, estou apenas começando a montar seugráfico de estilo OBJ_RECTANGLE. Você mencionou "WindowsBarsPerChart() e talvez WindowsFirstVisibleBar()". Ainda estou tendo dificuldades para descobrir como fazer as barras funcionarem do lado esquerdo da tela para o lado direito. Mas eu gosto do layout! Alguma pista de como fazer isso?

Olá MisterDog,

Simples.

1. Obter a distância temporal entre uma barra e outra. Podemos conseguir isto subtraindo o tempo atual da barra com o tempo da barra anterior ou multiplicando o período com 60 segundos, escolha esta última, pois há uma lacuna de tempo na segunda-feira.

datetime Bar_Time_Gap; // or integer type

Bar_Time_Gap = Time [0] - Time [1]; // or Time [7] - Time [8] or whatever
Bar_Time_Gap = Period()*60;

2. WindowsFirstVisibleBar() é a barra muito à esquerda. Comece desenhando a partir dessa barra, ou melhor ainda comece desenhando a partir de n esquerda dessa barra, digamos 5 barras para a esquerda. Digamos que o retorno da WindowsFirstVisibleBar() é 20. Isso significa que a barra muito à esquerda é a barra [20], comece a desenhar a partir da barra [25] então. Na verdade, eu desenho a partir de [Barras - 1].

datetime Start;

Start = Time [WindowFirstVisibleBar() + 5];                  //which is the same ...
Start = Time [WindowFirstVisibleBar()] - 5 * Bar_Time_Gap;   //... with this one

3. WindowsBarsPerChart() é o número de barras no gráfico . Digamos que o retorno deWindowsBarsPerChart() é 35 e WindowsFirstVisibleBar() é 20. Assim, a partir da barra [0] há cerca de 15 barras de espaço vazio no lado direito. Desenhe o final desse retângulo até a barra bem direita desse espaço vazio, ou melhor ainda comece a desenhar a partir de n direita dessa barra digamos 5 barras para a direita.

datetime End;
int Right_Bar = WindowBarsPerChart() - WindowFirstVisibleBar() + 5;

End = Time[0] + Right_Bar * Bar_Time_Gap;

Quando uma nova barra estiver chegando, esta barra direita estará se movendo para a esquerda, então o final do retângulo será visível, e temos que desenhar isso novamente.

Espero não estar cometendo um erro aqui, pois escrevi este rápido.

:D