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

 
Бахром Балтабаев une notification à mon téléphone lorsque le prix atteint un certain niveau, c'est-à-dire de ne pas regarder le terminal tout le temps.

J'ai récemment écrit une alerte :. Mais il peut être amélioré en ajoutant SendNotification :

// использовать алерт
input bool alert = true;
// использовать push-уведомления
input bool notification = true;
// уровень срабатывания
input double trigLv = 0.0;
// отклонение от trigLv в пунктах
input int deviation = 30; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
  return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]
) {
  static bool triggered = false;
  static datetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (EqualDoubles(trigLv, close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { // сравнение цены Close с trigLv
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level ", NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " triggered!");
      if (notification)
        SendNotification("Level " + (string)NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

Ajoutez les lignes, que j'ai mises en évidence, au code source, déposez-le dans le dossier Indicateurs et compilez-le. Cet indicateur peut être ajouté au graphique autant de fois que vous le souhaitez et recevoir des signaux lorsque différents niveaux sont franchis. Le code a été finalisé en ligne. Le résultat n'est pas vérifié.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes les questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.

GlaVredFX, 2022.01.17 18:59

Je cherche le code pour fermer les ordres et si je n'en vois pas, je vais ouvrir un nouvel ordre.

Mais pour une raison quelconque, il ne ferme qu'un seul ordre et s'arrête avant le prochain signal.

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e : Signal 1.1322 < clos 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e : Signal 1.1322 > clos 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 08:00:00 e : Signal 1.1325 < clos 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e : Signal 1.1325 > clos 1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 2022.01.04 00:00:00 e : Signal 1.1326 < clos 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e : Signal 1.1326 > clos 1.1296 ExistPosBuy 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e : Signal 1.1328 < clos 1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e : close #1 acheter 0.01 EURUSD à 1.13598 au prix 1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e : Signal 1.1328 > clos 1.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e : ouvert #4 acheter 0.01 EURUSD à 1.13512 ok
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e : Signal 1.134 < fermeture 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e : Signal 1.134 > fermeture 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
Si vous prêtez un peu plus attention à votre question et à votre code, vous verrez par vous-même quel est le problème.
 
Mihail Matkovskij #:

Si vous prêtez un peu plus attention à votre question et à votre code, vous verrez par vous-même.

La question est que l'ordre le plus rentable doit être clôturé sur une barre, puis attendre une nouvelle barre et clôturer à nouveau un ordre rentable. Nous ne devrions pas les fermer tous en même temps.

Cela signifie que nous fermons sur la première barre, mais que rien ne se passe sur la barre suivante.

 
GlaVredFX #:

Le problème est que l'ordre le plus rentable doit être clôturé sur une barre, puis attendre une nouvelle barre et clôturer à nouveau un ordre rentable. Vous ne devez pas les fermer tous en même temps.

Ensuite, vous devez formuler vos questions correctement. Vous n'avez qu'un seul signal. Vous ne recevrez qu'un seul signal à l'ouverture d'une nouvelle barre. S'il n'y a qu'un seul signal, combien d'ordres seront fermés ? Et seulement si le signal apparaît sur une nouvelle barre. Et, s'il n'y a pas de signal, les ordres seront fermés sur les barres suivantes. Encore une fois, s'il y a un signal.

 
Mihail Matkovskij #:

Ensuite, vous devez formuler les questions correctement. Vous n'avez qu'un seul signal. Et c'est à l'ouverture d'un nouveau bar. Et s'il n'y a qu'un seul signal, combien d'ordres seront fermés ? Et seulement si le signal apparaît sur une nouvelle barre. Et, s'il n'y a pas de signal, les ordres seront fermés sur les barres suivantes. Et encore une fois, s'il y a un signal.

Dans ce cas, un organigramme est généralement utile. Ou bien nous devons décrire l'algorithme en détail, point par point, sur une feuille de papier ou dans un fichier texte. Et c'est seulement à ce moment-là que vous comprendrez comment écrire votre code.

 

J'ai besoin d'une fonction pour fermer un ordre ouvert en premier parmi tous les ordres disponibles. qui peut partager.

 
GlaVredFX #:

Donc, si vous avez remarqué, l'algorithme est écrit dans le code.

1) Une nouvelle barre apparaît

2) Si la MA est supérieure au prix de clôture de la barre précédente, passez à l'étape 3 ; si la MA est inférieure au prix de clôture, passez à l'étape 4.

3)Si nous avons une position BUY, nous fermons une position avec un profit maximum dans la paire de devises.

3.1)S'il n'y a pas d'ordre d'achat en cours, ouvrez une position de vente.

4) Si nous avons une position BUY, nous fermons une position avec un profit maximum dans la paire de devises.

4.1) S'il n'y a pas d'ordre de VENTE ouvert, nous ouvrons une position d'ACHAT.


Maintenant, j'ai à nouveau une question, qu'est-ce qui ne va pas dans ce code de l'algorithme décrit ci-dessus :

Ce code contient un ensemble de commandes. Le terminal ne sait pas ce dont vous avez besoin, il ne sait que ce qui est écrit dans le code !

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
Ecrire les variables buySignal etsellSignal de manière globale.
 
Mihail Matkovskij #:

Un ensemble de commandes est écrit dans le code. Le terminal ne sait pas ce dont vous avez besoin, il ne sait que ce qui est écrit dans le code !

J'ai supprimé ce message car le problème est que les ordres doivent être fermés non pas en fonction du profit mais du temps.

C'est parce que nous n'avons pas toujours le bénéfice et pas toujours là où il devrait être.

Par conséquent, nous avons besoin de la fonction"Fermer une position ouverte au tout début de toutes les positions disponibles".

 
GlaVredFX #:

J'ai supprimé ce message, car le problème est que les ordres doivent être fermés en fonction du temps et non du profit.

Parce que le profit n'est pas toujours là et pas toujours là où il devrait être.

Par conséquent, nous avons besoin de la fonction"Fermer une position ouverte au tout début de toutes les positions disponibles".

J'ai ajouté un exemple d'ouverture de position dans le timer dans le post précédent. Pour que l'ouverture de la position soit garantie. Vous pouvez y substituer votre propre fonction.

 
Mihail Matkovskij #:

Ajout d'un exemple d'ouverture d'une position de minuterie dans le post précédent. Pour que l'ouverture du poste soit garantie. Vous pouvez y substituer votre propre fonction.

Mais pas comme ça. Vous devez surveiller le résultat de

ClosePosWithMaxProfitInCurrency

ou une nouvelle fonction de votre part dans OnTradeTransaction. Et s'il n'y a pas de positions, il entrera. Ou écrire le signal dans buySignal ousellSignal et le traiter dans OnTimer comme je l'ai montré dans l'exemple.