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

 
SK. писал (а) >>

É isso que eu quero dizer. É preciso levar em conta as restrições existentes, que, de modo geral, mudam o tempo todo.

Existe alguma função que analise todas as restrições possíveis?

O mesmo para modificações.

--

(Tenho 16 funções - 3 para cada boa ordem (OP,SL,TP) e 2 para cada ordem de mercado (SL,TP),

e depois mais algumas funções analisando combinações de licenças).

sim, eu também tenho uma função separada para definir uma ordem verificando todas as limitações possíveis e uma separada (parcialmente semelhante à primeira) para modificações. eu não darei o código - há tanta coisa "deixada" lá que só eu preciso, que - ouch. :-) mas, em geral - é difícil sem isso em verdadeiras negociações de Expert Advisors. :-)

 
Shu писал (а) >>

Sim, eu também tenho uma função separada para estabelecer uma ordem, que verifica todas as limitações possíveis e uma separada (parcialmente semelhante à primeira) para modificação. Eu não lhe darei o código - há tantos truques "deixados", que só eu preciso, que - ouch. :-) mas, em geral - é difícil sem isso em verdadeiras negociações Expert Advisors. :-)

Na verdade, eu queria verificar a mim mesmo - se eu considerei tudo. Se você não verificá-los, pode encontrar uma série de ressaltos (às vezes com a perspectiva de ser banido).

Vou fazer uma breve lista de meus cheques.

1) StopLevel. Por exemplo, ao modificar o SL BuyStop.

Ele não verifica apenas a distância. Você deve analisar a posição atual do StopLevel e a direção do movimento da ordem de parada.

Se o SL estiver fora do corredor do StopLevel, você pode fechá-lo ou movê-lo indefinidamente.

Se o SL estiver dentro do corredor, o movimento para cima é rejeitado. O movimento para baixo é aceito, mas com consideração do StopLevel: se a distância de modificação dentro do corredor de distância é definida em 3 p, e o corredor é de 30 p, então o valor real aceito para execução é definido pelo limite do corredor do StopLevel.

2) FreezeLevel.

3. Razão de StopLevel e TICKSIZE. A ordem pode estar fora de todos os corredores, mas não em múltiplos de TICKSIZE - então é um problema. Ela precisa ser arredondada em direção à direção de modificação. Crítico para a "não-corrente".

4. Muitos. Minlote +/- minlote. Levar em conta que os fechamentos parciais e os contra-encerramentos também são limitados a minlots (embora na minha opinião seja ilógico, mas é assim que as coisas são).

Após cheques pessoais, o pedido é emitido se cada cheque tiver terminado positivamente (sem proibição).

 

Bibliotecas de funções totalmente publicadas:

b-Graphics.rar - trabalho com objetos gráficos.

b-Indicadores.rar - trabalhar com indicadores.

 

A função ArrayLR().

Esta função gera um conjunto de valores de regressão linear. A função aceita os seguintes parâmetros obrigatórios:

  • x é um conjunto de valores de séries numéricas. Este é o parâmetro de entrada. Esta matriz deve conter os valores antes que a função seja chamada.
  • y é um conjunto de valores de regressão linear. Este é o parâmetro de saída, ou seja, a matriz será preenchida após a execução da função.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.05.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    y - массив значений линейной регрессии                                  |
//+----------------------------------------------------------------------------+
void ArrayLR(double& x[], double& y[]) {
  double a, b, c, sx=0, sx2=0, sxy=0, sy=0;
  int    i, n=ArraySize(x);

  if (n>1) {
    for (i=0; i<n; i++) {
      sx+=i+1;
      sy+=x[i];
      sxy+=(i+1)*x[i];
      sx2+=(i+1)*(i+1);
    }
    a=sx*sy-n*sxy;
    c=sx*sx-n*sx2;
    if (c!=0) a=a/c; else a=0;
    b=(sy-a*sx)/n;
    ArrayResize(y, n);
    for (i=0; i<n; i++) y[i]=a*(i+1)+b;
  } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", n);
}
 

Exemplo de utilização da função ArrayLR().

Vamos marcar os níveis de preços da regressão linear para as 30 barras anteriores.

#define r 30
double x[r], y[];
for (int i=0; i<r; i++) x[i]=Close[i+1];
ArrayLR(x, y);
for (i=0; i<r; i++) SetArrow(170, Red, "arr"+i, Time[i+1], y[i]);

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

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

Bibliotecas de funções totalmente publicadas:

b-Graphics.rar - trabalho com objetos gráficos.

b-Indicadores.rar - trabalhar com indicadores.

Muito legal! >> Obrigado!

 
Parabellum писал (а) >>

Igor, há um bom indicador que pode combinar várias velas em uma só. Mas só funciona na tabela horária. É possível torná-lo universal?

Obrigado.

?

 
Parabellum писал (а) >>

?

ooh... desculpe...

Tal indicador já foi escrito, não me lembro por quem e não me lembro onde o vi... Pensei que você mesmo o encontraria ou alguém lhe daria o link...

 

A função ArrayLR() não funciona com precisão.

1. Não leva em conta a localização temporal das barras. Funciona incorretamente quando as barras estão faltando.

2. O algoritmo usado para calcular coeficientes tem uma desvantagem na forma de acumulação de erros de arredondamento, veja "Ajude-me a escrever uma regressão linear" (o final da página Rosh confirma esta armadilha).

3. Proponho um algoritmo sem estes inconvenientes.

4. Se você substituir X[i]=Time[i+1]; por X[i]=i+1; o algoritmo é semelhante, mas sem acumulação de erros.

5. Os bares são pulados não somente nos fins de semana :-(((

Aqui está minha variante

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.09.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии y(x)=A*x+B.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

void Array_LR(double &X[], double& Y[])
{
      double mo_X = 0, mo_Y = 0, var_0 = 0, var_1 = 0;
      int    i,N=ArraySize(X);
      double A,B;
     
      if(N>1)  {
         for ( i = 0; i < N; i ++ ) {
            mo_X +=X[i];
          mo_Y +=Y[i];
      }
      mo_X /=N;
      mo_Y /=N;
        
      for ( i = 0; i < N; i ++ )   {
         var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
         var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
      // значение коэффициента A
      if(var_1!=0)   A = var_0 / var_1; else A=0;
      // значение коэффициента B
      B = mo_Y - A * mo_X;
      ArrayResize(Y, N);
     for (i=0; i<N; i++) Y[i]=A*X[i]+B;
    } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", N);
    
}

aqui está uma foto

Exemplo de trabalho

#define r 280
void start() {
  double X[r], Y[r];
  for (int i=0; i<r; i++)  {
    Y[i]=Close[i+1];
    X[i]=Time[i+1];
  }
   Array_LR(X, Y);
  for (i=0; i<r; i++) {SetArrow(170, Blue, "arr"+i, X[i], Y[i])}

Roteiro de verificação anexado

Arquivos anexados:
 
Prival писал (а) >>
Aqui está minha variante

OK, Sergei! Que haja duas variantes desta função.

Minha variante é boa porque é idêntica ao objeto gráfico embutido OBJ_REGRESSION. Se alguém precisar tirar preços deste objeto, minha função os ajudará, enquanto a sua, infelizmente... Mas poderia ser usado para outra coisa... Obrigado!