FarhadCrab61

Download script
Author: Copyright � 2007, Farhad Farshad
Profit factor:
1.37

FarhadCrab6.mq4 Trading Logic Overview

This document provides a professional, non-technical explanation of the automated trading logic contained within the FarhadCrab6 script. The system is designed primarily for the EURUSD currency pair on a 1-minute timeframe.

1. Risk Management and Safety Switches

The script includes several high-level safety protocols to protect the trading account:

  • Equity Protection: The system monitors your account balance and "floating" profit/loss. If the total loss exceeds a specific percentage of your initial deposit, or if the profit reaches a certain target, the EA is programmed to automatically close all open positions.
  • Margin Check: Before opening any new trades, the script checks if there is enough free money (margin) available. If the account lacks sufficient funds, it will stop from placing new orders.
  • Trade Spacing: To prevent "over-trading," the system ensures that it does not open multiple positions simultaneously unless specific conditions are met, and it enforces a minimum waiting period between actions.

2. Market Analysis Indicators

The script uses four main technical tools to "read" the market:

  • Long-Term Moving Average (55 periods): Used to determine the overall trend of the market (upward or downward).
  • RSI (Relative Strength Index): Used to identify "Overbought" conditions (where the price might be too high) or "Oversold" conditions (where the price might be too low).
  • DeMarker: A momentum indicator used alongside the RSI to confirm price fluctuations and entry signals.
  • ADX (Average Directional Index): This is used specifically to calculate your Take Profit. It helps the system determine if the market is trending strongly or moving sideways, adjusting the profit target accordingly.

3. Trade Entry Logic

The EA looks for specific "conflicts" between momentum and price action to enter trades:

Buy Signals (Going Long)

  • Standard Entry: The system looks for a situation where the DeMarker indicator is very low (Oversold) AND the RSI is below 30. This suggests the price has dropped too far and may bounce back up.
  • Hedged Entry: If the account is already in a specific state, it may look for an "Oversold" signal combined with a rising DeMarker to open a protective "hedge" buy position.

Sell Signals (Going Short)

  • Standard Entry: The system looks for a situation where the DeMarker indicator is very high (Overbought) AND the RSI is above 70. This suggests the price has risen too far and may drop back down.
  • Hedged Entry: Similar to the buy side, it monitors the DeMarker for an "Overbought" trend to open a protective sell position if conditions allow.

4. Dynamic Trade Management

Once a trade is live, the script manages it actively:

  • Dynamic Take Profit: The system checks the ADX indicator. If the market is moving sideways (low volatility), it uses a "Sideway" profit target. If there is a strong trend, it uses a larger, standard profit target.
  • Trailing Stop: The EA features a "Trailing Stop" mechanism for both Buy and Sell positions. As the price moves in your favor, the script automatically moves the "Stop Loss" closer to the current price. This allows the trade to stay open as long as it remains profitable while locking in gains as the price continues to move.
  • Position Coloring: The script utilizes different colors (Blue, Aqua, Red, Violet) to visually distinguish between different types of open positions (Open vs. Closed, Buy vs. Sell) on the trading chart.
Price Data Components
Series array that contains open time of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reachedIt Closes Orders by itself
Indicators Used
DeMarker indicatorRelative strength indexMovement directional indexMoving average indicator
17 Views
0 Downloads
0 Favorites
FarhadCrab61
//+------------------------------------------------------------------+
//|     FarhadCrab6.mq4 |
//|     Copyright © 2007, Farhad Farshad |
//|     http://www.fxperz.com
//|     info@farhadfarshad.com
//|     info@fxperz.com
//|     ***** PLEASE NOTE *****
//|     This EA best works on EURUSD 1M TimeFrame. 
//|     If you get money from this EA please donate some to poor people of your country.
//+-----------------------------------------------------------------+
#property copyright "Copyright © 2007, Farhad Farshad"
#property link      "http://www.fxperz.com"
#include <stdlib.mqh>

