bool t() { static datetime time=0; if(time==0) time=iTime(NULL,PERIOD_H1,0); if(time!=iTime(NULL,PERIOD_H1,0)) { time=iTime(NULL,PERIOD_H1,0); return(true); } return(false); } int start() { if(t()) { // ваши действия, когда бар уже сформировался } // return(0); }
OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE); if (OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)!=true)Это вызов функции OrderClose() дважды.
if ((OrdersTotal()>=1)&&(Bar<iBars(NULL,PERIOD_H1)))
{
for(int i=0;i<OrdersTotal();i++)
OrderSelect(i,SELECT_BY_POS);
cmd=OrderType();
if (cmd<2)
{
if(cmd==OP_BUY)
price=Bid;
else
price=Ask;
bool Info=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
if (Info!=true)
{
error=GetLastError(); Print("LastError = ",error);
}
if(error==135) RefreshRates();
}
if(Info==true)
{
Bar=iBars(NULL,PERIOD_H1);
}
return(0);
}
Вот так? не помогло.
и еще эта функция теоретически не должна открывать больше 1 позиции
if (OrdersTotal()!=1)
{
OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point);
if (OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point)!=true) Sleep(1000);
}
return(0);
но она открывает 2
кто подскажет где ошибочка?
и еще эта функция теоретически не должна открывать больше 1 позиции
if (OrdersTotal()!=1)
{
OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point);
if (OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-Stop*Point,Bid+Teik*Point)!=true) Sleep(1000);
}
return(0);
но она открывает 2
кто подскажет где ошибочка?
Я ведь уже писал, что вы дважды вызываете функцию (в операторе if она тоже вызывается), поэтому и открывается 2 ордера.
с колличеством ордеров разобрались-а с закрытием ни как, так и закрывает сразу после открытия.
bool t() { static datetime time=0; if(time==0) time=iTime(NULL,PERIOD_H1,0); if(time!=iTime(NULL,PERIOD_H1,0)) { time=iTime(NULL,PERIOD_H1,0); return(true); } return(false); } int start() { if(t()) { OrderSelect(0,SELECT_BY_POS); if(cmd==OP_BUY) price=Bid; else if(cmd==OP_SELL) price=Ask; OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE); } // return(0); }
Можно и еще проще:
if(OrdersTotal()>0) { OrderSelect(0,SELECT_BY_POS); if(cmd==OP_BUY) price=Bid; else if(cmd==OP_SELL) price=Ask; if(iBarShift(NULL,PERIOD_H1,OrderOpenTime())>0); OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE); }
Я сделал все через статическую переменную static int Bar
if ((OrdersTotal()>=1)&&(Bar<iBars(NULL,PERIOD_H1)))
{
for(int i=0;i<OrdersTotal();i++)
OrderSelect(i,SELECT_BY_POS);
cmd=OrderType();
if (cmd<2)
{
if(cmd==OP_BUY)
price=Bid;
else
price=Ask;
bool Info=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
if (Info!=true)
{
error=GetLastError(); Print("LastError = ",error);
}
if(error==135) RefreshRates();
}
if(Info==true)
{
Bar=iBars(NULL,PERIOD_H1);
}
return(0);
}
Коментарии приветствуються!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
if ((OrdersTotal()>=1)&&(Bar<iBars(NULL,PERIOD_H1)))
{
for(int i=0;i<OrdersTotal();i++)
OrderSelect(i,SELECT_BY_POS);
cmd=OrderType();
if (cmd<2)
{
if(cmd==OP_BUY)
price=Bid;
else
price=Ask;
OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
if (OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)!=true)
{
error=GetLastError(); Print("LastError = ",error);
}
if(error==135) RefreshRates();
}
if(OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE)==true)
{
Bar=iBars(NULL,PERIOD_H1);
}
}
Суть этого блока; закрывать ордер при появлении нового бара на часовом графике. Вот только он закрывает его сразу после открытия. Где собака зарыта?