Bonjour, Je vous remercie pour votre réponse
Mais si c’était possible de traduire
Le code que J’ai fourni ça serait cool
En vous remerciant pour votre aide
Ci-joint le codes
//+——————————————————————+
//| Gann high-low activator |
//| |
//+——————————————————————+
#property copyright “www.forex-station.com”
#property link “www.forex-station.com”
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 CLR_NONE
#property indicator_color2 CLR_NONE
#property indicator_color3 CLR_NONE
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
extern string TimeFrame = “Current time frame”;
extern int Lb = 51;
extern bool alertsOn = false;
extern bool alertsOnCurrent = false;
extern bool alertsMessage = false;
extern bool alertsSound = false;
extern bool alertsEmail = false;
extern bool Interpolate = false;
extern int MaxBars = 1000; // Dodane ograniczenie liczby świec
double gup[];
double gdna[];
double gdnb[];
double trend[];
int timeFrame;
string indicatorFileName;
bool returnBars;
bool calculateValue;
//+——————————————————————
//| Initialization |
//+——————————————————————
int init()
{
for (int i = 0; i < indicator_buffers; i++) SetIndexStyle(i, DRAW_LINE);
IndicatorBuffers(4);
SetIndexBuffer(0, gup); SetIndexDrawBegin(0, Lb + 1);
SetIndexBuffer(1, gdna); SetIndexDrawBegin(1, Lb + 1);
SetIndexBuffer(2, gdnb); SetIndexDrawBegin(2, Lb + 1);
SetIndexBuffer(3, trend);
indicatorFileName = WindowExpertName();
calculateValue = (TimeFrame == “calculateValue”); if (calculateValue) return(0);
returnBars = (TimeFrame == “returnBars”); if (returnBars) return(0);
timeFrame = stringToTimeFrame(TimeFrame);
IndicatorShortName(“”);
SetIndexLabel(0, NULL);
SetIndexLabel(1, NULL);
SetIndexLabel(2, NULL);
SetIndexLabel(3, NULL);
return(0);
}
//+——————————————————————
//| Deinitialization |
//+——————————————————————
int deinit()
{
// Remove all vertical lines created by this indicator
for (int i = ObjectsTotal() – 1; i >= 0; i–)
{
string name = ObjectName(i);
if (StringSubstr(name, 0, 4) == “Line”)
{
ObjectDelete(name);
}
}
return(0);
}
//+——————————————————————
//| Calculation |
//+——————————————————————
int start()
{
int counted_bars = IndicatorCounted();
int i, limit;
if (counted_bars < 0) return(-1);
if (counted_bars > 0) counted_bars–;
limit = MathMin(Bars – counted_bars, Bars – 1);
// Zastosowanie ograniczenia MaxBars
limit = MathMin(limit, MaxBars);
if (returnBars) { gup[0] = limit + 1; return(0); }
if (calculateValue || timeFrame == Period())
{
if (!calculateValue && trend[limit] == -1) CleanPoint(limit, gdna, gdnb);
for (i = limit; i >= 0; i–)
{
gdna[i] = EMPTY_VALUE;
gdnb[i] = EMPTY_VALUE;
trend[i] = trend[i + 1];
if (Close[i] > iMA(Symbol(), 0, Lb, 0, MODE_EMA, PRICE_HIGH, i + 1)) trend[i] = 1;
if (Close[i] < iMA(Symbol(), 0, Lb, 0, MODE_EMA, PRICE_LOW, i + 1)) trend[i] = -1;
if (trend[i] == -1)
gup[i] = iMA(Symbol(), 0, Lb, 0, MODE_EMA, PRICE_HIGH, i + 1);
else
gup[i] = iMA(Symbol(), 0, Lb, 0, MODE_EMA, PRICE_LOW, i + 1);
if (!calculateValue && trend[i] == -1) PlotPoint(i, gdna, gdnb, gup);
// Check for trend change and draw vertical line
if (i < Bars – 1 && trend[i] != trend[i + 1] && trend[i] != 0)
{
DrawVerticalLine(i, trend[i]);
}
}
ManageVerticalLines();
manageAlerts();
return(0);
}
limit = MathMax(limit, MathMin(Bars – 1, iCustom(NULL, timeFrame, indicatorFileName, “returnBars”, 0, 0) * timeFrame / Period()));
if (trend[limit] == -1) CleanPoint(limit, gdna, gdnb);
for (i = limit; i >= 0; i–)
{
int y = iBarShift(NULL, timeFrame, Time[i]);
gdna[i] = EMPTY_VALUE;
gdnb[i] = EMPTY_VALUE;
gup[i] = iCustom(NULL, timeFrame, indicatorFileName, “calculateValue”, Lb, 0, y);
trend[i] = iCustom(NULL, timeFrame, indicatorFileName, “calculateValue”, Lb, 3, y);
if (timeFrame <= Period() || y == iBarShift(NULL, timeFrame, Time[i – 1])) continue;
if (!Interpolate) continue;
datetime time = iTime(NULL, timeFrame, y);
for (int n = 1; i + n < Bars && Time[i + n] >= time; n++) continue;
for (int k = 1; k < n; k++)
gup[i + k] = gup[i] + (gup[i + n] – gup[i]) * k / n;
}
for (i = limit; i >= 0; i–) if (trend[i] == -1) PlotPoint(i, gdna, gdnb, gup);
ManageVerticalLines();
manageAlerts();
return(0);
}
//+——————————————————————
//| Manage Alerts |
//+——————————————————————
void manageAlerts()
{
if (!calculateValue && alertsOn)
{
int whichBar = alertsOnCurrent ? 0 : 1;
whichBar = iBarShift(NULL, 0, iTime(NULL, timeFrame, whichBar));
if (trend[whichBar] != trend[whichBar + 1])
{
if (trend[whichBar] == 1) doAlert(whichBar, “UP TREND”);
if (trend[whichBar] == -1) doAlert(whichBar, “DOWN TREND”);
}
}
}
//+——————————————————————
//| Do Alert |
//+——————————————————————
void doAlert(int forBar, string doWhat)
{
static string previousAlert = “nothing”;
static datetime previousTime;
string message;
if (previousAlert != doWhat || previousTime != Time[forBar])
{
previousAlert = doWhat;
previousTime = Time[forBar];
message = StringConcatenate(Symbol(), Period(), ” at “, TimeToStr(TimeLocal()), “::: “, doWhat);
if (alertsMessage) Alert(message);
if (alertsEmail) SendMail(StringConcatenate(Symbol(), “Gann HL “), message);
if (alertsSound) PlaySound(“alert2.wav”);
}
}
//+——————————————————————
//| Draw Vertical Line |
//+——————————————————————
void DrawVerticalLine(int i, int trendValue)
{
datetime lineTime = Time[i];
string lineName = “Line” + TimeToStr(lineTime, TIME_DATE|TIME_MINUTES);
color lineColor = (trendValue == 1) ? Lime : Magenta;
// Check if the line already exists
if (ObjectFind(0, lineName) == -1)
{
ObjectCreate(0, lineName, OBJ_VLINE, 0, lineTime, 0);
ObjectSetInteger(0, lineName, OBJPROP_COLOR, lineColor);
ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DOT);
ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 1);
ObjectSetInteger(0, lineName, OBJPROP_RAY_RIGHT, false); // Ensure label is not printed
ObjectSetInteger(0, lineName, OBJPROP_BACK, true); // Draw line in background
}
else
{
ObjectSetInteger(0, lineName, OBJPROP_COLOR, lineColor); // Update line color if it exists
}
}
//+——————————————————————
//| Utility Functions |
//+——————————————————————
string sTfTable[] = {“M1”, “M5”, “M15”, “M30”, “H1”, “H4”, “D1”, “W1”, “MN”};
int iTfTable[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};
int stringToTimeFrame(string tfs)
{
tfs = stringUpperCase(tfs);
for (int i = ArraySize(iTfTable) – 1; i >= 0; i–)
if (tfs == sTfTable[i] || tfs == “” + iTfTable[i]) return(MathMax(iTfTable[i], Period()));
return(Period());
}
string timeFrameToString(int tf)
{
for (int i = ArraySize(iTfTable) – 1; i >= 0; i–)
if (tf == iTfTable[i]) return(sTfTable[i]);
return(“”);
}
string stringUpperCase(string str)
{
string s = str;
for (int length = StringLen(str) – 1; length >= 0; length–)
{
int tchar = StringGetChar(s, length);
if ((tchar > 96 && tchar < 123) || (tchar > 223 && tchar < 256))
s = StringSetChar(s, length, tchar – 32);
else if (tchar > -33 && tchar < 0)
s = StringSetChar(s, length, tchar + 224);
}
return(s);
}
void CleanPoint(int i, double& first[], double& second[])
{
if ((second[i] != EMPTY_VALUE) && (second[i + 1] != EMPTY_VALUE))
second[i + 1] = EMPTY_VALUE;
else if ((first[i] != EMPTY_VALUE) && (first[i + 1] != EMPTY_VALUE) && (first[i + 2] == EMPTY_VALUE))
first[i + 1] = EMPTY_VALUE;
}
void PlotPoint(int i, double& first[], double& second[], double& from[])
{
if (first[i + 1] == EMPTY_VALUE)
{
if (first[i + 2] == EMPTY_VALUE)
{
first[i] = from[i];
first[i + 1] = from[i + 1];
second[i] = EMPTY_VALUE;
}
else
{
second[i] = from[i];
second[i + 1] = from[i + 1];
first[i] = EMPTY_VALUE;
}
}
else
{
first[i] = from[i];
second[i] = EMPTY_VALUE;
}
}
//+——————————————————————
//| New Utility Function to Remove Vertical Line if Trend Reverts |
//+——————————————————————
void RemoveVerticalLineIfTrendReverts(int i)
{
datetime lineTime = Time[i];
string lineName = “Line” + TimeToStr(lineTime, TIME_DATE|TIME_MINUTES);
if (ObjectFind(0, lineName) != -1)
{
ObjectDelete(lineName);
}
}
//+——————————————————————
//| New Function to Manage Vertical Lines |
//+——————————————————————
void ManageVerticalLines()
{
int currentTrend = trend[0];
int previousTrend = trend[1];
if (currentTrend != previousTrend)
{
DrawVerticalLine(0, currentTrend);
}
else if (currentTrend == previousTrend && ObjectFind(0, “Line” + TimeToStr(Time[0], TIME_DATE|TIME_MINUTES)) != -1)
{
RemoveVerticalLineIfTrendReverts(0);
}