TrueScalperProfitLock

Author: Copyright � 2005, International Federation of Red Cross.
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Moving average indicatorRelative strength index
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
41.00 %
Total Trades 807
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -4.21
Gross Profit 2393.50
Gross Loss -5787.00
Total Net Profit -3393.50
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
53.00 %
Total Trades 1386
Won Trades 890
Lost trades 496
Win Rate 0.64 %
Expected payoff -3.40
Gross Profit 5214.00
Gross Loss -9930.00
Total Net Profit -4716.00
-100%
-50%
0%
50%
100%
TrueScalperProfitLock
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                        TrueScalperProfitLock.mq4 |
//|         Copyright © 2005, International Federation of Red Cross. |
//|                                             http://www.ifrc.org/ |
//|                                         Please donate some pips  |
//+------------------------------------------------------------------+
/*
		Modifications                                                         
		-------------                                                       
		DATE       MOD #    DESCRIPTION                		        
		---------- -------- ------------------------------------------------------------
       ??  ?? 2005  1      Jacob Yego and Ron Thompson: Original version                               
        
       19 Oct 2005  2      Reworked by Roger. This MT4 version is now identical to
                           Roger's earlier MT3 version TrueScalperProfitLock.mql.
                           Both these versions now include optional RSI validation, optional
                           Abandon method, MoneyManagement and ProfitLock system.
                           
Original Theory of operation (See TrueScalperProfitLock.mql MT3 version for more UPDATED
and DETAILED descriptions)                        
*/

#property copyright "Copyright © 2005, International Federation of Red Cross."
#property link      "http://www.ifrc.org/"

// generic user input
extern double Lots=1.0;
extern int    TakeProfit=44;
extern int    StopLoss=90;
extern bool   RSIMethodA=false;
extern bool   RSIMethodB=true;
extern int    RSIValue=50;
extern bool   AbandonMethodA=true;
extern bool   AbandonMethodB=false;
extern int    Abandon=101;
extern bool   MoneyManagement=true;
extern int    Risk=2;
extern int    Slippage=3;
extern bool   UseProfitLock=true;
extern int    BreakEvenTrigger=25;
extern int    BreakEven=3;
extern bool   LiveTrading=false;
extern bool   AccountIsMini=false;
extern int    maxTradesPerPair=1;
extern int    MagicNumber=5432;

double lotMM;
bool BuySignal=false;
bool SetBuy=false;
bool SellSignal=false;
bool SetSell=false;


// Bar handling
datetime bartime=0;
int      bartick=0;
int      TradeBars=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if (UseProfitLock) ProfitLockStop();
   if (AbandonMethodA || AbandonMethodB)
      {
      RunAbandonCheck();
      RunAbandonMethods();
      }
   if (!SetLotsMM()) return(0);   
   RunOrderTriggerCalculations();
   RunPairSpesificSettings();
   RunNewOrderManagement();
//----
   return(0);
  }
  
/////////////////////////////////////////////////
//  SetLotsMM - By Robert Cochran http://autoforex.biz
/////////////////////////////////////////////////
bool SetLotsMM()
{
   double MarginCutoff;

   if(!AccountIsMini) MarginCutoff = 1000;
   if( AccountIsMini) MarginCutoff = 100;

   if(AccountFreeMargin() < MarginCutoff) return(false);

   if(MoneyManagement)
   {
     lotMM = MathCeil(AccountBalance() * Risk / 10000) / 10;

     if(lotMM < 0.1) lotMM = Lots;
     if(lotMM > 1.0) lotMM = MathCeil(lotMM);

     // Enforce lot size boundaries

     if(LiveTrading)
     {
         if( AccountIsMini)               lotMM = lotMM * 10;
         if(!AccountIsMini && lotMM < 1.0) lotMM = 1.0;
     }

     if(lotMM > 100) lotMM = 100;
   }
   else
   {
     lotMM = Lots; // Change MoneyManagement to 0 if you want the Lots parameter to be in effect
   }
   return(true);
}

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

/////////////////////////////////////////////////
//  RunOrderTriggerCalculations
/////////////////////////////////////////////////
bool RunOrderTriggerCalculations()
{

bool    RSIPOS=false;
bool    RSINEG=false;

// 3-period moving average on Bar[1]
double bullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1);
// 7-period moving average on Bar[1]
double bearMA7=iMA(Symbol(),0,7,0,MODE_EMA,PRICE_CLOSE,1);
   
// 2-period moving average on Bar[2]
double RSI=iRSI(Symbol(),0,2,PRICE_CLOSE,2);
double RSI2=iRSI(Symbol(),0,2,PRICE_CLOSE,1);

// Determine what polarity RSI is in
if (RSIMethodA)
   {
   if(RSI>RSIValue && RSI2<RSIValue)
     {
     RSIPOS=true;
     RSINEG=false;
     }
     else RSIPOS=false;
   if(RSI<RSIValue && RSI2>RSIValue)
     {
     RSIPOS=false;
     RSINEG=true;
     }
     else RSINEG=false;
   }
if (RSIMethodB)
   {
    if(RSI>RSIValue)
      {
      RSIPOS=true;
      RSINEG=false;
      }
    if(RSI<RSIValue)
      {
      RSIPOS=false;
      RSINEG=true;
      }
   }  

