Как одновременно запустить два советника - страница 3

 

Честно говоря мне больше нравится мой вариант


int CountOrder[6]; // массив для подсчета количества ордеров
 
void Order_Count(string _symbol, int Magic){
   int total= OrdersTotal();    
   int i;
   for (i=0;i<6;i++) CountOrder[i]=0; // Инициализация массива
   for (i = total - 1;  i >= 0;  i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == _symbol) {
            if (OrderMagicNumber() == Magic)  {
               CountOrder[OrderType()]++;
            }
         }
      }
   }            
}
 

Виктор, инициализацию массива, мне каца лучше делать так:

ArrayInitialize(CountOrder, 0);
Одним циклом меньше :)
 
KimIV:

Виктор, инициализацию массива, мне каца лучше делать так:

ArrayInitialize(CountOrder, 0);
Одним циклом меньше :)

Предпочитаю явную, но это не особенно важно.
 
Vinin писал (а):
Предпочитаю явную, но это не особенно важно.

Ну тогда вместо:

int i;
for (i=0;i<6;i++) CountOrder[i]=0; // Инициализация массива

так:

for (int i=0;i<6;i++) CountOrder[i]=0; // Инициализация массива
Одной строкой меньше :)
 
И ещё такие условия:
if (OrderSymbol() == _symbol) {
  if (OrderMagicNumber() == Magic)  {
    CountOrder[OrderType()]++;
  }
}

лучше объединять логическим И:

if (OrderSymbol() == _symbol && OrderMagicNumber() == Magic) {
  CountOrder[OrderType()]++;
}
Ещё две строки убрали :)
 
KimIV:
И ещё такие условия:
if (OrderSymbol() == _symbol) {
  if (OrderMagicNumber() == Magic)  {
    CountOrder[OrderType()]++;
  }
}

лучше объединять логическим И:

if (OrderSymbol() == _symbol && OrderMagicNumber() == Magic) {
  CountOrder[OrderType()]++;
}
Ещё две строки убрали :)

Вариантов может быть множество реализации этой функции. Можно максимально увеличивать быстродействие, можно максимально упрощать код. Но где-то надо и остановиться. Я остановился на том варианте, который меня устраивает. Пока устраивает.
 
У меня вот такой вопрос: соколько внешних переменных поддерживает оптимизатор? мне захотелось использоать 35 - ругается! в принципе неписал свой используя 1 переменную как счетчик проходов но никак не могу сообразить как узнать где последний тик прохода ибо init() и deinit() вызываюстя 1 раз за оптимизацию не подскажите идею? с кодом смогу справиться.
 
Vinin:

Честно говоря мне больше нравится мой вариант


int CountOrder[6]; // массив для подсчета количества ордеров
 
void Order_Count(string _symbol, int Magic){
   int total= OrdersTotal();    
   int i;
   for (i=0;i<6;i++) CountOrder[i]=0; // Инициализация массива
   for (i = total - 1;  i >= 0;  i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == _symbol) {
            if (OrderMagicNumber() == Magic)  {
               CountOrder[OrderType()]++;
            }
         }
      }
   }            
}
Есть одно НО! функция под шаблон не очень годится так как имеет константу 6

потому важно не забыть ее поправить если вдруг возникнет 7 - 8-й ордер
функция работать перестанет

Когда собираешь "дом" из "КИРПИЧИКОВ" важно что бы не приходилось модернизировать каждый кирпичик при постройке разных домов
т е что бы Функции не приходилось переделывать при постройке разных стратегий
 
YuraZ писал (а):
Есть одно НО! функция под шаблон не очень годится так как имеет константу 6
Это количество типов ордеров. Вряд ли это количество увеличится даже в пятёрке
 
KimIV:
YuraZ писал (а):
Есть одно НО! функция под шаблон не очень годится так как имеет константу 6
Это количество типов ордеров. Вряд ли это количество увеличится даже в пятёрке
Игорь - просто не внимательно глянул!
очень бегло смотрел, увидел константу и не вникал в суть.


int CountOrder[6]; // массив для подсчета количества ордеров
я прочитал вот это! и мне хватило что бы удивиться ... если бы было написано учет количества ТИПОВ ОРДЕРОВ

сначала я действительно подумал о количестве ордеров
и все же

если разработчики рано или поздно добавят НОВЫЙ тип ордера то функцию прийдется переписать

к примеру добавят "ЗАВИСИМЫЕ" ордера... это когда автоматом выполняется то или иное действие - закрывается,открывается,удаляется ордер если цена доходит нужного уровня
т е построив лесенку из зависимых ордеров можно запрограммировать некоторую последовательность действий при условии достижения цены определенных уровней
получается на сервере хранится последовательность действий но ордера открываются только при выполнении условий
и не обязательно иметь включенный интернет
такие ТИПЫ ордеров я встречал в некоторых терминалах

но суть осталась, качественные "КИРПИЧИКИ" не должны модернизироваться если строится другой дом
хорошая функция должна работать как черный ящик, должно быть известно что на входе и что на выходе

качество функции определяется тем что ее не приходится модернизировать когда меняются некоторые условия