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

 
gyfto:

Или ещё упрощаем

 Здесь Δ - это разница имел ввиду, т.е. Close[i] - Open[i], а ^ - знак степени. const - константа в данном выражении, т.е. i_sizeOfSequentialCorrectionBar * pt, стандартные математические обозначения, ничего не выдумывал. 2*bVar-1 аналогично ±1, bVar здесь любая bool-переменная. И выражение 2*bVar-1 принимает значения уже не 0 и 1, а -1 и +1. ≥ это MQL4 >=, тоже стандартное математическое обозначение. step - шаг, т.е. в cnt++ шаг равен 1, а в cnt=0 шаг равен -cnt. Что ещё непонятно было из обозначений?

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

 Вадим,  писал не давно, что помещение внуть цикла функции на порядок притормаживает выполнение кода по скорости. Интересно, это относится только к тому случаю, когда функция рассчитывает свои значения на каждой итерации цикла, или вообще к любым? Например, пока что я не дописал эксперт, я ту функцию, что пробывал gyfto упростить, переписал вот так:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                            // Счётчик идущих друг за другом свечей с..
       cntDn;                                                                                // .. требуемыми признаками
       
   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if (directionMA == CROSS_UP)
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                     // .. прибавим 1 к счётчику

         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                   // .. счётчик обнуляем

         if (cntDn == i_sequentBarsСount)                                                   // Если cnt баров в подряд медвежьи..
             return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                         // .. Выходим из функции
      }

      if (directionMA == CROSS_DN)
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                     // .. прибавим 1 к счётчику

         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                   // .. счётчик обнуляем
     
         if (cntUp == i_sequentBarsСount)                                                   // Если cnt баров в подряд бычьи..
             return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                         // .. Выходим из функции
      }
   }
}

 Счётчики cntUp и cntDn я сделал разными, т.к. если когда по циклу по расчётным барам идёт расчёт, то может быть что directionMA сразу иметь одно значение, а потом другое. И счётчик может суммировав одно значение, продолжить суммировать другое. А если переменная одна, то количество баров одного признака, прибавятся к счётчику баров другого признака.

 Вот тут нужен совет, может лучше скомпонавать иначе как-то? 

Дело в том, что пока что эксперт не большой. Есть машки и эта функция. И бывает так, что вместо лонга, сова продаёт, и, наоборот. Вот пытаюсь понять, как такое может быть. Может тут есть какой-то косяк? 

 

Здравствуйте, начал знакомится с mql4, написал скрипт который локирует убыточные ордера. Никак не могу преодолеть одну проблему: скрипт локурует все ордера у которых убыток от -10 но он продолжает локировать их до тех пор пока цена находится ниже -10. Как сделать так что бы локирование происходило один раз? Т.е. ордер достиг убытка -10 скрипт залокировал его и дальше он этот ордер не трогает даже если убыток продолжает увеличиваться.

extern double StopLoss=150;

extern double Profit=-10;

//+------------------------------------------------------------------+

//----
void start()
{
double profit=Profit;
double Lots=0;
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS))
continue;

if(OrderType()==OP_BUY && OrderProfit()<Profit*Point)
Lots+=OrderLots();
if(OrderType()==OP_SELL && OrderProfit()<Profit*Point)
Lots-=OrderLots();


}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,0,NULL,Red);
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,Bid-StopLoss*Point,0,NULL,Blue);
//----
return(0);
}

 

Добрый день.

Посмотрите пожалуйста код, хочу рассчитать среднее время сделки (торговля отложенными ордерами

//+------------------------------------------------------------------+
//| Расчет среднего времени сделки            |
//+------------------------------------------------------------------+
double Sredneevremyasdelky(){
datetime Tsd=0; // общее время сделок
datetime Tsvsd=0; // среднее время сделки 
int n=0;
int orders=HistoryTotal();  // history orders total

        for(  int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                  n++;
                 Tsd=Tsd+(OrderCloseTime()-OrderOpenTime());
                   }
            if (n>0) Tsvsd=Tsd/n/60;


            return(Tsvsd);
         }

 с момента срабатывания ордера и до закрытия.

 
Stells:

Добрый день.

Посмотрите пожалуйста код, хочу рассчитать среднее время сделки (торговля отложенными ордерами) 

 с момента срабатывания ордера и до закрытия.


А зачем среднее время рассчитываете в цикле. Лишнии операции. Может лучше потом, после цикла. Да и неплохо было бы задать период рассчета 
 
Vinin:

А зачем среднее время рассчитываете в цикле. Лишнии операции. Может лучше потом, после цикла. Да и неплохо было бы задать период рассчета 
Вынес из цикла. А период расчета как сделать ?
 
Stells:
Вынес из цикла. А период расчета как сделать ?

Внешние переменные например
 

это я понял, дату как то вынести надо

это какая функция  

 
Stells:

это я понял, дату как то вынести надо

это какая функция  


Зачем усложнять если есть extern
 

hoz, как освобожусь въеду, так и быть.

У меня возник такой вопрос по оптимизации. Разбираюсь с алгоритмом EMA. Как известно, там рекурсия, которая вообщем-то сажает время. По оригиналу кода:

...

Перенесено в https://www.mql5.com/ru/forum/144691 

 
gyfto:

hoz, как освобожусь въеду, так и быть.

У меня возник такой вопрос по оптимизации. Разбираюсь с алгоритмом EMA. Как известно, там рекурсия, которая вообщем-то сажает время. По оригиналу кода:

 Специально взял маткад, чтобы разобраться с весами, которые генерирует EMA:

 

 Кстати говоря, мне теперь стало понятным, почему в индикаторах, использующих EMA (которую правильнее, выходит, было бы назвать степенной, а не экспотенциальной), используется период равный 14. Так вот, зачем надо так высоко забирать последний вес, если можно просто обернуть степенную функцию, если последующий вес важнее предыдущего? Я даже уже не спрашиваю, зачем пользоваться рекурсией, если конечные веса после окончания рекурсии можно вывести формулой (см. F(n,x) и y(n,x)).

 


Наверно Вам надо свою ветку открывать. Зачем Вам "Ветка для новичков"