[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 662

 
drknn:


Correcto, porque el primer parámetro devuelve un número y el segundo es un valor entero dentro de los límites aceptables. La cuestión es qué es exactamente lo que va a entrar en la variable. Pruébalo tal cual y prueba esta construcción:

Es interesante... Lo hice así:

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =NormalizeDouble(iAC(sy,tf,1),8),
   AC2   =NormalizeDouble(iAC(sy,tf,2),8),
   AC3   =NormalizeDouble(iAC(sy,tf,3),8);
   
   Comment("\n","AC1 = ",AC1," AC2=",AC2);
   string str1=AC1;
   Print("str1 = ",str1);
   string str2=AC2;
   Print("str2 = ",str2);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}
El comentario muestra

AS1 = 0,001 AS2 = 0,001,

En la ventana de datos, AC1 = 0,001008, AC2 = 0,001020,

y en el registro dice (los dos últimos valores):

0,00100029
0,00100771

 
IgorM:

No sé cómo encontrar el extremo de una función

Tengo un array de datos que almacena valores:

Cómo encontrar fracturas - extremas utilizando una matriz de datos de 250 elementos y almacenar sólo los números de los elementos donde se encuentran estos extremos


Chicos, es un poco complicado :)
Podrías esbozar un método sencillo:

//+------------------------------------------------------------------+
void searchExtremums(double base[], double &find[]){
   int step = 1;
   for(int loop = 0; loop < ArraySize(base)-2; loop++){
      if((base[loop] > base[loop+1] && base[loop+1] < base[loop+2]) || (base[loop] < base[loop+1] && base[loop+1] > base[loop+2])){
         ArrayResize(find, step);
         find[step - 1] = base[loop+1];
         step++;
      }
   }   
}
//+------------------------------------------------------------------+

Se pasa el array en el que se quiere encontrar los extremos (base) y el array en el que se van a escribir (find), una llamada de ejemplo para el array Vladimir:

double res[];
searchExtremum(my_array, res);

Y te mostramos el resultado:

for(int s = 0; s < ArraySize(res); s++)Alert(res[s])
Parece más fácil así :)
 
ToLik_SRGV:


Parece más sencillo :)


Vale, intentaré comprobarlo hoy, puede que sea más sencillo, pero no me sale la combinación en la cabeza

void searchExtremums(double base[], double & find[]){

Ahora necesito comprobar funciones como estas

 
IgorM:

Vale, intentaré comprobarlo hoy, puede que sea más sencillo, pero no me sale la combinación en la cabeza

void searchExtremums(double base[], double & find[]){

ahora necesito comprobar dichas funciones

Igor, ya escribí sobre esto en este hilo :)))

Cuando pasas una variable a una función, a través de su parámetro, la variable se pasa por valor, esto significa que cambiar la variable en la propia función no hará que se sobrescriba.
Intenta pasarlo por referencia, inserta un "&" delante del nombre del parámetro

void simple(string &s){
//                 ^
//       спец сим. & перед именем переменной задает передачу по ссылке, а не по значению
//
}
 
Mathemat:

El post de Volfram fue borrado por propagarse en varios hilos.

Volfram, ha creado su propio hilo específicamente para este propósito. Ya te han contestado; ¿no es suficiente?

P.D. Déjame contarte un secreto, Volfram: la ausencia de interés evidente en tu idea sugiere implícitamente que la idea no merece ninguna atención. En consecuencia, nadie estaba dispuesto a aplicarlo "a cambio de una cuota".

Has anulado la opción de notificación por correo electrónico...

¿Cómo puedes saber si alguien ha respondido o no sin él? ¿Cuándo lo recuperarás?

 
artmedia70:

Es interesante... Hice esto:

El comentario se muestra al mismo tiempo

AS1 = 0,001 AS2 = 0,001,

En la ventana de datos AC1 = 0,001008, AC2 = 0,001020,

y en el registro dice (los dos últimos valores):

0.00100029
0.00100771


Eso probablemente dependa de los desarrolladores ;)
 
artmedia70:

Es interesante... Lo hice así:

El comentario se muestra al mismo tiempo

AS1 = 0,001 AS2 = 0,001,

En la ventana de datos AC1 = 0,001008, AC2 = 0,001020,

y en el registro dice (los dos últimos valores):

0.00100029
0.00100771

Yo también lo he probado, todo parece estar bien, en el comentario:
AC = -0,0004, en la revista -0,00035586
AC2 = -0,0007, diarios -0,00068589
 
ToLik_SRGV:
Yo también lo he probado, todo parece correcto, en el comentario:
AC = -0.0004, en el diario -0.00035586
AC2 = -0.0007, en el juranle -0.00068589

Comment() parece redondear los valores internamente... Y qué cómodo es a veces verlos ahí mismo, en la pantalla, durante las pruebas visuales... Sin embargo, no exactamente... :)

Sí, y, por cierto, aquí en un foro sobre la normalización leer así que a partir de un par de horas a las 7.30 am ...
La normalización debe realizarse lo más cerca posible de la operación de comparación... Por lo tanto, creo que debo cambiar algunas cosas en algunas funciones y códigos... Y entonces la prueba mostrará la diferencia...

 
artmedia70:

Comment() parece redondear los valores internamente... Y qué cómodo es a veces verlos ahí mismo, en la pantalla, durante las pruebas visuales... Sin embargo, no exactamente... :)

Cuando estaba escribiendo una función de gestión de lotes, tuve que hacer una biblioteca dll en Delphi, porque la tarea que necesitaba usando MQL4 era imposible de resolver...
 

Estoy escribiendo mi primer EA. Coloco una orden SellStop y después de que se active, se coloca la orden BuyStop. Creo que tengo que usar OrdeCloseTime. He probado muchas variantes pero el EA sólo ve la orden cuando OrdeCloseTime==0. Después de cerrar el SellStop, el SellStop se abre de nuevo. Le proporciono el código. En esta variante, SellStop y BuyStop se abren simultáneamente. Por favor, ayúdame. Gracias de antemano.

int I = 0;

int inicio()

{

si (I < 1)

{

ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,OP_SS,Slippage,SL,CP_SS);

si (ticket>0)

{ Alert("OrderSend"," ",ticket); } else { Alert("!OrderSend","",GetLastError()); }

//--------------------------------------------------------------------------

if (OrderSelect(ticket,SELECT_BY_TICKET)==true)

{ Alert("OrderSelect", ",ticket); } else { Alert("!OrderSelect"," ",GetLastError()); }

//--------------------------------------------------------------------------

OrderSend(Symbol(),OP_BUYSTOP,Lot,OP_BS,Slippage,SL,CP_BS);

}

I=1;

}

retorno (0);

//--------------------------------------------------------------------------

Razón de la queja: