Spécifications
the sl doesnt work i want the tp logic to remain
i need the trend direction fucntion tow ork i the trend is up then only buys if down only sells
i need the fibo nacci fucntion to work as well
and the flat zone function to work as well
and i need the code to trade 1% of the balance
//+------------------------------------------------------------------+
//| US500_EA.mq4 |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.07"
#property strict
// Input parameters
extern int SMA14_Period = 14;
extern int SMA50_Period = 50;
extern int SMA100_Period = 100;
extern int DistinctTrend_Period = 10; // Period for detecting distinct trend
extern int FlatRange_Period = 5; // Period for detecting flat range
extern int MagicNumber = 12345;
// Global variables for trading
double sma14, sma50, sma100;
double upper15Percent, lower15Percent;
// Constants for US500 on IC Markets
const string SYMBOL = "US500";
const double LOT_SIZE = 1.0;
const double POINT_VALUE = 0.1; // Adjust this based on IC Markets' US500 contract specifications
const double STOP_LOSS_POINTS = 1.75; // Stop loss in points
const double TAKE_PROFIT_POINTS = 1.5; // Take profit in points
// Line names for chart objects
const string SMA14_LINE = "SMA14_Line";
const string SMA50_LINE = "SMA50_Line";
const string SMA100_LINE = "SMA100_Line";
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Check if the current symbol is US500
if (Symbol() != SYMBOL)
{
Print("This EA is designed to work only with ", SYMBOL);
return INIT_FAILED;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Remove all chart objects created by this EA
ObjectsDeleteAll(0, OBJ_TREND);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Calculate and draw SMAs
CalculateAndDrawIndicators();
// Check if there's already an open trade
if (IsTradeOpen())
{
return; // Exit the function as we don't want to open new trades
}
// Determine market conditions
double highestHigh = High[iHighest(NULL, 0, MODE_HIGH, 100, 0)];
double lowestLow = Low[iLowest(NULL, 0, MODE_LOW, 100, 0)];
double range = highestHigh - lowestLow;
upper15Percent = highestHigh - 0.15 * range;
lower15Percent = lowestLow + 0.15 * range;
bool distinctUptrend = IsDistinctTrend(1);
bool distinctDowntrend = IsDistinctTrend(-1);
bool inFibZone = (Bid >= upper15Percent || Bid <= lower15Percent);
double currentSpread = MarketInfo(Symbol(), MODE_SPREAD) * POINT_VALUE;
// Trading logic
if (sma14 > sma50 && distinctUptrend && !inFibZone && !IsFlatRange())
{
OpenOrder(OP_BUY, currentSpread);
}
else if (sma14 < sma50 && distinctDowntrend && !inFibZone && !IsFlatRange())
{
OpenOrder(OP_SELL, currentSpread);
}
}
//+------------------------------------------------------------------+
//| Calculate and draw SMAs |
//+------------------------------------------------------------------+
void CalculateAndDrawIndicators()
{
int draw_begin = Bars - 1000; // Draw for the last 1000 bars
// Calculate current SMA values
sma14 = iMA(NULL, 0, SMA14_Period, 0, MODE_SMA, PRICE_CLOSE, 0);
sma50 = iMA(NULL, 0, SMA50_Period, 0, MODE_SMA, PRICE_CLOSE, 0);
sma100 = iMA(NULL, 0, SMA100_Period, 0, MODE_SMA, PRICE_CLOSE, 0);
DrawSMA(SMA14_LINE, SMA14_Period, draw_begin, Blue);
DrawSMA(SMA50_LINE, SMA50_Period, draw_begin, Red);
DrawSMA(SMA100_LINE, SMA100_Period, draw_begin, Green);
}
//+------------------------------------------------------------------+
//| Draw an SMA line on the chart |
//+------------------------------------------------------------------+
void DrawSMA(const string name, const int period, const int draw_begin, const color line_color)
{
ObjectDelete(name);
ObjectCreate(name, OBJ_TREND, 0, Time[draw_begin], iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, draw_begin),
Time[0], iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, 0));
ObjectSetInteger(0, name, OBJPROP_COLOR, line_color);
ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, true);
}
//+------------------------------------------------------------------+
//| Check if the market is in a distinct trend |
//+------------------------------------------------------------------+
bool IsDistinctTrend(int direction)
{
for (int i = 1; i <= DistinctTrend_Period; i++)
{
double previousSMA100 = iMA(NULL, 0, SMA100_Period, 0, MODE_SMA, PRICE_CLOSE, i);
if (direction * (sma100 - previousSMA100) <= 0)
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| Check if the market is in a flat range |
//+------------------------------------------------------------------+
bool IsFlatRange()
{
double previousSMA100 = iMA(NULL, 0, SMA100_Period, 0, MODE_SMA, PRICE_CLOSE, 1);
double previousSMA50 = iMA(NULL, 0, SMA50_Period, 0, MODE_SMA, PRICE_CLOSE, 1);
return (MathAbs(sma100 - sma50) < FlatRange_Period * POINT_VALUE &&
MathAbs(sma100 - previousSMA100) < 0.001 &&
MathAbs(sma50 - previousSMA50) < 0.001);
}
//+------------------------------------------------------------------+
//| Open an order |
//+------------------------------------------------------------------+
void OpenOrder(int orderType, double spread)
{
// First, check if there's already an open trade
if (IsTradeOpen())
{
Print("A trade is already open. Skipping new order.");
return;
}
double price = (orderType == OP_BUY) ? Ask : Bid;
// Calculate stop loss: 1.75 points plus spread
double stopLossDistance = STOP_LOSS_POINTS * POINT_VALUE + spread;
double stopLoss = (orderType == OP_BUY) ? NormalizeDouble(price - stopLossDistance, Digits)
: NormalizeDouble(price + stopLossDistance, Digits);
// Calculate take profit: 1.5 points net
double takeProfitDistance = TAKE_PROFIT_POINTS * POINT_VALUE + spread; // Adding spread to make it net
double takeProfit = (orderType == OP_BUY) ? NormalizeDouble(price + takeProfitDistance, Digits)
: NormalizeDouble(price - takeProfitDistance, Digits);
int ticket = OrderSend(SYMBOL, orderType, LOT_SIZE, price, 3, stopLoss, takeProfit, "US500 Order", MagicNumber, 0, clrGreen);
if (ticket < 0)
{
Print("OrderSend failed with error #", GetLastError());
}
else
{
Print("Order opened successfully. Ticket: ", ticket, ", Stop Loss: ", stopLoss, ", Take Profit: ", takeProfit);
}
}
//+------------------------------------------------------------------+
//| Check if there's an open trade |
//+------------------------------------------------------------------+
bool IsTradeOpen()
{
for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == SYMBOL && OrderMagicNumber() == MagicNumber)
{
return true;
}
}
}
return false;
}