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

 
PolarSeaman:

Scusa, non capisco perché non puoi.

si può, ma non sarà esattamente un timer

if (IsTesting()) OnTimer();
 
PolarSeaman:

ecco qui... E se la zecca non venisse? Bisogna "iniziare" senza una zecca.

il primo tick è per la sincronizzazione, e se il tick iniziale non è arrivato, il mercato è chiuso, non c'è niente da fare

 

Buona sera!

Ancora una volta devo chiedere aiuto:

Un ordine deve essere aperto in un certo intervallo di tempo, se un ordine è già stato aperto negli ultimi 30 minuti con questa magia, allora nessun ordine deve essere aperto. Scrivere così:

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Se si lascia solo la prima parte, il problema è che se una posizione di stop/presa si chiude in quella mezz'ora, se ne apre un'altra. Così ho aggiunto la seconda parte per entrare nella storia degli ordini e se c'era già un ordine negli ultimi 30 minuti con questo mag, allora non aprirlo. Ma c'è qualcosa che non va nella seconda parte - si apre ancora.

Per favore, consigliatemi!

 

devi contare in secondi.

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

Bisogna contare in secondi.

Purtroppo non ha funzionato.

Provato di nuovo, anche questo no:

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

Purtroppo non ha funzionato.

Ho provato di nuovo, ma non ha funzionato nemmeno questo:

Perché confronti tutte le linee? Taras ha detto correttamente - conta in secondi. La sua versione non ha funzionato, perché non sei ancora arrivato alla storia dell'account:

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

Questo è un ciclo di ordini di lavoro. Se guardiamo la storia, il ciclo sarà il seguente:

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

Allora dovremmo prendere il tempo di chiusura dell'ordine invece del suo tempo di apertura nel ciclo.

 
Ihor Herasko:

Perché confronti tutte le linee? Taras aveva ragione quando ha detto di contare in secondi. La sua versione non si adattava, perché non sei mai arrivato alla storia dell'account:

Questo è un ciclo di ordini di lavoro. Se guardiamo la storia, il ciclo sarà il seguente:

Poi nel ciclo, dovremmo prendere il tempo di chiusura dell'ordine e non il suo tempo di apertura.


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Se ho capito bene, intendevi TimeToStr, cioè l'hai tradotto in testo?

L'ho corretto, ma comunque:

Tester

Scusate, se sono completamente stupido.

 
YanSay:

Se ho capito bene, intendi TimeToStr - cioè tradotto in testo?

Corretto, ma comunque:

Mi dispiace se sono completamente stupido.

Dite la vostra condizione ad alta voce e vedrete cosa sta succedendo).

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

Se a uno dei precedenti valori del buffer dell'indicatore viene assegnato un valore vuoto, verrà cancellato dal grafico?

o ci sarà un valore vuoto nel buffer e il disegno rimarrà sul grafico?

 
YanSay:

Se ho capito bene, intendi TimeToStr - cioè tradotto in testo?

Sì. Non ha senso convertire il tempo in una stringa, perché il tempo è un numero di secondi. Questo numero è molto più facile e veloce da lavorare rispetto alle stringhe.

Corretto, ma comunque:

Scusa se sono completamente stupido.

Hai corretto una cosa e ne hai rovinata un'altra).

Nella seconda parte invece di:

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

riportarlo indietro:

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

Nel tuo precedente tentativo avevi questa linea corretta.

Motivazione: