Сложно сказать наверняка не зная "механики" работы советника, но...
Логика прежде всего. Вы в одном цикле перебора ордеров осуществляете пересчет ордерови их закрытие. При условии, что одновременно может быть только один ордер - не проблема. А если могут быть несколько разнонаправленых ордеров?
Например нашли ордер Buy -> BuyOrders=1, условие закрытие не выполнилось, следующий ордер Sell->SellOrders=1, ордер селл может закрыться по условию закрытия для бай ордера....
Вынесите пересчет ордеров в один цикл, а закрытия в другой. Или попробуйте так.
for(i=0; i<actTotal;i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if( OrderSymbol()==Symbol() && OrderMagicNumber()==Mag) { TotalOrders++; if(OrderType()==OP_BUY) BuyOrders++; if(OrderType()==OP_SELL) SellOrders++; double l = OrderLots(); }} if(OrderType()==OP_BUY && l == Lots && Bid > OrderOpenPrice() + Pips*Point && Bid < iClose(NULL,1,1)) OrderClose(OrderTicket(),OrderLots(),Ask,CLR_NONE); if(OrderType()==OP_SELL && l == Lots && Ask < OrderOpenPrice() - Pips*Point && Ask > iClose(NULL,1,1)) OrderClose(OrderTicket(),OrderLots(),Bid,CLR_NONE); }
.
for(int i=OrdersTotal()-1;i>=0;i--){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if( OrderSymbol()==Symbol() && OrderMagicNumber()==Mag){ TotalOrders++; double l = OrderLots(); if(OrderType()==OP_BUY){ BuyOrders++; if(BuyOrders > 0 && l == Lots && Bid > OrderOpenPrice() + Pips*Point && Bid < iClose(NULL,1,1)){ if(OrderClose(OrderTicket(),OrderLots(),Ask,CLR_NONE)){ BuyOrders--; TotalOrders--; RefreshRates(); } } } if(OrderType()==OP_SELL){ SellOrders++; if(SellOrders > 0 && l == Lots && Ask < OrderOpenPrice() - Pips*Point && Ask > iClose(NULL,1,1)){ if(OrderClose(OrderTicket(),OrderLots(),Bid,CLR_NONE)){ SellOrders--; TotalOrders--; RefreshRates(); } } } } } else{ return(0); } }Еще не помешает нормализацию даблов делать при сравнении.
Я в советнике пытаюсь сделать закрытие ордера если он зашел в плюс, а потом произошел разворот на минутном тф.
Попробовала Ваш ваниант все равно не работает (позиции не закрываются).
Вы что тут над нами издеваетесь???) Два взрослых человека искренне пытались Вам помочь.... Интересно, о чем тут были Ваши предыдущие 100 постов, если Вы еще не удосужились узнать, что для закрытия ордера его необходимо сначала ОТКРЫТЬ?) Да и вообще не эксперт это... ЧИТАТАТЬ от корки до корки https://book.mql4.com/ru/
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Что в этом куске кода не правильно?
for(i=0; i<actTotal;i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if( OrderSymbol()==Symbol() && OrderMagicNumber()==Mag)
{
TotalOrders++;
if(OrderType()==OP_BUY) BuyOrders++;
if(OrderType()==OP_SELL) SellOrders++;
double l = OrderLots();
}}
if(BuyOrders > 0 && l == Lots && Bid > OrderOpenPrice() + Pips*Point && Bid < iClose(NULL,1,1))
OrderClose(OrderTicket(),OrderLots(),Ask,CLR_NONE);
if(SellOrders > 0 && l == Lots && Ask < OrderOpenPrice() - Pips*Point && Ask > iClose(NULL,1,1))
OrderClose(OrderTicket(),OrderLots(),Bid,CLR_NONE);
}