Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 182

 
Artyom Trishkin:
E non hai mostrato un solo pezzo del tuo codice - non è chiaro perché stai mostrando un esempio.

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(){

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

}

Quando l'EA lavora per molto tempo, l'array diventa troppo grande per l'elaborazione e dobbiamo ridurlo. Tutti i vecchi ordini chiusi sono all'inizio e tutto dopo il primo ordine aperto trovato dovrebbe essere lasciato.
 
Evgenii:

...
Quando l'EA è stato in esecuzione per molto tempo, l'array diventa troppo grande da elaborare e dobbiamo ridurlo. Tutti i vecchi ordini chiusi sono all'inizio, tutto dopo il primo ordine aperto trovato dovrebbe essere lasciato.

Cosa succede all'array di strutture quando l'EA viene riavviato?

 
Artyom Trishkin:

Cosa succede all'array di strutture quando l'EA viene riavviato?

l'array si blocca, questo problema non è stato risolto.
 
Evgenii:
L'array sarà cancellato, questo problema non è stato risolto.

Ecco. E questo avrebbe dovuto essere considerato fin dall'inizio.

La conclusione è ovvia: l'array deve essere azzerato e riempito nuovamente con lo stato attuale degli ordini e delle posizioni. Ma questo dovrebbe essere fatto solo quando si colgono cambiamenti nella quantità di ordini o posizioni nel conto.

Avrete sempre a portata di mano solo lo stato attuale degli ordini e delle posizioni, e non ci sarà bisogno di preoccuparsi di eliminare ordini/posizioni inesistenti dall'array. E la lista degli ordini/posizioni dovrà essere fatta scorrere completamente, o per un dato periodo di storia, ma solo in casi specifici - quando il numero di ordini/posizioni nel conto cambia.

 
Alexey Viktorov:
Perché avete bisogno di una tale perversione?

In modo che onInit non giri ad ogni reinizializzazione e riduca l'array statico in una sola istanza perché in alcuni punti è scritto due volte... in generale, questa è un'ottimizzazione delle risorse
... lo lascio così com'è, è più semplice al momento
 
LRA:
Si dichiara una matrice globale senza specificare una dimensione. La vostra funzione imposta la sua dimensione con ArrayResize. Ed è visibile globalmente, e OnInit viene rilasciato...

Non è del tutto corretto, l'array è statico con valori chiaramente definiti, non ha senso inizializzarlo separatamente(
 
Money_Maker:

per evitare che OnInit giri ad ogni reinizializzazione e per ridurre l'array statico ad una sola istanza perché in alcuni punti è scritto due volte... in generale si tratta di un'ottimizzazione delle risorse
... lo lascerò così com'è ora.
Per evitare il looping in OnOnit() ad ogni reinizializzazione, basta controllare il motivo della deinizializzazione UninitializeReason(), e non ottengo più nulla. Cosa significa ridurre una matrice statica? Beh, in generale, lo sai bene.
 
Le commissioni non sono prese in considerazione nel tester MT4?
 
Andrey Dik:
Le commissioni non sono prese in considerazione nel tester MT4?
Sembra che si debba essere collegati a un conto con una commissione perché sia presa in considerazione.
 

Domanda sulla funzione Print(); come fare in modo che Print() stampi i dati più la data (giorno) nell'EA? aiutare un principiante a capire il plz, mettere il codice rifatto per il bene di esperimento, induke "pivot" prima cbs!


il codice stesso: PivotsDaily v2.mq4


#proprietà indicator_chart_window

#proprietà indicator_buffers 3

#proprietà indicator_color1 Lime

#property indicator_color2 Blue

#property indicator_color3 Red


//---- parametri di ingresso

extern inttern CountBars=300;

//---- buffer

doppio PBuffer[];

doppio S1Buffer[];

doppio R1Buffer[];


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


int fontsize=10;

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

doppio LastHigh,LastLow,x;

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

//| funzione di deinizializzazione dell'indicatore Custor

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

int deinit()

{


ObjectDelete("Pivot");

ObjectDelete("S1");

ObjectDelete("R1");

ritorno(0);

}

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

//| funzione di inizializzazione dell'indicatore personalizzata

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

int init()

{

stringa short_name;


IndicatorBuffers(7);

//---- linea di indicazione

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


//---- nome per DataWindow e l'etichetta della sottofinestra dell'indicatore

short_name="Pivot";

IndicatoreNomeCorto(nome_corto);

SetIndexLabel(0,short_name);

short_name="R1";

IndicatoreNomeCorto(nome_corto);

SetIndexLabel(2,short_name);


short_name="S1";

IndicatoreNomeCorto(nome_corto);

SetIndexLabel(1,short_name);


SetIndexDrawBegin(0,6);

//----


ritorno(0);

}

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

//| funzione di iterazione dell'indicatore personalizzata

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

int start()


{

int counted_bars=IndicatorCounted();


limite int, i;

//---- calcolo dell'indicatore

se (counted_bars==0)

{

x=Periodo();

se (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=(Bars-counted_bars)-1;


per (i=limite; i>=0;i--)

{

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

{

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

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

}


se (

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

)

{

P=Close[i+1];

R1 = LastLow;

S1 = LastHigh;

S2=High[i]-Low[i];

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

se(S3==0)

{R2 = S3;} else {R2 = S2/S3;}

Print("R2 ",R2); // <= come ottengo la stampante più i dati per stampare la data?


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;

}

//----

ritorno(0);

}

Motivazione: