Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
По крайне мере в методах сеттерах это оправдано - код может стать читабельные и компактнее, получаются а-ля именованные параметры
ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой
// получается вот из подобного :
class HLine:public ChartObject {
public:
HLine(double price);
HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); } // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
и немного мешает квалификация функций по возвращаемому типу.
Не стесняйтесь возвращать GetPointer(this) из методов.
Так &this лаконичнее.
Ну, давайте начну первым.
Для закрытия ордера совсем не обязательно определять тип ордера и цену соответствующую этому типу. Достаточно написать закрыть по цене OrderClosePrice()
void OnStart()
{
int i, total = OrdersTotal()-1;
for(i = total; i >= 0; i--)
{
if(OrderType() < OP_SELLSTOP)
{
if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
printf("***********");
}
}
}/********************************************************************/
Прикольно! ) Спасибо.
Судя по примеру, и OrderSelect() не нужен?
Прикольно! ) Спасибо.
Судя по примеру, и OrderSelect() не нужен?
Прикольно! ) Спасибо.
Нужен. Просто пропустил Алексей по запарке...
Да уж... Действительно лоханулся.
Но до того как, я не встречал этих тем.
Так использовать OrderClosePrice можно только СРАЗУ после соответствующего OrderSelect. Т.к. OrderSelect копирует один раз данные для Order(const)-функций, а тот же RefreshRates их обновить не в состоянии.
Т.е. если, например, по OrderClosePrice закрыть не удалось, то нужно перед следующей попыткой сделать снова OrderSelect (RefreshRates не требуется).
ЗЫ Это тема аж 2005 года! Здесь подробные доводы разработчиков.
Открытые ордера надо анализировать с большего номера, т.е. for(int nom=OrdersTotal()-1; nom>=0; nom--)
Особенно это важно при удалении ордеров.
А что же будет, если сделать наоборот for(int nom=0; nom<OrdersTotal(); nom++) ?
Сначала индекс равен нулю и удаляется самый первый ордер под номером 0.
Потом индекс становится равным 1. В это время оставшиеся ордера сдвигаются, и тот, что был с номером 1,
занимает нулевую позицию. Бывший номер 2 занимает позицию 1. Он и будет удален.
Потом индекс становится равным 2. И будет удален ордер, бывший в начале под номером 4. ...
Таким образом, удаляются ордера, занимавшие в начале четные позиции. А нечетные остаются. Это видно по комментариям к ордерам и номерам.
Прилагаю скрипт, демонстрирующий оба варианта удаления, и скриншоты
Создано 20 отложенных ордеров
Удалились через один