TheButterFlyMethod/Developing a Trading Strategy: The Butterfly Oscillator Method

109 Zeilen
Kein EOL
3,3 KiB
Text

#include <Canvas\Canvas.mqh>
// Create canvas for drawing
int width = 800; // Canvas width
int height = 600; // Canvas height
string canvas_name = "ButterflyCurve";
// Create canvas object
CCanvas canvas;
if(!canvas.CreateBitmapLabel(canvas_name, 200, 50, width, height, COLOR_FORMAT_XRGB_NOALPHA))
{
Print("Error creating canvas: ", GetLastError());
return;
}
// Set up drawing parameters
int points = 1000; // Number of points
double t_start = 0; // Start angle
double t_end = 12 * M_PI; // End angle
double step = (t_end - t_start) / (points - 1);
// Calculate curve points
double x[], y[];
ArrayResize(x, points);
ArrayResize(y, points);
for(int i = 0; i < points; i++)
{
double t = t_start + i * step;
double expr = MathExp(MathCos(t)) - 2 * MathCos(4 * t) - MathPow(MathSin(t/12), 5);
x[i] = MathSin(t) * expr;
y[i] = MathCos(t) * expr;
}
// Find coordinate bounds for scaling
double x_min = x[ArrayMinimum(x)];
double x_max = x[ArrayMaximum(x)];
double y_min = y[ArrayMinimum(y)];
double y_max = y[ArrayMaximum(y)];
// Scale points to canvas coordinates
int x_px[], y_px[];
ArrayResize(x_px, points);
ArrayResize(y_px, points);
double x_scale = (width - 40) / (x_max - x_min);
double y_scale = (height - 40) / (y_max - y_min);
double scale = MathMin(x_scale, y_scale); // Maintain aspect ratio
for(int i = 0; i < points; i++)
{
x_px[i] = (int)((x[i] - x_min) * scale) + 20;
y_px[i] = height - (int)((y[i] - y_min) * scale) - 20; // Flip Y-axis for canvas coordinates
// Draw the curve
canvas.Erase(ColorToARGB(clrWhite, 255)); // White background
// Set line color - we'll pass this directly to Line() method
uint line_color = ColorToARGB(clrBlue, 255);
// Draw the polyline
for(int i = 1; i < points; i++)
{
canvas.Line(x_px[i-1], y_px[i-1], x_px[i], y_px[i], line_color);
}
// Title
canvas.FontSet("Arial", 20, FW_BOLD);
canvas.TextOut(300, 20, "Butterfly Curve", ColorToARGB(clrBlack, 255));
// Update display
canvas.Update();
//--- plot Butterfly
#property indicator_label1 "Butterfly Oscillator"
#property indicator_type1 DRAW_LINE
#property indicator_color1 DodgerBlue
#property indicator_width1 2
#property indicator_style1 STYLE_SOLID
//--- indicator levels
#property indicator_level1 2.5
#property indicator_level2 -2.5
#property indicator_level3 0.0
//--- input parameters
input bool UsePriceStep = false; // Use ClosePrice as Step size for t increment
input double tmStep = 0.05; // Step size for t increment
double CalButterflyValue(int bar_index, double bar_close, double bar_open)
{
double tStep = UsePriceStep ? MathMod((bar_close - bar_open) / _Point, tmStep) : tmStep;
double t = bar_index * tStep;
// Butterfly curve formula
double x = MathSin(t) *
(MathExp(MathCos(t)) - 2.0 * MathCos(4.0 * t) - MathPow(MathSin(t / 12.0), 5));
return (x);
}
int pStart = prev_calculated == 0 ? 0 : prev_calculated - 1;
for(int i = pStart; i < rates_total; i++)
{
double bar_close = close[i];
double bar_open = open[i];
ButterflyBuffer[i] = CalButterflyValue(i, bar_close, bar_open);
}