Author: Copyright � 2010
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains close prices for each barSeries array that contains open prices of each bar
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
Indicators Used
Moving average indicator
Miscellaneous
It sends emails
0 Views
0 Downloads
0 Favorites
move_cross
//+---------------------------------------------------------------------------+
    Donation are accepted to get the access to strategy tester: contact on PM 
    on MQL 4 website
//+---------------------------------------------------------------------------+
#property copyright "Copyright © 2010"
#property link      ""
#include <stdlib.mqh>
//----
//+---------------------------------------------------+
//|Money Management                                   |
//+---------------------------------------------------+
extern bool AccountIsMini=true;         // Change to true if trading mini account
extern bool MoneyManagement=true;       // Change to false to shutdown money management controls.
extern bool UseTrailingStop=true;
//----                                  // Lots = 1 will be in effect and only 1 lot will be open regardless of equity.
extern double TradeSizePercent  = 30;   // Change to whatever percent of equity you wish to risk.
extern double Lots              = 0.1; // you can change the lot but be aware of margin. Its better to trade with 1/4 of your capital. 
extern double MaxLots=200;
extern double StopLoss          = 1000;  // Maximum pips willing to lose per position.


extern int TakeProfit           = 5;   // Maximum profit level achieved. recomended  no more than 20
extern double MarginCutoff      = 300;  // Expert will stop trading if equity level decreases to that level.
extern int Slippage             = 3;   // Possible fix for not getting closed Could be higher with some brokers    
//----
int cnt, ticket;
int MagicNumber;        // Magic EA identifier. Allows for several co-existing EA with different input values
string ExpertName;      // To "easy read" which EA place an specific order and remember me forever :)
double lotMM;
int TradesInThisSymbol;

 

 
double BAL, RAVI0_2_24_H1, LastBid, RAVI0_2_24_D1, RAVI0_2_24_D1_1, RAVI0_2_24_D1_2, RAVI0_2_24_D1_3, Pnt;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
 int init() 
  {
   MagicNumber=3000 + func_Symbol2Val(Symbol())*100 + func_TimeFrame_Const2Val(Period());
   ExpertName="DVD 100 cent: " + MagicNumber + " : " + Symbol() + "_" + func_TimeFrame_Val2String(func_TimeFrame_Const2Val(Period()));
   Pnt = Point*MathPow(10,Digits-5);
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
 int deinit() 
  {
   return(0);
  }

//+------------------------------------------------------------------+
//| CheckExitCondition                                               |
//| Check if any rules are met for close of trade                    |
//| This EA closes trades by hitting StopLoss or TrailingStop        |
//| No Exit rules so always return false                             |
//+------------------------------------------------------------------+
 bool CheckExitCondition(string TradeType,double OpenPrice, datetime OpenTime)
  {
   return(false);
  }
   
 bool calcTrend()
  {
      RAVI0_2_24_H1      = Get_RAVI(PERIOD_H1,2,24, MODE_SMA,PRICE_OPEN,0);
      RAVI0_2_24_D1      = Get_RAVI(PERIOD_D1,2,24, MODE_SMA,PRICE_OPEN,0);
      RAVI0_2_24_D1_1    = Get_RAVI(PERIOD_D1,2,24, MODE_SMA,PRICE_OPEN,1);
      RAVI0_2_24_D1_2    = Get_RAVI(PERIOD_D1,2,24, MODE_SMA,PRICE_OPEN,2);
      RAVI0_2_24_D1_3    = Get_RAVI(PERIOD_D1,2,24, MODE_SMA,PRICE_OPEN,3);
  }
//+------------------------------------------------------------------+
//| CheckEntryCondition                                              |
//| Check if rules are met for Buy trade                             |
//+------------------------------------------------------------------+
bool CheckEntryConditionBUY()
  {
   BAL = 0;      
                                       
   if (RAVI0_2_24_H1 <  -0.00) BAL = BAL + 10; 
   
   double Level100;
   int PointFromLevelGo = 50, PtFrRise = 700;
   Level100 = StrToDouble(DoubleToStr(Bid,2)) + PointFromLevelGo*Pnt;
   
   if (iHigh(NULL,PERIOD_H1,1) > Level100 + PtFrRise*Pnt || iHigh(NULL,PERIOD_H1,2) > Level100 + PtFrRise*Pnt) BAL = BAL + 7;
   
   if (Bid < Level100  && iClose(NULL,PERIOD_M1,1) > Level100 && iLow(NULL,PERIOD_H1,0) > Level100 - PointFromLevelGo*Pnt + 30*Pnt
                                                              && iLow(NULL,PERIOD_H1,1) > Level100 - PointFromLevelGo*Pnt + 30*Pnt 
                                                              && iLow(NULL,PERIOD_H1,2) > Level100 - PointFromLevelGo*Pnt ) BAL = BAL + 45;
                                               
   int HiLevel = 600, LoLevel = 250, x, LoLevel2 = 450;
   for (x=0;x<=11;x++)  {if (iHigh(NULL,PERIOD_M1,x) > Level100 + HiLevel*Pnt) BAL = BAL - 50;}
   
   for (x=0;x<=30;x++) {if (iHigh(NULL,PERIOD_M1,x + 3) - iLow(NULL,PERIOD_M1,x) > 300*Pnt  && iOpen(NULL,PERIOD_M1,x + 3) > iClose(NULL,PERIOD_M1,x) 
                                                                                          && RAVI0_2_24_D1 < -2) BAL = BAL - 50;}
     
   bool IsCrossLowLevel2 = false; 
   for (x=0;x<=14;x++)  {if (iHigh(NULL,PERIOD_H1,x) > Level100 + LoLevel2*Pnt) IsCrossLowLevel2 = true;}
   if (IsCrossLowLevel2 == false) BAL = BAL - 50;

   if (iHigh(NULL,PERIOD_M30,0) < Level100 + LoLevel*Pnt   && iHigh(NULL,PERIOD_M30,1) < Level100 + LoLevel*Pnt
                                                           && iHigh(NULL,PERIOD_M30,2) < Level100 + LoLevel*Pnt
                                                           && iHigh(NULL,PERIOD_M30,3) < Level100 + LoLevel*Pnt
                                                           && iHigh(NULL,PERIOD_M30,4) < Level100 + LoLevel*Pnt
                                                           && iHigh(NULL,PERIOD_M30,5) < Level100 + LoLevel*Pnt
                                                           && iHigh(NULL,PERIOD_M30,6) < Level100 + LoLevel*Pnt
                                                           && iHigh(NULL,PERIOD_M30,7) < Level100 + LoLevel*Pnt) BAL = BAL - 50;
   if (BAL >= 50) return(true); 
   
   return(false);
  }
//+------------------------------------------------------------------+
//| CheckEntryCondition                                              |
//| Check if rules are met for open of trade                         |
//+------------------------------------------------------------------+
int MyLevel=100;

bool CheckEntryConditionSELL()
  {
   BAL = 0;                                          
                   
   if (RAVI0_2_24_H1 >  0.00) BAL = BAL + 10; 
   
   double Level100;
   int PointFromLevelGo = 50, PtFrRise = 700;
   Level100 = StrToDouble(DoubleToStr(Bid,2)) - PointFromLevelGo*Pnt;
   
   if (iLow(NULL,PERIOD_H1,1) < Level100 - PtFrRise*Pnt || iLow(NULL,PERIOD_H1,2) < Level100 - PtFrRise*Pnt) BAL = BAL + 7;
   
   if (Bid > Level100  && iClose(NULL,PERIOD_M1,1) < Level100 && iHigh(NULL,PERIOD_H1,0) < Level100 + PointFromLevelGo*Pnt - 30*Pnt 
                                                              && iHigh(NULL,PERIOD_H1,1) < Level100 + PointFromLevelGo*Pnt - 30*Pnt 
                                                              && iHigh(NULL,PERIOD_H1,2) < Level100 + PointFromLevelGo*Pnt ) BAL = BAL + 45;
                                               
   int HiLevel = 600, LoLevel = 250, x, LoLevel2 = 450;
   for (x=0;x<=11;x++) {if (iLow(NULL,PERIOD_M1,x) < Level100 - HiLevel*Pnt) BAL = BAL - 50;}
   
   for (x=0;x<=30;x++) {if (iHigh(NULL,PERIOD_M1,x) - iLow(NULL,PERIOD_M1,x + 3) > 300*Pnt && iClose(NULL,PERIOD_M1,x) > iOpen(NULL,PERIOD_M1,x + 3) 
                                                                                         && RAVI0_2_24_D1 > 2) BAL = BAL - 50;}

   bool IsCrossLowLevel2 = false; 
   for (x=0;x<=14;x++) {if (iLow(NULL,PERIOD_H1,x) < Level100 - LoLevel2*Pnt) IsCrossLowLevel2 = true;}
   if (IsCrossLowLevel2 == false) BAL = BAL - 50;

   if (iLow(NULL,PERIOD_M30,0) > Level100 - LoLevel*Pnt && iLow(NULL,PERIOD_M30,1) > Level100 - LoLevel*Pnt
                                                          && iLow(NULL,PERIOD_M30,2) > Level100 - LoLevel*Pnt
                                                          && iLow(NULL,PERIOD_M30,3) > Level100 - LoLevel*Pnt
                                                          && iLow(NULL,PERIOD_M30,4) > Level100 - LoLevel*Pnt
                                                          && iLow(NULL,PERIOD_M30,5) > Level100 - LoLevel*Pnt
                                                          && iLow(NULL,PERIOD_M30,6) > Level100 - LoLevel*Pnt
                                                          && iLow(NULL,PERIOD_M30,7) > Level100 - LoLevel*Pnt) BAL = BAL - 50;
   if (BAL >= 50) return(true); 
   
   return(false);
  }
 
 //+------------------------------------------------------------------+
//| Ïðîâåðêà âðåìåíè òîðãîâ                                           |
//+------------------------------------------------------------------+
  bool ValidTime() 
  {
   if (DayOfWeek()==1 && Hour()<=6) return(false);  
  //if (IsNewsDVD(29,65)) return(false);  
    return(true);
   }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 int OpPozBUYpred, OpPozSELLpred;
 
  int start() 
  {
   calcTrend();            
   HandleOpenPositions();
 
   if(!ValidTime()) return(0);
 
   TradesInThisSymbol=openPositions();
   int OpPozBUY = openPositionsBUY();
   int OpPozSELL = openPositionsSELL();
   //+------------------------------------------------------------------+
   //| Check if OK to make new trades                                   |
   //+------------------------------------------------------------------+
   // Only allow 1 trade per Symbol
   int KolPozOpen = 1;
    
   // If there is no open trade for this pair and this EA
   if(AccountFreeMargin() < MarginCutoff) 
     {
      Print("Not enough money to trade Strategy:", ExpertName);
      return(0);
     }
   lotMM=GetLots();
   
   if (OpPozBUYpred > OpPozBUY) { SendMail("DVD 100 cent: Close BUY at " + Bid,"");}
   OpPozBUYpred = OpPozBUY;
   
   if(CheckEntryConditionBUY() && OpPozBUY < KolPozOpen)
     {
      OpenBuyOrder();
     }

   if (OpPozSELLpred > OpPozSELL) { SendMail("DVD 100 cent: Close SELL at " + Bid,"");}
   OpPozSELLpred = OpPozSELL;

   if (CheckEntryConditionSELL() && OpPozSELL < KolPozOpen)
     {
      OpenSellOrder();
     }
     
   return(0);
  }


//--------------------------------
double Get_RAVI(int timeframe, int Period1, int Period2, int MA_Metod,  int  PRICE, int shift)
   {
    double MA1, MA2, result; 
   
    MA1 = iMA(NULL, timeframe, Period1 ,0, MA_Metod, PRICE, shift); 
    MA2 = iMA(NULL, timeframe, Period2, 0, MA_Metod, PRICE, shift); 
    result = ((MA1 - MA2) / MA2)*100; 
    return(result);
   
   }

//+------------------------------------------------------------------+
//| OpenBuyOrder                                                     |
//| If Stop Loss or TakeProfit are used the values are calculated    |
//| for each trade                                                   |
//+------------------------------------------------------------------+
void OpenBuyOrder()
  {

   int err, ticket;
   color myColor = Green;
   
   double myPrice      = Bid - 10*Pnt*10;
   double myTakeProfit = myPrice + TakeProfit * Pnt*10;                                                     //
   if (RAVI0_2_24_D1 > 1 && RAVI0_2_24_D1 < 5 && RAVI0_2_24_D1_1 < RAVI0_2_24_D1 && RAVI0_2_24_D1_2 < RAVI0_2_24_D1_1 && RAVI0_2_24_D1_3 < RAVI0_2_24_D1_2) myTakeProfit = myTakeProfit + 25 * Pnt*10;
   double myStopLoss   = myPrice - StopLoss * Pnt*10;
   datetime myTimeEnd  = TimeCurrent() + 1200;
  
   ticket=OrderSend(Symbol(),OP_BUYLIMIT,lotMM,myPrice,Slippage,myStopLoss,myTakeProfit,ExpertName, MagicNumber,myTimeEnd,myColor);
 
   string MyTxt, subject;
   MyTxt = " for " + DoubleToStr(myPrice,4) 
         + " BAL :" + BAL 
         + " RAVI0_2_24_H1 :" + RAVI0_2_24_H1; 
         
   subject = "DVD 100 cent: OpenBuy for " + DoubleToStr(myPrice,4) + " " + Symbol() + " lot " + DoubleToStr(lotMM,2);
   if(ticket<=0)
     {
      err=GetLastError();
      Print("DVD 100 cent: Error opening BUY order [" + ExpertName + "]: (" + err + ") " + ErrorDescription(err) + " /// " + MyTxt);
      SendMail("DVD 100 cent: Error OpenBuy ","[" + ExpertName + "]: (" + err + ") " + ErrorDescription(err) + " /// " + MyTxt);
      return(0);
     }
   Print("DVD 100 cent: OpenBuy" + MyTxt); 
   SendMail(subject,MyTxt);


  }
//+------------------------------------------------------------------+
//| OpenSellOrder                                                    |
//| If Stop Loss or TakeProfit are used the values are calculated    |
//| for each trade                                                   |
//+------------------------------------------------------------------+
void OpenSellOrder()
  {
   int err, ticket;
   color myColor = Green;
   
   double myPrice = Bid + 7*Pnt*10;         
   double myTakeProfit = myPrice - TakeProfit * Pnt*10;                                                           //
   if (RAVI0_2_24_D1 < -1 && RAVI0_2_24_D1 > -5 && RAVI0_2_24_D1_1 > RAVI0_2_24_D1 && RAVI0_2_24_D1_2 > RAVI0_2_24_D1_1 && RAVI0_2_24_D1_3 > RAVI0_2_24_D1_2) myTakeProfit = myTakeProfit - 25 * Pnt*10;
   //if (openPositionsSELLreal() > 0)  myTakeProfit = myTakeProfit - 101 * Pnt*10;
   double myStopLoss   = myPrice + StopLoss * Pnt*10;
   //if (openPositionsSELLreal() > 0)  myStopLoss = myStopLoss - 100 * Pnt*10;
   datetime myTimeEnd  = TimeCurrent() + 1200;
  
   ticket=OrderSend(Symbol(),OP_SELLLIMIT,lotMM,myPrice,Slippage,myStopLoss,myTakeProfit,ExpertName, MagicNumber,myTimeEnd,myColor);
   
   string MyTxt, subject;
   MyTxt = " for " + DoubleToStr(myPrice,4) 
         + " BAL :" + BAL 
         + " RAVI0_2_24_H1 :" + RAVI0_2_24_H1; 
         
   subject = "DVD 100 cent: OpenSell for " + DoubleToStr(myPrice,4) + " " + Symbol() + " lot " + DoubleToStr(lotMM,2);
   if(ticket<=0)
     {
      err=GetLastError();
      Print("DVD 100 cent: Error opening Sell order [" + ExpertName + "]: (" + err + ") " + ErrorDescription(err) + " /// " + MyTxt);
      SendMail("DVD 100 cent: Error OpenSell ","[" + ExpertName + "]: (" + err + ") " + ErrorDescription(err) + " /// " + MyTxt);
      return(0);
     }
   Print("DVD 100 cent: OpenSell" + MyTxt); 
   SendMail(subject,MyTxt);
  }
//+------------------------------------------------------------------------+
//| counts the number of open positions                                    |
//+------------------------------------------------------------------------+
int openPositions(  )
  {  int op =0;
   for(int i=OrdersTotal()-1;i>=0;i--)                                // scan all orders and positions...
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      //if (OrderMagicNumber()!=MagicNumber) continue;
      if(OrderSymbol()==Symbol() )
        {
         if(OrderType()==OP_BUY)op++;
         if(OrderType()==OP_SELL)op++;
         if(OrderType()==OP_BUYLIMIT)op++;
         if(OrderType()==OP_SELLLIMIT)op++;
        }
     }
   return(op);
  }
//+------------------------------------------------------------------------+
//| counts the number of open positions BUY                                    |
//+------------------------------------------------------------------------+
int openPositionsBUYreal(  )
  {  int op =0;
   for(int i=OrdersTotal()-1;i>=0;i--)                                // scan all orders and positions...
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      //if (OrderMagicNumber()!=MagicNumber) continue;
      if(OrderSymbol()==Symbol() )
        {
         if(OrderType()==OP_BUY )op++;
         if(OrderType()==OP_BUYLIMIT)op++;
        }
     }
   return(op);
  }//+------------------------------------------------------------------------+
//| counts the number of open positions BUY                                    |
//+------------------------------------------------------------------------+
int openPositionsBUY(  )
  {  int op =0;
   for(int i=OrdersTotal()-1;i>=0;i--)                                // scan all orders and positions...
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      //if (OrderMagicNumber()!=MagicNumber) continue;
      if(OrderSymbol()==Symbol() )
        {
         if(OrderType()==OP_BUY      )op++;//&& OrderOpenPrice() - Bid < -600*Pnt 
         if(OrderType()==OP_BUYLIMIT )op++;//&& OrderOpenPrice() - Bid < -600*Pnt 
        }
     }
   return(op);
  }
//+------------------------------------------------------------------------+
//| counts the number of open positions SELL                                   |
//+------------------------------------------------------------------------+
int openPositionsSELLreal(  )
  {  int op =0;
   for(int i=OrdersTotal()-1;i>=0;i--)                                // scan all orders and positions...
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      //if (OrderMagicNumber()!=MagicNumber) continue;
      if(OrderSymbol()==Symbol() )
        {
         if(OrderType()==OP_SELL)op++;
         if(OrderType()==OP_SELLLIMIT)op++;
        }
     }
   return(op);
  }//+------------------------------------------------------------------------+
//| counts the number of open positions SELL                                   |
//+------------------------------------------------------------------------+
int openPositionsSELL(  )
  {  int op =0;
   for(int i=OrdersTotal()-1;i>=0;i--)                                // scan all orders and positions...
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      //if (OrderMagicNumber()!=MagicNumber) continue;
      if(OrderSymbol()==Symbol() )
        {
         if(OrderType()==OP_SELL       )op++;//&& Bid - OrderOpenPrice()  < 600*Pnt
         if(OrderType()==OP_SELLLIMIT )op++;//&& Bid - OrderOpenPrice()  < 600*Pnt 
        }
     }
   return(op);
  }

//+------------------------------------------------------------------+
//| Close Open Position Controls                                     |
//|  Try to close position 3 times                                   |
//+------------------------------------------------------------------+
void CloseOrder(int ticket,double numLots,double close_price)
  {
   int CloseCnt, err;
   // try to close 3 Times
   CloseCnt=0;
   while(CloseCnt < 3)
     {
      if (OrderClose(ticket,numLots,close_price,Slippage,Violet))
        {
         CloseCnt=3;
        }
      else
        {
         err=GetLastError();
         Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
         if (err > 0) CloseCnt++;
        }
     }
  }
//+------------------------------------------------------------------+
//| HandleTrailingStop                                               |
//+------------------------------------------------------------------+

int HandleTrailingStop(string type, int ticket, double op, double os, double tp)
 {
     int x; bool IsGoHi;
    
     if (type== "SELL")
     {
      IsGoHi = false;
      for (x=0;x<=30;x++) {if (iHigh(NULL,PERIOD_M1,x) - iLow(NULL,PERIOD_M1,x + 3) > 500*Pnt && iClose(NULL,PERIOD_M1,x) > iOpen(NULL,PERIOD_M1,x + 3)) IsGoHi = true;}
      if(op < Ask && IsGoHi && tp < op - 50*Pnt) ModifyOrder(ticket,op,os,op  - 10*Pnt );
      }
    
     if (type== "BUY")
     {
      IsGoHi = false;
      for (x=0;x<=30;x++) {if (iHigh(NULL,PERIOD_M1,x + 3) - iLow(NULL,PERIOD_M1,x) > 500*Pnt && iClose(NULL,PERIOD_M1,x) < iOpen(NULL,PERIOD_M1,x + 3)) IsGoHi = true;}
      if(op > Bid && IsGoHi && tp > op + 50*Pnt) ModifyOrder(ticket,op,os,op + 10*Pnt);
      }


   return(0);  // íå èñïîëüçóåòñÿ
  }
//+------------------------------------------------------------------+
//|  Modify Open Position Controls                                   |
//|  Try to modify position 3 times                                  |
//+------------------------------------------------------------------+
void ModifyOrder(int ord_ticket,double op, double price,double tp)
  {
   int CloseCnt, err;
   CloseCnt=0;
   while(CloseCnt < 3)
     {
      if (OrderModify(ord_ticket,op,price,tp,0,Aqua))
        {
         CloseCnt=3;
        }
      else
        {
         err=GetLastError();
         Print(CloseCnt," Error modifying order : (", err , ") " + ErrorDescription(err));
         if (err>0) CloseCnt++;
        }
     }
  } 
  
