Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1948

 
Alexandr Sokolov #:


2) Если у массива обратная индексация, то по идее новые ячейки должны появляться в начале массива - чего не наблюдается

а почему новые ячейки должны появляться в начале массива? - если не ошибаюсь, то в справке должно быть написано, что при применении ArraySetAsSeries() физически массив не перераспределяется в памяти, просто будет использована обратная индексация при обращению к элементам массива

ЗЫ: пример у Вас сложный, вот набросал:

#property strict
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[] = {1, 2, 3, 4, 5};
   int arr2[] = {1, 2, 3, 4, 5};
   ArraySetAsSeries(arr2, true);
   Print("Start size : ", ArraySize(arr1), " , ", ArraySize(arr2));
   Print("Resize : ", ArrayResize(arr1, 10), " , ", ArrayResize(arr2, 10));
   string s1 = "", s2 = "";
   for(int i = 0, j = 0; i < ArraySize(arr1) && j < ArraySize(arr2); i++, j++)
   {
      s1 += (string)arr1[i] + " , ";
      s2 += (string)arr2[j] + " , ";
   }
   Print("arr1 = ", s1);
   Print("arr2 = ", s2);
}

2022.04.18 21:31:59.223 tst EURUSD,H1: arr2 = 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 , 

2022.04.18 21:31:59.223 tst EURUSD,H1: arr1 = 1 , 2 , 3 , 4 , 5 , 0 , 0 , 0 , 0 , 0 , 

2022.04.18 21:31:59.223 tst EURUSD,H1: Resize : 10 , 10

2022.04.18 21:31:59.223 tst EURUSD,H1: Start size : 5 , 5

 
Подскажите. как работает в МТ5
iClose(NULL,PERIOD_CURRENT,shift)

У меня выскакивает ошибка 'iClose' - ambiguous call to overloaded function.

А вообще цель выбирать ТФ.

Хотел, по привычке из МТ4, выбирать так

if(iClose(NULL, TF(), 1) < iOpen(NULL, TF(), 1))

int TF()
  {
   int tf;
   switch(TF)
     {
      case 1 :
         tf = 1;
         break;
      case 2 :
         tf = 5;
         break;
      case 3 :
         tf = 15;
         break;
      case 4 :
         tf = 30;
         break;
      case 5 :
         tf = 60;
         break;
      case 6 :
         tf = 240;
         break;
      case 7 :
         tf = 1440;
         break;
      case 8 :
         tf = 10080;
         break;
      case 9 :
         tf = 43200;
         break;
      default:
         tf = 10;
         Print(tf);
     }
   return(tf);
  }

