FarhadCrab61
Download scriptFarhadCrab6.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.
//+------------------------------------------------------------------+
//| 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
Expected payoff
Average expected payoff across the available backtests for each symbol.
Comments