Автор | Сообщение |
|
| |
Пост N: 27
Зарегистрирован: 05.03.12
|
|
Отправлено: 14.03.12 21:54. Заголовок: Нет ясности с временем
if(OrderType()==OP_BUY) { or_bye=1; if((Bid>OrderOpenPrice()+ot)&&(trailUp<(Bid-ot))) trailUp=Bid-ot;//двигаем уровень трейлинг стопа if(Bid<=trailUp) OrderClose(OrderTicket(),OrderLots(),Bid,3,Aqua);//закрываемся } Нетрудно заметить, что в приведённом кусочке кода пять раз используется Bid. Вопрос в следующем: может ли Bid измениться в процессе выполнения этого кусочка кода? При каждом вызове Bid советник обращается к серверу брокера или нет? А ещё когда вызываем функции OrderOpenPrice(), OrderTicket(), OrderLots() тоже каждый раз обращаемся к серверу брокера или OrderSelect всю информацию об ордере получает одним пакетиком и функции OrderOpenPrice(), OrderTicket(), OrderLots() пользуются данными, которые уже лежат на моём компьютере?
|
|
|
Ответов - 2
[только новые]
|
|
|
| постоянный участник
|
Пост N: 349
Зарегистрирован: 03.09.09
|
|
Отправлено: 14.03.12 23:11. Заголовок: Максим пишет: Нетру..
Максим пишет: цитата: | Нетрудно заметить, что в приведённом кусочке кода пять раз используется Bid. Вопрос в следующем: может ли Bid измениться в процессе выполнения этого кусочка кода? При каждом вызове Bid советник обращается к серверу брокера или нет? |
| Такое обращение к Bid позволительно, т.к. это немного необычная обычная переменная (только для чтения), значение которой присваивается терминалом на входе в функцию start или после вызова функции RefreshRates(). Обращение к серверу не производится. Вообще все, что не связано с таймсериями и торговыми операциями, не производит обращение к серверу. К примеру, Open[1] - это обращение только к имеющимся данным, а iOpen(NULL, 0, 1) - к серверу, если такой информации нет на компьютере. С другой стороны, когда в коде используется неоднократное обращение к каким-то данным, то в таких случаях неплохо бы кешировать данные. Например, если бы вместо Bid использовался вызов функции AccountFreeMargin(), то сначала следует присвоить значение функции переменной, а потом производить все необходимые действия с этой переменной: цитата: | double margin = AccountFreeMargin(); if (margin > 0) { ... } if (margin == 0) { ... } |
| Такой подход, во-первых, позволит увеличить быстродействие программы, а, во-вторых, гарантирует, что в любом месте выражения вы оперируете неизменными данными.
|
|
|
|
Отправлено: 14.03.12 23:20. Заголовок: Ответы на подобные в..
|
|
|
|