Линейное торможение - ошибка программиста или особенность работы MT4? - страница 4

 

одна только конструкция приведённая ниже чего стоит.


    bool Ok=true;
     for(i=OrdersTotal()-1;i>=0;i--){//проверяем наличие ордеров
      if(OrderSelect(i,SELECT_BY_POS)){
       if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic){
        if(OrderType()==OP_SELLSTOP||OrderType()==OP_SELLLIMIT){
         Ok=false;
        }}}}

чуть причешем

    bool Ok=true;
    for(i=OrdersTotal()-1;i>=0;i--){//проверяем наличие ордеров
      if(OrderSelect(i,SELECT_BY_POS)){
        if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic){
          if(OrderType()==OP_SELLSTOP||OrderType()==OP_SELLLIMIT){
            Ok=false;
          }
        }
      }
    }

и уже становится понятно, что, в какой последовательности выполняется.  Это только форматирование. А ведь ещё можно разбивать код на логически целостные операции и выделять их в отдельные функции. Облегчая тем самым основной алгоритм от нагромождений перемешанного кода.

 
micle:

Беда в дублировании кода, в чрезмерно большом количестве условных операторов. По факту, код состоит из 99% строк так или иначе включающих условный оператор If, уверен, если разобраться, наверняка количество сравнений можно сократить раз в 10. Это не только тормозит исполнение, такой код трудно читаем. У человека вносящего в него дополнения как минимум 2 основных задачи:

1 - не сломать

2 - добавить нужный функционал

Не читаемый код, так или иначе приводит к дополнительному дублированию всевозможных проверок, сравнений - а это опять дополнительные расходы. Глядя в код, лично я вспоминаю себя лет эдак 25 назад, когда программировать только начинал, причём учился этому по инструкции к ПК Atari 800ХL без учителей, просто потому, что было интересно. 

Это конечно интересно, о каких "if" идет речь, там видимо есть мое ТЗ - где я пишу "если так, то так", а программист так и интерпретирует это в коде, а есть "if" относящийся к непосредственной работе с ордерами, и операций с ордерами очень много...

Конечно я думал что дело в каком то цикле, выполнение которого приводит к многократному выполнению проверки условий ТЗ. А выходит дело, что исправить ситуацию можно только переписав код с нуля?

 
micle:

одна только конструкция приведённая ниже чего стоит.

чуть причешем

и уже становится понятно, что, в какой последовательности выполняется.  Это только форматирование. А ведь ещё можно разбивать код на логически целостные операции и выделять их в отдельные функции. Облегчая тем самым основной алгоритм от нагромождений перемешанного кода.

А на производительность это разве как то влияет? 

 
micle:

Беда в дублировании кода

Дублирование ни при чем, ифы тоже. Реальное замедление дает работа с ордерами.
 
micle:

одна только конструкция приведённая ниже чего стоит.


чуть причешем

и уже становится понятно, что, в какой последовательности выполняется.  Это только форматирование. А ведь ещё можно разбивать код на логически целостные операции и выделять их в отдельные функции. Облегчая тем самым основной алгоритм от нагромождений перемешанного кода.

Очень у вас веские аргументы, ваш код, где можно посмотреть опытного программиста?
 

rev 1.1

Для выставления стоп лосса и фильтрации отложенных ордеров используем два варианта применения зеркального МА.
maMirror - рассчитывается на основании стандартной функции iMA, работает один раз на бар, данные беруться по ценам открытия бара
Алгоритм расчета:

Для продажи:
начальная точка расчета maMirror=iMA+pipsXHmaM(o/b)
последующие точки расчета maMirror=maMirror(1)-(iMA(0)+pipsXHmaM(o/b)-iMA(1)+pipsXHmaM(o/b))
расчет завершается после точки окончания расчета.

Для покупки:
начальная точка расчета maMirror=iMA-pipsXHmaL
последующие точки расчета maMirror=maMirror(1)-(iMA(0)-pipsXLmaM-iMA(1)-pipsXLmaM)
расчет завершается после точки окончания расчета.


Для упрощения ТЗ необходимо ставить два блока расчета, которые будут независимы по работе и переменным, и настраиваются пользователем
maMBlock=0 - не использовать блоки (используется стандартный стоп лосс)
maMBlock=1 - использовать только блок №1
maMBlock=2 - использовать только блок №2 (используется стандартный стоп лосс)
maMBlock=3 - использовать оба блока

Блок №1
Расчет выставления стоп лосса. Стоп лосс пересчитывается и ордер модернизируется при каждом баре на значение maMirror.
1. Для определения точки начала отсчета для вычисления расчета используется переменная StartPoint, если StartPoint=1 (расчет происходит после касания maT), если StartPoint=2 (расчет происходит после открытия ордера).
1.1 Если StartPointO=1 то окончание расчета происходит после касания maT;
1.2.Если StartPointO=2 то окончание расчета происходит после закрытия ордера;
1.3. Если выставить стоп лосс нельзя по maMirror, то ордер закрывается.
1.4. Levl_Zerro=0 (не используем), Levl_Zerro!=0 (модернизируем стоп лосс до максимально заданного значения отсчет идет от цены открытия, отрицательное значение значит что стоп лосс переводиться в положительное значение)

Блок №2
Расчет фильтрации выставления отложенных ордеров.
0.1 Для покупки ордера выставляются если maMirror>цены открытия отложенного ордера
0.2 Для продажи ордера выставляются если maMirror<цены открытия отложенного ордера
1. Для определения точки начала отсчета для вычисления расчета используется переменная StartPoint, если StartPoint=1 (расчет происходит после касания maT), если StartPoint=2 (расчет происходит после открытия ордера).
1.1 Если StartPointB=1 то окончание расчета происходит после касания maT;
1.2.  Если StartPointB=2 то окончание расчета происходит после закрытия ордера;
2. Если maMirrorDell=0 (не используется) maMirrorDell=1 (удаляются все открытые ордера при несовпадении условий из пункта 0)

Пользовательские переменные
maMirrorO (настройки по iMA)
maMirrorB (настройки по iMA)
StartPointO
StartPointB
pipsXHmaMo
pipsXLmaMo
pipsXHmaMb
pipsXLmaMb
maMBlock

maMirrorDell

Помогите оценить задание, заказчик хочет новую работу, не знаю во сколько оценить) Так как я не программист, я инженер аэрокосмической академии)

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Возможно повторюсь, но! Первая и вполне возможно главная проблема в том, что код не читаем и не структурирован. Можно иметь вполне чёткое ТЗ. Но если писать по нему код в лоб, то получается вот такая каша. если разобраться в ТЗ, и подойти с правильной стороны к написанию кода, то это (как правило) даёт существенный выигрыш в скорости выполнения, но и стоит других денег.
 
-Aleks-:

А на производительность это разве как то влияет? 

в конкретном примере не влияет. Целиком в скрипте советника разбираться с таким форматированием, равно как и переформатировать его полностью, желания не возникает
 
zfs:
Очень у вас веские аргументы, ваш код, где можно посмотреть опытного программиста?
Моего кода в паблике нет. Коммерческие разработки трудятся на высоко нагруженных web серверах и рядом с ними. В частности, мой код обсчитывает пробочную ситуацию на дорогах "нескольких" городов в рамках проекта ДорогаТВ
 
TheXpert:
Дублирование ни при чем, ифы тоже. Реальное замедление дает работа с ордерами.

Работа с ордерами в коде по ТЗ, а может ТЗ само, или работа MT4 с ордерами вообще? 

Причина обращения: