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

 
Vitalie Postolache:


Se lo si confronta con l'equilibrio, è così:

Grazie.

 
trader781:

OK, allora, come ho capito, otteniamo tre diverse funzioni personalizzate con il ritorno di quella giusta (se cerchiamo tre parametri diversi)

ArraySort

poi

ArrayBsearch per il numero giusto

e poi come affrontarlo?

Esattamente la transizione da un array a un elemento della struttura

Tu non capisci.

Dovete fare una singola funzione che popolerà e ordinerà l'array dichiarato globalmente. L'array dovrà essere passato alla funzione per riferimento.

E avete bisogno di funzioni aggiuntive che prendano i dati di cui avete bisogno da questo array.

 
Artyom Trishkin:

Tu non capisci.

Dovete fare una singola funzione che riempie e ordina l'array dichiarato globalmente. L'array dovrà essere passato alla funzione per riferimento.

E avete bisogno di funzioni aggiuntive che prendano i dati di cui avete bisogno da questo array.

Ok, potete dimostrare come prendere qualcosa da un array di strutture? diciamo riempito e ordinato

come trasferire per riferimento e scrivere.

 

Si prega di consigliare come dovrebbe essere la condizione. Se viene attivato uno stop loss, allora il lotto viene moltiplicato per 2, e se l'ordine successivo attiva un take profit, il lotto tornerebbe al lotto originale, che era prima dello stop loss.

Lo capisco così, ma non so come andare avanti...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

 

un'altra domanda, cosa ho scritto di sbagliato nel blocco di cancellazione degli ordini? non sempre cancella gli ordini, nel log dice

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }
 
wishmast:

Un'altra domanda, cosa ho scritto di sbagliato nel blocco per cancellare gli ordini? Non sempre cancella gli ordini, nel log dice

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


Stai cercando di cancellare un ordine a mercato, non vengono cancellati, vengono chiusi usando la funzione OrderClose(). Affinché il ciclo si cancelli o si chiuda correttamente, dobbiamo distinguere l'ordine in base al suo tipo.

if(OrderType()<=OP_SELL) - per ordini a mercato, if(OrderType()>OP_SELL) - per ordini pendenti.

 

C'è una cosa chiamataCHARTEVENT_MOUSE_MOVE

Domanda: questo funziona sui dispositivi mobili dove non c'è il mouse?

 
wishmast:

Si prega di consigliare come dovrebbe essere la condizione. Se viene attivato uno stop loss, allora il lotto viene moltiplicato per 2, e se l'ordine successivo attiva un take profit, il lotto tornerebbe al lotto originale, che era prima dello stop loss.

Lo capisco così, ma non so come andare avanti...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

Se l'hai fatto velocemente, l'ultimo ordine perdente apparirà, cosa fare con esso e quali parametri correggere, penso che capirai.
File:
last1.mq4  4 kb
 
wishmast:

Si prega di consigliare come dovrebbe essere la condizione. Se viene attivato uno stop loss, allora il lotto viene moltiplicato per 2, e se l'ordine successivo attiva un take profit, il lotto tornerebbe al lotto originale, che era prima dello stop loss.

Lo capisco così, ma non so come andare avanti...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

La soluzione a questo problema dipende dalla logica completa dell'Expert Advisor, puoi rintracciare l'attivazione dello stoploss o del takeprofit dal suo commento.

  if(StringFind(OrderComment(),"sl")>=0)// сработал стоплосс
  if(StringFind(OrderComment(),"tp")>=0)// сработал тейкпрофит

...

 
Artyom Trishkin:

Tu non capisci.

Dovete fare una singola funzione che riempia e ordini l'array dichiarato a livello globale. L'array dovrà essere passato alla funzione per riferimento.

E avete bisogno di funzioni aggiuntive che prendano i dati di cui avete bisogno da questo array.

Artem, ti sbagli. L'array, dichiarato a livello globale, è visibile in tutte le parti del programma, e non è necessario passarlo da qualche parte. È solo riempito in un posto nel programma, ordinato in un altro e letto nel terzo, non importa.