Daily Scalping EA v1[1].0e2

Author: Skyline 2007
Price Data Components
Series array that contains open time of each barSeries array that contains open prices of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of closed ordersIt Closes Orders by itself 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
35.00 %
Total Trades 476
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -2.27
Gross Profit 580.50
Gross Loss -1661.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
65.00 %
Total Trades 1683
Won Trades 348
Lost trades 1335
Win Rate 0.21 %
Expected payoff -1.12
Gross Profit 3437.50
Gross Loss -5319.50
Total Net Profit -1882.00
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
18.00 %
Total Trades 1070
Won Trades 75
Lost trades 995
Win Rate 0.07 %
Expected payoff -3.03
Gross Profit 730.60
Gross Loss -3975.10
Total Net Profit -3244.50
-100%
-50%
0%
50%
100%
Daily Scalping EA v1[1].0e2
//+-----------------------------------------------------------------------------+
//|                                                    Daily Scalping v1.0e.mq4 |
//|                                                                Skyline 2007 |
//|                                                                             |
//+-----------------------------------------------------------------------------+
#property copyright "Skyline 2007"
#property link      ""
#include <stdlib.mqh>

// v1.0  (07 Feb 2007) : Start Project 
// v1.0a (07 Feb 2007) : Add GMT_Shift variable
// v1.0b (16 Feb 2007) : Added MagicNumber routine based on pair and timeframe
// v1.0c (17 Feb 2007) : Added routine TotalOrders to count only active order related to current EA (Thanks to Vitalykk)
//                       Added routine OrdersLossInDay to control losses in the same day. Users have the option to change how much loss trade they want setting external variable MaxLossesTradesPerDay.
// v1.0d (19 Feb 2007) : Fixed bug that prevent , when an order was not dispatched, to open reverse trade correctly. 
//                       Handled the case of doji candle that EA now will ignore to determine the trend situation from last 3 candles.
// v1.0e (19 Feb 2007) : Fixed bug on CheckTrend for doji candle routine (Thanks to Vitalykk)
//                       Added function OrdersTakeProfit to avoid EA enter again the market until next day.


//---- Definizione parametri esterni 
extern double    GMT_Shift             = 0;
extern int       TakeProfit            = 100;
extern int       StopLoss              = 40;  
extern int       HourToCloseOrders     = 23;
extern bool      SundayCandleExists    = true;
extern double    Lots                  = 0.1; 
extern bool      UseMoneyManagement    = false;
extern int       Risk                  = 0;
extern int       Slippage              = 3;
extern int       MaxLossesTradesPerDay = 2; 
extern string    EAComment;

//----- Definizione parametri interni 
static int TradeStatus = 0; //0 = Trades disabilitati , 1 = Solo Buy permessi, 2 = Solo Sell permessi 
int MagicNumber;
string EA_Comment="";

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   string TradeMode;
   
   // Calcola dimensione Lot in base all'Equity
   if (UseMoneyManagement==true) Lots = CalcolaLot(Risk);   
   
   // Calcola MagicNumber a seconda della coppia e timeframe 
   MagicNumber = MagicFromSymbol();

   // Attiva ordine alle 00:00 GMT 
   OpenOrderMidnight(Lots);
 
   // Controlla ordini chiusi in perdita
   OrdersLossInDay();
   
   // Controlla se TP è stato raggiunto 
   OrdersTakeProfit();

   // Attiva ordini successivi
   OpenNextOrders(Lots);
   
   // Chiude ordini allo scadere di HourToCloseOrders
   CloseAllOrders(HourToCloseOrders);
   
   // Commenti
   if (TradeStatus == 0) TradeMode = "NONE";
   if (TradeStatus == 1) TradeMode = "BUY";
   if (TradeStatus == 2) TradeMode = "SELL";
   
   Comment("\nDaily Scalping EA v1.0b (Skyline 2007.e3)",
           "\nCompiled version on 16 Feb 2007",
           "\n\n---------------------------------------",
           "\nMagicNumber : ",MagicNumber,
           "\nNext Trade : ",TradeMode,
           "\nTimeFrame to be used : H1",
           "\n---------------------------------------");
	EA_Comment = EAComment + " Skyline";
           
   return(0);
  }

