Schaff_EA_V1

Author: Copyright � 2009, Robert Hill
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
0 Views
0 Downloads
0 Favorites

Profitability Reports

GBP/USD Oct 2024 - Jan 2025
87.00 %
Total Trades 52
Won Trades 29
Lost trades 23
Win Rate 0.56 %
Expected payoff -0.21
Gross Profit 74.03
Gross Loss -84.92
Total Net Profit -10.89
-100%
-50%
0%
50%
100%
Schaff_EA_V1
//+------------------------------------------------------------------+
//|                                                    Schaff_EA.mq4 |
//|                                    Copyright © 2009, Robert Hill |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Robert Hill"
#property link      ""
#include <stdlib.mqh>
#include <stderror.mqh> 

// Define signal types
#define NONE 0
#define LONG 1
#define SHORT 2
#define CLOSEBUY 3
#define CLOSESELL 4

//---- input parameters
extern int       MagicBase=20000;
extern string    myComment = "Schaff";
extern int       Slippage = 3;
 
extern string  p1 = "Schaff 1 inputs";
extern int STCPeriod    = 10;
extern int CDPeriod     = 25;
extern int FastMAPeriod = 23;
extern int SlowMAPeriod = 50;
extern double sm1 = 2;

extern string  p2 = "Schaff 2 inputs";
extern int MAShort=12;
extern int MALong=50;
extern double Cycle=10;
extern int CountBars=300;
extern double sm2 = 2;

extern int WhichSchaff = 1;


extern int     ovrbotlevel=80;
extern int     ovrsoldlevel=20;
extern int     TargetBotLevel = 80;
extern int     TargetSoldLevel = 20;

extern int     StopLoss = 100;
extern int     TakeProfit = 100;

extern string  tsp = "--Trailing Stop Types--";
extern string  tsp0 = " 0 = Do not trail";
extern string  tsp1 = " 1 = Trail immediately";
extern string  tsp2 = " 2 = Wait to trail";
extern string  tsp3 = " 3 = Uses 3 levels before trail";
extern string  tsp4 = " 4 = Breakeven + Lockin";
extern int     TrailingStopType = 2;

extern string  ts2 = "Settings for Type 2";
extern double  TrailingStop = 25;      // Change to whatever number of pips you wish to trail your position with.

extern string  ts3 = "Settings for Type 3";
extern double  FirstMove = 10;        // Type 3  first level pip gain
extern double  FirstStopLoss = 30;    // Move Stop to Breakeven
extern double  SecondMove = 25;       // Type 3 second level pip gain
extern double  SecondStopLoss = 20;   // Move stop to lock is profit
extern double  ThirdMove = 35;        // type 3 third level pip gain
extern double  TrailingStop3 = 15;    // Move stop and trail from there

extern string  ts4 = "Settings for Type 4";
extern double  BreakEven = 25;
extern int     LockInPips = 10;        // Profit Lock in pips

//+---------------------------------------------------+
//|Money Management                                   |
//+---------------------------------------------------+
extern string  mm = "---Money Management---";
extern double  Lots=0.01;
extern bool    UseMoneyManagement = false; // Change to false to shutdown money management controls.
extern bool    BrokerIsIBFX = false;
extern bool    BrokerIsCrownForex = false;
extern string  m1="Set mini and micro to false for standard account";
extern bool    AccountIsMini = false;
extern bool    AccountIsMicro = true;
extern double  TradeSizePercent = 1;  // Change to whatever percent of equity you wish to risk.
extern bool    BrokerPermitsFractionalLots = true;

extern string  es3="Sunday No Trade - Enter 0 for false, 1 for true";
extern int    UseSundayNoTrade = 0;
extern string  em3="Monday No Trade - Enter 0 for false, 1 for true";
extern int    UseMondayNoTrade = 0;
extern string  ef3="Friday No Trade - Enter 0 for false, 1 for true";
extern int    UseFridayNoTradeTime = 0;
extern int     FridayFinalHour = 20;   // No trades to start after time

extern string  th0="--Trading Hours Filter--";
extern string  th2="UseTradingHours - Enter 0 for false, 1 for true";
extern int    UseTradingHours = 0;
extern string  th4="TradeAsian - Enter 0 for false, 1 for true";
extern int    TradeAsianMarket = 1;
extern int     AsianStart = 100;       // Start trades after time
extern int     AsianStop = 400;      // Stop trading after time
extern string  th5="Trade Europe - Enter 0 for false, 1 for true";
extern int    TradeEuropeanMarket = 1;
extern int     EurStart = 900;       // Start trades after time
extern int     EurStop = 1400;      // Stop trading after time
extern string  th6="Trade NY - Enter 0 for false, 1 for true";
extern int    TradeNewYorkMarket = 1;
extern int     NYStart = 1600;       // Start trades after time
extern int     NYStop = 1700;      // Stop trading after time

