Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 14

 
Andrey F. Zelinsky:
hay un poco sobre esto aquíhttps://docs.mql4.com/ru/convert/normalizedouble

DoubleToString, IMHO...

Imprime.

 
Andrey F. Zelinsky:
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 había un digis después de la coma. Sé que incluso los valores dobles tienen que ser normalizados. Intenta recalcular tú mismo los datos estáticos normalizados, creo que es un error del compilador, pero espero equivocarme, de momento lo he solucionado con MathRound, pero está mal.
 
arhipov-76:
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(...)

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

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...

 
Timur1988:

¡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));

 
Vladimir:

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:

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));
}
 
Hola! Puse mi robot en una cuenta de demostración y ha estado funcionando durante el segundo mes. Hoy abro el terminal, dos órdenes han sido colocadas por una señal, aunque una orden ha sido colocada antes. Tengo una restricción en el número de pedidos. ¿Cuál puede ser la razón?
 

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);
}
 
Neron_76:

Esto es lo que utilizo

Los ciclos deben contarse en orden inverso, desdeOrdersTotal()-1 hasta 0.
 
Vitalie Postolache:
Los ciclos deben contarse en orden inverso, desdeOrdersTotal()-1 hasta 0.
Gracias, tendré que rehacerlo.