Но обломился.(

 
Александр #:
Подскажите. как работает в МТ5

У меня выскакивает ошибка 'iClose' - ambiguous call to overloaded function.

А вообще цель выбирать ТФ.

Хотел, по привычке из МТ4, выбирать так

Но обломился.(

периоды в мт5   

if(Period()==1) return "M1";

   if(Period()==2) return "M2";

   if(Period()==3) return "M3";

   if(Period()==4) return "M4";

   if(Period()==5) return "M5";

   if(Period()==6) return "M6";

   if(Period()==10) return "M10";

   if(Period()==12) return "M12";

   if(Period()==15) return "M15";

   if(Period()==20) return "M20";

   if(Period()==30) return "M30";

   if(Period()==16385) return "H1";

   if(Period()==16386) return "H2";

   if(Period()==16387) return "H3";

   if(Period()==16388) return "H4";

   if(Period()==16390) return "H6";

   if(Period()==16392) return "H8";

   if(Period()==16396) return "H12";

   if(Period()==16408) return "Daily";

   if(Period()==32769) return "Weekly";

   if(Period()==49153) return "Monthly";

 
Andrei Sokolov #:

периоды в мт5   

if(Period()==1) return "M1";

   if(Period()==2) return "M2";

   if(Period()==3) return "M3";

   if(Period()==4) return "M4";

   if(Period()==5) return "M5";

   if(Period()==6) return "M6";

   if(Period()==10) return "M10";

   if(Period()==12) return "M12";

   if(Period()==15) return "M15";

   if(Period()==20) return "M20";

   if(Period()==30) return "M30";

   if(Period()==16385) return "H1";

   if(Period()==16386) return "H2";

   if(Period()==16387) return "H3";

   if(Period()==16388) return "H4";

   if(Period()==16390) return "H6";

   if(Period()==16392) return "H8";

   if(Period()==16396) return "H12";

   if(Period()==16408) return "Daily";

   if(Period()==32769) return "Weekly";

   if(Period()==49153) return "Monthly";

Спасибо!

 
Александр #:

Спасибо!

А чем вам не нравится  ENUM_TIMEFRAMES?

И в input переменные можно в виде перечисления ставить и выбирать как угодно… Зачем такие танцы с бубном¿ Да и в mql4 уже давно доступно это перечисление…

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Периоды графиков - Константы графиков - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

А чем вам не нравится  ENUM_TIMEFRAMES?

И в input переменные можно в виде перечисления ставить и выбирать как угодно… Зачем такие танцы с бубном¿ Да и в mql4 уже давно доступно это перечисление…

+

 
Alexey Viktorov #:

А чем вам не нравится  ENUM_TIMEFRAMES?

И в input переменные можно в виде перечисления ставить и выбирать как угодно… Зачем такие танцы с бубном¿ Да и в mql4 уже давно доступно это перечисление…

Спасибо! Не знал.

 

Коллеги подскажите алгоритм можно оптимальный для нахождения цены выставленного ранее  ближайшего к текущей цене лимитного ордера - соответственно к аск ближайшего сверху селл лимита, к бид -

ближайшего снизу бай - лимита.

Вот ф-ия считаю кол-во, но нужна ЦЕНА ранее выставленного  лимитника, чтобы ф-ия возвращала...


Пока делаю через мин зн ие  по цене для селл лимит и макс зн ие для бай лимит....

int Price_of_orders(int Magic_) // цена ближайшего ордера к цене по магику
  {
//--- получим общее количество ордеров
   int ord = 0; // итоговое значение кол-ва ордеров
   int orders=OrdersTotal();
//--- пробежим по списку ордеров
   for(int i=0;i<orders;i++)
     {
      ResetLastError();
      //--- скопируем в кэш ордер по его номеру в списке
      ulong ticket=OrderGetTicket(i);
      if(ticket!=0)// если ордер успешно скопирован в кэш, работаем с ним
        {
         double price_open  =OrderGetDouble(ORDER_PRICE_OPEN);
         datetime time_setup=OrderGetInteger(ORDER_TIME_SETUP);
         string symbol      =OrderGetString(ORDER_SYMBOL);
         long magic_number  =OrderGetInteger(ORDER_MAGIC);
         if(magic_number==Magic_)
           {
            //  обработаем ордер с заданным ORDER_MAGIC - посчитаем
            ord++;
           }
         PrintFormat("Ордер #%d по %s был выставлен %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
        }
      else         // вызов OrderGetTicket() завершился неудачно
        {
         PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());
        }

     }
   return (ord);   
  }
 
Roman Shiredchenko #:

Коллеги подскажите алгоритм можно оптимальный для нахождения цены выставленного ранее  ближайшего к текущей цене лимитного ордера - соответственно к аск ближайшего сверху селл лимита, к бид -

ближайшего снизу бай - лимита.

Вот ф-ия считаю кол-во, но нужна ЦЕНА ранее выставленного  лимитника, чтобы ф-ия возвращала...


Пока делаю через мин зн ие  по цене для селл лимит и макс зн ие для бай лимит....

запоминать в свою структуру или массив нужные цены с тикетами и еще может что нужно, время например, и сразу сортировать после добавления по цене. По ресурсам, если ищите не часто, то одинаково или немного дороже, а если часто, то лучше запоминать. Ну и если конечно у Вас не 100500 ордеров) Тогда тоже накладно может быть. В общем сортировка в структуре или многомерном массиве задача решена только для первого индекса к сожалению.

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

 

Вопрос возник, не нашел в поиске. Можно ли включить алготорговлю из советника. Получить свойства терминала, включено или нет вижу.

И можно ли в одном терминале запустить один советник с разрешенной алготорговлей, а другой нет.

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