extern double maxLoss        = 100; // Maximum Loss that you can bear in percent
extern double maxYield       = 0.1; // a number between 0 to 100 (not more than 10 is recommended)
extern double lTakeProfit    = 300;   // recomended  no more than 20
extern double sTakeProfit    = 300;   // recomended  no more than 20
extern double takeProfit     = 300;            // recomended  no more than 20
extern double pr             = 300;      //take profit in sideway markets.
extern double stopLoss       = 0;             // 
extern int magicEA           = 124;        // Magic EA identifier. Allows for several co-existing EA with different input values
extern double lTrailingStop  = 15;   // trail stop in points
extern double sTrailingStop  = 15;   // trail stop in points
extern color clOpenBuy       = Blue;  //Different colors for different positions
extern color clCloseBuy      = Aqua;  //Different colors for different positions
extern color clOpenSell      = Red;  //Different colors for different positions
extern color clCloseSell     = Violet;  //Different colors for different positions
extern color clModiBuy       = Blue;   //Different colors for different positions
extern color clModiSell      = Red;   //Different colors for different positions
extern int Slippage          = 3;
extern string nameEA         = "FarhadCrab6.mq4";// To "easy read" which EA place an specific order and remember me forever :)



double maLongCurrent, maShortCurrent, maLongPrevious, maShortPrevious, faRSICurrent, deMark;
double realTP, realSL, faMiddle, faHighest, faLowest, closeCurrent,faCloseM5, closeCurrentD, closePreviousD;
int cnt, ticket;
bool isBuying = false, isSelling = false, isBuyClosing = false, isSellClosing = false;
double initialDeposit; //First of All Specify your initial Deposit.
double lLots , sLots;// you can change the lot but be aware of margin. Its better to trade with 1/4 of your capital. 






//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() {

 
/*   
 */  
initialDeposit=AccountBalance();


//System Stoploss based on LongTerm Moving Average (Fibo  55 day MA)
//StopLoss For Buy Positions (Optional)
//if ((maLongCurrent>closeCurrentD) && (maLongPrevious<closePreviousD) && (maLongCurrent>highCurrentH1)) {
if ((AccountEquity()>(initialDeposit+((maxYield/100)*initialDeposit))) 
|| (AccountBalance()-AccountEquity()>((maxLoss/100)*initialDeposit))
//|| ((maLongCurrent>closeCurrentD) && (maLongPrevious<closePreviousD) && (maLongCurrent>highCurrentH1))
){
CloseBuyPositions(); 
 //return(0);
}

//StopLoss For Sell Positions (Optional)
//if ((maLongCurrent<closeCurrentD) && (maLongPrevious>closePreviousD) && (maLongCurrent<lowCurrentH1)) {
if ((AccountEquity()>(initialDeposit+((maxYield/100)*initialDeposit)))
|| (AccountBalance()-AccountEquity()>((maxLoss/100)*initialDeposit))
//|| ((maLongCurrent<closeCurrentD) && (maLongPrevious>closePreviousD) && (maLongCurrent<lowCurrentH1))

){

CloseSellPositions();

return(0);
}
         
   double overbought,oversold;
   
   if (maLongCurrent>closeCurrentD) //downtrend
   {
   oversold = 0.15;
   overbought = 0.85;
   }
   
      if (maLongCurrent<closeCurrentD) //uptrend
   {
   oversold = 0.15;
   overbought = 0.85;
   }





   // Check for invalid bars and takeprofit
   if(Bars < 200) {
      Print("Not enough bars for this strategy - ", nameEA);
      return(0);
      }

    calculateIndicators();                      // Calculate indicators' value 
    //Check for TakeProfit Conditions  
   if(lTakeProfit<1){
      Print("TakeProfit less than 1 on this EA with Magic -", magicEA );
      return(0);
   }
   if(sTakeProfit<1){
      Print("TakeProfit less than 1 on this EA with Magic -", magicEA);
      return(0);
   }
   
   //Introducing new expressions
