Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 930

 

DiPach , gracias de nuevo por tu ayuda. He analizado sus ejemplos. Hice algunos cambios en mi código de inicio. El resultado es este:

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

Lo que se ha cambiado:

1. He movido la línea que contiene la declaración del array int awd1[]; dentro de la función OnStart()

2. Añadida la función ArrayResize(awd1,6,7);

3. El guión funciona.

Intentaré sacar algunas conclusiones. En los scripts, es correcto declarar arrays dentro de la función OnStart(). Después de declarar el array, debe definirse necesariamente su tamaño mediante la función ArrayResize(); de lo contrario, el compilador jurará. ¿Son correctas mis conclusiones? Si no es así, por favor, dé la interpretación correcta.

 
silachara:

DiPach , gracias de nuevo por tu ayuda. He analizado sus ejemplos. Hice algunos cambios en mi código de inicio. El resultado es este:

Lo que se ha cambiado:

1. He movido la línea que contiene la declaración del array int awd1[]; dentro de la función OnStart()

2. Añadida la función ArrayResize(awd1,6,7);

3. El guión funciona.

Intentaré sacar conclusiones. En los scripts, es correcto declarar arrays dentro de la función OnStart(). Después de declarar el array, debe definirse necesariamente su tamaño mediante la función ArrayResize(); de lo contrario, el compilador generará un error. ¿Son correctas mis conclusiones? Si no es así, por favor, dé la interpretación correcta.

En general, sí. Y funcionará, al menos en silencio, pero muy bien. :)

Sólo especificaré los siguientes puntos:

1. Cuando se declaran las variables y matrices normales, creo que hay que tener en cuenta qué va a hacer este script (o EA/indicador) y para qué sirven estas variables/matrices.

El flujo de trabajo de su script adjunto permite la declaración de variables no a nivel global del programa, sino localmente. Es decir, el array se declara una vez. Y no hay necesidad en las declaraciones repetidas (en bucle) en el cuerpo de Start(), por ejemplo, antes de que comencemos el bucle for() y, por ejemplo, cuando necesitamos alguna declaración más de variables después de for() {}:


En consecuencia, el array se declara no a nivel de variables globales del programa sino en el cuerpo de OnStart() antes de la sentencia del bucle for() - es bastante aceptable en este esquema de ejecución del programa.

Desde mi punto de vista, si no hay necesidad de declarar algo a nivel de variables globales en un programa, mejor aprovechar esta oportunidad y declarar todo lo que podamos localmente.

2. En cuanto al código, déjame aclararlo:

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

Eso es:

  • No debe utilizar el signo <= (menos que igual) en for. Me refiero a dónde estaba (i=0;i<=5;i++). Sólo hay que poner un signo <(menos que) y sustituir 5 por 6:
for(int i=0;i<6;i++)

Esa es la forma 5 que sería apropiada para:

for(int i=5;i>=0;i--)
  • Recuerdo haber encontrado antes información de que la función Stringconcatenate contribuye a un procesamiento más rápido del texto largo. Por eso suelo utilizarlo en mi código. Lo he añadido aquí también, por si acaso.


P./S.: Una aclaración más, por si acaso, el uso de ArrayResize() - para arrays dinámicos. En la documentación de esta función , hay información cuando esta función no puede redimensionar arrays dinámicos.

 
Best_ATS:
¿Por qué no puedo añadir amigos?
¿Y cómo te imaginas a un amigo sin conocerlo personalmente en la vida, desde el trabajo?
 

¿Cómo puedo hacer que el nuevo precio se muestre primero y que el precio anterior baje a la parte inferior y así sucesivamente? He puesto un ejemplo para que quede claro.

double NN=0;
double NN1=0;
double NN2=0;
double NN3=0;
void OnTick()
  {
//---
if(Ask>NN)NN=Ask;
if(NN>NN1)NN1=NN;
if(NN1>NN2)NN2=NN1;
if(NN2>NN3)NN3=NN2;
        Comment(""       
             + "1.   "+"Buy: "" Max: " + DoubleToStr(NN,5)
             + "\n"  
             + "2.   "+"Buy: "" Max: " + DoubleToStr(NN1,5)
             + "\n"  
             + "3.   "+"Buy: "" Max: " + DoubleToStr(NN2,5)
             + "\n"  
             + "4.   "+"Buy: "" Max: " + DoubleToStr(NN3,5)
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks:

¿Cómo puedo hacer que el nuevo precio se muestre primero y que el precio anterior baje a la parte inferior y así sucesivamente? Eso sería claro hecho un ejemplo.

Hice un ejemplo, y con las condiciones más o menos puedes averiguarlo tú mismo:

double bda_Price[4];
void OnTick()
{
      int li_int;
//---
    if (Ask > bda_Price[0])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[0] = Ask;
        double lda_Price[3];
        ArrayCopy (lda_Price, bda_Price, 0, 1);
        for (int li_int = 1; li_int < 4; li_int++)
        {bda_Price[li_int] = lda_Price[li_int-1];}
    }
    string ls_txt;
    StringInit (ls_txt, 100);
    for (li_int = 0; li_int < 4; li_int++)
    {ls_txt = StringConcatenate (ls_txt, (string) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits), "\n");
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
    Comment (ls_txt);
//---
}
 
TarasBY:

He hecho un ejemplo, y puedes resolver los términos más o menos por tu cuenta:


Gracias.
 
abeiks:

¿Cómo puedo hacer que el nuevo precio se muestre primero y que el precio anterior baje a la parte inferior y así sucesivamente? Para que quede claro, he puesto un ejemplo.

Aquí hay un código completamente primitivo.

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
 
silachara:

Aquí hay un código perfectamente primitivo hecho.




Gracias.
 

Hola a todos. Intenté abrir una orden de operación en el probador de estrategias usando un script rudimentario, falló.

int inicio()

{

//----

int res;

double ask=Cierre[0]+MarketInfo(_Símbolo,MODE_SPREAD)*Punto;

res=Enviar orden(Símbolo(),OP_BUY,0.1,ask,3,0,0,",0,0,Azul);

if(res>-1)Alert("Abrir orden de COMPRA con ticket ",res);

//----

return(0);

}

Puse el script en el gráfico de prueba en modo de visualización, pero la orden de operación se abre en la terminal MT4.

Tampoco puedo obtener información sobre las órdenes abiertas en el probador de estrategias utilizando SimpleFXTester_v2.ex4.

Por favor, ayúdenme a entender esto.

 
kosmos0975:

Hola a todos. Intenté abrir una orden de operación en el probador de estrategias usando un script rudimentario, falló.

int inicio()

{

//----

int res;

double ask=Cierre[0]+MarketInfo(_Símbolo,MODE_SPREAD)*Punto;

res=Enviar orden(Símbolo(),OP_BUY,0.1,ask,3,0,0,",0,0,Azul);

if(res>-1)Alert("Abrir orden de COMPRA con ticket ",res);

//----

return(0);

}

Pongo el script en el gráfico de prueba en modo de visualización, pero la orden de operación se abre en el terminal MT4.

Tampoco puedo obtener información sobre las órdenes abiertas en el probador de estrategias utilizando SimpleFXTester_v2.ex4.

Por favor, ayúdenme a entender esto.

Los scripts del Probador de Estrategias no funcionan.