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

 

A função ArrayInsertDouble()

Insere um elemento de uma matriz com o índice dado. Retorna o número de elementos (tamanho) da nova matriz. A inserção é feita da seguinte forma. Primeiro, o tamanho da matriz é aumentado em um. Então todos os elementos que têm um índice maior ou igual ao a ser inserido são deslocados para o final da matriz um a um, abrindo espaço para o que deve ser inserido. Finalmente, o valor é escrito na célula necessária. A função ArrayInsertDouble() toma os seguintes parâmetros:

  • m - Um conjunto de elementos do tipo duplo.
  • e - Valor do elemento de matriz a ser inserido.
  • i - Índice do elemento da matriz a ser inserido. Se o valor do índice for menor que zero ou maior ou igual ao tamanho da matriz, o elemento será adicionado ao final da matriz. O valor padrão é -1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize( m);

  ArrayResize( m, k+1);
  if ( i>=0 && i< k) {
    for ( j= k; j> i; j--) m[ j]= m[ j-1];
    m[ i]= e;
  } else m[ k]= e;

  return( k+1);
}

SZY. Por favor, encontre em anexo scripts para testar as funções ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString().

ZZZY. Atualizei a biblioteca b-Array em meu site.

 

Igor, já que estamos falando de matrizes, podemos voltar ao meu antigo pedido, sobre a classificação de matrizes ("Funções úteis do KimIV"). O que foi feito anteriormente está um pouco errado, desculpe pelo TOR indefinido.

Preciso ordenar uma matriz bidimensional por uma determinada coluna (linha), análoga à operação no EXCEL. Este procedimento é necessário para usar a estatística do 'Coeficiente de Correlação de Posição do Spearman', em algumas análises de variantes de matrizes de correlação moedas (portfólios).

 

A função BubbleSort2().

Esta função borbulha os elementos de uma matriz bidimensional em uma coluna arbitrária. Você também pode especificar a direção de classificação. A função BubbleSort2() toma os seguintes parâmetros:

  • a - Conjunto bidimensional de elementos. Parâmetro obrigatório.
  • r - Número (índice) da coluna de ordenação (coluna). O valor padrão é 0 - a primeira coluna (coluna com um índice zero).
  • m - Direção de classificação. Valores válidos: MODE_ASCEND - ordem ascendente, MODE_DESCEND - ordem descendente. O valor padrão é MODE_ASCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m= MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange( a, 1);      // Количество колонок
  int    n=ArrayRange( a, 0);      // Количество строк

  if ( r<0) r=0;
  if ( r> k) r= k;

  for ( i= n-1; i>0; i--) {
    for ( j=0; j< i; j++) {
      if ( m== MODE_ASCEND) {
        // по возрастанию
        if ( a[ j][ r]> a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      } else {
        // по убыванию
        if ( a[ j][ r]< a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      }
    }
  }
}
Em anexo está um roteiro para testar a função BubbleSort2().
Arquivos anexados:
 

Função GetTypeLastDeleted().

Esta função retorna o tipo da última ordem eliminada, ou -1. Pode haver situações em que precisamos ligar a lógica de operação da EA ao tipo de ordem recém-apagada. Por exemplo, se você acabou de excluir o BuyStop, você deve fazer isso, mas se BuyLimit, você deve fazer outra coisa, etc. A função GetTypeLastDeleted() aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" - qualquer caráter, NULL - caráter atual. O valor padrão é "".
  • mn - identificador de pedido do usuário (MagicNumber). Valor padrão -1 - qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()== sy || sy=="") && ( mn<0 || OrderMagicNumber()== mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return( r);
}
 
beginner писал(а) >>

Sim, agora este aqui.

#incluir "b-KimIV.mqh" // Biblioteca de funções adicionais

Olá Oleg!

Para uma compilação sem erros da biblioteca b-Positions. mqh, você precisa das funções que já se encontram neste ramo:

  • GetNameOP() - Devolve o nome da operação comercial.
  • GetNameTF() - Retorna o nome do período de tempo.
  • IIFc() - Retorna um de dois valores, dependendo da condição.
  • Mensagem() - Saída de mensagem em comentário e em log.

Portanto, você pode fazer o seguinte:

  1. Crie um arquivo vazio chamado b-kimiv.mqh na mesma pasta, onde você tem b-Positions.mqh
  2. Insira as funções acima e compile b-Positions.mqh.

>> Boa sorte!

 

A função iBarLargest().

