Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет через платежную систему Visa QIWI Wallet
crocuta
32
crocuta 2013.06.12 13:22 

Здравствуйте!

Помогите, пожалуйста обнаружить ошибки в коде.

Задача очень простая: При включений советника он сразу открывает два ордера на пробой на расстоянии 70 пунктов (бай-стоп, селл-стоп). При прохождении каким-либо из них 300 пунктов от точки входа (в пятизначной котировке), все существующие ордера удаляются. Больше во время работы советника ордера не создаются (это регулируется булевой переменной).

Важно: я не стал выставлять тейк-профит в самих ордерах, так как думаю далее присобачить и трейлинг-стоп.

Почему-то советник

1. Не удаляет ордера

2. Создает новые и новые

Скажите пожалуйста, в чем ошибка? Заранее огромное спасибо!

extern double lot1 = 0.01;
extern int magic = 574476;
double ask1,bid1;
bool trade=false;

int init()
  {
   return(0);
  }
int deinit()
  {
   return(0);
  }
int start()
  {
if (OrdersTotal()==0 && trade==false)
{
ask1=Ask+70*Point; //точки
bid1=Bid-70*Point; //входа
OrderSend(Symbol(),OP_BUYSTOP,lot1,ask1,100,ask1-140*Point,0,NULL,magic,0,Green);
OrderSend(Symbol(),OP_SELLSTOP,lot1,bid1,100,bid1+140*Point,0,NULL,magic,0,Green);
return(0);   
}
//----
if (OrdersTotal()!=0 && ((Ask-ask1)>=300*Point || (bid1-Bid)>=300*Point))
{
killemall(); //если профит достигнут - гасим все ордера
trade=false; //больше не торгуем
return(0);
} 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//функция для удаления ордеров
void killemall()
{
for (int a=0; a<OrdersTotal(); a++)
        {
               OrderSelect(a,SELECT_BY_POS,MODE_TRADES);                        
               if (OrderType()==OP_BUY)
               OrderClose(OrderTicket(),OrderLots(),Ask,100,CLR_NONE);
               if (OrderType()==OP_SELL) 
               OrderClose(OrderTicket(),OrderLots(),Bid,100,CLR_NONE); 
               if (OrderType()==OP_BUYSTOP) 
               OrderDelete(OrderTicket());
               if (OrderType()==OP_SELLSTOP) 
               OrderDelete(OrderTicket());               
        }
}
Alexander
2441
Alexander 2013.06.13 04:42  

Замени

double ask1,bid1;

на

static double ask1,bid1;

и

trade=false; //больше не торгуем

 на

trade=true; //больше не торгуем

 Функция удаления ордеров неправильная - считать ордера надо с конца.

 Лучше так

for (int a=OrdersTotal()-1;a>=0; a--)
        {
               OrderSelect(a,SELECT_BY_POS);                        
               if (OrderType()<2)
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100,CLR_NONE);
               else
               OrderDelete(OrderTicket());               
        }
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий