Скачать MetaTrader 5

помогите найти ошибку в коде!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Arseniy Barudkin
224
Arseniy Barudkin  

идея состоит в том что бы сперва открыть два отложенных ордера в разном направлении, при открыти ордера на бай сразу открыть отложенный ордер на селл по той же цене что и превый ордер селл с удвоенным лотом далее при открытии второго ордера селл открыть отложженный ордер бай  по той же цене что и первый ордер бай с удвоенным лотом. Проблема в  том что если первым открывается ордер селл то все работает нормально как надо, если бай то программа не видит этого и не выполняет след действия!

//+------------------------------------------------------------------+
//|                                              Win-Win Advisor.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int     Magic = 11;
extern int     Step  = 100;
extern double  Lots  = 0.01;

int     ticket,
        Multipler = 2;
double  lastlots,
        price,
        Price_BUY,
        Price_SELL,
        TP_BUY,TP_SELL,
        ST_SELL,ST_BUY;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
 if (Digits == 2 || Digits == 4)
 {
  Step /= 10;
 }
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
 
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  
 if(OrdersTotal() == 0)
 {
  price = NormalizeDouble((Ask+Bid)/2,Digits);
  
  Price_BUY = price + Step/2*Point;
  double TP_BUY1 = NormalizeDouble(Price_BUY + Step*Point,Digits);    
  ST_BUY = NormalizeDouble(Price_BUY - Step*3*Point,Digits); 
  ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,0,0,TP_BUY1,"1-й ордер BUY",Magic,0,clrGreen);
     
  Price_SELL = price - Step/2*Point;
  double TP_SELL1 = NormalizeDouble(Price_SELL - Step*Point,Digits);
  ST_SELL = NormalizeDouble(Price_SELL + Step*3*Point,Digits);
  ticket = OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,0,0,TP_SELL1,"1-й ордер SELL",Magic,0,clrBlue);        
 }                 
 if(CountTrades() == 1)
 { 
  int order_taype = FindLastOrderTaype();
  
  if (order_taype == OP_SELL)
  { 
   Price_BUY = FindLastOrderPrice(OP_BUYSTOP);
   TP_BUY = NormalizeDouble(Price_BUY + Step*2*Point,Digits);
   ST_BUY = NormalizeDouble(Price_BUY - Step*3*Point,Digits);  
   lastlots = FindLastLots(order_taype);         
   lastlots = NormalizeDouble(lastlots * Multipler,2);
   
   OrderDeleteX();     
   ticket = OrderSend(Symbol(),OP_BUYSTOP,lastlots,Price_BUY,0,ST_BUY,TP_BUY,"2-й ордер BUY",Magic,0,clrGreen);
  }    
  if (order_taype == OP_BUY)
  {
   Price_SELL = FindLastOrderPrice(OP_SELLSTOP);
   TP_SELL = NormalizeDouble(Price_SELL - Step*2*Point,Digits);
   ST_SELL = NormalizeDouble(Price_SELL + Step*3*Point,Digits);       
   lastlots = FindLastLots(order_taype);
   lastlots = NormalizeDouble(lastlots * Multipler,2);
    
   OrderDeleteX();       
   ticket = OrderSend(Symbol(),OP_SELLSTOP,lastlots,Price_SELL,0,ST_SELL,TP_SELL,"2-й ордер SELL",Magic,0,clrBlue);
  }          
 } 
 if (OrdersTotal() == 1)
 {
  OrderDeleteX();
 }
 if(CountTrades() == 2)
 {
  int order_taype = FindLastOrderTaype();
  if (order_taype == OP_BUY)
  {
   Price_SELL = FindLastOrderPrice(OP_SELL);
   TP_SELL = NormalizeDouble(Price_SELL - Step*2*Point,Digits);
   ST_SELL = NormalizeDouble(Price_SELL + Step*3*Point,Digits);       
   lastlots = FindLastLots(order_taype);
   lastlots = NormalizeDouble(lastlots * Multipler,2); 
         
   ticket = OrderSend(Symbol(),OP_SELLSTOP,lastlots,Price_SELL,0,ST_SELL,TP_SELL,"3-й ордер SELL",Magic,0,clrBlue);
   OrderModifyX(OP_SELL);    
  } 
  if (order_taype == OP_SELL)
  { 
   Price_BUY = FindLastOrderPrice(OP_BUY);
   TP_BUY = NormalizeDouble(Price_BUY + Step*2*Point,Digits);
   ST_BUY = NormalizeDouble(Price_BUY - Step*3*Point,Digits);  
   lastlots = FindLastLots(order_taype);            
   lastlots = NormalizeDouble(lastlots * Multipler,2);
         
   ticket = OrderSend(Symbol(),OP_BUYSTOP,lastlots,Price_BUY,0,ST_BUY,TP_BUY,"3-й ордер BUY",Magic,0,clrGreen);
   OrderModifyX(OP_BUY);  
  }
 }
 if(CountTrades() == 3)
 {
  int order_taype = FindLastOrderTaype();
  if (order_taype == OP_BUY)
  {
   Price_SELL = FindLastOrderPrice(OP_SELL);
   TP_SELL = NormalizeDouble(Price_SELL - Step*2*Point,Digits);
   ST_SELL = NormalizeDouble(Price_SELL + Step*3*Point,Digits);       
   lastlots = FindLastLots(order_taype);
   lastlots = NormalizeDouble(lastlots * Multipler,2); 
         
   ticket = OrderSend(Symbol(),OP_SELLSTOP,lastlots,Price_SELL,0,ST_SELL,TP_SELL,"4-й ордер SELL",Magic,0,clrBlue);
  } 
  if (order_taype == OP_SELL)
  { 
   Price_BUY = FindLastOrderPrice(OP_BUY);
   TP_BUY = NormalizeDouble(Price_BUY + Step*2*Point,Digits);
   ST_BUY = NormalizeDouble(Price_BUY - Step*3*Point,Digits);  
   lastlots = FindLastLots(order_taype);            
   lastlots = NormalizeDouble(lastlots * Multipler,2);
       
   ticket = OrderSend(Symbol(),OP_BUYSTOP,lastlots,Price_BUY,0,ST_BUY,TP_BUY,"4-й ордер BUY",Magic,0,clrGreen);
  }
 }
 if(CountTrades() == 4)
 {
  int order_taype = FindLastOrderTaype();
  if (order_taype == OP_BUY)
  {
   Price_SELL = FindLastOrderPrice(OP_SELL);
   TP_SELL = NormalizeDouble(Price_SELL - Step*2*Point,Digits);
   ST_SELL = NormalizeDouble(Price_SELL + Step*3*Point,Digits);       
   lastlots = FindLastLots(order_taype);
   lastlots = NormalizeDouble(lastlots * Multipler,2); 
         
   ticket = OrderSend(Symbol(),OP_SELLSTOP,lastlots,Price_SELL,0,ST_SELL,TP_SELL,"5-й ордер SELL",Magic,0,clrBlue);
  } 
  if (order_taype == OP_SELL)
  { 
   Price_BUY = FindLastOrderPrice(OP_BUY);
   TP_BUY = NormalizeDouble(Price_BUY + Step*2*Point,Digits);
   ST_BUY = NormalizeDouble(Price_BUY - Step*3*Point,Digits);  
   lastlots = FindLastLots(order_taype);            
   lastlots = NormalizeDouble(lastlots * Multipler,2);
       
   ticket = OrderSend(Symbol(),OP_BUYSTOP,lastlots,Price_BUY,0,ST_BUY,TP_BUY,"5-й ордер BUY",Magic,0,clrGreen);
  }
 }
}
//+------------------------------------------------------------------+
//| Функции                                                          |
//+------------------------------------------------------------------+
void OrderDeleteX()
{
 for(int i = OrdersTotal();i>=0;i--)
 {
  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
   {
    if (OrderType() >= 2 && OrderType() <= 5)
    ticket = OrderDelete(OrderTicket());
   }
  }
 }
} 
//+------------------------------------------------------------------+
void OrderModifyX(int otype)
{
 for (int i = OrdersTotal()-1; i>=0; i--)
 {
  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
   {
    if (otype == OP_BUY)
    {
     Price_BUY = FindLastOrderPrice(OP_BUYSTOP);
     TP_BUY = NormalizeDouble(Price_BUY + Step*2*Point,Digits);
     ST_BUY = NormalizeDouble(Price_BUY - Step*3*Point,Digits);
     ticket = OrderModify(OrderTicket(),OrderOpenPrice(),ST_BUY,TP_BUY,0,0);
    }
    if (otype == OP_SELL)
    {
     Price_SELL = FindLastOrderPrice(OP_SELLSTOP);
     TP_SELL = NormalizeDouble(Price_SELL - Step*2*Point,Digits);
     ST_SELL = NormalizeDouble(Price_SELL + Step*3*Point,Digits); 
     ticket = OrderModify(OrderTicket(),OrderOpenPrice(),ST_SELL,TP_SELL,0,0);
    } 
   }
  } 
 }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
 int    oldticket;
 double oldlots=0;
        ticket=0;
   
 for (int cnt = OrdersTotal()-1; cnt>=0; cnt--)
 {
  if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
  {
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
   {
    oldticket = OrderTicket();
    if(oldticket>ticket)
    {
     ticket = oldticket;
     oldlots = OrderLots();
    }
   }
  }
 }
 return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{  
 int    oldticket;
 double oldopenprice =0;
        ticket =0;
   
 for (int cnt = OrdersTotal()-1; cnt>=0; cnt--)
 {
  if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
  {
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
   {
    oldticket = OrderTicket();
    if(oldticket>ticket)
    {
     ticket = oldticket;
     oldopenprice = OrderOpenPrice();
    }
   }  
  }
 }
 return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderTaype()
{
 int oldticket,
     ticketnamber =0,
     oldtype =0;
 
 for (int i = OrdersTotal()-1; i>=0; i--)
 {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
   {
    oldticket = OrderTicket();
    if(oldticket > ticketnamber)
    {
     ticketnamber = oldticket;
     oldtype = OrderType();
    }
   }
  }
 }
 return(oldtype);
}
//+------------------------------------------------------------------+
int CountTrades()
{
 int count = 0;
 for (int i = OrdersTotal()-1; i>=0; i--)
 {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
   {
    if(OrderType() == OP_BUY || OrderType() == OP_SELL)
    count++;
   }
  }
 }
 return(count);
}
//+------------------------------------------------------------------+
Vladimir Karputov
Модератор
68513
Vladimir Karputov  
Вставьте, пожалуйста, код в сообщение правильно: Правильно вставляем код на форуме
Jevgenijs Mihailovs
128
Jevgenijs Mihailovs  