Esta função retorna o índice da maior barra ou -1. O tamanho da barra é medido pela função em uma de duas maneiras, determinada pelo tipo de parâmetro de entrada - tipo de itens de busca. Seja apenas o tamanho do corpo ou junto com as sombras. A função iBarLargest() aceita os seguintes parâmetros opcionais:

  • sy - Nome da ferramenta. "" ou NULL - o símbolo atual. O valor padrão é "".
  • tf - Cronograma. O valor padrão é 0 - o período de tempo atual.
  • ty - Tipo de itens de busca. Valores válidos - 0 - Alto-Baixo, 1 - abs(Open-Close).
  • co - Número de itens de séries cronológicas. Valor padrão - 0 - todos os elementos.
  • em - Índice da barra inicial. Valor padrão - 0 - barra de corrente.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( in< 0) in=0;
  if ( co<=0) co=iBars( sy, tf)- in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for ( i= co+ in; i>= in; i--) {
    if ( ty>0) r=MathAbs(iOpen( sy, tf, i)-iClose( sy, tf, i));
    else r=iHigh( sy, tf, i)-iLow( sy, tf, i);
    if ( rb< r) {
      rb= r;
      nb= i;
    }
  }

  return( nb);
}
ZS. Anexado um roteiro para testar a função iBarLargest().
Arquivos anexados:
 

A função iBarOfDayCalc().

Esta função retorna o número de barras calculado desde o início do dia. As barras são numeradas a partir de uma, ou seja, a barra com o menor tempo de abertura em um determinado dia será a número um, a próxima barra será a número dois, etc. Esta função é útil para otimizar os tempos de entrada/saída. Se alguém estiver interessado em detalhes, faça perguntas. Farei o meu melhor para respondê-las. A função iBarOfDayCalc() tem os seguintes parâmetros opcionais:

  • tf - Cronograma. O valor padrão é 0 - o período de tempo atual.
  • dt - Data e hora de abertura do bar. O valor padrão é 0 - hora atual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod( dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor( ms/ tf)+1;        // номер бара от начала суток

  return( bd);
}

SZY. anexo é um roteiro para testar a função iBarOfDayCalc(). A ilustração abaixo mostra como usar o roteiro.

Arquivos anexados:
 

Função iBarOfDayReal().

Esta função retorna o número real da barra desde o início do dia. As barras são numeradas com um, ou seja, a barra com o menor tempo de abertura em determinado dia terá o número um, a próxima barra terá o número dois, etc. Ainda não encontrei nenhum uso prático para esta função. Mas eu o escrevi para tê-lo :-) junto com a função iBarOfDayCalc(). A função iBarOfDayReal() aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento comercial. NULL ou "" - símbolo atual. O valor padrão é "".
  • tf - Cronograma. Valor padrão - 0 - prazo atual.
  • dt - Data e hora de abertura do bar. Valor padrão - 0 - hora atual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay( dt);                       // текущий день месяца
  int nb=iBarShift( sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime( sy, tf, nb))== cd) {
    nb++;
    bd++;
  }

  return( bd);
}

SZY. Eu anexei um roteiro para testar a função iBarOfDayReal(). A ilustração abaixo mostra como usar o roteiro.

Arquivos anexados:
 
KimIV писал(а) >>

A função iBarOfDayReal().

Eu ainda não encontrei uma aplicação prática para esta função.

yyyyy... :)

Estou aqui como uma ferramenta de treinamento, decidi escrever um roteiro que calcula a distância percorrida.

Se alguém sabe que existe um programa que conta quantos quilômetros o mouse percorreu no monitor.

Portanto, aqui, somar as barras de fechamento aberto do dia atual (semana, mês ou ano) ou se você imaginar

outra maneira, como uma linha e uma agulha cosendo um casaco de pele: abrir-fechar-fechar-fechar-fechar-fechar-fechar-fechar-fechar... no decorrer do gráfico.

A mesma coisa, mas no alto-baixo...

*

O engate começou desde os primeiros passos.

Como filtrar as barras do dia atual do gráfico...

Tentarei aplicar suas funções para esta procura.

 

Igor. Boa tarde.

Talvez você possa desenhar uma tarefa simples para você: a tarefa (para mim) é a seguinte:

A tarefa é a seguinte: definir a que preço a linha de sinal atravessará o MACD, ou, em outras palavras, o histograma MACD se tornará igual a zero.

A solução deste problema é necessária, por exemplo, para calcular um preço de parada ou limite de ordem para a próxima barra nos sinais de um sistema comercial que utiliza este indicador,

que mostrará visualmente o nível de preço, no qual o histograma MACD cruzará a linha zero (ou seja, o cruzamento de uma linha sobre o preço - linha no gráfico)

Isto se refere à porcentagem MACD calculada usando a fórmulaMACD= (FastEMA/SlowEMA - 1). Períodos 12, 26, Sinal 9.

Tenho códigos para Omega e Metostock. Não consigo encontrar em nenhum outro lugar como implementá-lo no MT4.

Obrigado