//--- description
#property description "Le script dessine l'objet graphique \"Ligne Horizontale\"."
#property description "Les coordonnées du point d'ancrage sont en pourcentage de la taille"
#property description "de la fenêtre du graphique."
//--- affichage de la fenêtre des paramètres d'entrée lors du lancement du script
#property script_show_inputs
//--- paramètres d'entrée du script
input string InpName="HLine"; // Nom de la ligne
input int InpPrice=25; // Prix de la ligne, %
input color InpColor=clrRed; // Couleur de la ligne
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Style de la ligne
input int InpWidth=3; // Largeur de ligne
input bool InpBack=false; // Ligne d'arrière-plan
input bool InpSelection=true; // Mise en surbrillance pour déplacer
input bool InpHidden=true; // Caché dans la liste des objets
input long InpZOrder=0; // Priorité du clic de souris
//+----------------------------------------------------------------------------------------------------+
//| Crée une ligne horizontale |
//+----------------------------------------------------------------------------------------------------+
bool HLineCreate(const long chart_ID=0, // identifiant du graphique
const string name="HLine", // Nom de la ligne
const int sub_window=0, // indice de sous-fenêtre
double price=0, // Prix de la ligne
const color clr=clrRed, // couleur de la ligne
const ENUM_LINE_STYLE style=STYLE_SOLID, // style de la ligne
const int width=1, // largeur de la ligne
const bool back=false, // en arrière plan
const bool selection=true, // mise en surbrillance pour le déplacement
const bool hidden=true, // caché dans la liste des objets
const long z_order=0) // priorité pour le clic de souris
{
//--- si le prix n'est pas défini, la positionne au niveau du prix Bid actuel
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- réinitialise la valeur d'erreur
ResetLastError();
//--- crée une ligne horizontale
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
{
Print(__FUNCTION__,
": impossible de créer une ligne horizontale ! Code d'erreur = ",GetLastError());
return(false);
}
//--- définit la couleur de la ligne
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- définit le style d'affichage de la ligne
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- définit la largeur de la ligne
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- affiche en premier plan (false) ou en arrière-plan (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- active (true) ou désactive (false) le mode de déplacement de la ligne à la souris
//--- lors de la création d'un objet graphique utilisant la fonction ObjectCreate, l'objet ne peut pas être
//--- mis en surbrillance et déplacé par défaut. Dans cette méthode, le paramètre de sélection
//--- est vrai par défaut, permettant de mettre en surbrillance et de déplacer l'objet
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- masque (true) ou affiche (false) le nom de l'objet graphique dans la liste des objets
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- définit la priorité pour recevoir l'événement d'un clic de souris dans le graphique
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- exécution réussie
return(true);
}
//+----------------------------------------------------------------------------------------------------+
//| Déplace la ligne horizontale |
//+----------------------------------------------------------------------------------------------------+
bool HLineMove(const long chart_ID=0, // identifiant du graphique
const string name="HLine", // Nom de la ligne
double price=0) // Prix de la ligne
{
//--- si le prix de la ligne n'est pass défini, la déplace au niveau du prix Bid actuel
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- réinitialise la valeur d'erreur
ResetLastError();
//--- déplace la ligne horizontale
if(!ObjectMove(chart_ID,name,0,0,price))
{
Print(__FUNCTION__,
": impossible de déplacer la ligne horizontale ! Code d'erreur = ",GetLastError());
return(false);
}
//--- exécution réussie
return(true);
}
//+----------------------------------------------------------------------------------------------------+
//| Supprime une ligne horizontale |
//+----------------------------------------------------------------------------------------------------+
bool HLineDelete(const long chart_ID=0, // identifiant du graphique
const string name="HLine") // Nom de la ligne
{
//--- réinitialise la valeur d'erreur
ResetLastError();
//--- supprime la ligne horizontale
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": impossible de supprimer la ligne horizontale ! Code d'erreur = ",GetLastError());
return(false);
}
//--- exécution réussie
return(true);
}
//+----------------------------------------------------------------------------------------------------+
//| Fonction de démarrage du script |
//+----------------------------------------------------------------------------------------------------+
void OnStart()
{
//--- vérifie l'exactitude des paramètres d'entrée
if(InpPrice<0 || InpPrice>100)
{
Print("Erreur ! Valeurs incorrectes des paramètres d'entrée !");
return;
}
//--- taille du tableau des prix
int accuracy=1000;
//--- tableau pour stocker les valeurs de prix à utiliser
//--- pour le réglage et la modification des coordonnées des points d'ancrage des lignes
double price[];
//--- allocation mémoire
ArrayResize(price,accuracy);
//--- remplit le tableau des prix
//--- trouve les valeurs les plus élevées et les plus faibles du graphique
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- définit un changement de prix et remplit le tableau
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- définit les points pour dessiner la ligne
int p=InpPrice*(accuracy-1)/100;
//--- crée une ligne horizontale
if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redéssine le graphique et attend 1 seconde
ChartRedraw();
Sleep(1000);
//--- déplace maintenant la ligne
//--- compteur de boucle
int v_steps=accuracy/2;
//--- déplace la ligne
for(int i=0;i<v_steps;i++)
{
//--- utilise la valeur suivante
if(p<accuracy-1)
p+=1;
//--- déplace le point
if(!HLineMove(0,InpName,price[p]))
return;
//--- vérifie si l'exécution du script a été stoppée
if(IsStopped())
return;
//--- redessine le graphique
ChartRedraw();
}
//--- délai de 1 seconde
Sleep(1000);
//--- supprime du graphique
HLineDelete(0,InpName);
ChartRedraw();
//--- délai de 1 seconde
Sleep(1000);
//---
}
|