WIP RSI Alert
This commit is contained in:
+284
@@ -0,0 +1,284 @@
|
|||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| LearnCAppDialog.mq5 |
|
||||||
|
//| Copyright 2018, MetaQuotes Software Corp. |
|
||||||
|
//| https://www.mql5.com |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
#property copyright "Copyright 2025, Perco"
|
||||||
|
#property link "https://www.mql5.com"
|
||||||
|
#property version "1.00"
|
||||||
|
#include <Controls\Dialog.mqh>
|
||||||
|
#include <Controls\Button.mqh>
|
||||||
|
#include <Controls\CheckGroup.mqh>
|
||||||
|
#include <Controls\CheckBox.mqh> // ← AJOUT: Include pour checkbox
|
||||||
|
#include <Controls\Label.mqh> // ← NOUVEAU: Include pour label
|
||||||
|
|
||||||
|
CAppDialog AppWindow;
|
||||||
|
CButton m_button1; // the button object
|
||||||
|
CButton m_button2; // the button object
|
||||||
|
CButton m_button3; // the button object
|
||||||
|
CButton m_button4; // the button object
|
||||||
|
CButton m_button_locker; // the button object
|
||||||
|
CCheckBox m_checkbox_sound; // ← AJOUT: checkbox pour alerte sonore
|
||||||
|
CLabel m_label_rsi; // ← NOUVEAU: label pour valeur RSI
|
||||||
|
|
||||||
|
//--- Variables RSI
|
||||||
|
int rsi_handle; // ← NOUVEAU: handle pour RSI
|
||||||
|
double rsi_buffer[]; // ← NOUVEAU: buffer pour RSI
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert initialization function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
int OnInit()
|
||||||
|
{
|
||||||
|
//--- Créer le handle RSI
|
||||||
|
rsi_handle = iRSI(_Symbol, _Period, 14, PRICE_CLOSE);
|
||||||
|
if(rsi_handle == INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
Print("Erreur lors de la création du handle RSI");
|
||||||
|
return(INIT_FAILED);
|
||||||
|
}
|
||||||
|
ArraySetAsSeries(rsi_buffer, true);
|
||||||
|
|
||||||
|
//--- create application dialog
|
||||||
|
if(!AppWindow.Create(0,"RSI Alert",0,5,82,200,300))
|
||||||
|
return(INIT_FAILED);
|
||||||
|
//--- create dependent controls
|
||||||
|
if(!CreateButton1())
|
||||||
|
return(INIT_FAILED);
|
||||||
|
if(!CreateButton2())
|
||||||
|
return(INIT_FAILED);
|
||||||
|
if(!CreateButton3())
|
||||||
|
return(INIT_FAILED);
|
||||||
|
if(!CreateButton4())
|
||||||
|
return(INIT_FAILED);
|
||||||
|
if(!CreateButton_locker())
|
||||||
|
return(INIT_FAILED);
|
||||||
|
if(!CreateCheckBoxSound()) // ← AJOUT: Créer la checkbox
|
||||||
|
return(INIT_FAILED);
|
||||||
|
if(!CreateLabelRSI()) // ← NOUVEAU: Créer le label RSI
|
||||||
|
return(INIT_FAILED);
|
||||||
|
//--- run application
|
||||||
|
AppWindow.Run();
|
||||||
|
//--- succeed
|
||||||
|
return(INIT_SUCCEEDED);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert deinitialization function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void OnDeinit(const int reason)
|
||||||
|
{
|
||||||
|
//--- Libérer le handle RSI
|
||||||
|
if(rsi_handle != INVALID_HANDLE)
|
||||||
|
IndicatorRelease(rsi_handle);
|
||||||
|
//--- destroy dialog
|
||||||
|
AppWindow.Destroy(reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert chart event function |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void OnChartEvent(const int id, // event ID
|
||||||
|
const long& lparam, // event parameter of the long type
|
||||||
|
const double& dparam, // event parameter of the double type
|
||||||
|
const string& sparam) // event parameter of the string type
|
||||||
|
{
|
||||||
|
AppWindow.ChartEvent(id,lparam,dparam,sparam);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Expert tick function - NOUVEAU |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void OnTick()
|
||||||
|
{
|
||||||
|
//--- Mettre à jour la valeur RSI
|
||||||
|
UpdateRSIDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| defines |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//--- indents and gaps
|
||||||
|
#define INDENT_LEFT (11) // indent from left (with allowance for border width)
|
||||||
|
#define INDENT_TOP (11) // indent from top (with allowance for border width)
|
||||||
|
#define CONTROLS_GAP_X (5) // gap by X coordinate
|
||||||
|
//--- for buttons
|
||||||
|
#define BUTTON_WIDTH (20) // size by X coordinate
|
||||||
|
#define BUTTON_HEIGHT (20) // size by Y coordinate
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create the "Button1" button |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateButton1(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1=INDENT_LEFT; // x1 = 11 pixels
|
||||||
|
int y1=INDENT_TOP + 25; // y1 = 11 pixels
|
||||||
|
int x2=x1+BUTTON_WIDTH; // x2 = 11 + 100 = 111 pixels
|
||||||
|
int y2=y1+BUTTON_HEIGHT; // y2 = 11 + 20 = 32 pixels
|
||||||
|
//--- create
|
||||||
|
if(!m_button1.Create(0,"Button1",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_button1.Text("+"))
|
||||||
|
return(false);
|
||||||
|
if(!AppWindow.Add(m_button1))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create Button2 |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateButton2(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1 = INDENT_LEFT+ 25;
|
||||||
|
int y1 = INDENT_TOP + 25 ; // Position sous le premier bouton
|
||||||
|
int x2 = x1 + BUTTON_WIDTH;
|
||||||
|
int y2 = y1 + BUTTON_HEIGHT;
|
||||||
|
//--- create
|
||||||
|
if(!m_button2.Create(0,"Button2",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_button2.Text("-"))
|
||||||
|
return(false);
|
||||||
|
if(!AppWindow.Add(m_button2))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create the "Button3" button |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateButton3(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1=INDENT_LEFT; // x1 = 11 pixels
|
||||||
|
int y1=INDENT_TOP + 55; // y1 = 11 pixels
|
||||||
|
int x2=x1+BUTTON_WIDTH; // x2 = 11 + 100 = 111 pixels
|
||||||
|
int y2=y1+BUTTON_HEIGHT; // y2 = 11 + 20 = 32 pixels
|
||||||
|
//--- create
|
||||||
|
if(!m_button3.Create(0,"Button3",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_button3.Text("+"))
|
||||||
|
return(false);
|
||||||
|
if(!AppWindow.Add(m_button3))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create Button4 |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateButton4(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1 = INDENT_LEFT+ 25;
|
||||||
|
int y1 = INDENT_TOP + 55; // Position sous le premier bouton
|
||||||
|
int x2 = x1 + BUTTON_WIDTH;
|
||||||
|
int y2 = y1 + BUTTON_HEIGHT;
|
||||||
|
//--- create
|
||||||
|
if(!m_button4.Create(0,"Button4",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_button4.Text("-"))
|
||||||
|
return(false);
|
||||||
|
if(!AppWindow.Add(m_button4))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create Button_locker |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateButton_locker(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1 = INDENT_LEFT+ 150;
|
||||||
|
int y1 = INDENT_TOP + 150; // Position sous le premier bouton
|
||||||
|
int x2 = x1 + BUTTON_WIDTH;
|
||||||
|
int y2 = y1 + BUTTON_HEIGHT;
|
||||||
|
//--- create
|
||||||
|
if(!m_button_locker.Create(0,"Button_locker ",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_button_locker.Text("🔒"))
|
||||||
|
return(false);
|
||||||
|
if(!AppWindow.Add(m_button_locker))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create CheckBox pour alerte sonore |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateCheckBoxSound(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1 = INDENT_LEFT ;
|
||||||
|
int y1 = INDENT_TOP + 85; // Position sous les autres boutons
|
||||||
|
int x2 = x1 + 120; // Largeur pour le texte "Alerte sonore"
|
||||||
|
int y2 = y1 + 20; // Hauteur standard
|
||||||
|
//--- create
|
||||||
|
if(!m_checkbox_sound.Create(0,"CheckBoxSound",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_checkbox_sound.Text("Alerte sonore"))
|
||||||
|
return(false);
|
||||||
|
m_checkbox_sound.Checked(true); // ← CORRECTION: Utiliser Checked() au lieu de Check()
|
||||||
|
//--- add to dialog
|
||||||
|
if(!AppWindow.Add(m_checkbox_sound))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Create Label pour valeur RSI |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
bool CreateLabelRSI(void)
|
||||||
|
{
|
||||||
|
//--- coordinates
|
||||||
|
int x1 = INDENT_LEFT + 25;
|
||||||
|
int y1 = INDENT_TOP; // Position sous la checkbox
|
||||||
|
int x2 = x1 + 150; // Largeur pour "RSI: 00.00"
|
||||||
|
int y2 = y1 + 25; // Hauteur un peu plus grande
|
||||||
|
//--- create
|
||||||
|
if(!m_label_rsi.Create(0,"LabelRSI",0,x1,y1,x2,y2))
|
||||||
|
return(false);
|
||||||
|
if(!m_label_rsi.Text("RSI: ---.--")) // Texte initial
|
||||||
|
return(false);
|
||||||
|
if(!m_label_rsi.Color(clrLime)) // Couleur verte
|
||||||
|
return(false);
|
||||||
|
//--- add to dialog
|
||||||
|
if(!AppWindow.Add(m_label_rsi))
|
||||||
|
return(false);
|
||||||
|
//--- succeed
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
//| Mettre à jour l'affichage RSI |
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
void UpdateRSIDisplay()
|
||||||
|
{
|
||||||
|
//--- Copier les données RSI
|
||||||
|
if(CopyBuffer(rsi_handle, 0, 0, 1, rsi_buffer) <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//--- Obtenir la valeur actuelle
|
||||||
|
double current_rsi = rsi_buffer[0];
|
||||||
|
|
||||||
|
//--- Créer le texte avec couleur selon niveau
|
||||||
|
string rsi_text = "RSI: " + DoubleToString(current_rsi, 2);
|
||||||
|
|
||||||
|
//--- Changer la couleur selon les niveaux
|
||||||
|
color rsi_color = clrLime; // Neutre (vert)
|
||||||
|
|
||||||
|
if(current_rsi >= 70.0)
|
||||||
|
rsi_color = clrRed; // Surachat (rouge)
|
||||||
|
else if(current_rsi <= 30.0)
|
||||||
|
rsi_color = clrCyan; // Survente (cyan)
|
||||||
|
|
||||||
|
//--- Mettre à jour le label
|
||||||
|
m_label_rsi.Text(rsi_text);
|
||||||
|
m_label_rsi.Color(rsi_color);
|
||||||
|
// Refresh() supprimé - pas nécessaire avec CLabel
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user