Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 14

 
Andrey F. Zelinsky:
há um pouco sobre isso aquihttps://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

Imprimir.

 
Andrey F. Zelinsky:
há um pouco sobre isso aquihttps://docs.mql4.com/ru/convert/normalizedouble
Você não vai acreditar, mas originalmente todos os dados foram normalizados, e houve um digis após a vírgula. Sei que mesmo os valores duplos têm que ser normalizados. Tente recalcular você mesmo os dados estáticos normalizados, acho que é um erro de compilação, mas espero estar errado, até agora resolvi-o com MathRound, mas está errado!
 
arhipov-76:
Você não vai acreditar, mas originalmente todos os dados foram normalizados e o digis estava após a vírgula. Eu sei que até mesmo valores duplos devem ser normalizados. Tente recalcular você mesmo dados estáticos normalizados, acho que é um erro de compilação, mas espero estar errado, até agora resolvi este problema com a função MathRound, mas está errado!

Não sei o que é digis, basta tentar a função DoubleToString(...).

Se você fizer cálculos com o que você tem agora dentro da EA, os cálculos estão corretos, mesmo comNormalizeDouble(), mas se você quiser emitir parâmetros fora, por exemplo Imprimir, Alertar, Comentar, então use a normalização através do DoubleToString(...)

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

Não importa como você normalize o número 0,0001, ele permanecerá uma fração periódica infinita em representação binária, pois tem uma divisão por 5. Em um computador, esta fração infinita tem que ser truncada a um comprimento que se encaixe. Dividir por ela resulta em algo muito longo novamente, que também tem que ser aparado. Para obter uma visão "boa" do número resultante na forma decimal, você precisa convertê-lo no programa em uma cadeia com um determinado número adequado de dígitos fracionários. Usando, por exemplo, o DoubleToString, como já foi escrito aqui.

P.S. " o resultado resulta um décimo a menos do que deveria ser" - não havia tal coisa, uma acusação vã. Por um centésimo de milhão fez...

 
Timur1988:

Olá! Por favor, me ajude com o algoritmo!
Escrevi um roteiro simples, que calcula o coeficiente de correlação de Pearson. As matrizes são baseadas em preços de fechamento, a partir da primeira barra.

A tabela de preços é levada da primeira barra até a 24ª barra.
Agora eu quero calcular a correlação também para 24 barras, mas pegue a matriz de preços da SEGUNDA(!) barra.

Sem conhecer o algoritmo, entrei em cada tabela de preços manualmente:

24 barras é uma chatice, e se eu quiser saber a correlação para 100 barras, é uma chatice entrar em cada matriz.
O que fazer, pessoal?)

Eu provavelmente deveria fixar a raiz quadrada da corda Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)));

 
Vladimir:

Provavelmente também deveríamos corrigir a raiz quadrada do cálculo da string Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)));

Aqui está uma função de trabalho para calcular a correlação, basta dar as matrizes com os preços, e a produção será o valor:

string Correlation1(double& CurOpen[], double& SubOpen[]) {
double sumXY2=0, sumX2=0, sumY2=0, sumXs2=0, sumYs2=0, res2=1;

int k=MathMin(ArraySize(CurOpen), ArraySize(SubOpen));
  if(k>2) {
   for(int i=0; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
  return(DoubleToStr(res2,2));
}
 
Olá! eu coloquei meu robô em uma conta demo e ele está funcionando há um segundo mês. Hoje eu abro o terminal, dois pedidos foram feitos por um sinal, embora um pedido já tenha sido feito antes. Eu tenho uma restrição no número de pedidos. Qual pode ser a razão?
 

Aqui está o que eu uso

Вот что я использую

if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Buy<Low[1]&& sar>Close[1])
{SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);}
if(ExistPositions(Symb)==false&&ExistOrders(Symb)==false&&Delta_Sell>High[1] && sar<Close[1])
{SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//--------------------------------------------------------------------------------//


bool ExistPositions(string sy="", int op=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symb;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if ( OrderMagicNumber()==Magik_number) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Neron_76:

Aqui está o que eu uso

Os ciclos precisam ser contados em ordem inversa, deOrderTotal()-1 a 0.
 
Vitalie Postolache:
Os ciclos devem ser contados em ordem inversa, deOrderTotal()-1 a 0.
Obrigado, vou ter que refazê-lo.