Здравствуйте! Столкнулся с одной проблемой при написании советника.
Суть в том, что советник открывает ордера по индикатору. Сигналы частые, и в рынке появляется много ордеров.
Например, при открытии ордера Buy ранее открытые Buy если они в плюсе должны закрыться. Если в минусе, то нет. Такие же условия и для Sell .
Но проблема в том, что код закрывает только что открытый ордер, как только он войдет в плюс
Вот код.
Когда один два ордера, все работает, когда много ордеров Buy и Sell тогда начинает гнать!
Подскажите, где ошибка?
Заранее спасибо за ответы
Я так понял, вам надо закрывать самый "старый" ордер. Тогда вам нужно анализировать время открытия ордера и закрывать тот у которого дата открытия меньше чем у других.
Я так понял, вам надо закрывать самый "старый" ордер. Тогда вам нужно анализировать время открытия ордера и закрывать тот у которого дата открытия меньше чем у других.
Еще вопрос! Я не пойму, почему этот код закрывает все ордера, и бай, и селл. Даже в минусе?
void CloseBuy() { for(int i=OrdersTotal(); i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(OrderProfit()+OrderSwap()+OrderCommission()>0) { if(CountOrdep(OP_BUY)>1 && i!=0) { OrderClose(OrderTicket(),OrderLots(),Bid,Slip,clrGray); } } } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseSell() { for(int i=OrdersTotal(); i>=0; i--) { if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { if(OrderMagicNumber()==Magic) { if(OrderType()==OP_SELL) { if(OrderProfit()+OrderSwap()+OrderCommission()>0) { if(CountOrdep(OP_SELL)>1 && i!=0) { OrderClose(OrderTicket(),OrderLots(),Ask,Slip,clrGray); } } } } } } } }
Еще вопрос! Я не пойму, почему этот код закрывает все ордера, и бай, и селл. Даже в минусе?
if(OrderProfit()+OrderSwap()+OrderCommission()>0)
Попробуйте так:
if((OrderProfit()+OrderSwap()+OrderCommission())>0)
Здесь возможно ошибка:
Попробуйте так:
Спасибо! А как это в коде выразить?
Тут есть два варианта.
1 Тикет ордеру присваивается в порядке возрастания чем больше OrderTicet() то значит он открыт позже. Можно запихнуть тикет всех ордеров в массив и отсортировать его в порядке возрастания (функция ArraySort()) , таким образом в массиве самым первыми ордерами будут те у кого тикет меньше всех соответственно они были открыты раньше.
2. Сравнивать OrderOpenTime(). Ордер с самым маленьким значением OrderOpenTime() будет открыт самым первым.
Еще вопрос! Я не пойму, почему этот код закрывает все ордера, и бай, и селл. Даже в минусе?
void Close(int cmd) { if(CountOrdep(cmd)>1) { for(int i=OrdersTotal()-1; i>=0; i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) coutinue; if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber()!=Magic) continue; if(OrderType()==cmd) { if(OrderProfit()+OrderSwap()+OrderCommission()>0) { if (cmd==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slip,clrGray); if (cmd==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slip,clrGray); } } } } }Зачем дублировать код, алгоритм должен быть универсальным, подходящим для решения однотипных задач.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Столкнулся с одной проблемой при написании советника.
Суть в том, что советник открывает ордера по индикатору. Сигналы частые, и в рынке появляется много ордеров.
Например, при открытии ордера Buy ранее открытые Buy если они в плюсе должны закрыться. Если в минусе, то нет. Такие же условия и для Sell .
Но проблема в том, что код закрывает только что открытый ордер, как только он войдет в плюс
Вот код.
Когда один два ордера, все работает, когда много ордеров Buy и Sell тогда начинает гнать!
Подскажите, где ошибка?
Заранее спасибо за ответы