//+------------------------------------------------------------------+
//| Handle Open Positions                                            |
//| Check if any open positions need to be closed or modified        |
//+------------------------------------------------------------------+
int HandleOpenPositions()
  {
   int cnt;
   bool YesClose;
   double pt;
//----
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()!=MagicNumber)  continue;
      if(OrderType()==OP_BUY)
        {
         if (CheckExitCondition("BUY",OrderOpenPrice(),OrderOpenTime() ))
           {
            CloseOrder(OrderTicket(),OrderLots(),Bid);
           }
         else
           {
            if (UseTrailingStop)
              {
               HandleTrailingStop("BUY",OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
              }
           }
        }
      if(OrderType()==OP_SELL)
        {
         if (CheckExitCondition("SELL",OrderOpenPrice(),OrderOpenTime()))
           {
            CloseOrder(OrderTicket(),OrderLots(),Ask);
           }
         else
           {
            if(UseTrailingStop)
              {
               HandleTrailingStop("SELL",OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
              }
           }
        }
      if(OrderType()==OP_SELLLIMIT)
        {
         if (CheckExitCondition("LIMIT",OrderOpenPrice(),OrderOpenTime()))
           {
            CloseOrder(OrderTicket(),OrderLots(),Ask);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Get number of lots for this trade                                |
//+------------------------------------------------------------------+
double GetLots()
  {
   double lot;
   if(MoneyManagement)
     {
      lot=LotsOptimized();
     }
     else 
     {
      lot=Lots;
      if(AccountIsMini)
        {
         if (lot > 1.0) lot=lot/10;
         if (lot < 0.1) lot=0.1;
        }
     }
     //----
   return(lot);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
//---- select lot size
   lot=NormalizeDouble(MathFloor(AccountFreeMargin()*TradeSizePercent/1000)/100,2);
   // Check if mini or standard Account
   if(AccountIsMini)
     {
      lot=MathFloor(lot*100)/100;
      // Use at least 1 mini lot
      if(lot<0.1) lot=0.1;
      if (lot > MaxLots) lot=MaxLots;
     }
     else
     {
      if (lot < 1.0) lot=1.0;
      if (lot > MaxLots) lot=MaxLots;
     }
//----
   return(lot);
  }
//+------------------------------------------------------------------+
//| Time frame interval appropriation  function                      |
//+------------------------------------------------------------------+
  int func_TimeFrame_Const2Val(int Constant)
  {
     switch(Constant) 
     {
         case 1:  // M1
            return(1);
         case 5:  // M5
            return(2);
         case 15:
            return(3);
         case 30:
            return(4);
         case 60:
            return(5);
         case 240:
            return(6);
         case 1440:
            return(7);
         case 10080:
            return(8);
         case 43200:
            return(9);
        }
     }
//+------------------------------------------------------------------+
//| Time frame string appropriation  function                        |
//+------------------------------------------------------------------+
 string func_TimeFrame_Val2String(int Value)
 {
    switch(Value) 
    {
        case 1:  // M1
           return("PERIOD_M1");
        case 2:  // M1
           return("PERIOD_M5");
        case 3:
           return("PERIOD_M15");
        case 4:
           return("PERIOD_M30");
        case 5:
           return("PERIOD_H1");
        case 6:
           return("PERIOD_H4");
        case 7:
           return("PERIOD_D1");
        case 8:
           return("PERIOD_W1");
        case 9:
           return("PERIOD_MN1");
        default:
           return("undefined " + Value);
       }
    }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int func_Symbol2Val(string symbol) 
  {
     if(symbol=="AUDCAD") 
     {
      return(1);
      }
       else if(symbol=="AUDJPY") 
      {
         return(2);
         }
          else if(symbol=="AUDNZD") 
         {
         return(3);
         }
          else if(symbol=="AUDUSD") 
         {
         return(4);
         }
          else if(symbol=="CHFJPY") 
         {
         return(5);
         }
          else if(symbol=="EURAUD") 
         {
         return(6);
         }
          else if(symbol=="EURCAD") 
         {
         return(7);
         }
          else if(symbol=="EURCHF") 
         {
         return(8);
         }
          else if(symbol=="EURGBP") 
         {
         return(9);
         }
          else if(symbol=="EURJPY") 
         {
         return(10);
         }
          else if(symbol=="EURUSD") 
         {
         return(11);
         }
          else if(symbol=="GBPCHF") 
          {
         return(12);
         }
          else if(symbol=="GBPJPY") 
         {
         return(13);
         }
          else if(symbol=="GBPUSD") 
         {
         return(14);
         }
          else if(symbol=="NZDUSD") 
         {
         return(15);
         }
          else if(symbol=="USDCAD") 
         {
         return(16);
         }
          else if(symbol=="USDCHF") 
         {
         return(17);
         }
          else if(symbol=="USDJPY") 
         {
         return(18);
         }
          else 
         {
      Comment("unexpected Symbol");
      return(0);
     }
  }
//+------------------------------------------------------------------+

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