void OnTick(void) { MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1); if (MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) { ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red); } if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green); } }
Пока существует сигнал, будет пачками-сериями открывать а не по одному на каждом новом сигнале.
Сделайте ещё функцию поиска времени открытия последнего рыночного ордера TimeLastOpen()
И замените CountSell() == 0 и CountBuy() == 0 на TimeLastOpen()<iTime(NULL,0,0)
Предлагаю отключать функцию открытия и активировать если сигнал изменился, тогда будет на каждый новый сигнал по одной позиции
int SignalBuy=-1,SignalSell=-1; bool buy=true,sell=true; void OnTick(void) { MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1); //----+ if (MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) {SignalSell=1;} else SignalSell=-1; if (SignalSell==1 && sell) { ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red); sell=false; } if(SignalSell==-1) sell=true; //----+ if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) {SignalBuy=1;} else SignalBuy=-1; if (SignalBuy==1 && buy) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green); buy=false; } if(SignalBuy==-1) buy=true; }
Предлагаю отключать функцию открытия и активировать если сигнал изменился, тогда будет на каждый новый сигнал по одной позиции
Нельзя так делать. При перезагрузке терминала на существующем сигнале опять откроется ордер
Нельзя так делать. При перезагрузке терминала на существующем сигнале опять откроется ордер
Очень даже можно и перезагружать осторожно))
Нет открытых позиций и терминал лагает можно и перезагружаться, также если видно по индикатору что сигнал не соответствует ни одному из направлений.
Зачем во время открытия позиции сразу перезагружаться?
Очень даже можно и перезагружать осторожно))
Нет открытых позиций и терминал лагает можно и перезагружаться, также если видно по индикатору что сигнал не соответствует ни одному из направлений.
Зачем во время открытия позиции сразу перезагружаться?
Электросетям не прикажешь.
Предложенный мною выше метод исключает ошибку.
Вы ведь не уверены что график советника не Period() == W1 ? А за неделю много что может случиться.
Электросетям не прикажешь.
Предложенный мною выше метод исключает ошибку.
Аааа, ваш вариант подразумевает не было ли открытия на текущем баре?
Ну можно тогда и это учесть
int SignalBuy=-1,SignalSell=-1; bool buy=true,sell=true; void OnTick(void) { MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1); //----+ if (MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) {SignalSell=1;} else SignalSell=-1; if (SignalSell==1 && BarOp()!=0 && sell) { ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red); sell=false; } if(SignalSell==-1) sell=true; //----+ if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) {SignalBuy=1;} else SignalBuy=-1; if (SignalBuy==1 && BarOp()!=0 && buy) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green); buy=false; } if(SignalBuy==-1) buy=true; } //+------------------------------------------------------------------+ //| Одна позиция на одном баре //if(BarOp()!=0) | //+------------------------------------------------------------------+ bool BarOp(){ datetime t=0; for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(t<OrderOpenTime()) t=OrderOpenTime();} return(iBarShift(Symbol(),0,t,true));}
Аааа, ваш вариант подразумевает не было ли открытия на текущем баре?
Именно.
Именно.
Ну вроде всё учли, ждём благодарности))
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу советник, возникла проблема: открывается ордер по условию, и пока он не закроется, следующий ордер не открывается. А хотелось бы, чтоб каждый раз при наступлении условия ордер снова открывался, не важно открывался ли ордер до этого.
Код:
void OnTick(void)
{
MacdCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,Fast,SLow,Signal,PRICE_CLOSE,MODE_SIGNAL,1);
if (CountSell() == 0 && MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious)
{
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippege,0,Bid-TakeProfit*Point,"macd",Magic,0,Red);
}
if (CountBuy() == 0 && MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,2,0,Ask+TakeProfit*Point,"macd",Magic,0,Green);
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()- 1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol()&& OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()- 1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber()== Magic && OrderType() == OP_BUY)
count++;
}
}
return(count);
}