double myPoint;

int MagicNumber;
double mLots; 
int LastTrade = NONE;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

	  MagicNumber = MagicBase + func_Symbol2Val(Symbol())*100 + Period();

     myPoint = SetPoint();
   
   return(0);
  }

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
  return(0);
  }  

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  bool YesStop;
  
   int NumOrders = 0,  signal = 0;

   if (IsTesting() == false)
   {
     if (IsExpertEnabled() == false)
     {
      return(0);
     }
   }
   if (IsTradeAllowed()==false ) return(0);
   

  NumOrders = CalculateCurrentOrders();
  if (NumOrders == 0)
  {
     YesStop = CheckTradeFilters();
     if (YesStop == false)
     {
       if (!NewBar()) return(0); // wait until first tick after bar close to take any action; 
       signal = GetEntrySignal();
       if (signal != NONE)
       {
        mLots = GetLots();
        OpenNewTrades(signal, mLots);
       }
     }
  }
  else
  {
     RefreshRates();
     CheckForClose();
  }
  return(0);
}

double GetSchaffTrend(int pos)
{
   double mSchaff;
   
   if (WhichSchaff == 1)
   {
    mSchaff = iCustom(NULL,0,"SchaffTrendCycle1",STCPeriod,CDPeriod,FastMAPeriod,SlowMAPeriod,sm1,0,pos);
   }
   else
   {
    mSchaff = iCustom(NULL,0,"Schaff_Trend_Cycle2",MAShort,MALong,Cycle,CountBars,sm2,0,pos);
   }
   
   return(mSchaff);
   
}

int GetEntrySignal()
{

   double Schaff1, Schaff2;
   
   Schaff2 = GetSchaffTrend(2);
   
   if (Schaff2 > ovrbotlevel)
   {
      Schaff1 = GetSchaffTrend(1);
      if (Schaff1 < ovrbotlevel) return(SHORT);
   }
   if (Schaff2 < ovrsoldlevel)
   {
      Schaff1 = GetSchaffTrend(1);
      if (Schaff1 > ovrsoldlevel) return(LONG);
   }
   return(NONE);
   
}

int GetExitSignal(int cmd)
{
   double Schaff1, Schaff2;
   
   Schaff2 = GetSchaffTrend(2);
   
   if (cmd == OP_BUY)
   {
     if (Schaff2 >= TargetBotLevel)
     {
        Schaff1 = GetSchaffTrend(1);
        if (Schaff1 < TargetBotLevel) return(CLOSEBUY);
     }
   }
   
   if (cmd == OP_SELL)
   {
     if (Schaff2 <= TargetSoldLevel)
     {
        Schaff1 = GetSchaffTrend(1);
        if (Schaff1 > TargetSoldLevel) return(CLOSESELL);
     }
   }
    
   return(NONE);
   
}


