ComFracti_v2.1

Author: mich99@o2.pl

Professional Description of the ComFracti.mq4 Script Logic

Overview

The ComFracti.mq4 script is an Expert Advisor (EA) designed for use in MetaTrader 4, a popular trading platform. It automates trading decisions based on specific technical indicators and conditions. The EA operates by placing buy or sell orders when certain criteria are met and manages open positions using trailing stops.

Key Features

  1. Trade Entry Conditions:

    • The script uses fractals, SAR (Parabolic Stop and Reverse) values, and RSI (Relative Strength Index) to determine trade entry points.
    • It places a buy order if the conditions for an upward trend are met or a sell order for a downward trend.
  2. Fractals:

    • Fractals are patterns that indicate potential reversal points in the market.
    • The script checks specific time frames and levels to identify these patterns.
  3. SAR (Parabolic Stop and Reverse):

    • SAR is used to determine the direction of the trend and potential entry points.
    • Two different SAR values are compared to refine trade signals.
  4. RSI (Relative Strength Index):

    • RSI is a momentum oscillator that measures the speed and change of price movements.
    • The script uses RSI to avoid trades when the market is overbought or oversold.
  5. Trailing Stop Management:

    • The EA adjusts stop-loss levels dynamically as prices move in favor of open positions, locking in profits while allowing room for further gains.
  6. Order Management:

    • It checks for existing orders to avoid duplication and manages them based on current market conditions.
    • Optionally closes positions if they are not performing well.
  7. Risk Management:

    • The script calculates lot sizes based on account free margin and predefined risk levels, ensuring that trades do not exceed a certain percentage of the trader's capital.
  8. Customizable Parameters:

    • Users can adjust various parameters such as stop-loss, take-profit, trailing stops, and risk level to suit their trading strategy.

Operation

  • The script runs continuously in the background, checking market conditions at each tick.
  • If the time has not changed since the last check, it exits early to save resources.
  • It evaluates the market using the defined indicators and decides whether to open a new position or adjust existing ones.
  • The EA is designed to be user-friendly, allowing traders with varying levels of experience to implement automated trading strategies.

Conclusion

The ComFracti.mq4 script leverages technical analysis tools like fractals, SAR, and RSI to automate trading decisions in MetaTrader 4. It offers features for trade entry, exit, and risk management, making it a versatile tool for traders looking to automate their strategies while maintaining control over key parameters.

Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Indicators Used
FractalsParabolic Stop and Reverse systemRelative strength index
0 Views
0 Downloads
0 Favorites

Profitability Reports

GBP/USD Oct 2024 - Jan 2025
93.00 %
Total Trades 20
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -3.37
Gross Profit 848.80
Gross Loss -916.20
Total Net Profit -67.40
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
27.00 %
Total Trades 9
Won Trades 4
Lost trades 5
Win Rate 0.44 %
Expected payoff -41.73
Gross Profit 142.40
Gross Loss -518.00
Total Net Profit -375.60
-100%
-50%
0%
50%
100%
ComFracti_v2.1
//+---------------------------------------------------------------------------------+
//|                                 ComFracti.mq4                                   |
//|                                                                                 |
//| If You make too much money with this EA - some gift or donations accepted [:-)  |
//+---------------------------------------------------------------------------------+
#property copyright " mich99@o2.pl "
#property link      " "

//---- input parameters 
extern int          mn = 818;
extern double       tp = 2000; // ( for 5 digits brokers )
extern double       sl = 1000;
extern double       TrailingStop=300;
extern double       lots = 0.1;
extern bool         MM = false;
extern double       Risk= 0.005;
extern double       multilot=0;
extern bool         closeby = false;
static int          prevtime = 0;


extern int          sh2 = 3; 
extern int          sh3 = 3;
extern int          sh4 = 3;
extern int          sh5 = 3;

extern int          per_rsi=3; // rsi1440 period 

extern double       sars1=0.02; // if sar1 = sar2,that sar filter is with out mining.
extern double       sars2=0.03;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if (Time[0] == prevtime) return(0);
   prevtime = Time[0];
   
   if (! IsTradeAllowed()) {
      again();
      return(0);
   }
//----
   int total = OrdersTotal();
   for (int i = 0; i < total; i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {
      
      if(OrderType()<=OP_SELL && TrailingStop>0)
          {
             
              TrailingPositions();

          }
          
           if(OrderType() == OP_BUY && psv()  < 0 && closeby )
          {
             
              OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),30,GreenYellow);

          }
          if(OrderType() == OP_SELL && psv()  > 0 && closeby)
          {
             
              OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),30,GreenYellow);

          }
         return(0);
      } 
   }
   
 
   
   int ticket = -1;
   
   RefreshRates();
   
   if (psv()  > 0) {
      ticket = OrderSend(Symbol(), OP_BUY, LotSize(), Ask, 30, Bid - sl * Point, Bid + tp * Point, WindowExpertName(), mn, 0, Blue); 
      if (ticket < 0) {
         again();      
      }
   } if (psv()  < 0) {
      ticket = OrderSend(Symbol(), OP_SELL, LotSize(), Bid, 30, Ask + sl * Point, Ask - tp * Point, WindowExpertName(), mn, 0, Red); 
      if (ticket < 0) {
         again();
      }
   }
//-- Exit --
   return(0);
}


 double Crof(int t , int s)
    
    
   {
     
   double frup = iFractals(NULL, t, MODE_UPPER, s);
   double frdw = iFractals(NULL, t, MODE_LOWER, s);

  
    
    if ( (frup==0 ) && frdw!=0 ) return (1); 
    if ( (frdw==0 ) && frup!=0 ) return (-1); 
   
    
     
     return (0); //elsewhere
   }    


 

 

      

double psv()   {

    double  s1 = iSAR(NULL, 0, sars1, 0.2, 0);
    double  s2 = iSAR(NULL, 0, sars2, 0.2, 0);
 
    double m6=iRSI(NULL, 1440, per_rsi, PRICE_OPEN, 0);

   if ( Crof(0 , sh2)>0  && Crof(60 , sh3)>0  && m6<50  && s1>=s2 )  return(1);
    
   if ( Crof(0 , sh4)<0  && Crof(60 , sh5)<0  && m6>50  && s1<=s2 ) return(-1);
      
      
   return(0);
  
}

//+--------------------------- getLots ----------------------------------+
   
  double LotSize()
  {
  double DecreaseFactor=multilot;
  
   double lot=lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=MathCeil(AccountFreeMargin() * Risk / 1000)/10;
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>0) lot=NormalizeDouble(lot-(-1)*lot*DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.01) lot=MarketInfo(Symbol(), MODE_MINLOT);
   if(!MM) lot=lots;
   return(lot);
  }
  
  
void TrailingPositions() {
  double pp;
  int TrailingStep = 1;
  bool ProfitTrailing = true;
  pp = Point;
  if (OrderType()==OP_BUY) 
  {
    
    if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*pp*2) 
    {
      if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*pp) 
      {
        ModifyStopLoss(Bid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) 
  {
  
    if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*pp*2) 
    {
      if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) 
      {
        ModifyStopLoss(Ask+TrailingStop*pp);
        return;
      }
    }
  }
}
//--------------------------------------------------------------------------------------// 
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,Yellow);
  
}
//-------------------------



void again() {
   prevtime = Time[1];
   Sleep(10000);
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---