Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1134

 
Alexandr Nevadovschi:

Cari programmatori, per favore aiutate un principiante in questo settore.

L'EA apre ordini di acquisto e di vendita in modo sequenziale dopo un certo periodo di tempo. Voglio che modifichi tutti gli ordini precedenti (in particolare, tutti quelli precedenti dovrebbero essere chiusi da Take Profit dell'ultimo. Cioè se l'ultimo ordine di acquisto e il precedente ordine di vendita, allora lo stop loss dell'ordine precedente è impostato al livello di take profit dell'ultimo,

Se il precedente acquisto, allora il suo TakeProfit sarà impostato sul livello dell'ultimo TakeProfit. Il punto è che quando arriva il takeprofit dell'ultimo ordine, tutti gli ordini devono essere chiusi).

Spero di averlo spiegato chiaramente, anche se è difficile capire come dovrebbe essere implementato. Grazie in anticipo.

Capisco che possiamo passare attraverso tutti gli ordini aperti e modificarli, ma come possiamo saltare l'ultimo?

La cosa più importante in tutto questo è capire cosa dovrebbe succedere.

Cos'è l'"ultimo ordine"? È ultimo per l'orario di apertura? O per livello di prezzo di apertura?

Cosa succede se consideriamo "l'ultimo" ordine come "COMPRA", ma il prezzo andrà a puttane? O viceversa, l'ultimo ordine sarà SELL, ma il prezzo va a nord? Allora quale dovrebbe essere considerato l'ultimo? Questo è ciò che dobbiamo capire per realizzare la nostra idea.

 

Salve. Se non sapete in anticipo quanti elementi ci saranno nell'array, come dichiarate l'array in modo che l'array aumenti con ogni nuovo elemento?

Un esempio per renderlo più chiaro:

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

Salve. Se non sapete in anticipo quanti elementi ci saranno nell'array, come dichiarate l'array in modo che l'array aumenti con ogni nuovo elemento?

Un esempio per renderlo più chiaro:

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Dovresti leggere più spesso la documentazione.
ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
Alexey Viktorov:
Dovresti leggere più spesso la documentazione.

Ho letto e provato ma ottengo un errore "array out of range". Nell'esempio sembrava così:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

Ho letto e provato ma ottengo un errore "array out of range". Sull'esempio sembrava così:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Quando la condizione A[i] < B[i] non è soddisfatta, la dimensione dell'array rimane invariata e il contatore del ciclo viene incrementato. Ecco perché è fuori portata.

Provate in questo modo.

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Alexey Viktorov:

Quando la condizione A[i] < B[i] non è soddisfatta, la dimensione dell'array rimane invariata e il contatore del ciclo viene incrementato. Ecco perché è fuori dai limiti.

Prova in questo modo.

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


Grazie! Ora funziona tutto !
 
Nauris Zukas:

Ho letto e provato ma ottengo un errore "array out of range". Nell'esempio sembrava così:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Beh, questo funzionerebbe più velocemente

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Vitaly Muzichenko:

Beh, funzionerà più velocemente in questo modo

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
Grazie, capisco! Sarà più veloce a causa dell'ArraySize, lo rallenta in qualche modo?
 
Nauris Zukas:
Grazie, capisco! Sarà più veloce a causa dell'ArraySize, lo rallenta in qualche modo?
Non molto, ma è chiaro e a prova di errore.
 
Alexey Viktorov:
Non molto, ma è chiaro e a prova di errore.
Grazie!