void OpenNewTrades(int mSignal, double mLots)
{
  int ticket, err;
  double TPprice,STprice;
  double OrderOP;
      
   RefreshRates();
   
    if (mSignal == SHORT)
    { 
    
      ticket=OrderSend(Symbol(),OP_SELL,mLots,Bid,Slippage * myPoint,0,0,
                  myComment,MagicNumber,0,Red); //Sell at Market price
      if (ticket > 0)
      {
         LastTrade = SHORT;
         OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
         OrderOP = OrderOpenPrice();
         if (StopLoss != 0 || TakeProfit != 0)
	      {
            TPprice = 0;
            if (TakeProfit > 0)
            {
               TPprice=TakeShort(OrderOP, TakeProfit);
            }
            STprice = 0;
            if (StopLoss > 0)
            {
              STprice=StopShort(OrderOP, StopLoss);
		        STprice = ValidStopLoss(OP_SELL,Ask, STprice);
		      }   
 // Normalize stoploss / takeprofit to the proper # of digits.
            if (Digits > 0) 
            {
              STprice = NormalizeDouble( STprice, Digits);
              TPprice = NormalizeDouble( TPprice, Digits); 
            }
		      ModifyOrder(ticket, OrderOP, STprice, TPprice, LightGreen);
         } 
      }
    }
    
    if (mSignal == LONG)   
    {
      ticket=OrderSend(Symbol(),OP_BUY,mLots,Ask,Slippage * myPoint,0,0,
                   myComment,MagicNumber,0,Lime); //Buy at Market price
      if (ticket > 0)
      {
         LastTrade = LONG;
         OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
         OrderOP = OrderOpenPrice();
         if (StopLoss != 0 || TakeProfit != 0)
	      {
            TPprice = 0;
            if (TakeProfit > 0)
            {
              TPprice=TakeLong(OrderOP,TakeProfit);
            }
            STprice = 0;
            if (StopLoss > 0)
            {
              STprice=StopLong(OrderOP ,StopLoss);
		        STprice = ValidStopLoss(OP_BUY,Bid, STprice); 
		      }  
 // Normalize stoploss / takeprofit to the proper # of digits.
            if (Digits > 0) 
            {
              STprice = NormalizeDouble( STprice, Digits);
              TPprice = NormalizeDouble( TPprice, Digits); 
            }
		      ModifyOrder(ticket, OrderOP, STprice, TPprice, Red);
         }
      }
    }
   if(ticket<0)
   {
     err = GetLastError();
     Print("OrderSend failed : (" +  err + ")");
     Print(ErrorDescription(err));
   }
}


