Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 14
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
há um pouco sobre isso aquihttps://docs.mql4.com/ru/convert/normalizedouble
DoubleToString, IMHO...
Imprimir.
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 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(...)
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...
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)));
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:
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));
}
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);
}
Aqui está o que eu uso
Os ciclos devem ser contados em ordem inversa, deOrderTotal()-1 a 0.