// ===== Routine per controllare se il TP è stato raggiunto e disabilitare i trades =====
int OrdersTakeProfit()
{
 int total,cnt;
 int TradeWin=0;
 
 int hstTotal=OrdersHistoryTotal();
   
 for(cnt=0;cnt<hstTotal;cnt++)
 {
   OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
   if (OrderMagicNumber()==MagicNumber)
   {
    if (NormalizeDouble(OrderClosePrice(),Digits)==NormalizeDouble(OrderTakeProfit(),Digits) && TimeDay(OrderCloseTime())==Day()) TradeWin++;
   }  // if (OrderMagicNumber()==MagicNumber)
 }  // for 
 if ( TradeWin == 1 ) TradeStatus = 0; // disable trades
 //Print("TradeLoss = ",TradeLoss);
}

// ===== Routine per contare gli ordini chiusi in perdita nello stesso giorno =====
int OrdersLossInDay()
{
 int total,cnt;
 int TradeLoss=0;
 
 int hstTotal=OrdersHistoryTotal();
   
 for(cnt=0;cnt<hstTotal;cnt++)
 {
   OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
   if (OrderMagicNumber()==MagicNumber)
   {
    if (NormalizeDouble(OrderClosePrice(),Digits)==NormalizeDouble(OrderStopLoss(),Digits) && TimeDay(OrderCloseTime())==Day()) TradeLoss++;
   }  // if (OrderMagicNumber()==MagicNumber)
 }  // for 
 if ( TradeLoss == MaxLossesTradesPerDay ) TradeStatus = 0; // disable trades
 //Print("TradeLoss = ",TradeLoss);
}
  
// ===== Routine per chiudere tutti gli ordini =====
void CloseAllOrders(int Ora)
{
 int total,cnt;
 
 total = TotalOrders();
 
 if ( Hour()==MathMod(Ora+GMT_Shift,24) )
 {
  TradeStatus = 0; // azzera variabile globale per non aprire più trade
  
  for(cnt=0;cnt<total;cnt++)
  {
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   if (OrderMagicNumber()==MagicNumber)
   {
    if (OrderType() == OP_BUY)  OrderClose(OrderTicket(),OrderLots(), Bid, Slippage, LimeGreen);
    if (OrderType() == OP_SELL) OrderClose(OrderTicket(),OrderLots(), Ask, Slippage, Red);
   }  // if (OrderMagicNumber()==MagicNumber)
  }  // for 
 } // if
}

// ===== Routine per aprire il primo ordine alle 00:00 GMT =====
void OpenOrderMidnight(double Lot)
{  int Ticket,Errore; 
   double SL,TP;
   int ActualSpread;
   
   RefreshRates();
    
   int Total = TotalOrders();
   
   if ( Total < 1 && Hour()==MathMod(24+GMT_Shift,24) && DayOfWeek()>=1 && DayOfWeek()<=5 ) 
   {
     TradeStatus = 0; // azzera variabile globale 
      
   // Controlla BUY Order
   if (CheckTrend()=="BUY")
    {   
      
      // Controlla SL 
      if (StopLoss < MarketInfo(Symbol(),MODE_STOPLEVEL)) StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
      if (StopLoss == 0) SL = 0;
      SL = Ask-StopLoss*Point;
      if (TakeProfit == 0) TP = 0;
      else TP = Ask+TakeProfit*Point;
      // Piazza l'ordine BUY
      Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,EA_Comment,MagicNumber,0,Blue);
          
      if(Ticket<0)
      {
       Errore=GetLastError();
       Print("ERROR ON BUY ORDER (",Errore,") : ",ErrorDescription(Errore));
      } 
      else 
      {
       TradeStatus = 2; // Prossimo trade è Sell
      } 
     } 
   }
   
   // Rileva ordini relativi a questa EA (thanks to Vitalykk)
   Total = TotalOrders(); 
   
   if ( Total < 1 && Hour()==MathMod(24+GMT_Shift,24) && DayOfWeek()>=1 && DayOfWeek()<=5 ) 
   {
   
     // Controlla SELL Order
     if (CheckTrend()=="SELL")
     {
 
      // Setta SL 
      if (StopLoss < MarketInfo(Symbol(),MODE_STOPLEVEL)) StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
      if (StopLoss == 0) SL = 0;
      SL = Bid+StopLoss*Point;
      if (TakeProfit == 0) TP = 0;
      else TP = Bid-TakeProfit*Point;
      
      // Piazza Ordine SELL       
      Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,EA_Comment,MagicNumber,0,Blue);
         
      if(Ticket<0)
      {
       Errore=GetLastError();
       Print("ERROR ON SELL ORDER (",Errore,") : ",ErrorDescription(Errore));
      } 
      else
      {
       TradeStatus = 1; // Prossimo trade è Buy
      }
     }    
   }
}