void CheckForClose()
{
   int Signal, result, err;
   
// Check for open trades to close or modify

    for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
    {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      {
        Signal = GetExitSignal(OrderType());
        result = true;
        if(OrderType() == OP_BUY)
        {
           if (Signal == CLOSEBUY)
           {
              result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
           }
           else
              if (TrailingStopType > 0) HandleTrailingStop(OP_BUY,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
 
        }
        if(OrderType() == OP_SELL)
        {
           if (Signal == CLOSESELL)
           {
             result = OrderClose(OrderTicket(), OrderLots(), Ask, 3, Lime);
           }
           else
             if (TrailingStopType > 0) HandleTrailingStop(OP_SELL,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
 
        }
        if (result == false)
        {
		     err = GetLastError();
           Print(" Error closing order : (" +  err + ")");
           Print(ErrorDescription(err));
        }
        
      }
    }
 }
//----

//+------------------------------------------------------------------+
//| HandleTrailingStop                                               |
//| Type 1 moves the stoploss without delay.                         |
//| Type 2 waits for price to move the amount of the trailStop       |
//| before moving stop loss then moves like type 1                   |
//| Type 3 uses up to 3 levels for trailing stop                     |
//|      Level 1 Move stop to 1st level                              |
//|      Level 2 Move stop to 2nd level                              |
//|      Level 3 Trail like type 1 by fixed amount other than 1      |
//| Type 4 Move stop to breakeven + Lockin, no trail                 |
//| Type 5 uses steps for 1, every step pip move moves stop 1 pip    |
//| Type 6 Uses EMA to set trailing stop                             |
//+------------------------------------------------------------------+
int HandleTrailingStop(int type, int ticket, double op, double os, double tp)
{
   switch (TrailingStopType)
   {
     case 1 : Immediate_TrailingStop (type, ticket, op, os, tp);
              break;
     case 2 : Delayed_TrailingStop (type, ticket, op, os, tp);
              break;
     case 3 : ThreeLevel_TrailingStop (type, ticket, op, os, tp);
              break;
     case 4 : BreakEven_TrailingStop (type, ticket, op, os, tp);
              break;
	}
   return(0);
}

int ModifyOrder(int ord_ticket,double op, double oSL, double oTP, color mColor)
{
    int CloseCnt, err;
    double myStop, myTake;
    
/*
    if (Digits > 0)
    {
       myStop = NormalizeDouble( oSL, Digits);
       myTake = NormalizeDouble( oTP, Digits);
    }
*/
    CloseCnt=0;
    while (CloseCnt < 3)
    {
       if (OrderModify(ord_ticket,op,oSL,oTP,0,mColor))
       {
         CloseCnt = 3;
       }
       else
       {
          err=GetLastError();
          Print(CloseCnt," Error modifying order : (", err , ") " + ErrorDescription(err));
         if (err>0) CloseCnt++;
       }
    }
}

double ValidStopLoss(int type, double price, double SL)
{

   double mySL;
   double minstop;
   
   if (SL < 0.1) return(SL);
   
   mySL = SL;
   minstop = MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (Digits == 3 || Digits == 5) minstop = minstop / 10;
   if (type == OP_BUY)
   {
		 if((price - SL) < minstop*myPoint) mySL = price - minstop*myPoint;
   }
   if (type == OP_SELL)
   {
       if((SL-price) < minstop*myPoint)  mySL = price + minstop*myPoint;  
   }

   return(NormalizeDouble(mySL,MarketInfo(Symbol(), MODE_DIGITS)));   
}

//+------------------------------------------------------------------+
//|                                       Immediate_TrailingStop.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by MrPip,robydoby314@yahoo.com   |
//|                                                                  |   
//| Moves the stoploss without delay.                                |
//+------------------------------------------------------------------+
void Immediate_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pt, pBid, pAsk, BuyStop, SellStop;

   digits = MarketInfo(Symbol( ), MODE_DIGITS);
   
   if (type==OP_BUY)
   {
     pBid = MarketInfo(Symbol(), MODE_BID);
     pt = StopLoss * myPoint;
     if(pBid-os > pt)
     {
       BuyStop = pBid - pt;
       if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
		 BuyStop = ValidStopLoss(OP_BUY,pBid, BuyStop);   
       if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
		 return;
	  }
   }
   if (type==OP_SELL)
   {
     pAsk = MarketInfo(Symbol(), MODE_ASK);
     pt = StopLoss * myPoint;
     if(os - pAsk > pt)
     {
       SellStop = pAsk + pt;
       if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
       SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
       if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
		 return;
     }
   }   
}

//+------------------------------------------------------------------+
//|                                         Delayed_TrailingStop.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by MrPip,robydoby314@yahoo.com   |
//|                                                                  |   
//| Waits for price to move the amount of the TrailingStop           |
//| Moves the stoploss pip for pip after delay.                      |
//+------------------------------------------------------------------+
void Delayed_TrailingStop(int type, int ticket, double op, double os, double tp)
{
   int digits;
   double pt, pBid, pAsk, BuyStop, SellStop;

   pt = TrailingStop * myPoint;
   digits = MarketInfo(Symbol(), MODE_DIGITS);
   
   if (type==OP_BUY)
   {
     pBid = MarketInfo(Symbol(), MODE_BID);
     BuyStop = pBid - pt;
     if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
	  BuyStop = ValidStopLoss(OP_BUY,pBid, BuyStop);   
     if (pBid-op > pt && os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
	  return;
   }
   if (type==OP_SELL)
   {
     pAsk = MarketInfo(Symbol(), MODE_ASK);
     pt = TrailingStop * myPoint;
     SellStop = pAsk + pt;
     if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
     if (op - pAsk > pt && os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
	  return;
   }   
}
 
//+------------------------------------------------------------------+
//|                                           BreakEvenExpert_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
void BreakEven_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pBid, pAsk, BuyStop, SellStop;

   digits = MarketInfo(Symbol(), MODE_DIGITS);
   
  if (type==OP_BUY)
  {
    pBid = MarketInfo(Symbol(), MODE_BID);
    if ( pBid-op > myPoint*BreakEven ) 
    {
       BuyStop = op + LockInPips * myPoint;
       if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
		 BuyStop = ValidStopLoss(OP_BUY,pBid, BuyStop);   
       if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
		 return;
	 }
  }
  if (type==OP_SELL)
  {
    pAsk = MarketInfo(Symbol(), MODE_ASK);
    if ( op - pAsk > myPoint*BreakEven ) 
    {
       SellStop = op - LockInPips * myPoint;
       if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
       SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
       if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
		 return;
    }
  }   

}

//+------------------------------------------------------------------+
//|                                      ThreeLevel_TrailingStop.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by MrPip,robydoby314@yahoo.com   |   
//|                                                                  |
//| Uses up to 3 levels for trailing stop                            |
//|      Level 1 Move stop to 1st level                              |
//|      Level 2 Move stop to 2nd level                              |
//|      Level 3 Trail like type 1 by fixed amount other than 1      |
//+------------------------------------------------------------------+
void ThreeLevel_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pBid, pAsk, BuyStop, SellStop;

   digits = MarketInfo(Symbol(), MODE_DIGITS) ;

   if (type == OP_BUY)
   {
      pBid = MarketInfo(Symbol(), MODE_BID);
      if (pBid - op > FirstMove * myPoint)
      {
         BuyStop = op + FirstMove*myPoint - FirstStopLoss * myPoint;
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
		   BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
         if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
      }
              
      if (pBid - op > SecondMove * myPoint)
      {
         BuyStop = op + SecondMove*myPoint - SecondStopLoss * myPoint;
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
		   BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
         if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
      }
                
      if (pBid - op > ThirdMove * myPoint)
      {
         BuyStop = pBid  - ThirdMove*myPoint;
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
		   BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
         if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
      }
   }
       
    if (type ==  OP_SELL)
    {
        pAsk = MarketInfo(Symbol(), MODE_ASK);
        if (op - pAsk > FirstMove * myPoint)
        {
           SellStop = op - FirstMove * myPoint + FirstStopLoss * myPoint;
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
           if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        }
        if (op - pAsk > SecondMove * myPoint)
        {
           SellStop = op - SecondMove * myPoint + SecondStopLoss * myPoint;
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
           if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        }
        if (op - pAsk > ThirdMove * myPoint)
        {
           SellStop = pAsk + ThirdMove * myPoint;               
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
           if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        }
    }

}


//-- Check for Start of a new Bar
bool NewBar()
{
   static datetime dt = 0;
   
   if (Time[0] != dt)
   {
      dt = Time[0];
      return(true);
   }
   return(false);
}

double StopLong(double price,int stop)
{
 if(stop==0)
  return(0);
 else
  return(price-(stop*myPoint));
}

double StopShort(double price,int stop)
{
 if(stop==0)
  return(0);
 else
  return(price+(stop*myPoint));
}

double TakeLong(double price,int take)
{
 if(take==0)
  return(0);
 else
  return(price+(take*myPoint));
}

double TakeShort(double price,int take)
{
 if(take==0)
  return(0);
 else
  return(price-(take*myPoint));
}

int CalculateCurrentOrders()
{
   int buys = 0, sells = 0, num = 0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber)
      {
        if(OrderType() == OP_BUY)  buys++;
        if(OrderType() == OP_SELL) sells++;
      }
   }
     
   num = buys + sells;
   return(num);
}


//+------------------------------------------------------------------+
//| Get number of lots for this trade                                |
//+------------------------------------------------------------------+
double GetLots()
{
   double lot;
   double myMaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   
   if(UseMoneyManagement == false) return(Lots);

   if (BrokerIsIBFX == true)
   {
     lot = Calc_IBFX_Money_Management();
     return(lot);
   }
   
   if (BrokerIsCrownForex == true)
   {
     lot = Calc_CrownMoney_Management();
     return(lot);
   }
//   lot = LotsOptimized();
   lot=NormalizeDouble((AccountEquity()*TradeSizePercent/10000)/10,2);

//   lot = MathRound( lot/myStep ) * myStep;

// Use at least 1 micro lot
   if (AccountIsMicro == true)
   {
      lot = MathFloor(lot*100)/100;
      if (lot < 0.01) lot = 0.01;
      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }

// Use at least 1 mini lot
   if(AccountIsMini == true)
   {
      lot = MathFloor(lot*10)/10;
      if (lot < 0.1) lot = 0.1;
      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }
   
// Standard account   
   if( BrokerPermitsFractionalLots == false)
   {
      if (lot >= 1.0) lot = MathFloor(lot); else lot = 1.0;
   }
   
   if (lot < 1.0) lot = 1.0;
   if (lot > myMaxLot) lot = myMaxLot;

   return(lot);
}

