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

 

Exemplos de como usar GetNearestDownFractal().

  • O nível de preço do fractal ascendente mais próximo no gráfico atual. A fórmula fractal é 2-2 (padrão).
    Message(GetNearestUpFractal());
  • O nível de preço do fractal superior mais próximo no gráfico USDJPY H1. A fórmula do fractal 5-2.
    Message(GetNearestUpFractal("USDJPY", PERIOD_H1, 5));
  • Traçar uma linha horizontal através do nível de preço do fractal superior 4-3 mais próximo no gráfico atual.
    double p=GetNearestUpFractal(NULL, 0, 4, 3);
    SetHLine(Red, "", p);

SZY. Em anexo está um roteiro para testar a função GetNearestUpFractal().

Arquivos anexados:
 

Função CorrectTF().

Escrevi esta função depois de descobrir que às vezes posso facilmente especificar um prazo incorreto, que é igual a um número inteiro de minutos, nos parâmetros de entrada de um indicador ou de um EA. Por exemplo, eu inscrevi 50 por hora em vez de 60. Bem... meio que falhou. Acontece que a função iRSI() retorna zero por um período de tempo incorreto. Eu não posso dizer nada sobre outras funções, porque não as verifiquei. Para evitar mal-entendidos resultantes de meus próprios erros desatentos, escrevi esta função como uma função primitiva à prova de tolices. Ele ajusta o parâmetro de entrada para o período de tempo "mais próximo" apropriado e correto e retorna seu valor.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  if (TimeFrame< PERIOD_M5                         ) return(PERIOD_M1);
  if (TimeFrame>=PERIOD_M5  && TimeFrame<PERIOD_M15) return(PERIOD_M5);
  if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
  if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
  if (TimeFrame>=PERIOD_H1  && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
  if (TimeFrame>=PERIOD_H4  && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
  if (TimeFrame>=PERIOD_D1  && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
  if (TimeFrame>=PERIOD_W1  && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
  if (TimeFrame>=PERIOD_MN1                        ) return(PERIOD_MN1);
}
SZY. Em anexo está um roteiro para testar a função CorrectTF().
Arquivos anexados:
 

A função DateBeginQuarter().

Esta função retorna a data de início do trimestre por seu número. Por exemplo, se for agora 27.08.2008, a data de início do trimestre atual será 01.07.2008. A função leva apenas um parâmetro - o número do trimestre relativo ao trimestre atual. Por exemplo, 0 é o trimestre atual, 1 é o trimestre seguinte e -1 é o trimestre anterior. Ou seja, números positivos de trimestre solicitarão datas do futuro, enquanto zero e negativos solicitarão datas do passado. O valor retornado é o número de segundos decorridos desde 00:00 de 1 de janeiro de 1970.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter(int nq=0) {
  int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);
  int mo=Month()-MathMod(Month()+2, 3)+3*nq;
  if (mo<1) {
    mo+=12;
    ye--;
  }
  if (mo>12) {
    mo-=12;
    ye++;
  }

  return(StrToTime(ye+"."+mo+".01"));
}

P.S. Em anexo está um roteiro para testar a função DateBeginQuarter().

Arquivos anexados:
 

A função DateOfMonday().

Esta função retorna a data de início da semana (segunda-feira) por seu número. Por exemplo, se for agora 29.08.2008, a data de início da semana atual será 25.08.2008. A função leva apenas um parâmetro - o número de semanas em relação à semana atual. Por exemplo, 0 é a semana atual, 1 é a próxima semana e -1 é a semana anterior. Ou seja, números positivos da semana solicitarão datas do futuro, enquanto números zero e números negativos solicitarão datas do passado. O valor retornado é o número de segundos decorridos desde 00:00 de 1 de janeiro de 1970.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int nn=0) {
  datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

  while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
  dt+=nn*7*24*60*60;

  return (dt);
}

P.S. Em anexo está um roteiro para testar a função DateOfMonday().

Arquivos anexados:
 

A função Fibonacci().

Esta função retorna um elemento de uma série Fibonacci por seu número seqüencial.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci(int n) {
  int a=0, b=0, i=1, s=0;

  if (n==1) s=1;
  if (n>1) {
    s=1;
    while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
  return(s);
}

P.S. Em anexo está um roteiro para testar Fibonacci().

Arquivos anexados:
 

Função GetNameMA().

Esta função retorna o nome do método MA (Moving Averages) por seu identificador. Esta função é conveniente para ser usada em comentários, indicadores e mensagens de Expert Advisors.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA(int mm) {
  switch (mm) {
    case MODE_SMA : return("SMA");
    case MODE_EMA : return("EMA");
    case MODE_SMMA: return("SMMA");
    case MODE_LWMA: return("LWMA");
    default       : return("Unknown Method");
  }
}
 
KimIV писал (а) >>

Função GetNameMA().

Esta função retorna o nome do método MA (Moving Averages) por seu identificador. Esta função é útil em comentários, indicadores e Expert Advisors.

Não pense nisto como um "nitpicking" ....

default       : return("Unknown Method");

É que, para ser consistente, você tem que ir até o fim.
 
TheXpert писал (а) >>

Não pense nisto como uma escolha de....

por todos os meios... obrigado! Corrigido!

 
KimIV

Boa tarde!

Ajude-me a atravessar a expo apenas um pouco.

Não posso acreditar que ele esteja abrindo ordens e não fechando esta pilha em condição.

Ou seja, se um acordo for apenas um, ele sairá da pose e se houver 2 acordos, ele se desliga.

Arquivos anexados:
panzer.mq4  5 kb
 

Função GetPriceDiffInPoint().

Esta função retorna a diferença de preço entre duas barras, que são especificadas por seus números. O objetivo de desenvolver esta função era determinar o valor e a direção do movimento de preços. A função GetPriceDiffInPoint() determina os pontos de referência (Aberto ou Alto ou Baixo ou Fechado) das barras a serem levados em conta. A função aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. Valor padrão 0 - símbolo atual.
  • n2 - Número de barra esquerda. Valor padrão - 2.
  • n1 - Número de barras à direita. Valor padrão - 1.

Valor devolvido:

  • positivo - houve um aumento da taxa entre as barras N2 e N1.
  • Negativo - houve uma diminuição entre as barras N2 e N1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  int    d=MarketInfo(sy, MODE_DIGITS);
  int    dd=0, k=iBars(sy, tf);

  if (n1>k || n2>k)
    Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
  else {
    if (n1>0 && n2>0) {
      int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
      int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

      if (MathAbs(d1)>MathAbs(d2)) dd=d1;
      if (MathAbs(d1)<MathAbs(d2)) dd=d2;
      if (MathAbs(d1)==MathAbs(d2)) {
        if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

  return(dd);
}