// ===== Routine per aprire ordini durante la giornata al raggiungimento dello SL o TP =====
void OpenNextOrders(double Lot)
{  int Ticket,Errore; 
   double SL,TP;
   int ActualSpread;
   
   RefreshRates();

   int Total = TotalOrders();
   
   if ( Total < 1 && DayOfWeek()>=1 && DayOfWeek()<=5 ) 
   {
   // Controlla BUY Order
   if ( TradeStatus == 1 )
    {   
      
      // Controlla SL 
      if (StopLoss < MarketInfo(Symbol(),MODE_STOPLEVEL)) StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
      if (StopLoss == 0) SL = 0;
      SL = Ask-StopLoss*Point;
      if (TakeProfit == 0) TP = 0;
      else TP = Ask+TakeProfit*Point;
      
      // Piazza l'ordine BUY
      Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,EA_Comment,MagicNumber,0,Blue);    
         
      if(Ticket<0)
      {
       Errore=GetLastError();
       Print("ERROR ON BUY ORDER (",Errore,") : ",ErrorDescription(Errore));
      }  
      else
      {
       TradeStatus = 2; // Prossimo trade è Sell 
      }
     } 
   }
  
   Total = TotalOrders();
   if ( Total < 1 && DayOfWeek()>=1 && DayOfWeek()<=5 ) 
   {  
     // Controlla SELL Order
     if ( TradeStatus == 2 )
     {
 
      // Setta SL 
      if (StopLoss < MarketInfo(Symbol(),MODE_STOPLEVEL)) StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
      if (StopLoss == 0) SL = 0;
      SL = Bid+StopLoss*Point;
      if (TakeProfit == 0) TP = 0;
      else TP = Bid-TakeProfit*Point;
      
      // Piazza Ordine SELL       
      Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,EA_Comment,MagicNumber,0,Blue);
          
      if(Ticket<0)
      {
       Errore=GetLastError();
       Print("ERROR ON SELL ORDER (",Errore,") : ",ErrorDescription(Errore));
      } 
      else
      {
       TradeStatus = 1; // Prossimo trade è Buy
      }
     }    
   }
}

