Всем доброго времени суток. Пишу советника, основанного на стратегии "Стратегия нужный момент".
Возникла большущая загвоздка с алгоритмом на продажу.
Не буду приводить весь код. Приведу лишь фрагменты.
Для начала я написал функцию для подсчета количества ордеров sell:
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);
}
Затем, согласно условию, указанному в стратегии, а именно: "Если RSI пересек линию 70, ждём подтверждения от Williams (показатель должен пересечь линию -20). В этот момент цена должна находиться примерно у верхней линии полос Боллиджера, тогда открываем позицию." я написал функцию для открытия ордера на продажу:
double diff = MathAbs(PriceHigh - Bid); // разница между значением цены и верхней полосы Боллинджера
double fin = NormalizeDouble(diff,Digits);
if(CountSell() == 0 && TickRSI < 70 && TickWPR < -20 && (fin <= 0.00016)) //с помощью последнего условия как раз проверяю близость к верхней полосе
{
ticket = OrderSend(Symbol(),OP_SELL, Lots, Bid, Slippage, 0, 0,"First_expert",Magic, 0, Red);
if(ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
if(OrderSelect(ticket, SELECT_BY_TICKET))
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red);
}
}
Далее написал код, как мне казалось, исключительно по стратегии : "Затем ждём пробоя средней линии полос Боллинджера, опять же, этот уровень цена должна пройти без лишних колебаний. Если же цена достигла
нижней (на сайте указано верхней. Вероятно, опечатка) линии полос Боллинджера, то готовимся закрывать позицию в момент, когда индикатор Вильямса пересечёт уровень -80 снизу вверх."
if(CountSell() > 0 && Bid < ((PriceHigh + PriceLow) / 2)) //если есть открытые ордера и пробита средняя линия полос Боллинджера
{
RuleCloseSell = true;
}
double key = MathAbs(PriceLow - Bid); //разница между ценой и значением нижней полосы
double final_key = NormalizeDouble(key,Digits);
if(final_key <= 0.00020 && CountSell( ) > 0 && RuleCloseSell == true && TickWPR < -80) //проверка близости к нижней полосе, пробою средней и нужному положению RSI
{
RuleCloseSellFinal = true;
}
if(RuleCloseSellFinal == true && TickWPR > -80) //если предыдущие условия выполнились и теперь RSI выше -80, то закроем
{
OrderClose(OrderTicket(),0.01,PriceBid,Slippage);
}
Мне казалось, что всё реализовано верно, но на практике, при проверке советника на истории, я получаю ситуацию, когда ордера Sell у меня открываются и тут же закрываются с убытком. Таких открытий/закрытий может быть около десятка за пару минут. Это навело на мысль, что у меня есть косяк в алгоритме.
Буду очень рад советам) Не удивлюсь, если я не понял каких-то основ.
Если нужны какие-то дополнения или где-то непонятен код, то я готов дополнить сведения.