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

 
yaaarik777:
Sto imparando, sto cercando di usare la guida, ma mi rendo conto che sto ottenendo delle sciocchezze, mi piacerebbe vedere un esempio di come fare.
Leggete questo articolo, vi sarà utilehttps://www.mql5.com/ru/articles/1399
События в МetaТrader 4
События в МetaТrader 4
  • 2006.05.29
  • Andrey Khatimlianskii
  • www.mql5.com
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
 
yaaarik777:

Buona giornata a tutti! Potete per favore consigliarmi come impostare la cancellazione di un ordine in un EA?

La situazione è la seguente:

Mettiamo 2ordini pendenti in direzioni diverse, non appena uno di essi scatta, l'altro viene rimosso e non viene più esposto.

Sarei molto grato per qualsiasi aiuto.

Grazie.

Qualcosa del genere

   for(int pos=OrdersTotal()-1,ticket=0,trade=0;pos!=-1;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный
        {
         ticket=OrderTicket();//Запомним его тикет
        }
      else//Если ордер не отложенный
        {
         trade=1;//Запомним,что есть открытая позиция
        }
      if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция
        {
         int OD=OrderDelete(ticket);//Удаляем отложенный
        }
     }
 
Nikolay Gaylis:
"Continuiamo a cercare" deve essere rimosso!
Puoi modificare i tuoi messaggi sul forum. Tutto quello che hai scritto in post separati sopra può essere inserito in uno solo.
 
Vitalie Postolache:
Puoi modificare i tuoi messaggi sul forum. Tutto quello che hai scritto in post separati sopra può essere inserito in uno solo.
Grazie!
 

Ciao, ho introdotto una rete a strascico takeprofit utilizzando il seguente algoritmo:

if(total>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magico && OrderSymbol()==asset& OrderType()==OP_BUY)
{
RefreshRates();
se(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
PRENDERE CONDIZIONE DI PROFITTO;
ORDINARE LA MODIFICA DI UN NUOVO TAKEPROFIT;
}
}
}
}

Ma il limite di tempo non funziona per qualche motivo e succede che se una posizione non viene chiusa nel timeframe corrente, essa si trascina anche nel timeframe successivo se le condizioni sono soddisfatte.

Cosa c'è di sbagliato nel mio ultimo if()?

 
владимир:

Ciao, ho introdotto un takeprofit trawl utilizzando il seguente algoritmo:

se(totale>0)
{for (int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==magico && OrderSymbol()==asset && OrderType()==OP_BUY)
{
RefreshRates();
se(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
{
CONDIZIONE DI TP FINALE;
{ MODIFICA DELL'ORDINE AL NUOVO TAKEPROFIT;
}
}
}
}

Ma per qualche motivo il limite di tempo non funziona, e succede che se la posizione non viene chiusa nel timeframe corrente, scatta anche in quello successivo, se le condizioni sono soddisfatte.

Cosa c'è di sbagliato nel mio ultimo if()?

Beh, non lo so, non ho ancora visto nulla di sbagliato lì. Ho rimosso il controllo ridondante sul numero di ordini (è già presente nelle condizioni del ciclo) e ho aggiunto un controllo per entrambi i tipi di posizioni (Acquisto e Vendita)

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Dove // le condizioni di pesca a strascico e di modifica, inserire Print() con i valori delle variabili temporali e vedere cosa dice il log.

 
Artyom Trishkin:

Non so, non vedo ancora cosa ci sia di sbagliato con una rapida occhiata. Ho rimosso il controllo non necessario sul numero di ordini (è già presente nelle condizioni di ciclo) e ho aggiunto il controllo su entrambi i tipi di posizioni (Acquisto e Vendita)

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Dove // trawl e condizioni di modifica, inserire Print() con i valori delle variabili temporali e vedere cosa dice il log.

Ho condizioni diverse per Vendere, quindi ho mostrato solo COMPRARE.

"con variabili temporali" - intendete TimeCurrent()? Scusa se questo ti sorprende - sono uno zero-meno nella programmazione.

E non capisco questo -OrderType()>OP_SELL. Perché >? OrderType OP_SELL ha valore = 1 eOP_BUY = 0. Quindi deve essere <= ? Grazie.

 
владимир:

Ho diverse condizioni di pesca a strascico per SELL, quindi ho mostrato solo BAI.

"con valori di variabili temporali" - intendi TimeCurrent()? Scusa se questo ti sorprende - sono uno zero-meno nella programmazione.

E non capisco questo -OrderType()>OP_SELL. Perché >? OrderType OP_SELL ha valore = 1 eOP_BUY = 0. Quindi deve essere <= ? Grazie.

Se il tipo è maggiore di 1, allora vai alla prossima iterazione del ciclo.
 

Saluti. Potreste dirmi perché nel caso della seguente voce

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Il sistema genera costantemente errori

ticket non valido per la funzione OrderDelete

: errore OrderDelete 4051

Secondo il libro di riferimento è

Valore non valido del parametro della funzione

Anche se i parametri sembrano essere gli stessi.

Anche se se si rimuove la condizione e si lascia solo

OrderDelete(ticketD);

OrderDelete(ticketUP);

si cancella con successo (ma mi serve per condizione). Cosa sto facendo di sbagliato?

 
spoiltboy:

Saluti. Potreste dirmi perché nel caso della seguente voce

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

Il sistema genera costantemente errori

ticket non valido per la funzione OrderDelete

: errore OrderDelete 4051

Secondo il libro di riferimento è

Valore non valido del parametro della funzione

Anche se i parametri sembrano essere gli stessi.

Anche se se si rimuove la condizione e si lascia solo

OrderDelete(ticketD);

OrderDelete(ticketUP);

si cancella con successo (ma mi serve per condizione). Cosa sto facendo di sbagliato?

L'errore è da qualche parte sopra il codice, nell'area di selezione degli ordini.