Stoch EA-mm-V4

Author: Expert Advisor Builder

Here's a breakdown of what the script does, explained in a way that someone who doesn't know programming can understand:

This script is designed to automatically trade on the Forex market, based on certain signals it detects. It's like a robot that watches the market and makes decisions to buy or sell currency, aiming to make a profit.

Here's a step-by-step explanation:

  1. Setup (Initialization): When the script starts, it remembers the current number of "bars" (time periods) on the chart. This helps it keep track of whether a new time period has started.

  2. Constant Monitoring (Start Function): The script constantly runs and checks the market. Its main job is to look for opportunities to open or close trades (buy or sell).

  3. Checking Existing Trades: The script first looks at any trades that are already open. It determines if those trades need to be closed based on pre-defined conditions.

    • For buy orders, it checks if certain exit conditions are met, like when an indicator called WPR reaches an overbought threshold or a slow stochastic indicator reaches its peak.
    • Similarly, it checks for sell orders to determine when to close them, based on WPR oversold conditions, or the slow stochastic values
    • It uses an emergency stoploss that closes the trade if it goes bad, by checking the WPR indicator
    • It also implements trailing stops, so if the price moves favorably for a buy trade, the stop-loss will rise to lock in profits, and vice versa for sell trades.
  4. Looking for New Trade Opportunities: If there are no trades, or if the script has finished checking existing trades, it looks for opportunities to open new trades, by calculating a series of indicators, that look for a good time to open a trade:

    • It uses the Stochastic Oscillator, RSI (Relative Strength Index), and Williams Percent Range (WPR) indicators. These indicators use price data to measure the strength of recent price movements and identify potentially overbought or oversold conditions.
    • If the indicators meet certain conditions, the script generates either a "buy" or a "sell" signal. The script needs a perfect matching in the indicator for opening the trades.
  5. Opening Trades: If a "buy" or "sell" signal is generated, the script checks if it has enough money in the account to open the trade. If it does, it places the order with the broker. The amount of currency to buy or sell (the "lots") is determined by settings you provide. The script also can set stop-loss and take-profit levels to automatically close the trade if the price moves against you (stop-loss) or reaches your desired profit level (take-profit).

  6. Money Management: It calculates the lot size based on the account's free margin and a reinvestment percentage. This helps to manage risk and potentially increase profits as the account grows. The script also make sure that we do not risk more than the maxLots parameter.

  7. Looping: The script then goes back to step 2 and repeats the process, constantly monitoring the market and looking for new opportunities.

In summary: This script is an automated trading system. It monitors the Forex market, makes decisions based on technical indicators (Stochastic, RSI, WPR), and automatically opens and closes trades based on those decisions and pre-set rules for risk management (stop loss, take profit, trailing stop).

Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Indicators Used
Stochastic oscillatorRelative strength indexLarry William percent range indicator
Miscellaneous
It sends emails
2 Views
1 Downloads
0 Favorites

Profitability Reports

NZD/USD Oct 2024 - Jan 2025
102.00 %
Total Trades 10
Won Trades 4
Lost trades 6
Win Rate 40.00 %
Expected payoff 2.30
Gross Profit 994.00
Gross Loss -971.00
Total Net Profit 23.00
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
476.00 %
Total Trades 9
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 111.57
Gross Profit 1271.40
Gross Loss -267.30
Total Net Profit 1004.10
-100%
-50%
0%
50%
100%
Stoch EA-mm-V4
//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+

#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

extern int mm=1; 
extern int reinv=10; 
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = False;
extern double Lots = 0.1;
extern int Slippage = 3;
extern bool UseStopLoss = True;
extern int StopLoss = 200;
extern bool UseTakeProfit = True;
extern int TakeProfit = 600;
extern bool UseTrailingStop = False;
extern int TrailingStop = 30;
extern int maxLots=50;
extern bool emergencystoploss=True;
extern bool stoponslowstoch=True;
extern bool TPonWPR=True;

int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;



   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+


double Buy1_1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 0);
double Buy1_2 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 0);
double Buy1_1a = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 1);
double Buy1_2a = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 1);
double Buy1_1b = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 0);
double Buy1_2b = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 0);
double Buy2_1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 0);
double Buy2_2 = 25;
double Buy3_1 = iRSI(NULL, 0, 14, PRICE_CLOSE, Current + 1);
double Buy3_2 = 45;
double Buy4_1 = iWPR(NULL, 0, 14, Current + 1);
double Buy4_2 = -75;
double Buy5_1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 1);
double Buy5_2 = 1;

double Sell1_1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 0);
double Sell1_2 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 0);
double Sell1_1a = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 1);
double Sell1_2a = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 1);
double Sell1_1b = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 0);
double Sell1_2b = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_SIGNAL, Current + 0);
double Sell2_1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 0);
double Sell2_2 = 75;
double Sell3_1 = iRSI(NULL, 0, 14, PRICE_CLOSE, Current + 0);
double Sell3_2 = 52;
double Sell4_1 = iWPR(NULL, 0, 14, Current + 1);
double Sell4_2 = -25;
double Sell5_1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 1, MODE_MAIN, Current + 1);
double Sell5_2 = 99;

int orderOpenBar = iBarShift(NULL, 0, OrderOpenTime(), true);

double CloseBuy1_1a = iWPR(NULL, 0, 14, Current + 0);
double CloseBuy1_1b = iWPR(NULL, 0, 14, Current + 3);
double CloseBuy1_2a = -99.5; // emergency stoploss  - 0.5 WPR is in extreme overbought territory, lower it to close bad trades earlier
double CloseBuy1_2b = -6;  // TP by WPR - higher takes profit earlier
double CloseBuy2_1 = iStochastic(NULL, 0, 50, 3, 10, MODE_SMA, 0, MODE_MAIN, Current + 0);
double CloseBuy2_2 = 88; //slow stochastic TP - lower takes profit earlier and maybe not better

double CloseSell1_1a = iWPR(NULL, 0, 14, Current + 0);
double CloseSell1_1b = iWPR(NULL, 0, 14, Current + 3);
double CloseSell1_2a = -0.5; // emergency stoploss  - 0.5 WPR is in extreme overbought territory, lower it to close bad trades earlier
double CloseSell1_2b = -94; // TP by WPR - higher takes profit earlier
double CloseSell2_1 = iStochastic(NULL, 0, 50, 3, 10, MODE_SMA, 0, MODE_MAIN, Current + 0);
double CloseSell2_2 = 12;  //slow stochastic TP - higher takes profit earlier and maybe not better

   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+

                     if (orderOpenBar > 3)
                        //emergency stoploss
                       {
                        if(emergencystoploss==True)
                           {
                           if((OrderOpenPrice() > Bid) && (CloseBuy1_1a < CloseBuy1_2a)){Order = SIGNAL_CLOSEBUY;}
                           }
                      //slow stochastic reaches peak
                        if(stoponslowstoch==True)
                           {
                           if (CloseBuy2_1 > CloseBuy2_2){Order = SIGNAL_CLOSEBUY;}
                           }
                        //if we are going up, and the WPR reaches overbought                      
                        if(TPonWPR==True)
                           {
                           if((OrderOpenPrice() < Bid) && (CloseBuy1_1b > CloseBuy1_2b)){Order = SIGNAL_CLOSEBUY;}
                           }
                        }
                    
            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+

                       if (orderOpenBar > 3)
                        //emergency stoploss
                       {
                        if(emergencystoploss==True)
                           {
                           if((OrderOpenPrice() < Ask) && (CloseSell1_1a < CloseSell1_2a)){Order = SIGNAL_CLOSESELL;}
                           }
                      //slow stochastic reaches peak
                        if(stoponslowstoch==True)
                           {
                           if (CloseSell2_1 < CloseSell2_2){Order = SIGNAL_CLOSESELL;}
                           }
                        //if we are going up, and the WPR reaches overbought                      
                        if(TPonWPR==True)
                           {
                           if((OrderOpenPrice() > Ask) && (CloseSell1_1b < CloseSell1_2b)){Order = SIGNAL_CLOSESELL;}
                           }
                        }


            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }

   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+

   if ((Buy1_1 == Buy1_2)|| (Buy1_1a<Buy1_2a && Buy1_1b>Buy1_2b))
      {
         if (Buy2_1 < Buy2_2 && Buy3_1 > Buy3_2 && Buy4_1 < Buy4_2 && Buy5_1 > Buy5_2) 
         {
            Order = SIGNAL_BUY;
         }
      }          

   if ((Sell1_1 == Sell1_2) || (Sell1_1a > Sell1_2a && Sell1_1b < Sell1_2b))
      {
         if(Sell2_1 > Sell2_2 && Sell3_1 < Sell3_2 && Sell4_1 > Sell4_2 && Sell5_1 < Sell5_2) 
         {
         Order = SIGNAL_SELL;
         }
      }


   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+
if (mm==1) 
{ 
if(Lots<(MathCeil((AccountFreeMargin()/1000)*reinv)/10)){Lots=(MathCeil((AccountFreeMargin()/10000)*reinv)/10);if(Lots>maxLots){Lots=maxLots;}} 
}
   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
			} else {
				Print("Error opening BUY order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
			} else {
				Print("Error opening SELL order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   if (!EachTickMode) BarCount = Bars;

   return(0);
}
//+------------------------------------------------------------------+

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 ---