PHP код:
//+------------------------------------------------------------------+
//|                                                           dm.mq4 |
//|                            Copyright 2018, ir0407@forexdengi.com |
//|                                            ir0407@forexdengi.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, ir0407@forexdengi.com"
#property link      "ir0407@forexdengi.com"
#property version   "1.00"
#property strict

//макрос для нормализации значений
#define NDD(x)    NormalizeDouble((x), Digits)

//всякие константы
#define INFO_LABEL_NAME   "InfoLabel"
#define ARROW_NAME_PREFIX "MyArrow_"
#define ARROW_SELL_CODE   242
#define ARROW_BUY_CODE    241

//------------------параметры советника -------------------------------
extern double Lots      0.01
extern int    Magic     1111678111;
extern int    _Slippage 3;

extern int    DmPeriod    14;
extern double DmSellLevel 0.7;
extern double DmBuyLevel  0.3;

int Slippage;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  
//настраиваем Slippage
  
switch(Digits())
  {
    case 
3: case 5:
      
Slippage _Slippage 10;
  }
  
  
//создаем InfoLabel
  
ObjectCreate(INFO_LABEL_NAMEOBJ_LABEL000);    // Создание объекта "InfoLabel"
     
ObjectSet(INFO_LABEL_NAMEOBJPROP_CORNER0);     // Привязка угла (0-верхний левый угол, 3-нижний левый угол, 1-верхний правый угол, 4-нижний правыйвый угол)
     
ObjectSet(INFO_LABEL_NAMEOBJPROP_XDISTANCE10); // Координата Х
     
ObjectSet(INFO_LABEL_NAMEOBJPROP_YDISTANCE15); // Координата Y
  
SetInfoLabelProp(INFO_LABEL_NAME""clrNONE);

  return(
INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  
ObjectsDeleteAll();
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
int ticket 0;

  
// работаем только по новому бару, иначе не имеет смысла
  
if(IsNewBar())
  {
    
//получаем зачения индикатора
    
double DM0 iDeMarker(NULL0DmPeriod0);
    
double DM1 iDeMarker(NULL0DmPeriod1);
    
    
//проверяем корректность значений индикатора
    
if(DM0 == 0.0 || DM1 == 0.0) return;
 
    
//фиксируем наличие пересечений
    
bool CrossSell = (DM1 DmSellLevel && DM0 DmSellLevel);
    
bool CrossBuy  = (DM1 DmSellLevel && DM0 DmSellLevel);

    
//чтоб не делать дурную работу дальше работаем только если есть пересечения
    
if(CrossSell || CrossBuy)
    {
      
//вешаем срелки
      
string ArrowName StringConcatenate(ARROW_NAME_PREFIXTimeToString(Time[0]));
      if(
CrossSellDrawArrow(ArrowNameTime[0], Open[0], ARROW_SELL_CODEclrRed);
      if(
CrossBuy)  DrawArrow(ArrowNameTime[0], Open[0], ARROW_BUY_CODE,  clrBlue);
      
      
//считаем ордера
      
int CountBuy  OrdersCount(OP_BUY,  Magic);
      
int CountSell OrdersCount(OP_SELLMagic);
    
      
//открытие короткой позиции
      
if(CountSell == && CrossSell)
      {
        
ticket OrderSend(Symbol(), OP_SELLLotsNDD(Bid), Slippage00"советник"Magic0clrNONE);
        
SetInfoLabelProp(INFO_LABEL_NAME"Продажа"clrRed);
      }
      
//открытие длинной позиции
      
if(CountBuy == && CrossBuy)
      {
        
ticket OrderSend(Symbol(), OP_BUYLotsNDD(Ask), Slippage00"советник"Magic0clrNONE);
        
SetInfoLabelProp(INFO_LABEL_NAME"Покупка"clrBlue);
      }
      
//закрытие короткой позиции
      
if(CountSell && CrossBuy)
      {
        
CloseOrders(OP_SELLMagic);
        
SetInfoLabelProp(INFO_LABEL_NAME""clrNONE);
      }
      
//закрытие длинной позиции
      
if(CountBuy && CrossSell)
      {
        
CloseOrders(OP_BUYMagic);
        
SetInfoLabelProp(INFO_LABEL_NAME""clrNONE);
      }
      
//перерисуем окно
      
ChartRedraw(0); 
    }
  }
  return;
}

//+------------------------------------------------------------------+
bool IsNewBar()
{
  static 
datetime LastBar;
  
bool Result = (LastBar != Time[0]);
  if(
ResultLastBar Time[0];
  return(
Result);
}

//+------------------------------------------------------------------+
int OrdersCount(int Tint M
{
  
int Count 0;

  for(
int i OrdersTotal()-1; !(0); i--)
    if(
OrderSelect(iSELECT_BY_POS))
      if(
OrderSymbol() == Symbol() && OrderType() == && OrderMagicNumber() == M)
        
Count++;
  return(
Count);
}

//+------------------------------------------------------------------+
void CloseOrders(int Tint M)
{
  
double Price 0.0;
  
  
//формируем цену закрытия
  
switch(T)
  {
    case 
OP_BUY:  Price NDD(Bid); break;
    case 
OP_SELLPrice NDD(Ask); break;
    default: return;
  }
  
//закрываем ордера
  
for(int i OrdersTotal() - 1>= 0i--)
    if(
OrderSelect(iSELECT_BY_POS))
      if(
OrderSymbol() == Symbol() && OrderType() == && OrderMagicNumber() == M)
        if(!
OrderClose(OrderTicket(), OrderLots(), PriceSlippageclrNONE))
          Print(
"Ошибка закрытия ордера!");
}

//+------------------------------------------------------------------+
void SetInfoLabelProp(string Nstring Scolor C)
{
  
ObjectSetText(NS18"Arial"C);
}

//+------------------------------------------------------------------+
void DrawArrow(string Ndatetime Tdouble Pint ACcolor C)
{
  
ObjectCreate(0NOBJ_ARROW00000);   // создадим стрелку на покупку
  
ObjectSetInteger(0NOBJPROP_ARROWCODEAC);  // установим код стрелки
  
ObjectSetInteger(0NOBJPROP_TIME,  T);       // зададим время
  
ObjectSetDouble (0NOBJPROP_PRICEP);       // зададим цену
  
ObjectSetInteger(0NOBJPROP_COLORC);       // установим цвет стрелки