Características úteis da KimIV - página 109

 
Aperfeiçoou um pouco a função. Agora ele calcula as interseções sem colisões.
Parâmetros de entrada: |
nm1 - nome da primeira linha |

nm2 - nome da segunda linha

output M é o nível de preço.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

PS. Desculpe ao autor deste tópico por ter postado meu código aqui. Só de pensar, talvez alguém também tenha problemas com travessias...

 
Shuba: Pensei, talvez alguém também tenha lutado com crossovers...

Isso vem à mente (já nos Anais):

Novozar 23.07.2011 12:18
Por favor, diga-me a saída. Eu tenho um indicador chamado Average Directional Movement Index e ele desenha linhas tracejadas. Eu quero pegar linhas cruzadas. Não creio que seja necessário traçar linhas tracejadas.
 
Shuba:

PS. Peço desculpas ao autor deste tópico por ter postado meu código aqui. Pensei que talvez alguém também lutasse com interseções...

Muito bem. Perdoem-no...
 
Shuba:
Eu afinei um pouco a função. Agora ele calcula as interseções sem colisões.
Parâmetros de entrada: |
nm1 - nome da primeira linha |

nm2 - nome da segunda linha

produção M - nível de preço.

PS. Sinto muito ao autor deste tópico por ter postado meu código aqui. Só pensei, talvez alguém também tenha lutado com a travessia.

Bem, talvez esta função deva retornar este mesmo nível de preço (como na variante anterior)! Além disso, há uma variável "T" não declarada em seu código.
 
TarasBY:
Bem, talvez esta função deva retornar este mesmo nível de preço (como na variante anterior)! Além disso, seu código contém uma variável "T" não declarada.

Bem, ele o devolve)

sobre variáveis não declaradas - desculpe. Eu estou corrigido.

duplo M - cruzando o nível de preços. Esta variável é declarada no início.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      double T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

O trailer é um Expert Advisor para ver como a função funciona.

 

Não consegui que fosse carregado imediatamente...

Arquivos anexados:
proba_per_1.mq4  11 kb
 
Shuba:

Não consegui que fosse carregado imediatamente...


Você não deve agitar as águas, IMHO - bombardeie as bibliotecas de funções com descrições aqui e isso é tudo...

Aqueles que precisam dele o encontrarão.

 

A função ClosePosByTakeProfitZone().

Esta função fecha uma posição ao preço de mercado se o preço pisar em vários bares na zona próxima ao TakeProfit ou tentar sair desta zona. A seleção das posições a serem fechadas é especificada usando parâmetros externos:

  • sy - Nome do instrumento. Se definirmos este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa o instrumento atual, enquanto "" (por padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
  • tf - Prazo do gráfico, no qual contar as barras, durante o qual o preço pisca na zona TakeProfit. O valor padrão 0 é o período de tempo atual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.04.2012                                                     |
//|  Описание : Закрытие позиций при нахождении цены в зоне TakeProfit         |
//|             в течение заданного количества баров,                          |
//|             а также при попыте выйти из этой зоны.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
void ClosePosByTakeProfitZone(string sy="", int op=-1, int mn=-1, int tf=0) {
  double pa, pb, po, pp, tp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTakeProfit()>0) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol());
          else {
            if (OrderType()==OP_BUY) {
              RefreshRates();
              pb=MarketInfo(OrderSymbol(), MODE_BID);
              pp=iLow(OrderSymbol(), tf, iLowest(OrderSymbol(), tf, MODE_LOW, TP.ZoneBars, 0));
              tp=OrderTakeProfit()-TP.ZonePoint*po;
              if (pp>tp || (pb<tp && (iHigh(OrderSymbol(), tf, 0)>tp) || (iHigh(OrderSymbol(), tf, 1)>tp))) ClosePosBySelect();
            }
            if (OrderType()==OP_SELL) {
              RefreshRates();
              pa=MarketInfo(OrderSymbol(), MODE_ASK);
              pp=iHigh(OrderSymbol(), tf, iHighest(OrderSymbol(), tf, MODE_HIGH, TP.ZoneBars, 0));
              tp=OrderTakeProfit()+TP.ZonePoint*po;
              if (pp<tp || (pb>tp && (iLow(OrderSymbol(), tf, 0)<tp) || (iLow(OrderSymbol(), tf, 1)<tp))) ClosePosBySelect();
            }
          }
        }
      }
    }
  }
}
Em anexo está um Expert Advisor para testar a função ClosePosByTakeProfitZone(). você pode testá-lo tanto no testador como online.
Arquivos anexados:
 

Boa noite, Igor!

Comecei a estudar suas funções não faz muito tempo, na página 36 eu não entendia bem as funções, por favor, me ajude a entender:


Função GetArrowInterval().


//+
+
//| Retorna o intervalo de ajuste do ponteiro de sinal |
//+
+
int GetArrowInterval() {
int p = Period();

switch (p) {
case 1: return(4);
case 5: return(5); case 15: return(6);
case 30: return(8);
case 60: return(10); case 240: return(20);
case 1440: return(40);
case 10080: return(80);
case 43200: return(150);
} xml-ph-0015@deep

ou seja, esta função foi usada para definir setas usando a função SetArrow(), ou seja, em vez de nível de preço na linha ObjectCreate(nm, OBJ_ARROW, 0, 0,0), diga-me como aconteceu, não está claro para mim o que significam os valores de retorno (4,5,6,8,10....)


A nova versão da função também permanece pouco clara:





//+
+ //| Author : Kim Igor V. aka KimIV,
|
//+
+
//| Version : 12.10.2007 |
//+ +
//| Description : Returns signal pointer interval | //| Parameters: |
///| pr - percentage relative to window price size | //+

retorno((WindowPriceMax()-WindowPriceMin())/100*pr/Ponto);


A função WindowPriceMax() retorna o valor máximo da escala vertical, ou seja, este é o valor máximo do preço, mas em que período?

E obrigado por seu árduo trabalho
))))

 
Lisi4ka330:

Comecei a estudar suas funções não há muito tempo, na página 36 eu não entendia bem as funções, por favor, me ajude a entender:

ou seja, esta função foi usada para definir setas usando a função SetArrow(), ou seja, ao invés do nível de preço na linha ObjectCreate(nm, OBJ_ARROW, 0, 0,0), diga-me como isso foi feito...

Você deve ter entendido mal a finalidade destas funções. Eles não operam com preços e não colocam ícones; eles só retornam a distância em pips, dependendo do período de tempo atual. Por favor, consulte a imagem abaixo.

Se você colocar tal marcador não perto do preço, mas a uma certa distância e, por exemplo, no tempo H1, e depois mudar para M1, provavelmente não verá o marcador. A escala irá mudar e o ícone se moverá para baixo ou para cima. As funções mencionadas foram projetadas para garantir que os ícones estejam sempre visíveis no gráfico a qualquer momento.

Lisi4ka330:

...o que significam os valores de retorno (4,5,6,8,10....)

Distância em pips, dependendo do cronograma atual.


Lisi4ka330:

A função WindowPriceMax() retorna o valor máximo da escala vertical, ou seja, é o valor máximo do preço, mas em que período?

Não por qualquer período... Apenas na janela atual. Por exemplo, na figura abaixo, o preço máximo é 97,35