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

 
Artyom Trishkin:
Y no has mostrado ni un solo trozo de tu código, no está claro por qué muestras un ejemplo.

struct p{

double trailingProfit;

int orders[10];

bool flagOpen;// флаг , указывающий на открытость позиции

//тут еще куча связанных параметров

};


p order[];

int OrderN=-1;


int OnInit()
  {

   ArrayResize(pair,1,1000);
 

   return(INIT_SUCCEEDED);
  }

void openOrder(price){

       OrderN++;

       int t;

       ArrayResize(orders,order+1);

      t=OrderSend(Symbol(),OP_BUYSTOP,2,(NormalizeDouble(price,Digits)),3,0,0,"pair",MAGICN,0,Blue);
      if(t==0) Print("не удалось выставить ордер BUYSTOP ", price);

      for(intj=0,j<10,++j){     

      if(orders[OrderN].orders==0) orders[OrderN].orders=t;

      break;

      }

      orders[OrderN].flagOpen=1;

}

//...... тут идет обработка позиций...

void massCut(){

// нужна вот такая функция

}

Cuando el EA trabaja durante mucho tiempo, la matriz se vuelve demasiado grande para el procesamiento y tenemos que reducirla. Todas las órdenes antiguas cerradas están al principio y todo lo que hay después de la primera orden abierta encontrada debe ser dejado.
 
Evgenii:

...
Cuando el EA lleva mucho tiempo funcionando, el array se vuelve demasiado grande para procesarlo y hay que reducirlo. Todas las órdenes antiguas cerradas están al principio, todo lo que está después de la primera orden abierta encontrada debe ser dejado.

¿Qué ocurre con el conjunto de estructuras cuando se reinicia el EA?

 
Artyom Trishkin:

¿Qué ocurre con la matriz de la estructura cuando se reinicia el EA?

la matriz se estrellará, este problema no ha sido resuelto.
 
Evgenii:
La matriz se borrará, este problema no se ha resuelto.

Allí. Y esto debería haberse tenido en cuenta desde el principio.

La conclusión es obvia: hay que poner a cero la matriz y volver a llenarla con el estado actual de las órdenes y las posiciones. Pero esto sólo debe hacerse cuando se detecten cambios en la cantidad de órdenes o posiciones en la cuenta.

Siempre tendrá a mano sólo el estado actual de las órdenes y posiciones, y no habrá necesidad de molestarse en eliminar las órdenes/posiciones no existentes de la matriz. Y la lista de pedidos/posiciones tendrá que ser recorrida por completo, o por un periodo determinado de la historia, pero sólo en casos específicos - cuando el número de pedidos/posiciones en la cuenta cambia.

 
Alexey Viktorov:
¿Por qué necesitas esa perversión?

Para que onInit no gire en cada reinicialización y reduzca el array estático en una sola instancia porque en algunos lugares se escribe dos veces... en general, esto es optimización de recursos
... Lo dejaré como está, es más simple por el momento
 
LRA:
Se declara un array global sin especificar el tamaño. Su función establece su tamaño mediante ArrayResize. Y es visible globalmente, y OnInit se libera...