Если вопрос ещё актуален, то, кажется, у Вас неправильно организован FindLastOrderTaype().

В данном случае выбор по номеру тикета ошибка, так как отложки тоже находятся в MODE_TRADES, и так как первый тикет присвоен байстопу, то при его срабатывании бай=тикет 1, селлстоп=тикет 2. Функция возвращает oldtype=SELLSTOP, а код пляшет от BUY или SELL. И в начале функции Вы сразу присвоили возвращаемому значению 0=OP_BUY.. и в условиях рынка при работе с отложками тикеты не всегда присваиваиваются по возрастанию..  

Arseniy Barudkin
224
Arseniy Barudkin  
Jevgenijs Mihailovs:

Если вопрос ещё актуален, то, кажется, у Вас неправильно организован FindLastOrderTaype().

В данном случае выбор по номеру тикета ошибка, так как отложки тоже находятся в MODE_TRADES, и так как первый тикет присвоен байстопу, то при его срабатывании бай=тикет 1, селлстоп=тикет 2. Функция возвращает oldtype=SELLSTOP, а код пляшет от BUY или SELL. И в начале функции Вы сразу присвоили возвращаемому значению 0=OP_BUY.. и в условиях рынка при работе с отложками тикеты не всегда присваиваиваются по возрастанию..  

 Спасибо большое! Ваш ответ очень помог! Буду исправлять.
SlClRlElAlM
6
SlClRlElAlM  
Посчитай всего сколько у тебя скоб открытых и где какая закрывается,потому что я насчитал несоответсвие,ты где пропустил,либо забыл закрыть окончание алгоритма.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий