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

 
giannis1386:

Je suis complètement perdue.

double blevel=OrderStopLoss()<Bid-Point*TS; fonctionne pour moi. SL ne s'attaque au prix que pour faire du profit.

double slevel=OrderStopLoss()>Ask+Point*TS; Je ne sais pas comment ajouter celui-ci à else

Ce n'est pas un bool.

Ce n'est pas un bool, mais c'est ce qu'on appelle la conversion implicite.

Que faites-vous de toute façon ? Chalut ?

 
Artyom Trishkin:

Ce n'est pas un bool, mais c'est une conversion implicite.

Que faites-vous de toute façon ? Chalut ?

Oui, j'ai essayé de faire une recherche. Le script original était juste de fermer quand l'ordre a atteint le profit.
 
giannis1386:
Oui, j'ai essayé de faire un chalut. Le script original devait juste fermer lorsque le profit sur l'ordre était atteint.
Pas un script, un EA. Vous confondez les types de programmes. Le script est exécuté une fois après son chargement sur le graphique, puis il est supprimé. S'il n'est pas bouclé. Il est peu probable que quelqu'un fasse un script en boucle pour fermer des positions.
 
giannis1386:
Oui, j'ai essayé de faire un trawl. Le script original était juste de le fermer quand il atteignait le profit sur un ordre.

La logique :

Si le profit de l'ordre courant sélectionné dans la boucle est supérieur à la valeur fixée, si son stoploss est inférieur (pour l'Achat)/ supérieur (pour la Vente) au niveau de chalutage du stoploss calculé, alors déplacez le stop à la nouvelle valeur.

C'est en un mot.

 
Artyom Trishkin:
N'est-ce pas ce que j'ai suggéré ?

Ouais, eh bien... J'ai regardé votre code si inattentivement qu'il vaut mieux dire que je ne l'ai pas regardé du tout. Mais c'est la moitié du problème, ensuite j'ai dit des bêtises dont j'ai presque honte. Pour une raison quelconque, j'ai soudainement eu cette idée folle que ArrayMaximum() pourrait être appliqué à un tableau de structures ou même à un champ séparé de ce tableau.

Je me repens, je ne conseille à personne d'autre de penser ainsi, ça ne marche pas... :)

 
Alexey Viktorov:

Ouais, eh bien... J'ai regardé votre code si inattentivement qu'il vaut mieux dire que je ne l'ai pas regardé du tout. Mais c'est la moitié du problème, ensuite j'ai dit des bêtises dont j'ai presque honte. Pour une raison quelconque, j'ai soudainement eu cette idée folle que ArrayMaximum() pourrait être appliqué à un tableau de structures ou même à un champ séparé de ce tableau.

Je me repens, je ne conseille à personne d'autre de penser ainsi, ça ne marche pas... :)

Eh bien... Et moi ? J'ai parcouru votre code de la même manière et je vous ai remercié - c'était vraiment plus court...

En bref - les deux valent l'anecdote...

 
Artyom Trishkin:
Pas un script, un conseiller expert. Vous confondez les types de programmes. Le script est exécuté une fois après son chargement sur le graphique, puis il est supprimé. S'il n'est pas bouclé. Pratiquement personne ne fera un script en boucle pour fermer des positions.

selon l'auteur :

Voici un script standard MT4 close.mq4 légèrement modifié

Placez le fichier dans le dossier MetaTrader\experts\Scripts,

 
Artyom Trishkin:

Eh bien... Et moi ? Au moment où j'ai jeté un coup d'oeil à votre code, je me suis incliné en signe de gratitude - c'est vraiment plus court...

En bref - les deux valent une blague...

Non, je ne suis pas d'accord. Ce code

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

testé et fonctionne. Il existe de simples tableaux de doubles définis par l'utilisateur, et CopyRates() remplit un tableau de structures. Par conséquent, vous ne pouvez pas choisir le maximum et le minimum en utilisant les fonctions de travail avec les tableaux.

 
giannis1386:

selon l'auteur :

Voici un script standard MT4 close.mq4 légèrement modifié

Placez le fichier dans le dossier MetaTrader\experts\Scripts,

Donc son script ne fonctionne qu'une seule fois - je l'ai mis sur le graphique, le script a fonctionné(positions fermées) et s'est déchargé.

Vous n'avez pas besoin d'un script, vous avez besoin d'un EA.

 
Alexey Viktorov:

Non, je ne suis pas d'accord. Ce code

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

est testé et fonctionne. Ici, il s'agit de simples tableaux de doubles personnalisés, et CopyRates() remplit un tableau de structures et, par conséquent, vous ne pouvez pas sélectionner max et min en utilisant les fonctions de tableau.

Eh bien, je te le dis - je regardais ton code super attentivement aussi. Donc - la blague est à propos de moi.

SZY... Mais mon code renvoie quatre valeurs : High/Low/Highest/Lowest, le vôtre ne renvoie que High et Low, et mon code vérifie le succès de la copie des données (mais pas toutes), le vôtre ne le fait pas...

C'est ainsi que mon code vérifie la copie complète des données requises :

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)==rangeBars) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Raison: