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.

[Excluído]  

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