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

 

splxgf:

DhP:

Как "облегчить" этот цикл? Считает очень долго.
 if(iHigh(NULL,60,i)>LOWprice && LOWprice>iLow(NULL,60,i)) if(LOWprice> bid) CountH++ else CountL++;

А ещё лучше вот так:

 if(iHigh(NULL,60,i)>LOWprice) if(LOWprice>iLow(NULL,60,i)) if(LOWprice> bid) CountH++ else CountL++;

Есть ещё мысль сформировать Свой массив High- и Low-значений. Может это чуть ускорит работу?

 
abolk:


выбирается ордер https://docs.mql4.com/ru/trading/OrderSelect - перебор в цикле или выбор по тикету

затем функцией Order*() соответствующий параметр ордера смотрится

Извините, конечно, за тупые вопросы, но:

если в функции OrderSelect источник данных для выбора использовать MODE_HISTORY т.е. ордер выбирается среди закрытых и удаленных ордеров, то как найти номер ордера, который был закрыт последним? Каким способом они нумеруются в программе? От последнего к первому или наоборот?

 
Xaoss1990:

Извините, конечно, за тупые вопросы, но:

если в функции OrderSelect источник данных для выбора использовать MODE_HISTORY т.е. ордер выбирается среди закрытых и удаленных ордеров, то как найти номер ордера, который был закрыт последним? Каким способом они нумеруются в программе? От последнего к первому или наоборот?


в интернете куча таких вопросов уже задана

http://forum.alpari.ru/showthread.php?t=27708

 
Xaoss1990:

Извините, конечно, за тупые вопросы, но:

если в функции OrderSelect источник данных для выбора использовать MODE_HISTORY т.е. ордер выбирается среди закрытых и удаленных ордеров, то как найти номер ордера, который был закрыт последним? Каким способом они нумеруются в программе? От последнего к первому или наоборот?


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


в интернете куча таких вопросов уже задана

http://forum.alpari.ru/showthread.php?t=27708

О! Нашел, спс:

OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);

Все правильно, да?!

 
DhP:

Как "облегчить" этот цикл? Считает очень долго.

Наколдовал:

   INS = True;
   
   for (int i=1; i<=6000; i++)
   {
      if (INS)
      {
         if (LOWprice > iHigh(NULL,60,i))
         {
            INS = False;
            UPP = True;
            LOW = False;
            continue;
         }
         if (LOWprice < iLow (NULL,60,i))
         {
            INS = False;
            UPP = False;
            LOW = True;
            continue;
         }
      }
      else
      {
         if (UPP)
            if (LOWprice > iHigh(NULL,60,i))
               continue;
            else
            if (LOWprice < iLow (NULL,60,i))
            {
               // INS = "False"
               UPP = False;
               LOW = True;
               continue;
            }
         if (LOW)
            if (LOWprice < iLow (NULL,60,i))
               continue;
            else
            if (LOWprice > iHigh(NULL,60,i))
            {
               // INS = "False"
               UPP = True;
               LOW = False;
               continue;
            }
         
         INS = True;
      }
      
      if (LOWprice > Bid)
         CountH++;
      else
         CountL++;
   }

Логика такова: цена чаще находится вне исторических баров, нежели внутри.

INS = "Inside".

Правильность кода проверил на листочке. Быстродействие кода не проверял. Но Я уверен, что булевые переменные дают хорошее преимущество.

 
MaxZ:

Наколдовал:

Логика такова: цена чаще находится вне исторических баров, нежели внутри.

INS = "Inside".

P.S.: Правильность кода проверил на листочке. Быстродействие кода не проверял. Но Я уверен, что булевые переменные дают хорошее преимущество.


да уж.

это же надо так извратиться, чтобы три понятные строчки кода превратить в труднопонимаемый код.

если у вас возникла идея разделения проверки iLow, iHigh, то можно было сразу разделить:

          if(LOWprice> bid)if(iHigh(NULL,60,i)>LOWprice)if(LOWprice>iLow(NULL,60,i))CountH++;  
          if(LOWprice<=bid)if(iHigh(NULL,60,i)>LOWprice)if(LOWprice>iLow(NULL,60,i))CountL++;
и ничего не мудрить
 
      int HourPrices[20000];     
      for(int i=1; i<=6000; i++)
	for (double cPrice=iLow(NULL,60,i);cprice<=iHigh(NULL,60,i);cPrice+=Point)
	  HourPrices[cPrice/Point]+=1;

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

 
abolk:


да уж.

это же надо так извратиться, чтобы три понятные строчки кода превратить в труднопонимаемый код.

если у вас возникла идея разделения проверки iLow, iHigh, то можно было сразу разделить:

и ничего не мудрить

Похожий вариант Я предложил Выше (разделять if'ы).

А Мою идею Вы даже не пытались понять (хотя Я вкратце описал логику)... Когда цена находится высоко, Мы вместо двух проверок делаем одну. Аналогично для случая, когда цена находится низко. А когда цена находится внутри исторических баров (что довольно редко - в этом логика и идея!), Мы делаем две проверки (иначе никак).

Проверка идёт на наличие цены снаружи бара, а не внутри. Ранее искались иголки в стоге сена, а Я, если очередной иголки не вижу, искать её и не буду... Иголка Сама когда надо покажется! :)))

 
MaxZ:

Похожий вариант Я предложил Выше (разделять if'ы).

А Мою идею Вы даже не пытались понять (хотя Я вкратце описал логику)... Когда цена находится высоко, Мы вместо двух проверок делаем одну. Аналогично для случая, когда цена находится низко. А когда цена находится внутри исторических баров (что довольно редко - в этом логика и идея!), Мы делаем две проверки (иначе никак).

         if (LOWprice > iHigh(NULL,60,i)) continue;
        if (UPPprice < iLow (NULL,60,i)) continue;
Ваш вариант можно свести к этим двум строчкам добавленным в авторский вариант, и с некоторыми переделками условий в принципе вполне должно ускорить.
Причина обращения: