Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 14
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
hay un poco sobre esto aquíhttps://docs.mql4.com/ru/convert/normalizedouble
DoubleToString, IMHO...
Imprime.
hay un poco sobre esto aquíhttps://docs.mql4.com/ru/convert/normalizedouble
No te lo vas a creer, pero originalmente todos los datos estaban normalizados y el digis estaba después de la coma. Sé que incluso los valores dobles deben ser normalizados. Intenta recalcular tú mismo los datos estáticos normalizados, creo que es un error del compilador, pero espero equivocarme, hasta ahora he resuelto este problema con la función MathRound, ¡pero está mal!
No sé lo que es digis, sólo prueba la función DoubleToString(...).
Si haces cálculos con lo que tienes ahora dentro del EA, los cálculos son correctos, incluso conNormalizeDouble(), pero si quieres dar salida a los parámetros fuera, por ejemplo Print, Alert, Comment, entonces usa la normalización a través de DoubleToString(...)
No importa cómo se normalice el número 0,0001, seguirá siendo una fracción periódica infinita en representación binaria porque tiene una división por 5. En un ordenador, esta fracción infinita tiene que ser truncada a una longitud que encaje. Si se divide por ella, se obtiene de nuevo algo muy largo, que también hay que recortar. Para ver "bien" el número resultante en forma decimal, hay que convertirlo en el programa en una cadena con un número adecuado de dígitos fraccionarios. Utilizando, por ejemplo, DoubleToString, como ya se ha escrito aquí.
P.D. "el resultado sale una décima menos de lo que debería" - no había tal cosa, una acusación vana. Por cien millones lo hizo...
¡Hola! ¡Por favor, ayúdenme con el algoritmo!
He escrito un sencillo script que calcula el coeficiente de correlación de Pearson. Las matrices se basan en los precios de cierre, a partir de la primera barra.
La matriz de precios se toma desde la primera barra hasta la 24ª barra.
Ahora quiero calcular la correlación también para 24 barras, pero tomando la matriz de precios de la SEGUNDA(!) barra.
Al no conocer el algoritmo, introduje cada matriz de precios manualmente:
24 barras es un rollo, y si quiero saber la correlación de 100 barras, es un coñazo entrar en cada matriz.
¿Qué hacer, gente?)
Probablemente debería arreglar la raíz cuadrada de la cadena Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w));
Probablemente también deberíamos corregir el cálculo de la raíz cuadrada de la cadena Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w));
Aquí está una función de trabajo para calcular la correlación, sólo tiene que dar las matrices con los precios, y la salida será el 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));
}
Esto es lo que utilizo
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);
}
Esto es lo que utilizo
Los ciclos deben contarse en orden inverso, desdeOrdersTotal()-1 hasta 0.