No es del todo correcto, el array es estático con valores claramente definidos, no tiene sentido inicializarlo por separado(
 
Money_Maker:

para evitar que OnInit gire en cada reinicialización y para reducir el array estático a una instancia porque en algunos lugares se escribe dos veces... en general esto es optimización de recursos
...lo dejaré como está ahora.
Para evitar el bucle en OnOnit() en cada reinicialización, basta con comprobar el motivo de desinicialización UninitializeReason(), y no consigo nada más. ¿Qué significa reducir una matriz estática? Bueno, en general, usted lo sabe mejor.
 
¿No se tienen en cuenta las comisiones en el probador de MT4?
 
Andrey Dik:
¿No se tienen en cuenta las comisiones en el probador de MT4?
Parece que hay que estar conectado a una cuenta con comisión para que se tenga en cuenta.
 

Pregunta sobre la función Print(); ¿cómo hacer que Print() imprima los datos más la fecha (día) en el EA? ¡ayudar a un principiante a entender el plz, poner el código para rehacer el experimento, induke "pivote" de antemano cbs!


el propio código: PivotsDaily v2.mq4


#propiedad ventana_del_gráfica_del_indicador

#property indicator_buffers 3

#property indicator_color1 Lime

#property indicator_color2 Azul

#property indicator_color3 Rojo


//---- parámetros de entrada

extern inttern CountBars=300;

//---- buffers

doble PBuffer[];

doble S1Buffer[];

doble R1Buffer[];


string Pivot="P", Sup1="S 1", Res1="R 1";


int fontsize=10;

doble P,S1,R1,S2,R2,S3,R3;

double UltimoAlto,UltimoBajo,x;

//+------------------------------------------------------------------+

//| Función de desinicialización del indicador Custor |

//+------------------------------------------------------------------+

int deinit()

{


ObjectDelete("Pivot");

ObjectDelete("S1");

ObjectDelete("R1");

return(0);

}

//+------------------------------------------------------------------+

//| Función de inicialización de indicadores personalizada |

//+------------------------------------------------------------------+

int init()

{

nombre_corto_de_cadena;


IndicatorBuffers(7);

//---- línea indicadora

SetIndexStyle(0,DRAW_ARROW,2,1,Lime);

SetIndexArrow(0,158);

SetIndexStyle(1,DRAW_ARROW,2,1,Blue);

SetIndexArrow(1,158);

SetIndexStyle(2,DRAW_ARROW,2,1,Red);

SetIndexArrow(2,158);


SetIndexBuffer(0,PBuffer);

SetIndexBuffer(1,S1Buffer);

SetIndexBuffer(2,R1Buffer);


//---- nombre para la etiqueta de la subventana DataWindow y del indicador

short_name="Pivote";

IndicadorNombreCorto(nombre_corto);

SetIndexLabel(0,short_name);

short_name="R1";

IndicadorNombreCorto(nombre_corto);

SetIndexLabel(2,short_name);


short_name="S1";

IndicadorNombreCorto(nombre_corto);

SetIndexLabel(1,short_name);


SetIndexDrawBegin(0,6);

//----


return(0);

}

//+------------------------------------------------------------------+

//| Función de iteración de indicadores personalizada |

//+------------------------------------------------------------------+

int inicio()


{

int barras_contadas=IndicadorContado();


int límite, i;

//---- cálculo del indicador

si (barras_contadas==0)

{

x=Período();

si (x>CountBars) return(-1);

ObjectCreate("Pivot", OBJ_TEXT, 0, 0,0);

ObjectSetText("Pivot", " Pivot",10, "Arial",Lime);

ObjectCreate("S1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("S1", " S1",10, "Arial",Blue);

ObjectCreate("R1", OBJ_TEXT, 0, 0, 0);

ObjectSetText("R1", " R1",10, "Arial",Red);

}

if(counted_bars<0) return(-1);


limit=(Bares-contados_barras)-1;


for (i=limit; i>=0;i--)

{

if (TimeDayOfWeek(Time[i]) != 0)

{

if (High[i+1]>LastHigh) LastHigh=High[i+1];

if (Low[i+1]<LastLow) LastLow=Low[i+1];

}


si (

TimeDay(Time[i])!=TimeDay(Time[i+1]) && TimeDayOfWeek(Time[i])!=0

)

{

P=Cerrar[i+1];

R1 = LastLow;

S1 = ÚltimoAlto;

S2=Alto[i]-Bajo[i];

S3=High[i]-Open[i+1];

si(S3==0)

{R2 = S3;} si no {R2 = S2/S3;}

Print("R2 ",R2); // <= ¿cómo consigo que la impresora más los datos impriman la fecha?


LastLow=Open[i]; LastHigh=Open[i];

ObjectMove("Pivot", 0, Time[i],P);

ObjectMove("S1", 0, Time[i],S1);

ObjectMove("R1", 0, Time[i],R1);

}

PBuffer[i]=P;

S1Buffer[i]=S1;

R1Buffer[i]=R1;

}

//----

return(0);

}