Тогда это только усугубит общий минус по оставшимся открытыми позициям. Но делайте как хотите.
Благодарен Вам за ответ, но меня интересует,именно, то, что я написал. Може далее у меня кака другая мысль?, а вот,именно, на этом, что нужно, я споткнулся. Я получаю результаты, но не нужные.
Пример: for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS)// може SELECT_BY_TICKET?
{
if(OrderProfit()>0)
double pr=OrderProfit();int tik=OrderTicket();
if(OrderProfit()<0)
double pr2=OrderProfit();int tik2=OrderTicket();//тикет показывает один и тот же,как и OrderProfit()>0
}
if((pr-pr2*(-1))>0)
OrderCloseBy(tik,tik2);
Как правильно запрос составить? В результате мне нужно мах профитный ордер (по нескольким парам) и его тикет и и еще проигрышный ордер (по нескольким парам) и его тикет, который мог бы перекрыться выигрышным при одновременном закрытии. Если бред, иль просто ошибка, подскажите, пожалуйста, я в начале пути
Извиняюсь, може не ясно выразился. Не важно какой ордер BUY иль SELL, не важно какой инструмент,инструменты именно разные, важно "профит+", и "профит-", перебирать по всем инструментам и если "+" перекрывает "-", то два ордера закрываются. Нужны тикеты этих двух ордеров
bestseich:
Извиняюсь, може не ясно выразился. Не важно какой ордер BUY иль SELL, не важно какой инструмент,инструменты именно разные, важно "профит+", и "профит-", перебирать по всем инструментам и если "+" перекрывает "-", то два ордера закрываются. Нужны тикеты этих двух ордеров
//Пример: for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()>0)
{
double pr=OrderProfit();
int tik=OrderTicket();
for(i=0;i<total;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderProfit()<0)
{
if((OrderProfit()+pr)>=0)
{
// Здесь удаление 2х тикетов OrderTicket(), и tik.// OrderCloseBy(), не пойдет работает по одному символу.
}
}
}
}
}
}
}
У меня если профит "-", то if (OrderProfit()<5*Lots) т.е. "-" 5 пунктов, а перекрывает профит "+" > на 1 Lots больше, чем "-". Но в настоящее время столкнулся со следующим: в качестве профит "+" хочу наибольший "+" из всех открытых позиций, не важно по каким инструментам, минус подбирается сам, ништяк. А еще лучше, чёб "+" суммировался и перекрывал какой то "-", иль их сумму двумя, иль тремя, иль более, открытыми ордерами с "+" В настоящее время пока так:
Если длинно, то я в начале пути, пока лишь знакомлюсь... Не.. хочу уточнить. Это просто коментом показывает вновь появившийся "+"-совой ордер, а не больший, а так срабатывает все нормально Вот еще бы, если нет возможности участия всего лишь 2-ух ордеров, хочется чтоб участвовали по нескольку с обеих сторон, може кому не лень... Не надо частичное закрытие, оставим на потом, просто "+" больше "-" и всё... Покажите свое решение.
Только определись в чем прибыль считать - в валюте депозита или в пунктах. Если в пунктах, наверное нет смысла размер лота учитывать, просто закрывать тот у которого максимально положительная разница в пунктах.
Набросал, но не тестировал. Я бы так сделал.
#define MAGIC 12345int slip=30;
void GoodProfit(double prof=50){// prof - Достаточная прибыль в пунктах для закрытия ордера// закроет ордер с максимальной положительной разницой в пунктах не ниже заданнойdouble prl,prs,prlmax=0.0,prsmax=0.0;
int lt=-1,st=-1;
for (int i=OrdersTotal()-1;i>=0;i--){
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
if(OrderSymbol() !=Symbol())continue;
if(OrderMagicNumber()!=MAGIC) continue;
if(OrderType()==OP_BUY) {
prl=(Bid-OrderOpenPrice())/Point;
if(prl>prlmax){prlmax=prl;lt=OrderTicket();}// ищем бай с максимальной прибылью в пунктах и запоминаем его тикет
}
if(OrderType()==OP_SELL) {
prs=(OrderOpenPrice()-Ask)/Point;
if(prs>prsmax){prsmax=prs;st=OrderTicket();}// ищем селл с максимальной прибылью в пунктах и запоминаем его тикет
}
}
if(lt>=0 && prlmax>prof && prlmax-prsmax>0){OrderClose(lt,OrderLots(),Bid,slip,Blue);}// Закрываем бай с максимальным профитом в пунктахif(st>=0 && prsmax>prof && prsmax-prlmax>0){OrderClose(st,OrderLots(),Ask,slip,Red);}// Закрываем селл с максимальным профитом в пунктахreturn(0);
}
Добрый день всем. Подскажите, пожалуйста, как поправить код. Суть: закрытие одним плюсовым ордером одного минусового на разных инструментах
MQL-Код:
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()>0)
{
double pr=OrderProfit();
int tik=OrderTicket();
for(i=0;i<total;i++)//total=OrdersTotal()
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderProfit()<(-5)*Lots)//Lots=OrderLots()
{
if((OrderProfit()+pr-Lots)>0)
{// Здесь удаление 2х тикетов OrderTicket(), и tik.//А на самом деле вместо 2-х тикетов удаляются 1 плюсовой и// все минусовые подходящие под условие, в итоге вместо плюса получается общий минусif(OrderType()==OP_BUY)//може здесь сыграют фигурные скобки? хотя... не совсем понятно... наверно ещё нужен break? у меня нет мультивалютного тестера
Тогда это только усугубит общий минус по оставшимся открытыми позициям. Но делайте как хотите.
Благодарен Вам за ответ, но меня интересует,именно, то, что я написал. Може далее у меня кака другая мысль?, а вот,именно, на этом, что нужно, я споткнулся. Я получаю результаты, но не нужные.
Пример: for(cnt=0;cnt<total;cnt++)
}
if((pr-pr2*(-1))>0)
OrderCloseBy(tik,tik2);
Как правильно запрос составить? В результате мне нужно мах профитный ордер (по нескольким парам) и его тикет и и еще проигрышный ордер (по нескольким парам) и его тикет, который мог бы перекрыться выигрышным при одновременном закрытии. Если бред, иль просто ошибка, подскажите, пожалуйста, я в начале пути
Извиняюсь, може не ясно выразился. Не важно какой ордер BUY иль SELL, не важно какой инструмент,инструменты именно разные, важно "профит+", и "профит-", перебирать по всем инструментам и если "+" перекрывает "-", то два ордера закрываются. Нужны тикеты этих двух ордеров
Хотелось бы знать именно как из разных инструментов, ведь в окне терминала все, что нужно есть, как достать и применить?
OrderSelect(), OrderSymbol() да и OrderMagicNumber(). Всё в документации написано.
благодарю
благодарю
У меня если профит "-", то if (OrderProfit()<5*Lots) т.е. "-" 5 пунктов, а перекрывает профит "+" > на 1 Lots больше, чем "-". Но в настоящее время столкнулся со следующим: в качестве профит "+" хочу наибольший "+" из всех открытых позиций, не важно по каким инструментам, минус подбирается сам, ништяк. А еще лучше, чёб "+" суммировался и перекрывал какой то "-", иль их сумму двумя, иль тремя, иль более, открытыми ордерами с "+"
В настоящее время пока так:
for(cnt=0;cnt<total;cnt++) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) { if(OrderProfit()>0) { double pr=OrderProfit(); int tik=OrderTicket(); for(i=0;i<total;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderProfit()<(-5)*Lots) { if((OrderProfit()+pr-Lots)>0) {// Здесь удаление 2х тикетов OrderTicket(), и tik. if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); OrderClose(tik,OrderLots(),Bid,3,White); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); OrderClose(tik,OrderLots(),Ask,3,White); }}}}}Не.. хочу уточнить. Это просто коментом показывает вновь появившийся "+"-совой ордер, а не больший, а так срабатывает все нормально
Вот еще бы, если нет возможности участия всего лишь 2-ух ордеров, хочется чтоб участвовали по нескольку с обеих сторон, може кому не лень... Не надо частичное закрытие, оставим на потом, просто "+" больше "-" и всё... Покажите свое решение.
Есть готовая функция ClosePosBySizeProfitInCurrency - Закрытие тех позиций, у которых профит в валюте депозита некоторое значение
Только определись в чем прибыль считать - в валюте депозита или в пунктах. Если в пунктах, наверное нет смысла размер лота учитывать, просто закрывать тот у которого максимально положительная разница в пунктах.
Набросал, но не тестировал. Я бы так сделал.