Особенности языка mql4, тонкости и приёмы работы - страница 10

 
Alexey Viktorov:

Я не могу понять в чём неожиданность. В четвёрке прямо в документации есть int значение типа ордера.

OP_BUY

0

Покупка

OP_SELL

1

Продажа

OP_BUYLIMIT

2

Отложенный ордер BUY LIMIT

OP_SELLLIMIT

3

Отложенный ордер SELL LIMIT

OP_BUYSTOP

4

Отложенный ордер BUY STOP

OP_SELLSTOP

5

Отложенный ордер SELL STOP


#define OP_BALANCE    6
#define OP_CREDIT       7

Так-что с массивом на 6 ячеек иногда можно вылететь за пределы.

 

Forum on trading, automated trading systems and testing trading strategies

I want to move the EA comment from left to right corner ?

fxsaber, 2018.07.10 15:13

// Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0, const uint Y = 0 )
{
  string Shift = NULL;
  
  StringInit(Shift, X >> 2, ' ');
  
  if (StringLen(Shift))
  {
    StringReplace(Str, "\n", "\n" + Shift);
    
    Str = Shift + Str;
  }
  
  if (Y)
  {
    StringInit(Shift, Y / 14, '\n');
    
    Str = Shift + Str;
  }
  
  Comment(Str);  
}


Применение

void OnStart()
{
  const uint Height = 200;
  const uint Width = 200;
  
  while (!IsStopped())
  {
    CommentXY("Hello World!\nCommentXY", MathRand() * Width / SHORT_MAX, MathRand() * Height / SHORT_MAX); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
    Sleep(200);
  }
}
 
fxsaber:

У вас есть официальный ответ от разработчиков? Пока только вижу, что вы сами поискали, подумали и решили.

 
Artyom Trishkin:

У вас есть официальный ответ от разработчиков? Пока только вижу, что вы сами поискали, подумали и решили.

Мой вывод по уровню "самостоятельности" ничем не превосходит этот в начале данной ветки

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql4, тонкости и приёмы работы

Alexey Viktorov, 2017.02.24 07:27

Для закрытия ордера совсем не обязательно определять тип ордера и цену соответствующую этому типу. Достаточно написать закрыть по цене OrderClosePrice()

Не надо страдать ерундой/паранойей.

 
fxsaber:

Мой вывод по уровню "самостоятельности" ничем не превосходит этот в начале данной ветки


Не надо страдать ерундой/паранойей.

Вы видать не попали на то время, когда большинство из не страдающих "паранойей", срочно переписывали свои коды, так как советники рухнули в одночасье. Из-за зависимости от сортировки. Дело давнее, но у людей остались воспоминания. Кто нарвался, те стали писать коды, независимые от сортировки. Я не нарывался - просто почитал на форуме и принял к сведению.

 
Artyom Trishkin:

Вы видать не попали на то время, когда большинство из не страдающих "паранойей", срочно переписывали свои коды, так как советники рухнули в одночасье. Из-за зависимости от сортировки. Дело давнее, но у людей остались воспоминания. Кто нарвался, те стали писать коды, независимые от сортировки. Я не нарывался - просто почитал на форуме и принял к сведению.

К сожалению, этот миф не находит никаких подтверждений в истории форума. Более того, разработчики постоянно четко обозначают свою позицию, что подобных изменений принципиально быть не может.


Например, Вы можете смело писать так

if (OrderType() <= OP_SELL)
  ReverseType = 1 - OrderType();


вместо

if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
  ReverseType = (OrderType() == OP_BUY) ? OP_SELL : OP_BUY;


Можете смело писать

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql4, тонкости и приёмы работы

fxsaber, 2018.04.03 16:15

double Lots[] = {0, 0, 0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

и т.д. 

 
fxsaber:

К сожалению, этот миф не находит никаких подтверждений в истории форума. Более того, разработчики постоянно четко обозначают свою позицию, что подобных изменений принципиально быть не может.

Например, Вы можете смело писать так


Зачем все эти псевдооптимизации, о нюансах которых нужно постоянно помнить? Неужели так трудно написать код, который не будет зависеть от таких вот предположений (какое значение имеет та или иная именованная константа)? В чем вообще смысл таких конструкций, кроме того, что они показывают некоторое знание нюансов работы компилятора, но вовсе не являются такими, которые легче воспринимаются?

 
Ihor Herasko:

Зачем все эти псевдооптимизации, о нюансах которых нужно постоянно помнить? Неужели так трудно написать код, который не будет зависеть от таких вот предположений (какое значение имеет та или иная именованная константа)? В чем вообще смысл таких конструкций, кроме того, что они показывают некоторое знание нюансов работы компилятора, но вовсе не являются такими, которые легче воспринимаются?

Странно, у меня никаких проблем с чтением такого кода не возникает. Более того, его чтение и понимание происходит быстрее, чем "канонического".

Ну а пример выше с Lots[] - это настоящий клад, показывающий, как код может быть одновременно супер-лаконичным и абсолютно понятным. И заметьте, это ни разу не "канонический" стиль.

Наверное, если смотреть исходники многих Маркет/Фриланс работ, то столкнешься не просто с портянками "канонического" кода, но еще и с жуткой неэффективностью быстродействия и не менее важного фактора - понимания кода при чтении.


Та же неискоренимая любовь к continue - полное неуважение к возможностям языка. Код на 100 строк гораздо лучше воспринимается, чем код на 200, делающий то же самое. Именно по этой причине изначально народ жаловался на MQL5. Посмотрите на переделки MT4-кода в КБ под MT5 - разобраться в логике ТС жутко тяжело (код в разы больше). Проще перейти на MT4-оригинал и посмотреть код.

 
fxsaber:

Странно, у меня никаких проблем с чтением такого кода не возникает. Более того, его чтение и понимание происходит быстрее, чем "канонического".

Во многих софтверных компаниях за такой код бы все пальцы отбили. Первое, что требуется всегда и везде - это отсутствие "лишнего чтения". Например, если при входе в функцию используется условие:

if (<условие>)
{
}

то рекомендуется написать:

if (!<условие>)
   return;

Такой подход очень выручает от вложения условий.

Ну а пример выше с Lots[] - это настоящий клад, показывающий, как код может быть одновременно супер-лаконичным и абсолютно понятным. И заметьте, это ни разу не "канонический" стиль.

Еще раз - пальцы поотбивать. Ведь то, что вернула функция OrderType() никто не проверил. А может она вернула -1 или 6? Это пример закладывания на свойства компилятора, от чего всегда нужно держаться подальше. Вы же сами приводите много примеров кроссплатформенного кода. Так почему же в данном случае уходите от него? Выйдет новый компилятор от MQ и этот код перестанет корректно работать.

Та же неискоренимая любовь к continue - полное неуважение к возможностям языка. Код на 100 строк гораздо лучше воспринимается, чем код на 200, делающий то же самое. Именно по этой причине изначально народ жаловался на MQL5. Посмотрите на переделки MT4-кода в КБ под MT5 - разобраться в логике ТС жутко тяжело (код в разы больше). Проще перейти на MT4-оригинал и посмотреть код.

С continue та же самая ситуация. Код типа:

if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == m_nMagicNumber)
{
}

читается тяжелее, чем:

if (!OrderSelect(i, SELECT_BY_POS))
   continue;

if (OrderSymbol() != Symbol())
   continue;

if (OrderMagicNumber() != m_nMagicNumber)
   continue;
А ведь эффективность исполнения в обоих случаях одинакова.
Причина обращения: