Помогите доработать советник-полуавтомат торгующий по линиям

 

Добрый день! 

На график выставляется линия синего цвета для бай,(или красного-  для селл). Советник, открывает бай, если свечка закроется выше синей линии ( открывает селл, если свечка закрывается ниже выставленной красной линии.)


С открытием и закрытием позиций все ОК!  Но почему-то советник НЕ ВСЕГДА выставляет стоп-лосс если открывает позицию селл, если бай  - то стоп выставляется нормально.


//+------------------------------------------------------------------+
//|                                                   _investmm.mq4 |                               
//+------------------------------------------------------------------+
#property copyright "Copyright 2017"
#property link      "mm@mail.ru"

extern color BuyLineColor=Blue;
extern color SellLineColor=Red;
extern int magic=469333;
extern double LotSize=0.3;
extern int slippage=70;
extern int DopLos=15; //


string pref="investmmm";
string Comm="investmmm";
bool IsSellLine;
bool IsBuyLine;
double BuyLevel;
double SellLevel;

datetime T0;
datetime TA;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   EraseAll(pref); 
   T0=0;
   TA=TimeCurrent();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   EraseAll(pref);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
      CheckSL();
      if (T0>=Time[0]) return(0);
      T0=Time[0];
      int m=GetSign();
      if (m==1)
      {
         CloseSell();
         if (Buy()>0)
         {
             SendMail("Открытие BUY","Открытие BUY");
             Repaint(BuyLevel);
         }    
      
      }
      if (m==2)
      {
         CloseBuy();
         if (Sell()>0)
         {
            SendMail("Открытие SELL","Открытие SELL");
            Repaint(SellLevel);
         }   
      
      }
      
      
//----
   return(0);
  }
//+------------------------------------------------------------------+
int GetSign()
{
   int m=0;
   SearchLine();
   if (IsBuyLine)
   {
      if (Close[1]>BuyLevel) m=1;
   
   }
   if (IsSellLine)
   {
      if (Close[1]<SellLevel) m=2;
   
   }
   return (m);
}
int SearchLine()
{
   IsSellLine=false;
   IsBuyLine=false;
   for (int i=0; i<ObjectsTotal(); i++)
   {
      string name=ObjectName(i);
      if (ObjectType(name)==OBJ_HLINE)
      {
         if (ObjectGet(name,OBJPROP_COLOR)==BuyLineColor) { IsBuyLine=true; BuyLevel=ObjectGet(name,OBJPROP_PRICE1);}
         if (ObjectGet(name,OBJPROP_COLOR)==SellLineColor){ IsSellLine=true; SellLevel=ObjectGet(name,OBJPROP_PRICE1);}
   
      }
   }
   
   if (IsTesting())
   {
      if (!IsBuyLine)
      {
         name="TLB"+TimeCurrent();
         ObjectCreate(name,OBJ_HLINE,0,TimeCurrent(),Ask+80*Point);
         ObjectSet(name,OBJPROP_COLOR,BuyLineColor);
         IsBuyLine=true;
         BuyLevel=Ask+80*Point;
      }
      if (!IsSellLine)
      {
         name="TLS"+TimeCurrent();
         ObjectCreate(name,OBJ_HLINE,0,TimeCurrent(),Bid-80*Point);
         ObjectSet(name,OBJPROP_COLOR,SellLineColor);
         IsSellLine=true;
         SellLevel=Bid-80*Point;
         
      }
   
   }
   
}


int EraseAll(string pr)
  {
      
      for (int i=ObjectsTotal()-1;i>=0;i--)
      {
         string st=ObjectName(i); 
         if (StringFind(st,pr,0)==0 )  ObjectDelete(st);
      }
     return(0);
  } 
  