double deMark              = iDeMarker(NULL,PERIOD_M1,9,0);
double previousdeMark      = iDeMarker(NULL,PERIOD_M1,9,1);
double rsi                 = iRSI(NULL,PERIOD_M1,9,PRICE_CLOSE,0);


double n;

if ((AccountEquity()-AccountBalance()==0) || (AccountEquity()-AccountBalance()>-((OrderLots())*500)))
   
   n = 0;
   else 
    n = 1;

if (OrdersTotal()>n)
{
return(0);
}

int bnt;
   
   for(bnt=0;bnt<OrdersTotal();bnt++)
   {
      OrderSelect (bnt, SELECT_BY_POS);
      
      
      if (TimeCurrent()-OrderOpenTime()<500) {
 //if((OrdersTotal()>1)){
      return(0);
   }
   }

    

//Check Margin Requirement

   if(AccountFreeMargin()<0){
   
      
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0);
   }
   

   //Buy Condition
   if ((!takeBuyPositions()) && (n == 0) ){
   

      if (
      
     (deMark<oversold) 
     //&& (previousdeMark < deMark)
     && (rsi < 30)
   //  && ((maLongCurrent<closeCurrentD))
             
)


      {

         OpenBuy();
        
         
         return(0);
      }
      }
      
      
         if ((!takeBuyPositions()) && (n == 1) ){
   

      if (

 (deMark<0.50) 
 && (previousdeMark < deMark)
     &&    (OrderType()==OP_SELL)
)


      {

         hedgeOpenBuy();
        
         
         return(0);
      }
      }

//Sell Condition
   if ((!takeSellPositions()) && (n == 0)){
      if ( 
 
       (deMark>overbought)
       //&& (previousdeMark > deMark)
       && (rsi > 70)
 //  && ((maLongCurrent>closeCurrentD)) 

)
{


         OpenSell();
        
         return(0);
      }
      }
      
      
         if ((!takeSellPositions()) && (n == 1)){
      if (
       (deMark>0.50)
       && (previousdeMark > deMark)

  && (OrderType()==OP_BUY)
)
{


         hedgeOpenSell();
        
         return(0);
      }
      }
   
   
   
   //Trailing Expressions
   TrailingPositionsBuy(lTrailingStop);
   TrailingPositionsSell(sTrailingStop);
   return (0);
}
//Number of Buy Positions

bool takeBuyPositions() {

for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber() == magicEA) {
return(0);
}
} 
}

return(0);
}

//Number of Sell Positions

bool takeSellPositions() {

for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber() == magicEA) {
return(0);
}
} 
}

return(0);
}

void TrailingPositionsBuy(int trailingStop) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber() == magicEA) { 
            if (OrderType()==OP_BUY) { 
               if (Bid-OrderOpenPrice()>trailingStop*Point) { 
                  if (OrderStopLoss()<Bid-trailingStop*Point) 
                     ModifyStopLoss(Bid-trailingStop*Point); 
               } 
            } 
         } 
      } 
   } 
} 
void TrailingPositionsSell(int trailingStop) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber() == magicEA) { 
            if (OrderType()==OP_SELL) { 
               if (OrderOpenPrice()-Ask>trailingStop*Point) { 
                  if (OrderStopLoss()>Ask+trailingStop*Point || 
OrderStopLoss()==0)  
                     ModifyStopLoss(Ask+trailingStop*Point); 
               } 
            } 
         } 
      } 
   } 
} 
void ModifyStopLoss(double ldStopLoss) { 
   bool fm;
   fm = OrderModify(OrderTicket(),OrderOpenPrice
(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); 
  
} 

void OpenBuy() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   ldStop = GetStopLossBuy(); 
   ldTake = GetTakeProfitBuy(); 
   lsComm = GetCommentForOrder(); 
   if ((AccountEquity()-AccountBalance()==0) || (AccountEquity()-AccountBalance()>-((OrderLots())*500)))
   
   lLots = 0.1; //NormalizeDouble((MathRound((AccountBalance()-500)/1000)/10),1);

   else 
   lLots = 0.2; //NormalizeDouble((MathRound((AccountBalance()-500)/1000)/5),1);

   OrderSend(Symbol(),OP_BUY,lLots,Ask,Slippage,ldStop,ldTake,nameEA,magicEA,0,clOpenBuy);  

    
} 
void OpenSell() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 

   ldLot = GetSizeLot(); 
   ldStop = GetStopLossSell(); 
   ldTake = GetTakeProfitSell(); 
   lsComm = GetCommentForOrder(); 
   if ((AccountEquity()-AccountBalance()==0) || (AccountEquity()-AccountBalance()>-((OrderLots())*500)))
   
   sLots = 0.1; //NormalizeDouble((MathRound((AccountBalance()-500)/1000)/10),1);

   else 
   sLots = 0.2; //NormalizeDouble((MathRound((AccountBalance()-500)/1000)/5),1);

   
   

   OrderSend(Symbol(),OP_SELL,sLots,Bid,Slippage,ldStop,ldTake,nameEA,magicEA,0,clOpenSell); 
  
} 

