Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 572

 
PolarSeaman:

Désolé, je ne comprends pas pourquoi vous ne pouvez pas.

vous pouvez, mais ce ne sera pas exactement un minuteur

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

voilà... Et si la tique ne venait pas ? Vous devez "commencer" sans tique.

le premier tick est pour la synchronisation, et si le tick de départ n'est pas arrivé, le marché est fermé, il n'y a rien à faire là.

 

Bonsoir !

Encore une fois, je dois demander de l'aide :

Un ordre doit être ouvert dans une certaine plage horaire, si un ordre a déjà été ouvert dans les 30 dernières minutes avec cette magie, alors aucun ordre ne doit être ouvert. Écrire comme ça :

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

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

Si vous ne laissez que la première partie, le problème est que si une position stop/take se ferme dans cette demi-heure, une autre s'ouvre. J'ai donc ajouté la deuxième partie pour accéder à l'historique des commandes et s'il y a déjà eu une commande dans les 30 dernières minutes avec ce mag, alors ne l'ouvrez pas. Mais quelque chose ne va pas avec la deuxième partie - elle s'ouvre toujours.

Veuillez me conseiller !

 

vous devez compter en secondes.

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

Il faut compter en secondes.

Malheureusement, ça n'a pas marché.

J'ai essayé à nouveau, non plus :

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

Malheureusement, ça n'a pas marché.

J'ai réessayé, mais ça n'a pas marché non plus :

Pourquoi comparez-vous toutes les lignes ? Taras a dit correctement - comptez en secondes. Sa version n'a pas fonctionné, car vous n'avez toujours pas accédé à l'historique du compte :

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

Il s'agit d'un cycle d'ordres de travail. Si nous regardons l'historique, la boucle sera la suivante :

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

Nous devrions alors prendre l'heure de clôture de l'ordre au lieu de son heure d'ouverture dans la boucle.

 
Ihor Herasko:

Pourquoi comparez-vous toutes les lignes ? Taras avait raison quand il disait de compter en secondes. Sa version ne correspondait pas, car vous n'avez jamais atteint l'historique du compte :

Il s'agit d'un cycle d'ordres de travail. Si nous regardons l'historique, la boucle sera la suivante :

Ensuite, dans la boucle, nous devrions prendre l'heure de clôture de la commande plutôt que l'heure d'ouverture.


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

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

Si j'ai bien compris, vous vouliez dire TimeToStr, c'est-à-dire que vous l'avez traduit en texte ?

Je l'ai corrigé, mais quand même :

Testeur

Désolé, si je suis complètement stupide.

 
YanSay:

Si je comprends bien, vous voulez dire TimeToStr - c'est-à-dire traduit en texte ?

Corrigé, mais quand même :

Je suis désolé si je suis complètement stupide.

Dites votre condition à haute voix et vous verrez ce qui se passe).

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

Si l'on attribue une valeur vide à l'un des tampons d'indicateur précédents, celui-ci sera-t-il supprimé du graphique ?

ou y aura-t-il une valeur vide dans le tampon et le dessin restera sur le graphique ?

 
YanSay:

Si je comprends bien, vous voulez dire TimeToStr - c'est-à-dire traduit en texte ?

Oui. Il est inutile de convertir le temps en une chaîne de caractères, car le temps est un nombre de secondes. Ce nombre est beaucoup plus facile et rapide à travailler que les cordes.

Corrigé, mais quand même :

Désolé si je suis complètement stupide.

Vous avez corrigé une chose et gâché une autre).

Dans la deuxième partie, au lieu de :

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

le ramener :

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

Dans votre tentative précédente, cette ligne était correcte.

Raison: