7Konstantin7: Не представляю как это будет в коде) но каким то чудом я смог добавить в советник удаление отложенных ордеров, я в кодах не силен, только немного.
Да просто возьми и проверь как будет закрывать в цикле
1:
int i, total = OrdersTotal(); bool rez;
for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}
2:
//Всё тоже самое только поменяй направление циклаfor(i = 0; i < total; i++)
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.
Да просто возьми и проверь как будет закрывать в цикле
1:
2:
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.
Да просто возьми и проверь как будет закрывать в цикле
1:
2:
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.
Всем привет! Уже задавал подобный вопрос на стр 711, к сожалению, никто не откликнулся, может сейчас кто...
Столкнулся с проблемой по закрытию встречных ордеров на пятизнаке. Суть в следующем мне нужно закрыть при достижении суммарного профита, скажем 20 ордеров в бай и 33 ордера в сел. При этом 20 ордеров в бай и 20 ордеров в селл я хочу закрыть через функцию OrderCloseBy(), остальные 13 ордеров в селл закрываю через функцию OrderClose().
Если на 4-х знаке у нас спред фиксированный, то проблем по закрытию не возникает и при использовании функции OrderCloseBy() мы экономим спред. На пятизнаке же спред плавающий, именно поэтому,я думаю, при достижении суммарного профита ордера не закрываются, а в журнале ругается на OrderCloseBy(). При этом, если прогнать в тестере, то все закрывается нормально.
Ордера в одном направлении при достижении суммарного профита закрывает без проблем.
Кто сталкивался с такой проблемой, каковы варианты ее решения.
Привожу функции закрытия ордеров.
Да и еще, работает ли вообще функция OrderCloseBy() на пятизнаке.
//-----------------------------------------------------------------------// функция подсчета открытых ордеров//-----------------------------------------------------------------------void OrderOpen()
{
Orders_BUY=0; Orders_SELL=0;
for(int a=0; a<=OrdersTotal(); a++)
{
if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;
//if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;//if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
}
}
//-----------------------------------------------------------------------// функция закрытия ордеров сначала разнонаправленных//-----------------------------------------------------------------------void ClosePos()
{
int ticket_1=0, ticket_2=0;
for (int a=0; a<=OrdersTotal(); a++)
{
if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
{
if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
if(OrderType() == OP_SELL) ticket_2= OrderTicket();
}
}
}
if(ticket_1 != 0 && ticket_2 != 0) { // если найдены разнонаправленные ордера
res = OrderCloseBy(ticket_1,ticket_2,clrRed); } // закроем ихif(ticket_1 == 0 && ticket_2 != 0) { CloseOrder_by_type(OP_SELL,Symbol()); }
if(ticket_1 != 0 && ticket_2 == 0) { CloseOrder_by_type(OP_BUY,Symbol()); }
}
//---- Закрытие ордера по типу и комментарию ----//void CloseOrder_by_type(int type, string sym)
{
for(int k= OrdersTotal()-1;k>=0;k--)
{
if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
{
if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
else { res = OrderDelete(OrderTicket());}
if(!res)
Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
elsePrint("ордер успешно закрыт.");
}
}
}
Не представляю как это будет в коде) но каким то чудом я смог добавить в советник удаление отложенных ордеров, я в кодах не силен, только немного.
Да просто возьми и проверь как будет закрывать в цикле
1:
2:
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.Да просто возьми и проверь как будет закрывать в цикле
1:
2:
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.Да уже вродь в личке порешили проблему...
Ну так я-то не читаю вашу личку... и не в курсе происходящего.
Ага, не читает он... А тапочки мои куда пропали???!!! ;)
Помнишь что перечислял Иоан Васильевич что брал, а Шпака не брал... Так и я твои тапочки.
пока. Спать пойду.
Помнишь что перечислял Иоан Васильевич что брал, а Шпака не брал... Так и я твои тапочки.
пока. Спать пойду.
Да просто возьми и проверь как будет закрывать в цикле
1:
2:
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.Спасибо, уже решили проблему.
Я думал пошлют в жобу) Благодарю за помощь.
Всем привет! Уже задавал подобный вопрос на стр 711, к сожалению, никто не откликнулся, может сейчас кто...
Столкнулся с проблемой по закрытию встречных ордеров на пятизнаке. Суть в следующем мне нужно закрыть при достижении суммарного профита, скажем 20 ордеров в бай и 33 ордера в сел. При этом 20 ордеров в бай и 20 ордеров в селл я хочу закрыть через функцию OrderCloseBy(), остальные 13 ордеров в селл закрываю через функцию OrderClose().
Если на 4-х знаке у нас спред фиксированный, то проблем по закрытию не возникает и при использовании функции OrderCloseBy() мы экономим спред. На пятизнаке же спред плавающий, именно поэтому,я думаю, при достижении суммарного профита ордера не закрываются, а в журнале ругается на OrderCloseBy(). При этом, если прогнать в тестере, то все закрывается нормально.
Ордера в одном направлении при достижении суммарного профита закрывает без проблем.
Кто сталкивался с такой проблемой, каковы варианты ее решения.
Привожу функции закрытия ордеров.
Да и еще, работает ли вообще функция OrderCloseBy() на пятизнаке.
Всем привет! Уже задавал подобный вопрос на стр 711, к сожалению, никто не откликнулся, может сейчас кто...
Делаю так:
Привожу ситуацию к нулевой совокупной позиции (локирую), потом закрываю лок.
Теперь, детализация.
1. Подсчет совокупной позиции:
перебор ордеров
Если покупка, то совокупная позиция увеличивается на величину лота ордера.
Если продажа, то совокупная позиция уменьшается на величину лота ордера.
конец цикла перебора ордеров
2. Создание лока:
если совокупная позиция больше нуля, то продаем;
если совокупная позиция меньше нуля, то покупаем;
иначе - ничего не делаем.
Размер лота равен совокупной позиции.
3. Закрываем лок (перекрытые позиции)
Бесконечный цикл ( while (true) )
сбрасываем в ноль тикеты ордеров на покупку и продажу
цикл перебора ордеров
если (покупка) фиксируем тикет ордера на покупку
если (продажа) фиксируем тикет ордера на продажу
конец цикла перебора ордеров
если( есть продажа и есть покупка ) то перекрестное закрытие
иначе выход из бесконечного цикла (break)
конец бесконечного цикла
Теперь этот алгоритм программируем на выбранном языке (MQL4)