Примеры: Учёт ордеров в большой программе - страница 2

 
Dmitriy Falkov:

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

Лично я использую следующую конструкцию сразу после обнуления переменных при инициализации start():

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

так как все номера сместились бы для замещения закрытого

:))))))))))))))))) 

 
Vasyl Nosal:

так как все номера сместились бы для замещения закрытого

:))))))))))))))))) 

И что тут смешного, есть какие-то конкретные аргументы? Или вы заглянули просто поржать?

Я просто представил простой вариант и объяснил, почему обратный перебор предпочтительней прямого. У вас есть ордера 1, 2, 3 и 4. Вы начинаете перебор с 1. Закрыли номер 1 и перешли в цикле к номеру 2. Но при закрытии ордера у вас стало 1, 2 и 3. При этом бывший 2 стал "1", а вы в цикле просматриваете номер 3, который и стал номером "2". Если таким циклом вы попробуете закрыть все ордера, то в итоге увидите, что закрыли только через один.

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

 

в статье конечно просто объёмная вода ради публикации, но хочу обратить внимание автора

        Kol++;                  // Считаем общее количество ордеров
//-------------------------- Формирование нового массива ордеров --
        Mas_Ord_Tek[Kol][1] = NormalizeDouble(OrderOpenPrice(),
                                              Digits); 
// Курс открытия ордеров
        Mas_Ord_Tek[Kol][2] = NormalizeDouble(OrderStopLoss(),
                                              Digits); 

вот за такой стиль кода при (вдруг вам посчастливится) коллективной работе "убивают"

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