// ===== Routine per controllare il trend ===== 
string CheckTrend()
{

 // Check 1 day ago candle
 int DaysShift = 1;
 string C1="NONE",C2="NONE",C3="NONE";
 //if ( SundayCandleExists == true && DayOfWeek() == 1 ) DaysShift++; // if today is Monday then skip the Sunday candle
 if (SundayCandleExists == true && TimeDayOfWeek(iTime(NULL,PERIOD_D1,DaysShift)) == 0)  DaysShift++; // if candle is Monday then skip Sunday candle
 if (iOpen(NULL,PERIOD_D1,DaysShift)==iClose(NULL,PERIOD_D1,DaysShift)) DaysShift++;
 if (iOpen(NULL,PERIOD_D1,DaysShift)<iClose(NULL,PERIOD_D1,DaysShift)) C1 = "BULLISH";
 if (iOpen(NULL,PERIOD_D1,DaysShift)>iClose(NULL,PERIOD_D1,DaysShift)) C1 = "BEARISH";
 // Print("C1_DaysShift = ",DaysShift); // for debug purpouse

 // Check 2 days ago candle
 DaysShift++;
 if (SundayCandleExists == true && TimeDayOfWeek(iTime(NULL,PERIOD_D1,DaysShift)) == 0)  DaysShift++; // if candle is Monday then skip Sunday candle
 if (iOpen(NULL,PERIOD_D1,DaysShift)==iClose(NULL,PERIOD_D1,DaysShift)) DaysShift++;
 if (iOpen(NULL,PERIOD_D1,DaysShift)<iClose(NULL,PERIOD_D1,DaysShift)) C2 = "BULLISH";
 if (iOpen(NULL,PERIOD_D1,DaysShift)>iClose(NULL,PERIOD_D1,DaysShift)) C2 = "BEARISH";
 //Print("C2_DaysShift = ",DaysShift); // for debug purpouse

 // Check 3 days ago candle
 DaysShift++;
 if (SundayCandleExists == true && TimeDayOfWeek(iTime(NULL,PERIOD_D1,DaysShift)) == 0) DaysShift++; // if candle is Monday then skip Sunday candle
 if (iOpen(NULL,PERIOD_D1,DaysShift)==iClose(NULL,PERIOD_D1,DaysShift)) DaysShift++;
 if (iOpen(NULL,PERIOD_D1,DaysShift)<iClose(NULL,PERIOD_D1,DaysShift)) C3 = "BULLISH";
 if (iOpen(NULL,PERIOD_D1,DaysShift)>iClose(NULL,PERIOD_D1,DaysShift)) C3 = "BEARISH";
 // Print("C3_DaysShift = ",DaysShift);
 
 // Print("C1 = ",C1," C2 = ",C2," C3 = ",C3); // for debug purpouse
 
 // BULLISH Condition
 if (
    (C1=="BULLISH" && C2=="BEARISH" && C3=="BULLISH") ||
    (C1=="BULLISH" && C2=="BULLISH" && C3=="BEARISH") ||
    (C1=="BULLISH" && C2=="BEARISH" && C3=="BEARISH") ||     
    (C1=="BEARISH" && C2=="BEARISH" && C3=="BEARISH")
    )
 return("BUY"); 
 
 // BEARISH Condition
 if (
     (C1=="BEARISH" && C2=="BULLISH" && C3=="BEARISH") ||
     (C1=="BEARISH" && C2=="BEARISH" && C3=="BULLISH") ||
     (C1=="BEARISH" && C2=="BULLISH" && C3=="BULLISH") ||
     (C1=="BULLISH" && C2=="BULLISH" && C3=="BULLISH")
    )   
 return("SELL");   
}

// ===== Routine per il calcolo del Lot nel caso di Money Management =====
double CalcolaLot(int Rischio)
{
  double Lot=0;
  Lot=AccountEquity()* Rischio/100/1000;
  if( Lot>=0.1 )
  {
    Lot = NormalizeDouble(Lot,1); 
  }
  else Lot = NormalizeDouble(Lot,2);
  if (Lot > MarketInfo(Symbol(),MODE_MAXLOT)) { Lot = MarketInfo(Symbol(),MODE_MAXLOT); } // Avoid possible Lot value overflow if lot exceed maximum value allowed by broker
  if (Lot < MarketInfo(Symbol(),MODE_MINLOT)) { Lot = MarketInfo(Symbol(),MODE_MINLOT); } // Avoid possible Lot value overflow if lot exceed minimum value allowed by broker
  return(Lot);
}

// ===== Routine per calcolare MagicNumber diverso per ogni coppia e periodo =====
int MagicFromSymbol() 
{ // included by Renato 
   int MagicNumber=0;  
   for (int i=0; i<5; i++) 
   {  
     MagicNumber=MagicNumber*3+20+StringGetChar(Symbol(),i);  
   }  
   MagicNumber=MagicNumber*3+20+Period();  
   return(MagicNumber);  
}

// ===== Routine per calcolare quanti ordini aperti ci sono per questa EA ===== 
int TotalOrders()
{  
   int cnt; 
   int Total = 0;
   for(cnt=0;cnt<OrdersTotal();cnt++)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if (OrderMagicNumber()==MagicNumber) Total ++;
   }
  return(Total); 
}

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

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