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

 
Mikhail Mishanin:

C'est drôle) ça ne devrait pas l'être)

Si la bataille est terminée - négociez avec un spread normal, retirez simplement sa "limite" dans l'entrée et ignorez la transaction si le spread est supérieur à la limite.

Les spreads peuvent être étirés par des dillings sans rollover.

J'ai pas mal d'écarts, de 10 à 45 unités.

Je dois attendre l'écran 45.

En même temps, la fonction compte une moyenne de 17, ce qui est tout à fait satisfaisant.

Il monte à 100-140 pendant 1 heure après le rollover, je vais exécuter le code et voir comment il se comporte.

 
Vitaly Muzichenko:

Vous pourriez cependant le prescrire de cette façon :

Il devrait fonctionner correctement.

Je n'aime pas cette logique.

La première entrée de la fonction :

res = 0;

Par conséquent, la condition

if(dt.hour==22 && res<_sp)

n'est pas satisfaite.

Et je ne veux pas entrer davantage dans les détails. Pourquoi cette condition est-elle soudaine ?

   if(tc>LONG_MAX-1)
Je ne comprends pas la logique de tout ça.
 
Alexey Viktorov:

Je n'aime pas cette logique.

La première entrée de la fonction :

res = 0;

Par conséquent, la condition

if(dt.hour==22 && res<_sp)

n'est pas rempli.

Et je ne veux pas en parler davantage. Pourquoi cette condition soudaine ?

   if(tc>LONG_MAX-1)
Je ne comprends pas la logique de tout ça.

1. cette condition ne concerne que l'heure qui suit le retournement, alors que l'heure est de 22 heures. Mais ce n'est qu'au premier démarrage, alors que le terminal fonctionne toujours avec le conseiller expert, ce qui signifie qu'il n'est vide qu'une seule fois.

Il faudrait peut-être aussi le déclarer comme statique en cas de changement de calendrier.

2. if(tc>LONG_MAX-1) = on remet à zéro la variable tc si on a dépassé les limites admissibles de long. Il est peu probable que cela se produise, car le terminal est parfois surchargé, par exemple le week-end.

---

Code modifié, cela doit être définitif :

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. Mettez-le à l'épreuve

P.S. J'ai révisé le code

----

P.S.S.S. J'ai ajouté 1 heure de plus après le rollover, sinon j'ai un spread très élevé sur certains dealers.

La variante finale a travaillé 20 heures et le résultat est étonnant.

L'écart quotidien moyen est de 10 à 45 pps, mais la plupart du temps il est de 10 à 17 pps, l'écart moyen a été calculé comme étant de 19 %.

Merci à tous pour votre participation, si vous avez quelque chose à ajouter - écrivez !

 
Vitaly Muzichenko:

Peut-être devrait-il également être déclaré statique, en cas de changement de calendrier.

J'ai compris, ça a l'air de fonctionner, je retire "ça ne devrait pas"), maintenant il me reste juste à comprendre les moments de remise à zéro/affectation.

 

J'ai vu une discussion sur le forum, mais je ne la trouve pas.

J'ai besoin de me limiter à une position sur une barre qui peut être ouverte à tout moment, c'est une option maintenant, mais c'est "lourd" à mon avis.

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Comment peut-on le remplacer pour l'alléger ?

 
Vitaly Muzichenko:

J'ai vu une discussion sur le forum, mais je ne la trouve pas.

Besoin d'être limité à une position sur un bar qui peut être ouvert à tout moment, c'est une option maintenant, mais c'est "lourd" à mon avis

Comment peut-on le remplacer pour l'alléger ?

"Vous devez vous limiter à une seule position sur la barre, qui peut être ouverte à tout moment..."

En termes trop généraux, voulez-vous dire qu'une fois sur la barre de ce symbole, vous pouvez envoyer OrderSend?

 
Mikhail Mishanin:

"Vous devez vous limiter à une seule position sur la barre, qui peut être ouverte à tout moment..."

la formulation est trop générale, voulez-vous dire qu'une fois par barre dans ce symbole vous pouvez envoyer OrderSend?

Oui. Le conseiller expert travaille sur l'échelle de temps H1 et peut ouvrir une position à 10:17, il ne doit pas en ouvrir une autre avant 11:00, c'est-à-dire sur la barre actuelle.

 
Vitaly Muzichenko:

Oui. L'EA travaille sur le cadre temporel H1 et peut ouvrir une position à 10:17, vous devez vous assurer qu'avant 11:00, c'est-à-dire sur la barre actuelle - il ne s'ouvre plus.

Yep, encore une fois, je pense que le diable est dans les détails.

ouvrir une position - mettre un "ban flag" et/ou enregistrer le "temps" (peu importe lequel, tant que c'est le même (source) pour la comparaison)

un nouveau bar est ouvert - le "ban flag" est activé...

Question : Que se passe-t-il si la position a changé d'une manière ou d'une autre ?

Exemple de la façon dont je définis une nouvelle barre - diviseur doTB en secondes, pour H1 c'est 3600.0

BARii[].time - temps des barres avec M1, mais il peut être arbitraire et avec n'importe quelle division, s'il est supérieur ou égal à 1, cela signifie le "temps" de différentes "barres".

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

Yep, encore des conditions incomplètes à mon avis, "le diable est dans les détails", en termes simples si le texte

ouvert une position - mettre un "drapeau de bannissement" et/ou économiser le "temps" (peu importe lequel, tant qu'il s'agit de la même (source) pour la comparaison)

un nouveau bar est ouvert - le "ban flag" est activé...

Question : Que se passe-t-il si la position a changé d'une manière ou d'une autre ?

Exemple de la façon dont je définis une nouvelle barre - diviseur doTB en secondes, pour H1 c'est 3600.0

BARii[].time - temps des barres avec M1, mais il peut être arbitraire et avec n'importe quelle division, s'il est supérieur ou égal à 1, il signifie le "temps" de différentes "barres".

Je n'étais pas satisfait de l'option utilisant des drapeaux à ce moment-là ; je ne me souviens pas pourquoi, mais je l'ai remplacée par

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

OK, je vais réfléchir à une autre mise en œuvre

 
Vitaly Muzichenko:

Je n'étais pas satisfait de l'option drapeaux à l'époque, je ne me souviens plus pourquoi, mais je l'ai remplacée par

Ok, je vais réfléchir à une autre implémentation.

Et que retient cette mise en œuvre ? Similaire à mon code détermine deux fois dans une "barre" ou dans différents. Juste dans ma variante "vrai" quand dans différentes "barres", dans votre variante "vrai" quand dans une seule barre, il suffit de contourner la comparaison == avec "0" en particulier l'entier, wo, et je peux probablement changer la condition à >0,0 ou >0,9, besoin de réfléchir....