void hedgeOpenBuy() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   ldStop = GetStopLossBuy(); 
   ldTake = GetTakeProfitBuy(); 
   lsComm = GetCommentForOrder(); 
   //if ((AccountEquity()-AccountBalance()==0) || (AccountEquity()-AccountBalance()>-(MathSqrt(OrderLots())*500)))
   
   //lLots = 0.2; //MathRound(AccountBalance()/4000);

   //else 
   lLots = 0.2; //NormalizeDouble((MathRound((AccountBalance()-500)/1000)/5),1);

   OrderSend(Symbol(),OP_BUY,lLots,Ask,Slippage,Ask-60*Point,ldTake,nameEA,magicEA,0,clOpenBuy);  

    
} 
void hedgeOpenSell() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 

   ldLot = GetSizeLot(); 
   ldStop = GetStopLossSell(); 
   ldTake = GetTakeProfitSell(); 
   lsComm = GetCommentForOrder(); 
  // if ((AccountEquity()-AccountBalance()==0) || (AccountEquity()-AccountBalance()>-(MathSqrt(OrderLots())*500)))
   
   //sLots = 0.2; //MathRound(AccountBalance()/4000);

  // else 
   sLots = 0.2; //NormalizeDouble((MathRound((AccountBalance()-500)/1000)/5),1);

   
   

   OrderSend(Symbol(),OP_SELL,sLots,Bid,Slippage,Bid+60*Point,ldTake,nameEA,magicEA,0,clOpenSell); 
  
} 
string GetCommentForOrder() { return(nameEA); } 
double GetSizeLot() { return(lLots); } 
double GetTakeProfitBuy() { if (iADX(NULL,0,14,PRICE_MEDIAN,MODE_MAIN,0)<25)  return(Ask+lTakeProfit*Point); else return(Ask+pr*Point); } 
double GetTakeProfitSell() { if (iADX(NULL,0,14,PRICE_MEDIAN,MODE_MAIN,0)<25) return(Bid-sTakeProfit*Point); else return (Bid-pr*Point);} 
double GetStopLossBuy() { if (stopLoss==0) return(0); else  return(Ask - stopLoss*Point);}
double GetStopLossSell() { if (stopLoss==0) return(0); else return(Bid + stopLoss*Point);}
  void calculateIndicators() {  
    // Calculate indicators' value   

   closeCurrentD       = iClose(NULL,PERIOD_M1,0); //Close Price Current for D1 TimeFrame
   closePreviousD      = iClose(NULL,PERIOD_M1,1); //Close Price Previous for D1 TimeFrame
   maLongCurrent       = iMA(NULL,PERIOD_M1,55,1,MODE_SMMA,PRICE_TYPICAL,0); //Current Long Term Moving Average 
   maLongPrevious      = iMA(NULL,PERIOD_M1,55,1,MODE_SMMA,PRICE_TYPICAL,1); //Previous Long Term Moving Average 
   
   // Check for BUY, SELL, and CLOSE signal
   isBuying  = false;
   isSelling = false;
   isBuyClosing = false;
   isSellClosing = false;
}
void CloseBuyPositions(){ 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber() == magicEA) { 
            if (OrderType()==OP_BUY) OrderClose(OrderTicket(),lLots,Bid,Slippage);
         } 
      } 
   } 
} 
void CloseSellPositions(){ 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber() == magicEA) { 
            if (OrderType()==OP_SELL) OrderClose(OrderTicket(),sLots,Ask,Slippage);
         } 
      } 
   } 
}


