int i; total = OrdersTotal();
for(i = 0; i < total-1; i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderLots() == _Lots)
{
if (OrderType()==OP_BUY)
{
if (OrderOpenPrice()!=OrderStopLoss())
{
ModifyOrder(-1,OrderOpenPrice() , -1);
}
}
}
}
Вы уверены, что показали надёжный способ пропуска последней позиции в списке?
Если торговать реально, то не беспокоит, что от сортировки может вдруг появиться зависимость?
Всё же, ИМХО, тут нужны два цикла - в первом ищем по времени открытия самую свежую позицию, во втором модифицируем все, кроме той, тикет которой нашли в первом цикле.
Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?
Я-бы сделал так.
/********************Script program start function********************/voidOnStart()
{
int i, t1, t2, clTicket, total = OrdersTotal();
datetime d1, d2;
double v1, v2, clVolume;
for(i = total-1; i > 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
t1 = OrderTicket();
d1 = OrderOpenTime();
v1 = OrderLots();
}
elsecontinue;
if(OrderSelect(i-1, SELECT_BY_POS))
{
t2 = OrderTicket();
d2 = OrderOpenTime();
v2 = OrderLots();
}
elsecontinue;
clTicket = d1 > d2 ? t1 : t2;
clVolume = d1 > d2 ? v1 : v2;
if(!OrderClose(clTicket, clVolume, OrderClosePrice(), 100)) // закрывает независимо от типа ордера OP_BUY или OP_SELLPrint("фигня кака-та");
}
}/********************************************************************/
К сожалению это не проверено и что-то не могу сообразить возможен-ли вариант когда после закрытия очередного ордера образуется "дыра" в списке ордеров.
Если кто сможет объяснить возможность появления такой "дыры" буду благодарен...
Для страховки вставлено else continue; если будет дыра, то будет просто пропущен один ордер. Так мне кажется.
К сожалению это не проверено и что-то не могу сообразить возможен-ли вариант когда после закрытия очередного ордера образуется "дыра" в списке ордеров.
Если кто сможет объяснить возможность появления такой "дыры" буду благодарен...
Для страховки вставлено else continue; если будет дыра, то будет просто пропущен один ордер. Так мне кажется.
Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.
Нужно сделать так:
for(int i = total-2; i >= 0; i--)
Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.
Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.
Нужно сделать так:
Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.
Не последней по списку, а самой "молодой" по времени.
Хотя и я так-же не внимателен. Вопрос о модификации, а я пишу закрытие... А если просто модифай то и дыр никаких в списке ордеров не будет... Только может потребоваться добавить переменные и им присвоить значения и ОБЯЗАТЕЛЬНО проверку параметров, чтобы не получать ошибку #1. Ну с этим Мила сама справится.
Не последней по списку, а самой "молодой" по времени.
Хотя и я так-же не внимателен. Вопрос о модификации, а я пишу закрытие... А если просто модифай то и дыр никаких в списке ордеров не будет... Только может потребоваться добавить переменные и им присвоить значения и ОБЯЗАТЕЛЬНО проверку параметров, чтобы не получать ошибку #1. Ну с этим Мила сама справится.
Artyom Trishkin:
Откуда вы можете быть точно уверены, что не появится зависимость от сортировки, и вы пропустите совсем не тот ордер, который бы хотели?
Ещё раз повторю: для надёжного нахождения именно последнего ордера, его нужно определить по времени открытия, а не по позиции в списке.
Насколько я знаю, ордера в списке располагаются как раз от самого раннего (OrdersTotal()-1) до самого позднего (0). Если это не так (список сортируется не по времени) и у Вас есть доказательства, предоставьте их пожалуйста.
Если же Вы говорите о том, что в момент запроса истории функцией OrdersTotal() другой эксперт выставил ордер, то он либо будет пропущен (в любом случае, т.к. не успел попасть в историю ордеров), либо так же станет последним в списке ордеров.
Можно, конечно, сильно-сильно перестраховаться и сравнивать время открытия всех ордеров от total-1 до 0 но, вряд ли, при использовании большого количества ордеров и торгуемых символов, это будет оптимальным решением.
Насколько я знаю, ордера в списке располагаются как раз от самого раннего (OrdersTotal()-1) до самого позднего (0). Если это не так (список сортируется не по времени) и у Вас есть доказательства, предоставьте их пожалуйста.
Если же Вы говорите о том, что в момент запроса истории функцией OrdersTotal() другой эксперт выставил ордер, то он либо будет пропущен (в любом случае, т.к. не успел попасть в историю ордеров), либо так же станет последним в списке ордеров.
Можно, конечно, сильно-сильно перестраховаться и сравнивать время открытия всех ордеров от total-1 до 0 но, вряд ли, при использовании большого количества ордеров и торгуемых символов, это будет оптимальным решением.
Хоспидя... Доказательства им подавай...
Видать, вы не совсем помните такие ситуации, будучи давно обсуждаемыми на mql4.com. Вот тогда-то и пришли к выводу, что лучше всё же искать по времени ордер для однозначного определения его времени открытия/закрытия. Уже устал повторять, что была зависимость от сортировки. Потом сделали так, что перестала быть. Народ расслабился, и начал делать так, как предлагаете вы. А потом бац.., и опять появилась зависимость от сортировки. Народ взвыл - роботы с ума сошли. А потом опять зависимость пропала от сортировки.
Если у вас есть желание в угоду мнимой оптимальности попасть снова когда-нибудь под раздачу, то делайте так, как делаете. Но не предлагайте такие решения другим людям. Либо, предлагая, предупреждайте о вероятности когда-либо потерять деньги из-за сбоев поиска нужного ордера, который (поиск) зависит от сортировки символов в списке, который в свою очередь никак не зависит от вас и вашего алгоритма. Наоборот - ваш алгоритм целиком зависит от кого-то...
Только не нужно говорить о том, что дилер может мухлевать со временем открытия/закрытия - это уже вопрос из другой плоскости.
чтоб он работал его надо запихнуть в OnTick
Здравствуйте.
Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?
int i; total = OrdersTotal(); for(i = 0; i < total; i++) { if(OrderSelect(i, SELECT_BY_POS) && OrderLots() == _Lots) { if (OrderType()==OP_BUY) { if (OrderOpenPrice()!=OrderStopLoss()) { ModifyOrder(-1,OrderOpenPrice() , -1); } } } }Здравствуйте.
Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?
int i; total = OrdersTotal(); for(i = 0; i < total-1; i++) { if(OrderSelect(i, SELECT_BY_POS) && OrderLots() == _Lots) { if (OrderType()==OP_BUY) { if (OrderOpenPrice()!=OrderStopLoss()) { ModifyOrder(-1,OrderOpenPrice() , -1); } } } }int i; total = OrdersTotal(); for(i = 0; i < total-1; i++) { if(OrderSelect(i, SELECT_BY_POS) && OrderLots() == _Lots) { if (OrderType()==OP_BUY) { if (OrderOpenPrice()!=OrderStopLoss()) { ModifyOrder(-1,OrderOpenPrice() , -1); } } } }Вы уверены, что показали надёжный способ пропуска последней позиции в списке?
Если торговать реально, то не беспокоит, что от сортировки может вдруг появиться зависимость?
Всё же, ИМХО, тут нужны два цикла - в первом ищем по времени открытия самую свежую позицию, во втором модифицируем все, кроме той, тикет которой нашли в первом цикле.
Здравствуйте.
Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?
Я-бы сделал так.
К сожалению это не проверено и что-то не могу сообразить возможен-ли вариант когда после закрытия очередного ордера образуется "дыра" в списке ордеров.
Если кто сможет объяснить возможность появления такой "дыры" буду благодарен...
Для страховки вставлено else continue; если будет дыра, то будет просто пропущен один ордер. Так мне кажется.
Я-бы сделал так.
К сожалению это не проверено и что-то не могу сообразить возможен-ли вариант когда после закрытия очередного ордера образуется "дыра" в списке ордеров.
Если кто сможет объяснить возможность появления такой "дыры" буду благодарен...
Для страховки вставлено else continue; если будет дыра, то будет просто пропущен один ордер. Так мне кажется.
Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.
Нужно сделать так:
Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.
Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.
Нужно сделать так:
Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.
Не последней по списку, а самой "молодой" по времени.
Хотя и я так-же не внимателен. Вопрос о модификации, а я пишу закрытие... А если просто модифай то и дыр никаких в списке ордеров не будет... Только может потребоваться добавить переменные и им присвоить значения и ОБЯЗАТЕЛЬНО проверку параметров, чтобы не получать ошибку #1. Ну с этим Мила сама справится.
Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.
Нужно сделать так:
Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.
Откуда вы можете быть точно уверены, что не появится зависимость от сортировки, и вы пропустите совсем не тот ордер, который бы хотели?
Ещё раз повторю: для надёжного нахождения именно последнего ордера, его нужно определить по времени открытия, а не по позиции в списке.
Не последней по списку, а самой "молодой" по времени.
Хотя и я так-же не внимателен. Вопрос о модификации, а я пишу закрытие... А если просто модифай то и дыр никаких в списке ордеров не будет... Только может потребоваться добавить переменные и им присвоить значения и ОБЯЗАТЕЛЬНО проверку параметров, чтобы не получать ошибку #1. Ну с этим Мила сама справится.
Откуда вы можете быть точно уверены, что не появится зависимость от сортировки, и вы пропустите совсем не тот ордер, который бы хотели?
Ещё раз повторю: для надёжного нахождения именно последнего ордера, его нужно определить по времени открытия, а не по позиции в списке.
Насколько я знаю, ордера в списке располагаются как раз от самого раннего (OrdersTotal()-1) до самого позднего (0). Если это не так (список сортируется не по времени) и у Вас есть доказательства, предоставьте их пожалуйста.
Если же Вы говорите о том, что в момент запроса истории функцией OrdersTotal() другой эксперт выставил ордер, то он либо будет пропущен (в любом случае, т.к. не успел попасть в историю ордеров), либо так же станет последним в списке ордеров.
Можно, конечно, сильно-сильно перестраховаться и сравнивать время открытия всех ордеров от total-1 до 0 но, вряд ли, при использовании большого количества ордеров и торгуемых символов, это будет оптимальным решением.
Насколько я знаю, ордера в списке располагаются как раз от самого раннего (OrdersTotal()-1) до самого позднего (0). Если это не так (список сортируется не по времени) и у Вас есть доказательства, предоставьте их пожалуйста.
Если же Вы говорите о том, что в момент запроса истории функцией OrdersTotal() другой эксперт выставил ордер, то он либо будет пропущен (в любом случае, т.к. не успел попасть в историю ордеров), либо так же станет последним в списке ордеров.
Можно, конечно, сильно-сильно перестраховаться и сравнивать время открытия всех ордеров от total-1 до 0 но, вряд ли, при использовании большого количества ордеров и торгуемых символов, это будет оптимальным решением.
Хоспидя... Доказательства им подавай...
Видать, вы не совсем помните такие ситуации, будучи давно обсуждаемыми на mql4.com. Вот тогда-то и пришли к выводу, что лучше всё же искать по времени ордер для однозначного определения его времени открытия/закрытия. Уже устал повторять, что была зависимость от сортировки. Потом сделали так, что перестала быть. Народ расслабился, и начал делать так, как предлагаете вы. А потом бац.., и опять появилась зависимость от сортировки. Народ взвыл - роботы с ума сошли. А потом опять зависимость пропала от сортировки.
Если у вас есть желание в угоду мнимой оптимальности попасть снова когда-нибудь под раздачу, то делайте так, как делаете. Но не предлагайте такие решения другим людям. Либо, предлагая, предупреждайте о вероятности когда-либо потерять деньги из-за сбоев поиска нужного ордера, который (поиск) зависит от сортировки символов в списке, который в свою очередь никак не зависит от вас и вашего алгоритма. Наоборот - ваш алгоритм целиком зависит от кого-то...
Только не нужно говорить о том, что дилер может мухлевать со временем открытия/закрытия - это уже вопрос из другой плоскости.
Удачи.