Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 23
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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 ?
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 un chalut. Le script original devait juste fermer lorsque le profit sur l'ordre était atteint.
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.
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... :)
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...
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,
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
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.
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.
Non, je ne suis pas d'accord. Ce code
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);
}
//+------------------------------------------------------------------+