if ((bullMA3 > (bearMA7+Point)) && RSINEG)
   {
   BuySignal=true;
   }
   else BuySignal=false;
   
if ((bullMA3 < (bearMA7-Point)) && RSIPOS)
   {
   SellSignal=true;
   }
   else SellSignal=false;
  return(true);
}

/////////////////////////////////////////////////
//  OpenOrdersBySymbolAndComment
/////////////////////////////////////////////////
int OpenOrdersForThisEA()
{
   int ofts=0;
   for(int x=0;x<OrdersTotal();x++)
   {
      OrderSelect(x, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
      {
        ofts++;
      }
   }
   return(ofts);
}

/////////////////////////////////////////////////
//  PROFIT LOCK - By Robert Cochran - http://autoforex.biz
/////////////////////////////////////////////////

bool ProfitLockStop()
{
   if( OpenOrdersForThisEA() > 0 )
   {
      for ( int i = 0; i < OrdersTotal(); i++){
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         //--- LONG TRADES
         
         if(OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber()== MagicNumber)
         {
            if (Bid >= OrderOpenPrice() + BreakEvenTrigger*Point &&
                OrderOpenPrice() > OrderStopLoss())
            {
              OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + BreakEven * Point, OrderTakeProfit(), Green);
            }
         }
         
         //--- SHORT TRADES
         if(OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber()==MagicNumber)
         {
            if (Ask  <= OrderOpenPrice() - BreakEvenTrigger*Point &&
                OrderOpenPrice() < OrderStopLoss())
            {
                  OrderModify(OrderTicket(), OrderOpenPrice(),OrderOpenPrice() - BreakEven * Point, OrderTakeProfit(), Blue);
            }
         }
      }
   }
}


/////////////////////////////////////////////////
//  ABANDON CHECK
/////////////////////////////////////////////////

bool RunAbandonCheck()
{
  if( OpenOrdersForThisEA() > 0 )
     {
      if (TradeBars == 0 && bartick == 0)
      {
        for (int i = 0; i < OrdersTotal(); i++)
        {
            if (OrderSymbol() == Symbol())
            {
               TradeBars = MathFloor(CurTime() - OrderOpenTime())/60/Period();
               bartime = Time[0];
               bartick = TradeBars;
            }
         }
       }
       if(bartime!=Time[0])
       {
       bartime=Time[0];
       bartick++;
       }
    }          
  return(true);
}
 
/////////////////////////////////////////////////
//  RunAbandonMethods
/////////////////////////////////////////////////

bool RunAbandonMethods()
{
   if( OpenOrdersForThisEA() > 0 )
     {
      for (int i = 0; i < OrdersTotal(); i++)
      {
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
     
      if (AbandonMethodA && bartick==Abandon)//Force "HEDGE" after abandon
        {
         // LONG TRADES
         if (OrderType() == OP_BUY && OrderSymbol() == Symbol() &&
         OrderMagicNumber()==MagicNumber)
         {
           OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue);
           SetSell=true;
           continue;
         }
         // SHORT TRADES
         if (OrderType() == OP_SELL && OrderSymbol() == Symbol() &&
         OrderMagicNumber()==MagicNumber)
         {
           OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Blue);
           SetBuy=true;
           continue;
         }
       }

       if (AbandonMethodB && bartick==Abandon)//Indicators decide direction after abandon
        {
         // LONG TRADES
         if (OrderType() == OP_BUY && OrderSymbol() == Symbol() &&
         OrderMagicNumber()==MagicNumber)
         {
           OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
           continue;
         }
         // SHORT TRADES
         if (OrderType() == OP_SELL && OrderSymbol() == Symbol() &&
         OrderMagicNumber()==MagicNumber)
         {
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
            continue;
         }
       }
     } 
   }
   return(true);
 }
 
/////////////////////////////////////////////////
//  RunPairSpesificSettings
/////////////////////////////////////////////////
bool RunPairSpesificSettings()
{
   // set up the symbol optimizations
   if (Symbol()=="GBPUSD")
     {
     TakeProfit=55; StopLoss=100; Abandon=69;
     }
   return(true);
}
/////////////////////////////////////////////////
//  RunNewOrderManagement
/////////////////////////////////////////////////

bool RunNewOrderManagement()
{
double  TP,SL;

   if( OpenOrdersForThisEA() < maxTradesPerPair )
   {
      //ENTRY Ask(buy, long) 
      if (BuySignal || SetBuy)
		  {
		   SL = Ask - StopLoss*Point;
		   TP = Ask + TakeProfit*Point;
         OrderSend(Symbol(),OP_BUY,lotMM,Ask,Slippage,SL,TP,"TS-ProfitLock - "+Symbol()+" - Long",MagicNumber,0,White);
         bartick=0;
         if (SetBuy) SetBuy=false;
         return(true);
        }
        
      //ENTRY Bid (sell, short)
      if (SellSignal || SetSell)
        {
		   SL = Bid + StopLoss*Point;
		   TP = Bid - TakeProfit*Point;
         OrderSend(Symbol(),OP_SELL,lotMM,Bid,Slippage,SL,TP,"TS-ProfitLock - "+Symbol()+" - Short",MagicNumber,0,Red);
         bartick=0;
         if (SetSell) SetSell=false; 
         return(true);
        }
     }
  return(true);
}

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