[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 423

 

... продолжение...

Ниже, в конце подраздела Функция StringSubstr в скобках приведена следующая фраза: "отдельно нужно заметить, что в первом цикле for (мое примечание: очевидно, имеется в виду функция deinit(), так как больше нигде объекты не удаляются) удалять объекты нельзя, т.к. в этом случае после каждого удаления изменится общее количество объектов и их нумерация, в результате чего некоторые имена объектов будут пропущены". Но в приведенном тексте эксперта вообще нет второго цикла for. Кроме того, переменная Quant_Del, к-я объявлена в функции deinit() перед циклом for инициализирован нулем, а переменная i вообще до цикла for нигде не была объявлена И так, как цикл for имеет вид

   for(int k=0; k<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
         ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве

то получается, что в приведенном выше тексте эксперта просто банально пропущено несколько строк программы.

Поэтому 1-й вопрос такой: действительно ли здесь допущен банальный пропуск нескольких строк или это настолько хитромудрая программа, что новичкам не понять ее смысл без посторонней помощи?

Далее… В той же главе того же раздела перед приведенным текстом эксперта есть ссылка на этот же эксперт (привожу его в прикрепленном файле), при нажатии на который открывается тот же эксперт в MetaElitor. Но текст этого эксперта уже другой: здесь функция deinit()имеет уже такой вид:

//--------------------------------------------------------------- 9 --
int deinit()                           // Спец. функция deinit()
  {
   string Name_Del[1];                 // Объявление массива
   int Quant_Del=0;                    // Количество удаляемых объекто
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Найден объект, ..
        {                              // .. начинающийся с Paint_
         Quant_Del=Quant_Del+1;        // Колич имён к удалению
         Name_Del[Quant_Del-1]=Obj_Name;//Запоминаем имя удаляемого
        }
     }
   for(int i=0; i<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
      ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве
   return;                             // Выход из deinit()
  }
//-------------------------------------------------------------- 10 --

Тогда, если "скомбинировать" фразу "отдельно нужно заметить, что в первом цикле for удалять объекты нельзя, т.к. в этом случае после каждого удаления изменится общее количество объектов и их нумерация, в результате чего некоторые имена объектов будут пропущены" И текст функции deinit() последнего варианта, у меня возник 2-й вопрос:

Вопрос. Почему нельзя удалить объекты в первом цикле for, разместив функцию ObjectDelete(Obj_Name) внутри оператора if?... Ну что-то типа:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --

Почему после каждого удаления "... будет изменяться общее количество объектов"?... Ведь в данном случае переменная Quant_Objects, которая и определяет общее количество объектов, получает свое значение, равное ObjectsTotal(), ЗА пределами цикла for?

P.S. Чтобы не захламлять форум, заранее благодарю за ответ

Файлы:
strings_1.mq4  7 kb
 

Добрый день! Сделал блок для подсчета открытых magic Buy позиций, но проблема в том, что если блок работает на разных валютных парах, то блок выдаёт результат только по однои валютной пари(последней открытой позиций). Как исправить код (не меняя magic) что-бы блок выдавал результат для каждой валютный пари?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " OP_BUY" магики будет считать
 
7777877:

... продолжение...

Ниже, в конце подраздела Функция StringSubstr в скобках приведена следующая фраза: "отдельно нужно заметить, что в первом цикле for (мое примечание: очевидно, имеется в виду функция deinit(), так как больше нигде объекты не удаляются) удалять объекты нельзя, т.к. в этом случае после каждого удаления изменится общее количество объектов и их нумерация, в результате чего некоторые имена объектов будут пропущены". Но в приведенном тексте эксперта вообще нет второго цикла for. Кроме того, переменная Quant_Del, к-я объявлена в функции deinit() перед циклом for инициализирован нулем, а переменная i вообще до цикла for нигде не была объявлена И так, как цикл for имеет вид

то получается, что в приведенном выше тексте эксперта просто банально пропущено несколько строк программы.

Поэтому 1-й вопрос такой: действительно ли здесь допущен банальный пропуск нескольких строк или это настолько хитромудрая программа, что новичкам не понять ее смысл без посторонней помощи?

Далее… В той же главе того же раздела перед приведенным текстом эксперта есть ссылка на этот же эксперт (привожу его в прикрепленном файле), при нажатии на который открывается тот же эксперт в MetaElitor. Но текст этого эксперта уже другой: здесь функция deinit()имеет уже такой вид:

Тогда, если "скомбинировать" фразу "отдельно нужно заметить, что в первом цикле for удалять объекты нельзя, т.к. в этом случае после каждого удаления изменится общее количество объектов и их нумерация, в результате чего некоторые имена объектов будут пропущены" И текст функции deinit() последнего варианта, у меня возник 2-й вопрос:

Вопрос. Почему нельзя удалить объекты в первом цикле for, разместив функцию ObjectDelete(Obj_Name) внутри оператора if?... Ну что-то типа:

Почему после каждого удаления "... будет изменяться общее количество объектов"?... Ведь в данном случае переменная Quant_Objects, которая и определяет общее количество объектов, получает свое значение, равное ObjectsTotal(), ЗА пределами цикла for?

P.S. Чтобы не захламлять форум, заранее благодарю за ответ

Разверните цикл задом наперед и удаляйте сколько влезет
 
FAQ:
Разверните цикл задом наперед и удаляйте сколько влезет

Правильно ли я Вас понял? Надо представить функцию deinit (и цикл в частности) следующим образом:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


Эти данные нужны для расчета разницу между ордерамини на покупку и ордерами на продажу.

допустим открыт один ордер на buy объемом 0,09 лота и два ордера на sell общим объемом 0,11, разница между ними будет равна 0.09-0,11=-0,02, или если возможно то разницей между их стоимостью.


ну тогда фунция OrderLots.
 
abeiks:

Добрый день! Сделал блок для подсчета открытых magic Buy позиций, но проблема в том, что если блок работает на разных валютных парах, то блок выдаёт результат только по однои валютной пари(последней открытой позиций). Как исправить код (не меняя magic) что-бы блок выдавал результат для каждой валютный пари?

Поменять:

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

На:

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
Как заменить стоп лосс в пунктах в советнике,на стоп лосс выше препоследней свечи?
 
Neo777:
Как заменить стоп лосс в пунктах в советнике,на стоп лосс выше препоследней свечи?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

как его вставить вот сюда

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