Не стесняйтесь возвращать GetPointer(this) из методов.
По крайне мере в методах сеттерах это оправдано - код может стать читабельные и компактнее, получаются а-ля именованные параметры
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(..) };
конечно, пользоваться с осторожностью, потому как exception`s в языке нет и не предвидится
и немного мешает квалификация функций по возвращаемому типу.
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math#property strict#ifdef __MQL4__#include <Math\Alglib\bitconvert.mqh>
#define TEMP_MACROS(A) double A( double ) { return(0); }
TEMP_MACROS(MathLog1p)
TEMP_MACROS(MathExpm1)
TEMP_MACROS(MathArcsinh)
TEMP_MACROS(MathArccosh)
TEMP_MACROS(MathArctanh)
#undef TEMP_MACROS
#endif
Для закрытия ордера совсем не обязательно определять тип ордера и цену соответствующую этому типу. Достаточно написать закрыть по цене OrderClosePrice()
/********************Script program start function********************/ voidOnStart() { int i, total = OrdersTotal()-1; for(i = total; i >= 0; i--) { if(OrderType() < OP_SELLSTOP) { if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100)) printf("***********"); } } }/********************************************************************/
Artyom Trishkin: Нужен. Просто пропустил Алексей по запарке...
Да уж... Действительно лоханулся.
Но до того как, я не встречал этих тем.
fxsaber:
Так использовать OrderClosePrice можно только СРАЗУ после соответствующего OrderSelect. Т.к. OrderSelect копирует один раз данные для Order(const)-функций, а тот же RefreshRates их обновить не в состоянии.
Т.е. если, например, по OrderClosePrice закрыть не удалось, то нужно перед следующей попыткой сделать снова OrderSelect (RefreshRates не требуется).
Открытые ордера надо анализировать с большего номера, т.е. for(int nom=OrdersTotal()-1; nom>=0; nom--) Особенно это важно при удалении ордеров. А что же будет, если сделать наоборот for(int nom=0; nom<OrdersTotal(); nom++) ? Сначала индекс равен нулю и удаляется самый первый ордер под номером 0. Потом индекс становится равным 1. В это время оставшиеся ордера сдвигаются, и тот, что был с номером 1, занимает нулевую позицию. Бывший номер 2 занимает позицию 1. Он и будет удален. Потом индекс становится равным 2. И будет удален ордер, бывший в начале под номером 4. ... Таким образом, удаляются ордера, занимавшие в начале четные позиции. А нечетные остаются. Это видно по комментариям к ордерам и номерам. Прилагаю скрипт, демонстрирующий оба варианта удаления, и скриншоты Создано 20 отложенных ордеров
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
По крайне мере в методах сеттерах это оправдано - код может стать читабельные и компактнее, получаются а-ля именованные параметры
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--)
Создано 20 отложенных ордеров
Особенно это важно при удалении ордеров.
А что же будет, если сделать наоборот for(int nom=0; nom<OrdersTotal(); nom++) ?
Сначала индекс равен нулю и удаляется самый первый ордер под номером 0.
Потом индекс становится равным 1. В это время оставшиеся ордера сдвигаются, и тот, что был с номером 1,
занимает нулевую позицию. Бывший номер 2 занимает позицию 1. Он и будет удален.
Потом индекс становится равным 2. И будет удален ордер, бывший в начале под номером 4. ...
Таким образом, удаляются ордера, занимавшие в начале четные позиции. А нечетные остаются. Это видно по комментариям к ордерам и номерам.
Прилагаю скрипт, демонстрирующий оба варианта удаления, и скриншоты