Williama_EA[2]

Author: Coded by Raphy, All rights granted to you :)
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open orders
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
121.00 %
Total Trades 275
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 0.40
Gross Profit 625.28
Gross Loss -515.98
Total Net Profit 109.30
-100%
-50%
0%
50%
100%
GBP/CAD Oct 2024 - Jan 2025
67.00 %
Total Trades 887
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -0.74
Gross Profit 1343.60
Gross Loss -1998.03
Total Net Profit -654.43
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
116.00 %
Total Trades 728
Won Trades 557
Lost trades 171
Win Rate 0.77 %
Expected payoff 0.31
Gross Profit 1651.89
Gross Loss -1427.42
Total Net Profit 224.47
-100%
-50%
0%
50%
100%
Williama_EA[2]
//+------------------------------------------------------------------+
//|                                        Williama PriceTrapper.mq4 |
//|                        Based on the great strategie of Williama  |
//|                  Coded by Naufrage, All rights granted to you :) |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Coded by Raphy, All rights granted to you :)"
#property link      ""
#include <stdlib.mqh>
#include <stderror.mqh> 

//---- input parameters
extern int       pips=15; // number of pips between each level
extern double    lots=0.01;
extern int       NbLevels=3; // Number of levels of the pending orders (for each target, buy and sell)
extern int       ProfitTarget=0; //Minimum profit target, in pips. Whatever happen, at least this profit is made (unless we run out of free margin...).

int Magic=17663;
double   myPoint;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

     myPoint = SetPoint(Symbol());
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int ticket, err, cpt, profit, total, BuyGoalProfit, SellGoalProfit;
   double BuyGoal=0, SellGoal=0, spread=(Ask-Bid)/myPoint;
//----
//   total=OrdersTotal();
   total = CalculateCurrentOrders(Symbol(), Magic);
   if(total<1) //we can set up a new "price catcher"
   {
      if(AccountFreeMargin()<(10000*lots))
      {
         Print("Not enough free margin to begin");
         return(0);
      }
      SellGoal=Ask-(NbLevels+1)*pips*myPoint;
      BuyGoal=Ask+(NbLevels+1)*pips*myPoint;
      for(cpt=1;cpt<=NbLevels;cpt++)
      {
         ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,Ask+cpt*pips*myPoint,2,SellGoal,BuyGoal,"InitialSetup",Magic,0,Green);
         if(ticket==0)
         {
            err = GetLastError();
            Print("Error opening BUYSTOP order : (" + err + ") " + ErrorDescription(err)); 
            return(0); 
         }
         ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,Bid-cpt*pips*myPoint,2,BuyGoal+spread*myPoint,SellGoal-spread*myPoint,"InitialSetup",Magic,0,Green);
         if(ticket==0)
         {
            err = GetLastError();
            Print("Error opening SELLSTOP order : (" + err + ") " + ErrorDescription(err)); 
            return(0); 
         } 
      }
    } // initial setup done
    else
    {
      OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
      cpt=0;
      while(OrderType()!=OP_BUY && OrderType()!=OP_BUYSTOP)
      {
         OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES);
         cpt++;
      }
      BuyGoal=OrderTakeProfit();
      SellGoal=OrderStopLoss();
      // check if pending orders must be canceled
      if(Ask>=BuyGoal || (Ask<=SellGoal))
      {
         for(cpt=0;cpt<total;cpt++)
         {
            OrderSelect(cpt,SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) OrderDelete(OrderTicket());
         }
         return(0);
      }
      else if((Ask+pips*myPoint)<=BuyGoal && (Ask-pips*myPoint)>=SellGoal)
      // now we check if profit will be made no matter which goal is reached, and add pending orders if necessary
      {
         //first, check profit if the BuyGoal is reached
         profit=0;
         for(cpt=0;cpt<total;cpt++)
         {
            OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            {
               if(OrderType()==OP_BUY) profit+=(BuyGoal-OrderOpenPrice())/myPoint;
               if(OrderType()==OP_SELL) profit-=((BuyGoal+spread*myPoint)-OrderOpenPrice())/myPoint;
               if(OrderType()==OP_BUYSTOP && OrderOpenPrice()>Ask) profit+=(BuyGoal-OrderOpenPrice())/myPoint;
            }
         }
         cpt=1;
         BuyGoalProfit=profit;
         while(profit<ProfitTarget)
         {
            if((Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*myPoint)<(BuyGoal-cpt*pips*myPoint))
            {
               ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,BuyGoal-cpt*pips*myPoint,2,SellGoal,BuyGoal,"",Magic,0,Green);
               if(ticket==0)
               {
                  err = GetLastError();
                  Print("Error opening BUYSTOP order : (" + err + ") " + ErrorDescription(err)); 
                  return(0); 
               }
               profit+=cpt*pips;
            }
            cpt++;
            if(cpt>NbLevels) cpt=1;
         }
         // then, check profit if SellGoal is reached
         profit=0;
         for(cpt=0;cpt<total;cpt++)
         {
            OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            {
               if(OrderType()==OP_BUY) profit-=(OrderOpenPrice()-SellGoal)/myPoint;
               if(OrderType()==OP_SELL) profit+=(OrderOpenPrice()-(SellGoal-spread*myPoint))/myPoint;
               if(OrderType()==OP_SELLSTOP && OrderOpenPrice()<Bid) profit+=(OrderOpenPrice()-(SellGoal-spread*myPoint))/myPoint;
            }
         }
         cpt=1;
         SellGoalProfit=profit;
         while(profit<ProfitTarget)
         {
            if((Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*myPoint)>(SellGoal+cpt*pips*myPoint))
            {
               ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,(SellGoal-spread*myPoint)+cpt*pips*myPoint,2,BuyGoal+spread*myPoint,SellGoal-spread*myPoint,"",Magic,0,Green);
               if(ticket==0)
               {
                  err = GetLastError();
                  Print("Error opening SELLSTOP order : (" + err + ") " + ErrorDescription(err)); 
                  return(0); 
               }
               profit+=cpt*pips;
            }
            cpt++;
            if(cpt>NbLevels) cpt=1;
         }
      }
     }
   string sComment   = "";
   string sep         = "----------------------------------------\n";
   string nl         = "\n";
   sComment = "Williama EA v.0.1" + nl;
   sComment = sComment + "Lots=" + DoubleToStr(lots,2) + nl;
   sComment = sComment + "Buy Goal= " + DoubleToStr(BuyGoal,4) + nl; 
   sComment = sComment + "Buy Goal Profit (in pips)=" + BuyGoalProfit + nl + nl;
   sComment = sComment + "Sell Goal= " + DoubleToStr(SellGoal,4) + nl; 
   sComment = sComment + "Sell Goal Profit (in pips)=" + SellGoalProfit + nl + nl;
   sComment = sComment + "Pips of each level=" + pips + nl;
   sComment = sComment + "Number of levels for each goal: " + NbLevels + nl;
   sComment = sComment + "Spread= " + DoubleToStr(spread,1) + nl;
   sComment = sComment + sep;  
   Comment(sComment);
//----
   return(0);
  }
  
double SetPoint(string mySymbol)
{
   double mPoint, myDigits;
   
   myDigits = MarketInfo (mySymbol, MODE_DIGITS);
   if (myDigits < 4)
      mPoint = 0.01;
   else
      mPoint = 0.0001;
   
   return(mPoint);
}

int CalculateCurrentOrders(string mySymbol, int MagicNumber)
  {
   int buys = 0, sells = 0, num = 0;
   for(int i=0;i<OrdersTotal();i++)
     {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!= mySymbol) continue;
      if (OrderMagicNumber()!= MagicNumber) continue;
      if(OrderType() == OP_BUY)  buys++;
      if(OrderType() == OP_SELL) sells++;
      if(OrderType() == OP_BUYSTOP)  buys++;
      if(OrderType() == OP_SELLSTOP) sells++;
     }
     
   num = buys + sells;
   return(num);
  }

//+------------------------------------------------------------------+

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