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

 
gyfto:

Как упростить это выражение?

 

это из алгоритма ADX от MetaQuotes. Сами MetaQuotes пользуются таким оборотом:

  - как его упростить?


А почему самый простой вариант Вас не устраивает?

z=0;
if(y>x && y>0) z=y;
 
Roger:


А почему самый простой вариант Вас не устраивает?


Наверное, порой надо взглянуть на проблему под другим углом. Точно, благодарю.
 
gyfto:

hoz, у меня пока тут свет отключали, задумался я над тем, как ещё больше сократить if. Смотрите: если поставить переменную

 имеем cnt=cnt+step, где

 Но 1=cnt/cnt, a -cnt=cnt/(-1), разница только в знаменателе. Теперь вспоминаем, что x^0=1, x^1=x, т.е. в показатель можно поставить нашу булеву переменную _if, т.е. step=cnt/a*(cnt^_if); где

 Но ±а у нас равно по идее 2*_if-1, т.е.

 Или упрощаем


Ничего себе Вы упростили. Я не понял Вашей логики.
 
я понял так, что мы спустимся до if...  :-)))
 
zoritch:
я понял так, что мы спустимся до if...  :-)))

Я понял так же, что ничего не понял. Даже тех значков непонятных.. :)
 
hoz:

бары одного признака идут вверх, т.е. бычьи.

int LastCandlesType(int trend)
{
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

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

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

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

 Т.е. если trend == вниз, то функция в цикле была как щяс, а если trend == вверх, то в цикле было есс-но Open[i] и Close[i] поменены местами, чтоб соблюдались условия. Т.к. в том случае уже цена закрытия бара будет ниже цены открытия и в итоге разница будет со знаком минус.

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

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

      if ((2*trend-1)*(Close[i] - Open[i]) < i_sizeOfSequentialCorrectionBar * pt)    // Если бар, не соответствует основному признаку..
          cnt = 0;                                                                   // .. счётчик обнуляем
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

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

int LastCandlesType(bool trend)//trend равен 1 (бычий) или 0 (медвежий)
   int cnt,                            // Счётчик идущих друг за другом свечей с требуемыми признаками

   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      bool _if=((2*trend-1)*(Close[i] - Open[i])>=i_sizeOfSequentialCorrectionBar * pt); cnt=cnt+cnt/((2*_if-1)*MathPow(cnt, _if));
      
/*      if (i == 1)
      Print("i = ", i,"; cnt = ", cnt);*/
   }

   if (cnt == 3)                                                                     // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_CANDLE_GOT);                                         //..Выходим из функции
}

 Здесь Δ - это разница имел ввиду, т.е. 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. Что ещё непонятно было из обозначений?

 
Кто может подсказать, - как MT4 заставить автоматом удалять свободные логи(или вообще их не создавать)? А то на некоторых ДЦ с 5-и знаками, эти логи за сутки растут в ужасающие размеры(по 1.6гб), а место на впс ограничено. Заранее спс.
 
M2012K:
Кто может подсказать, - как MT4 заставить автоматом удалять свободные логи(или вообще их не создавать)? А то на некоторых ДЦ с 5-и знаками, эти логи за сутки растут в ужасающие размеры(по 1.6гб), а место на впс ограничено. Заранее спс.

Можете сами сделать:

Библиотека1, библиотека2

==============

Хотя, последний (текущий) файл открыт терминалом. Его непросто удалить. Зато можно удалить содержимое, что в начале записано.

Создание логов не отключается. 

==============

1. Создаёте на папку с логами символьную ссылку (библиотека1) в папку files.

2. Удаляете все ненужные файлы средствами MQL4.

3. Открываете текущий файл средствами MQL4. Редактируете его, как Вам надо.

4. Закрываете файл.

5. Можно удалить ссылку. Можно не удалять. Потом пригодится.

==============

Ещё можно создать файл сценария (BAT) и запускать его в эксперте. Сценарий такой же, что выше написал. Только без создания ссылки. Работа с файлами, конечно, средствами Windows.

 
M2012K:

Кто может подсказать, - как MT4 заставить автоматом удалять свободные логи(или вообще их не создавать)?

А то на некоторых ДЦ с 5-и знаками, эти логи за сутки растут в ужасающие размеры(по 1.6гб), а место на впс ограничено. Заранее спс.

логи чего?

ошибок эксперта?

 

 Привет! Нужна помощь с доработкой примитивного робота. Для начала, объясню свою простейшую стратегию, чтоб было понятней, где нужна помощь и для чего.

Суть ТС:

1. Если цена открытия ниже МА, а закрытие - выше, то покупаем.

2. Если цена открытия выше МА, а закрытие - ниже, то продаем. 

3. Если цена отошла на X%  от наивыгоднейшей цены, то закрываем ордер. Что-то на подобие трейлинг стоп, только вместо пунктов, X% от расстояния открытия ордера и наивыгоднейшей цены. Как показано на рисунке: 

 

 AB - расстояние от открытия ордера до наивыгоднейшей цены; BC=Х% от AB; С - закрытие ордера.

 

Пункты 1 и 2 я прописала в программе:

extern int period=50;
extern int ma_shift=0;
extern int Magic=666;
extern double lot=0.1;
extern int SL=150;


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  int kolpos=0;
  double ma=iMA (NULL,0,period,ma_shift,MODE_SMMA,PRICE_MEDIAN,0);
//----
   for (int pos=0; pos<OrdersTotal(); pos++)
   {
   OrderSelect (pos, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
   kolpos++;
   }
   if (kolpos==0)
   {
 
   if(Open[1]>ma && Close[1]<ma)  
   OrderSend(Symbol(),OP_SELL,lot,Bid,10,Bid+SL*Point,0,NULL,Magic,0,Red);
   if(Open[1]<ma && Close[1]>ma)  
   OrderSend(Symbol(),OP_BUY,lot,Ask,10,Ask-SL*Point,0,NULL,Magic,0,Green);
   
   }
   
   
  
//----
   return(0);
  }

 Вообщем, нужна помощь с написанием функции для закрытия ордеров под мою ТС (пункт 3) и адаптацией имеющегося кода под функцию. 

 

P.S. И я знаю, что ТС не ахти.