double Calc_CrownMoney_Management()
{
   double lot;

   lot=NormalizeDouble((AccountEquity()*TradeSizePercent/10000)/10,1);

//   lot = MathRound( lot/myStep ) * myStep;

// Use at least 1 mini lot
   if(AccountIsMini == true)
   {
      lot = MathFloor(lot*10)/10 * 10000;
      if (lot < 10000) lot = 10000;
//      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }
   
// Standard account   
   
   lot = lot * 100000;
   if (lot < 100000) lot = 100000;
//   if (lot > myMaxLot) lot = myMaxLot;

   return(lot);
}

double Calc_IBFX_Money_Management()
{
// variables used for money management
   double lot;
   double myMaxLot = MarketInfo(Symbol(), MODE_MAXLOT);

   lot=NormalizeDouble((AccountEquity()*TradeSizePercent/10000)/10,2);
   
// Use at least 1 micro lot
   if (AccountIsMicro == true)
   {
      lot = lot * 10;
      lot = MathFloor(lot*100)/100;
      if (lot < 0.1) lot = 0.1;
      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }

// Use at least 1 mini lot
   if(AccountIsMini == true)
   {
      lot = lot * 10;
      lot = MathFloor(lot*10)/10;
      if (lot < 1) lot = 1;
      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }
   
   // Standard Account
   
   if(BrokerPermitsFractionalLots == true)
        lot = StrToDouble(DoubleToStr(lot, 2));
   else
        lot = MathFloor(lot);
   
   if (lot > myMaxLot) lot = myMaxLot;

   return(lot); 
}

double SetPoint()
{
   double mPoint;
   
   if (Digits < 4)
      mPoint = 0.01;
   else
      mPoint = 0.0001;
   
   return(mPoint);
}

int func_Symbol2Val(string symbol)
 {
   string mySymbol = StringSubstr(symbol,0,6);
   
	if(mySymbol=="AUDCAD") return(1);
	if(mySymbol=="AUDJPY") return(2);
	if(mySymbol=="AUDNZD") return(3);
	if(mySymbol=="AUDUSD") return(4);
	if(mySymbol=="CHFJPY") return(5);
	if(mySymbol=="EURAUD") return(6);
	if(mySymbol=="EURCAD") return(7);
	if(mySymbol=="EURCHF") return(8);
	if(mySymbol=="EURGBP") return(9);
	if(mySymbol=="EURJPY") return(10);
	if(mySymbol=="EURUSD") return(11);
	if(mySymbol=="GBPCHF") return(12);
	if(mySymbol=="GBPJPY") return(13);
	if(mySymbol=="GBPUSD") return(14);
	if(mySymbol=="NZDJPY") return(15);
	if(mySymbol=="NZDUSD") return(16);
	if(mySymbol=="USDCAD") return(17);
	if(mySymbol=="USDCHF") return(18);
	if(mySymbol=="USDJPY") return(19);
   Comment("unexpected Symbol");
	return(999);
}


bool CheckTradeFilters()
{
   bool myStop, Expired;
   
   myStop = false;
   
      
      if (UseTradingHours == 1)
      {
        myStop = CheckTradingTimes();
   
        if (myStop == true)
        {
          Comment ("Trading has been stopped - wrong time of day");
        }
        else
        {
          Comment ("Trading has resumed - time is OK");
        }
      }
      else
          Comment("Trading Time filter not in use");

//+------------------------------------------------------------------+
//| Sunday No trade zone                                             |
//+------------------------------------------------------------------+
   if (myStop == false)
   {
      if (UseSundayNoTrade == 1)
      {
         if(DayOfWeek()==0)
         {
            myStop = true;
            Comment ("Trading has been stopped - Sunday");
         }
      }
   }
//+------------------------------------------------------------------+
//| Monday No trade zone                                             |
//+------------------------------------------------------------------+
   if (myStop == false)
   {
      if (UseMondayNoTrade == 1)
      {
         if(DayOfWeek()==1)
         {
            myStop = true;
            Comment ("Trading has been stopped - Monday");
         }
      }
   }
   
//+------------------------------------------------------------------+
//| Friday No trade zone                                             |
//+------------------------------------------------------------------+
   if (myStop == false)
   {
      if (UseFridayNoTradeTime == 1)
      {
         if(DayOfWeek()==5 && Hour() >= FridayFinalHour)
         {
            myStop = true;
            Comment ("Trading has been stopped - Friday");
         }
      }
   }

   
   return(myStop);
}


bool IsNotValidTradingTime( int StartHour, int EndHour)
{
  int lHour=Hour() *100+Minute( );
  if(StartHour<=EndHour)
  {
    if(lHour<StartHour || lHour>EndHour) return(true) ;
  }
  else if(lHour>EndHour && lHour<StartHour) return(true) ;
  return(false) ;
}

bool CheckTradingTimes()
{
   bool StopTrading;
   int ct;
   ct = Hour() * 100 + Minute();
   
     StopTrading = true;
// Check trading Asian Market
     if (TradeAsianMarket == 1)
     {
        StopTrading = IsNotValidTradingTime(AsianStart, AsianStop);
     }
     if (StopTrading == true)
     {
// Check trading European Market
       if (TradeEuropeanMarket == 1)
       {
         StopTrading = IsNotValidTradingTime(EurStart, EurStop);
       }
     }
     if (StopTrading == true)
     {
// Check trading New York Market
       if (TradeNewYorkMarket == 1)
       {
         StopTrading = IsNotValidTradingTime(NYStart, NYStop);
       }
     }
     
     return(StopTrading);
}
//----




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