OP_BUYSTOP и OP_BUY

 

Добрый день!

Пожалуйста, подскажите - после ОТКРЫТИЯ отложенного ордера, например ордера типа 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);

}

Заранее спасибо всем, кто подскажет.

 
concord99:

Добрый день!

Пожалуйста, подскажите - после ОТКРЫТИЯ отложенного ордера, например ордера типа 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);

}

Заранее спасибо всем, кто подскажет.


да, преобразуется. Только не после открытия, но после срабатывания. Отложенники не открываются, но срабатывают... :-)))

П.С. Будь в теме... :-)))

 
Roman.:


да, преобразуется. Только не после открытия, но после срабатывания. Отложенники не открываются, но срабатывают... :-)))

П.С. Будь в теме... :-)))


ок...спасибо за помощь! )
 
concord99:

ок...спасибо за помощь! )

там еще правочка в коде - красным.
 
Roman.:

там еще правочка в коде - красным.

Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal(). Вообще лучше будет вот так:

for (i=OrdersTotal()-1;i>=0;i--){}

Обратите внимание - я изменил направление перебора ордеров. Ордера перебираются у меня от последнего к первому в списке. Такое направление лучше использовать всегда. И лишь в некоторых случаях менять его на противоположное. Можете догадаться сами почему?

 
drknn:

Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal().

в записи

for (int i=0; i<OrdersTotal() - 1; i++) 
единицу вычитать нужно, так как нет ордера с индексом OrdersTotal(). Ордера индексируются с 0.
 
drknn:

Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal(). Вообще лучше будет вот так:

Обратите внимание - я изменил направление перебора ордеров. Ордера перебираются у меня от последнего к первому в списке. Такое направление лучше использовать всегда. И лишь в некоторых случаях менять его на противоположное. Можете догадаться сами почему?

drknn, Вы правы.

А по поводу перебора - если в цикле ордера не удаляются/не добавляются, то, в общем случае, направление перебора не имеет значения.

все ИМХО.

 
abolk:

в записи

единицу вычитать нужно, так как нет ордера с индексом OrdersTotal(). Ордера индексируются с 0.


Нет не нужно,так как ни когда не произойдёт сравнения i на равенство OrdersTotal(), а вот если Вы вычтите эту 1, то последний в списке ордеров ордер будет проигнорирован!

Смотрите, пусть в рынке у нас 2 ордера. Первый в нулевой позиции, второй - в первой позиции. Что произойдёт в Вашем случае - Ордерс Тотал вернул Вам число 2. Вы вычли из двойки единицу и проинициализировали счётчик нулём.

На первой итерации цикла код поймёт, что 0 меньше 1 и выполнит тело цикла. На второй итерации код поймёт, что 1 не меньше 1 и прекратит работу, так как условие не выполняется. Если же в Вашем случае не вычитать 1, то произойдёт следующее. Ордерс Тотал вернул Вам число 2. На первой итерации цикла код поймёт, что 0 меньше 2 и выполнит тело цикла. На второй итерации код поймёт, что 1 меньше 2 и выполнит тело цикла, на третьей итерации код поймёт, что 2 не меньше 2 и прекратит работу, так как условие не выполняется. Таким образом, мы перебрали и ордер, который стоит в нулево и в первой позициях списка, чего не произошло при вычитании 1.

 
всем спасибо и успехов в 2011 г.!
 
drknn:


Нет не нужно,так как ни когда не произойдёт сравнения 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++) 
 
drknn:

Единицу вычитать не нужно, так как нет сравения на равенство OrdersTotal(). Вообще лучше будет вот так:

Обратите внимание - я изменил направление перебора ордеров. Ордера перебираются у меня от последнего к первому в списке. Такое направление лучше использовать всегда. И лишь в некоторых случаях менять его на противоположное. Можете догадаться сами почему?


потому что рын ордер может быть закрыт, порядок ордеров изменится и какой-либо будет пропущен в цикле с начала, да и в учебнике все написано, поэтому вопросу, читал, редко бывает - править сначала не стал...
Причина обращения: