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

 
Sepulca:

На разных валютных парах будут работать, даже если это один и тот же советник. В одном графике точно только один. А вот на разных графиках одной и той же валютной пары даже не знаю.....
прошу меня извинить, но что то ни как не могу понять, это прямо в ордер выставлять, если не трудно можно по подробней объяснить...
datime exp=iTime(Symbol(),PERIOD_D1,0)+23*60*60+59*60;
 

Народ подскажите кто может,надо в советнике поменять стоп-лосс в пунктах на стоп-лосс на предыдущей свече.

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

Спасибо огромное кто подскажет.

double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
Файлы:
 

Ребята-профи, подскажите, пожалуйста: я через один сайт приобрел советника (300 $), согласно инструкции продавца его установил, но когда протестил его на истории счета он мне либо выдает прибыль и убытки по нулям, либо указывает, что что-то установлено неправильно (хотя еще раз повторюсь, все устанавливал строго по инструкции). Кстати, после установки советник среди своих бесплатных собратьев был по цвету серый, как будто неактивный. Все же остальные были цветные: желтые морды в синей шляпе. Перенес советника на демо-счет. Все как положено: рожа улыбается, комп не выключаю. День-два, ГЛУХО!!!((( Обратился с претензией к продавцу, он мне пишет: "1) серый цвет - это закрытый код, а не исходник. 2) советник не часто торгует, поэтому просто ждите сигнал". Ребята, подскажите стоит ли ждать? Такое вообще возможно или это тупой развод?

 
vpogarcev:

Обратился с претензией к продавцу, он мне пишет: "1) серый цвет - это закрытый код, а не исходник. 2) советник не часто торгует, поэтому просто ждите сигнал". Ребята, подскажите стоит ли ждать? Такое вообще возможно или это тупой развод?


1) Да, советник серый т.к. нет исходного кода;

Кто ж знает, стоит или не стоит ждать? Экстрасенсы в отпуске.

 
vpogarcev:

Ребята-профи, подскажите, пожалуйста: я через один сайт приобрел советника (300 $), согласно инструкции продавца его установил, но когда протестил его на истории счета он мне либо выдает прибыль и убытки по нулям, либо указывает, что что-то установлено неправильно (хотя еще раз повторюсь, все устанавливал строго по инструкции). Кстати, после установки советник среди своих бесплатных собратьев был по цвету серый, как будто неактивный. Все же остальные были цветные: желтые морды в синей шляпе. Перенес советника на демо-счет. Все как положено: рожа улыбается, комп не выключаю. День-два, ГЛУХО!!!((( Обратился с претензией к продавцу, он мне пишет: "1) серый цвет - это закрытый код, а не исходник. 2) советник не часто торгует, поэтому просто ждите сигнал". Ребята, подскажите стоит ли ждать? Такое вообще возможно или это тупой развод?


В лучшем случае вам могли продать советник, который скоро перестанет зарабатывать.
 
FAQ:


Правильно, в таком случае удаляя например 18 объект, 19 становится на его место, 19=>18 то есть автоматом получается одна обратная итерация. Используйте это и для ордеров тоже.

И еще, так как список объектов и ордеров формально являются массивами, и начинаются с = 0, то максимальный индекс будет на один меньше чем размер массива :

Ваша последняя мысль натолкнула меня на следующие соображения... Пусть имеем функцию deinit() следующего вида:

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 --

Допустим, что в клиентском терминале есть всего 3 объекта, из которых 1-й и 2-й соответствуют условиям удаления, определенным в функции deinit(). Соответственно в программе они будут проходить под индексами 0 и 1 соответственно. Тогда на первой итерации переменная k примет значение 0 и функция ObjectDelete(0) удалит соответствующий объект. Далее, так как список объектов формально является массивом, то после удаления одного из объектов произойдет переиндексация оставшихся объектов (ну что-то типа, как с образованием нового бара происходит переиндексация всех баров, к-е на данный момент имеются в клиентском терминале): тогда объект, к-й ранее был проиндексирован под номером 1 (к-й по условию тоже должен быть удален) получит индекс 0, а объект, к-й имел индекс 2 - получит индекс 1. После удаления на 1-й итерации объекта под индексом 0, управление будет передано в строку

for(int k=0; k<Quant_Objects; k++)

для выполнения выражения k++. Переменная k получит значение 1 и т.к. значение переменной Quant_Objects равно 3, то условия оператора for (k<Quant_Objects) истинно и будет выполнена 2-я итерация. Но на этой итерации удаления объекта не будет, так как по условию объект с индексом 1 (ранее 2) не соответствует условиям удаления. Но получается, т.к. произошла переиндексация объектов после удаления первого объекта, то 2-й объект (к-й по условию также должен был быть удален) "проскочил" операцию удаления, т.к. на момент, когда переменная k была равна 1, индекс этого объекта был переиндексирован и стал равен 0. Видимо это и имелось в виду во фразе "отдельно нужно заметить, что в первом цикле for удалять объекты нельзя, т.к. в этом случае после каждого удаления изменится общее количество объектов и их нумерация, в результате чего некоторые имена объектов будут пропущены".

Я все правильно понял или где-то в размышлениях допущена ошибка?

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

//--------------------------------------------------------------- 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 --

P.S. Заранее благодарю за ответ.

 
7777877:

Ваша последняя мысль натолкнула меня на следующие соображения... Пусть имеем функцию deinit() следующего вида:

Я все правильно понял или где-то в размышлениях допущена ошибка?


Вы всё правильно поняли.

А вообще, в циклах, в которых происходит удаление, лучше использовать уменьшение индекса:

int deinit()                           // Спец. функция deinit()
  {
   for(int k=ObjectsTotal()-1; k>=0; k--)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Найден объект, ..
         ObjectDelete(Obj_Name);
     }
   return;                             // Выход из deinit()
  }
 
да
 

Господа, используя OrderSelect(), можно легко найти цену открытия ордера. А можно ли сразу по самим котировкам на графике узнавать, стоит ли на даной конкретной цене ордер или на этой точке ничего не стоит? Очень неудобно перебирать на каждой котировке на графике все ордера(особенно если их много), чтоб выяснить находится там что-нибудь или нет, с такой ценой. Подкиньте код, если существует?

 
rosomah:

Господа, используя OrderSelect(), можно легко найти цену открытия ордера. А можно ли сразу по самим котировкам на графике узнавать, стоит ли на даной конкретной цене ордер или на этой точке ничего не стоит? Очень неудобно перебирать на каждой котировке на графике все ордера(особенно если их много), чтоб выяснить находится там что-нибудь или нет, с такой ценой. Подкиньте код, если существует?

Неудобно штаны одевать через голову © Народная поговорка

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

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