Добрый день!
Пожалуйста, подскажите - после ОТКРЫТИЯ отложенного ордера, например ордера типа OP_BUYSTOP, ПРЕОБРАЗУЕТСЯ ЛИ он в тип OP_BUY ?
Мне это необходимо, чтобы потом с помощью функции определять количество открытых позиций.
Вот функция:
int PositionsTotal()
{
int pos = 0;
for (int i=0; i<OrdersTotal() - 1; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
pos++;
}
return(pos);
}
Заранее спасибо всем, кто подскажет.
да, преобразуется. Только не после открытия, но после срабатывания. Отложенники не открываются, но срабатывают... :-)))
П.С. Будь в теме... :-)))
да, преобразуется. Только не после открытия, но после срабатывания. Отложенники не открываются, но срабатывают... :-)))
П.С. Будь в теме... :-)))
ок...спасибо за помощь! )
ок...спасибо за помощь! )
там еще правочка в коде - красным.
там еще правочка в коде - красным.
Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal(). Вообще лучше будет вот так:
for (i=OrdersTotal()-1;i>=0;i--){}
Обратите внимание - я изменил направление перебора ордеров. Ордера перебираются у меня от последнего к первому в списке. Такое направление лучше использовать всегда. И лишь в некоторых случаях менять его на противоположное. Можете догадаться сами почему?
Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal().
в записи
for (int i=0; i<OrdersTotal() - 1; i++)единицу вычитать нужно, так как нет ордера с индексом OrdersTotal(). Ордера индексируются с 0.
Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal(). Вообще лучше будет вот так:
Обратите внимание - я изменил направление перебора ордеров. Ордера перебираются у меня от последнего к первому в списке. Такое направление лучше использовать всегда. И лишь в некоторых случаях менять его на противоположное. Можете догадаться сами почему?
drknn, Вы правы.
А по поводу перебора - если в цикле ордера не удаляются/не добавляются, то, в общем случае, направление перебора не имеет значения.
все ИМХО.
в записи
единицу вычитать нужно, так как нет ордера с индексом OrdersTotal(). Ордера индексируются с 0.
Нет не нужно,так как ни когда не произойдёт сравнения i на равенство OrdersTotal(), а вот если Вы вычтите эту 1, то последний в списке ордеров ордер будет проигнорирован!
Смотрите, пусть в рынке у нас 2 ордера. Первый в нулевой позиции, второй - в первой позиции. Что произойдёт в Вашем случае - Ордерс Тотал вернул Вам число 2. Вы вычли из двойки единицу и проинициализировали счётчик нулём.
На первой итерации цикла код поймёт, что 0 меньше 1 и выполнит тело цикла. На второй итерации код поймёт, что 1 не меньше 1 и прекратит работу, так как условие не выполняется. Если же в Вашем случае не вычитать 1, то произойдёт следующее. Ордерс Тотал вернул Вам число 2. На первой итерации цикла код поймёт, что 0 меньше 2 и выполнит тело цикла. На второй итерации код поймёт, что 1 меньше 2 и выполнит тело цикла, на третьей итерации код поймёт, что 2 не меньше 2 и прекратит работу, так как условие не выполняется. Таким образом, мы перебрали и ордер, который стоит в нулево и в первой позициях списка, чего не произошло при вычитании 1.
Нет не нужно,так как ни когда не произойдёт сравнения i на равенство OrdersTotal(), а вот если Вы вычтите эту 1, то последний в списке ордеров ордер будет проигнорирован!
Смотрите, пусть в рынке у нас 2 ордера. Первый в нулевой позиции, второй - в первой позиции. Что произойдёт в Вашем случае - Ордерс Тотал вернул Вам число 2. Вы вычли из двойки единицу и проинициализировали счётчик нулём.
На первой итерации цикла код поймёт, что 0 меньше 1 и выполнит тело цикла. На второй итерации код поймёт, что 1 не меньше 1 и прекратит работу, так как условие не выполняется. Если же в Вашем случае не вычитать 1, то произойдёт следующее. Ордерс Тотал вернул Вам число 2. На первой итерации цикла код поймёт, что 0 меньше 2 и выполнит тело цикла. На второй итерации код поймёт, что 1 меньше 2 и выполнит тело цикла, на третьей итерации код поймёт, что 2 не меньше 2 и прекратит работу, так как условие не выполняется. Таким образом, мы перебрали и ордер, который стоит в нулево и в первой позициях списка, чего не произошло при вычитании 1.
согласен. не обратил внимание, что стоит "<"
либо
for (int i=0; i<OrdersTotal(); i++)
либо
for (int i=0; i<=OrdersTotal() - 1; i++)
Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal(). Вообще лучше будет вот так:
Обратите внимание - я изменил направление перебора ордеров. Ордера перебираются у меня от последнего к первому в списке. Такое направление лучше использовать всегда. И лишь в некоторых случаях менять его на противоположное. Можете догадаться сами почему?
потому что рын ордер может быть закрыт, порядок ордеров изменится и какой-либо будет пропущен в цикле с начала, да и в учебнике все написано, поэтому вопросу, читал, редко бывает - править сначала не стал...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день!
Пожалуйста, подскажите - после ОТКРЫТИЯ отложенного ордера, например ордера типа OP_BUYSTOP, ПРЕОБРАЗУЕТСЯ ЛИ он в тип OP_BUY ?
Мне это необходимо, чтобы потом с помощью функции определять количество открытых позиций.
Вот функция:
int PositionsTotal()
{
int pos = 0;
for (int i=0; i<OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
pos++;
}
return(pos);
}
Заранее спасибо всем, кто подскажет.