int CloseBuy()
{
for (int k=OrdersTotal()-1; k>=0; k--)
   {
     OrderSelect(k,SELECT_BY_POS);
     if (OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
     {
            int tk=OrderTicket();
            bool ko=OrderClose(tk,OrderLots(),Bid,slippage);
            int v=0;
            while (!ko&&v<40)
            {
               Sleep(200);
               RefreshRates();
               ko=OrderClose(tk,OrderLots(),Bid,slippage);
               v++;
            }
          
     }    
   }
   
 Sleep(200);
 return(0);
}
   
int CloseSell()
{
   for (int k=OrdersTotal()-1; k>=0; k--)
   {
     OrderSelect(k,SELECT_BY_POS);
     if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
     {
         
            int tk=OrderTicket();
            bool ko=OrderClose(tk,OrderLots(),Ask,slippage);
            int v=0;
            while (!ko&&v<40)
            {
               Sleep(200);
               RefreshRates();
               ko=OrderClose(tk,OrderLots(),Ask,slippage);
               v++;
            }
           
     }


  }
  Sleep(200);
 
 return(0);
 
}

int Buy()
{
       
 
 // Print (" -----------  Buy  ---------------"); 
  double p=NormalizeDouble(Ask,Digits);
  int dp=MarketInfo(Symbol(),MODE_STOPLEVEL);
  int n=2;
  if (MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) n=1;
  if (MarketInfo(Symbol(),MODE_LOTSTEP)==1.0) n=0;
  double lot=NormalizeDouble(LotSize,n);
  if (lot<MarketInfo(Symbol(),MODE_MINLOT)) lot=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),n);
  string cm=Comm;
  int mg=magic;
  double tp=0;
  double sl=Low[1]-(Close[1]-Low[1])-(DopLos+1)*Point;
  sl=NormalizeDouble(sl,Digits);
  int k=OrderSend(Symbol(),OP_BUY,lot,p,slippage,sl,tp,cm,mg,0);
  if (k<0)
  {
     int v=0;
     while (k<0&&v<40)
     {
        Print ("Buy error open ",GetLastError());
        Sleep(200);
        RefreshRates();
        p=NormalizeDouble(Ask,Digits);
        k=OrderSend(Symbol(),OP_BUY,lot,p,slippage,sl,tp,cm,mg,0); 
        v++;
     }
  } 
  
  return(k);
}
 
int Sell()
{
  
  
   //  Print (" -----------  Sell  ---------------");  
  double p=NormalizeDouble(Bid,Digits);
  int dp=MarketInfo(Symbol(),MODE_STOPLEVEL);
  int n=2;
  if (MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) n=1;
  if (MarketInfo(Symbol(),MODE_LOTSTEP)==1.0) n=0;
  double lot=NormalizeDouble(LotSize,n);
  if (lot<MarketInfo(Symbol(),MODE_MINLOT)) lot=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),n);
  string cm=Comm;
  int mg=magic;
  double tp=0;
  double sl=High[1]+(High[1]-Close[1])+(DopLos+1)*Point;
  sl=NormalizeDouble(sl,Digits);
  int k=OrderSend(Symbol(),OP_SELL,lot,p,slippage,sl,tp,cm,mg,0); 
  if (k<0)
  {
     int v=0;
     while (k<0&&v<40)
     {
        Print ("Sell error open ",GetLastError());
        Sleep(200);
        RefreshRates();
        p=NormalizeDouble(Bid,Digits);
        k=OrderSend(Symbol(),OP_SELL,lot,p,slippage,0,tp,cm,mg,0); 
        v++;
     }
  } 
  
  return(k);
  }
  
  int Repaint(double Level)
  {
   for (int i=0; i<ObjectsTotal(); i++)
   {
      string name=ObjectName(i);
      if (ObjectType(name)==OBJ_HLINE)
      {
         if (ObjectGet(name,OBJPROP_PRICE1)==Level)
         {
             color c2=PaleGreen ; //LightGray; //  ObjectGet(name,OBJPROP_COLOR)/2;
             if (Level==BuyLevel) c2=Pink;
             ObjectSet(name,OBJPROP_COLOR,c2);
         }
      }
   }
  
  
     return(0);
  }
    
  int CheckSL()
  {
     for (int i=0;i<OrdersHistoryTotal();i++)
     {
         OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
         if ((OrderCloseTime()>TA)&&(OrderProfit()<0))
         {
             if (OrderType()==OP_BUY)
             {
                if (OrderClosePrice()<=OrderStopLoss())
                {
                   SendMail("Стоп-лосс","Закрытие BUY по стоп-лоссу");
                } 
             }
             if (OrderType()==OP_SELL)
             {
                if (OrderClosePrice()>=OrderStopLoss())
                {
                   SendMail("Стоп-лосс","Закрытие SELL по стоп-лоссу");
                } 
             }
         }
     
     
     } 
  
     return(0);
  }  
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
invest-mmm:

Но почему-то советник НЕ ВСЕГДА выставляет стоп-лосс если открывает позицию селл, если бай  - то стоп выставляется нормально.


Ноль в условии надо исправить на sl


 
Natalya Dzerzhinskaya:

Ноль в условии надо исправить на sl



Благодарю, Наталья.

Причина обращения: