Friday, December 17, 2021

21 period high low with 9 and 20 ma crossover mt4

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

//|                                                       21 period  high low with 9 and 20 ma crossover mq4 |

//|                        Copyright 2021, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

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

#property copyright "Copyright 2021, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

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

//| Expert initialization function                                   |

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

extern int MagicNumber=10001;

extern double Lots =0.01;

extern double StopLoss=0;

extern double TakeProfit=0;

extern int TrailingStop=2;

extern int Slippage=3;

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

//    expert start function

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

int start()

{

  double MyPoint=Point;

  if(Digits==3 || Digits==5) MyPoint=Point*10;

  double high21 = High[iHighest(NULL, 0, MODE_HIGH, 21, 1)];   

  double low21 = Low[iLowest(NULL, 0, MODE_LOW, 21, 1)];

  double volumeh = High[iHighest(NULL, 0, MODE_VOLUME, 5, 1)];

  double volumel = Low[iHighest(NULL, 0, MODE_VOLUME, 5, 1)];

  double buybase = High[iLowest(NULL, 0, MODE_LOW, 21, 1)];

  double sellbase = Low[iHighest(NULL, 0, MODE_HIGH, 21, 1)];

  double ma9 = iMA(NULL,0,9,0,MODE_EMA,PRICE_TYPICAL ,0);

  double ma20 = iMA(NULL,0,20,0,MODE_EMA,PRICE_TYPICAL ,0);

  double speared =DoubleToStr(Ask-Bid,Digits);

  double vhvl =DoubleToStr(volumeh-volumel,Digits);

  double btar =DoubleToStr(Ask+speared,Digits);

  double star =DoubleToStr(Bid-speared,Digits);

  double bstop = DoubleToStr(Low[1]-speared,Digits);

  double sstop = DoubleToStr(High[1]+speared,Digits);

  double bstoploss = 0;  

  if(btar > bstop){ bstoploss = bstop;} else { bstoploss = btar;}

  double sstoploss = 0;  

  if(star < sstop){ sstoploss = sstop;} else { sstoploss = star;}

  double TheStopLoss=0;

  double TheTakeProfit=0;

  if( TotalOrdersCount()==0 ) 

  {

     int result=0;

    if(Close[1] > ma9 && Close[1] > ma20 && buybase < Ask && sellbase > Ask && Ask > High[1]) // Here is your open buy rule

     {

        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,bstoploss,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Blue);

        if(result>0)

        {

         TheStopLoss=0;

         TheTakeProfit=0;

         if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;

         if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;

         OrderSelect(result,SELECT_BY_TICKET);

        // OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);

        }

        return(0);

     }

    if(Close[1] < ma20 && Close[1] < ma9 && sellbase > Bid && star < Bid && Bid < Low[1]) // Here is your open Sell rule

     {

        result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,sstoploss,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Red);

        if(result>0)

        {

         TheStopLoss=0;

         TheTakeProfit=0;

         if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;

         if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;

         OrderSelect(result,SELECT_BY_TICKET);

        // OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);

        }

        return(0);

     }

  }

  double rsi = iRSI(NULL,0,14,PRICE_CLOSE,0);

  

  Comment(" speared " , speared , " high21 " , high21 , " low21 " , low21, " volumeh " , volumeh, " volumel ", volumel, " buybase " , buybase , " sellbase " , sellbase , " bstoploss " , bstoploss , " sstoploss " , sstoploss);

  for(int cnt=0;cnt<OrdersTotal();cnt++)

     {

      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

      if(OrderType()<=OP_SELL &&   

         OrderSymbol()==Symbol() &&

         OrderMagicNumber()==MagicNumber 

         )  

        {

         if(OrderType()==OP_BUY)  

           {

              if( Low[1] < Bid) //here is your close buy rule

              {

              //     OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);

              }

            if(TrailingStop>0)  

              {                 

               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)

                 {

                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)

                    {

                     //OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);

                     OrderModify(OrderTicket(),OrderOpenPrice(),bstoploss,OrderTakeProfit(),0,Green);

                     return(0);

                    }

                 }

              }

           }

         else 

           {

                if(High[1]<Ask) // here is your close sell rule

                {

               //    OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);

                }

            if(TrailingStop>0)  

              {                 

               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))

                 {

                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))

                    {

                     OrderModify(OrderTicket(),OrderOpenPrice(),sstoploss,OrderTakeProfit(),0,Red);

                     //OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);

                     return(0);

                    }

                 }

              }

           }

        }

     }

   return(0);

}


int TotalOrdersCount()

{

  int result=0;

  for(int i=0;i<OrdersTotal();i++)

  {

     OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);

     if (OrderMagicNumber()==MagicNumber) result++;


   }

  return (result);

}