Profitability Reports

PERFORMANCE BY SYMBOL

Expected payoff

Average expected payoff across the available backtests for each symbol.

Positive Negative
12 reports
USD/CAD Jul 2025 - Sep 2025
7.08
Total Trades 14
Won Trades 13
Lost trades 1
Win Rate 92.86 %
Expected payoff 8.06
Gross Profit 131.33
Gross Loss -18.56
Total Net Profit 112.77
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
2.98
Total Trades 19
Won Trades 18
Lost trades 1
Win Rate 94.74 %
Expected payoff 6.56
Gross Profit 187.70
Gross Loss -63.06
Total Net Profit 124.64
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
2.22
Total Trades 10
Won Trades 9
Lost trades 1
Win Rate 90.00 %
Expected payoff 4.99
Gross Profit 90.90
Gross Loss -41.00
Total Net Profit 49.90
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.92
Total Trades 121
Won Trades 41
Lost trades 80
Win Rate 33.88 %
Expected payoff -0.42
Gross Profit 602.72
Gross Loss -653.45
Total Net Profit -50.73
-100%
-50%
0%
50%
100%
EUR/USD Oct 2025 - Feb 2026
0.80
Total Trades 144
Won Trades 32
Lost trades 112
Win Rate 22.22 %
Expected payoff -1.85
Gross Profit 1078.30
Gross Loss -1344.00
Total Net Profit -265.70
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.77
Total Trades 57
Won Trades 16
Lost trades 41
Win Rate 28.07 %
Expected payoff -2.65
Gross Profit 507.20
Gross Loss -658.00
Total Net Profit -150.80
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.72
Total Trades 51
Won Trades 12
Lost trades 39
Win Rate 23.53 %
Expected payoff -2.81
Gross Profit 370.80
Gross Loss -514.10
Total Net Profit -143.30
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
0.50
Total Trades 9
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -3.38
Gross Profit 30.30
Gross Loss -60.70
Total Net Profit -30.40
-100%
-50%
0%
50%
100%
GBP/AUD Oct 2025 - Feb 2026
0.26
Total Trades 1335
Won Trades 69
Lost trades 1266
Win Rate 5.17 %
Expected payoff -5.97
Gross Profit 2747.88
Gross Loss -10714.84
Total Net Profit -7966.96
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.13
Total Trades 7
Won Trades 1
Lost trades 6
Win Rate 14.29 %
Expected payoff -10.07
Gross Profit 10.10
Gross Loss -80.60
Total Net Profit -70.50
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
0.02
Total Trades 104
Won Trades 98
Lost trades 6
Win Rate 94.23 %
Expected payoff -988.27
Gross Profit 2602.70
Gross Loss -105383.20
Total Net Profit -102780.50
-100%
-50%
0%
50%
100%
GBP/CAD Oct 2025 - Feb 2026
0.00
Total Trades 5
Won Trades 5
Lost trades 0
Win Rate 100.00 %
Expected payoff 10.09
Gross Profit 50.44
Gross Loss 0.00
Total Net Profit 50.44
-100%
-50%
0%
50%
100%

Comments