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

 
Вы задумали идею, написали код. Не работает. Начинаете с самого верха проверять, что не так. Для этого распечатываете значения переменных и читаете их либо в журнале тестера, либо в закладке "эксперты" терминала, смотря что используете тестер или график. Дальше анализируете, Вы хотели, чтобы это было или нет? Еще если printf() не печатает, значит условие if в котором он стоит не выполняется, смотрим почему, распечатывая само условие перед if(), смотрим. И так сверху до низа.
 
Roman Shiredchenko #:
спс. Разберу....

довольно прикольно получается..

#include <MT4Orders.mqh>

typedef double (*OrderGetDoubleProc)(void); // тип функций геттера

// базовый класс для фильтрации ордеров
// предполагается что ордер выбран по OrderSelect
class OrderFilter {
public:
   virtual bool Test() {
      return true;
   }
};
// пример фильтра - отбор ордеров по направлению
class DirectionIs: public OrderFilter {
protected:
   int dir;
public:
   DirectionIs(int _dir):OrderFilter() {
      dir=_dir;
   }
   bool Test() {
      int type=OrderType();
      if (dir==OP_BUY && (type==OP_BUY || type==OP_BUYLIMIT || type==OP_BUYSTOP)) {
         return true;
      }
      return false;
   }
};
// пример фильтра - отбор ордеров по "возрасту" в минутах
class AgeLessThen: public OrderFilter {
protected:
   int minutes;
public:
   AgeLessThen(int _minutes):OrderFilter() {
      minutes=_minutes;
   } 
   bool Test() {
      datetime time=OrderOpenTime();
      if (time==0) return false;
      if ((TimeCurrent()-OrderOpenTime())/60<minutes) {
         return true;
      }
      int shift=iBarShift(OrderSymbol(),PERIOD_M1,time,true);
      if (shift<0) {
         return false;
      }
      
      if (shift<minutes) {
         return true;
      }
      return false;
   }  
}; 
// функция - агрегатор (сумматор показателей)
double AggregateOrders(int pool,OrderGetDoubleProc proc,OrderFilter &filter)
{
   int total=(pool==MODE_TRADES?OrdersTotal():OrdersHistoryTotal());
   double sum=0;
   for(int pos=total-1;pos>=0;pos--) {
      if (!OrderSelect(pos,SELECT_BY_POS,pool)) {
         continue;
      }
      if (!filter.Test()) {
         continue;
      }
      double value=proc();
      if (!MathIsValidNumber(value) || value==EMPTY_VALUE) {
         continue;
      }
      sum=sum+value;
   }
   return sum;
}
// агрегатор для действующих ордеров
double AggregateTrades(OrderGetDoubleProc proc,OrderFilter &filter) {
   return AggregateOrders(MODE_TRADES,proc,filter);
}
// агрегатор для исторических ордеров
double AggregateHistory(OrderGetDoubleProc proc,OrderFilter &filter) {
   return AggregateOrders(MODE_HISTORY,proc,filter);
}
void OnStart()
{
   double sum=AggregateTrades(OrderLots,DirectionIs(OP_BUY));
   PrintFormat("sum=%f",sum);
   sum=AggregateHistory(OrderProfit,AgeLessThen(12*60));
   PrintFormat("sum2=%f",sum);
}

можете поупражнять ООП и написать булевые операторы для фильтров, чтобы совсем красиво:

double lots=AggregateTrades(OrderLots,DirectionIs(OP_BUY) && MagicIs(555) && !HaveStopLoss())

 

Здравствуйте!

Подскажите, пожалуйста.

Стоит задача - построить трендовую по двум точкам., максимумам \ минимумам. Известны индексы баров, известны значения цен максимумов\минимумов. 

Но для построения трендовой нужны коодинаты цены и времени в datetime. 

А как получить координату времени для максимума\минимума? 

Функции iHighest\iLowest возвращают не время, а индекс бара. iTime возвращает время открытия бара.

 
odyn #:

Здравствуйте!

Подскажите, пожалуйста.

Стоит задача - построить трендовую по двум точкам., максимумам \ минимумам. Известны индексы баров, известны значения цен максимумов\минимумов. 

Но для построения трендовой нужны коодинаты цены и времени в datetime. 

А как получить координату времени для максимума\минимума? 

Функции iHighest\iLowest возвращают не время, а индекс бара. iTime возвращает время открытия бара.

Есть ещё CopyHigh(), CopyLow(), iHigh(), iLow(), CopyRates()...

У Вас есть все данные...

 
Artyom Trishkin #:

Есть ещё CopyHigh(), CopyLow(), iHigh(), iLow(), CopyRates()...

У Вас есть все данные...

неприятно признаваться в тупости, но я не понял...((

 

Попробую сформулировать вопрос конкретней и короче.

Как получить координату времени в datetime для конкретного максимума (известного) конкретного бара (известного) ?

 
odyn #:

Попробую сформулировать вопрос конкретней и короче.

Как получить координату времени в datetime для конкретного максимума (известного) конкретного бара (известного) ?

Я Вам перечислил стандартные функции. Наберите их в редакторе, поставьте на них курсор и нажмите F1
 
Artyom Trishkin #:
Я Вам перечислил стандартные функции. Наберите их в редакторе, поставьте на них курсор и нажмите F1

Да я их все перечитал. И все равно не понял. А уже потом тут спросил.

 
odyn #:

Да я их все перечитал. И все равно не понял. А уже потом тут спросил.

Я в другой ветке ответил...не надо дублировать по всему форуму.

 
odyn #:

Да я и

iTime - это время бара. И открытия, и экстремумов и закрытия. Надо же как-то сжимать время. Поэтому используйте это время. А для определения цены экстремума используйте iHigh, iLow.
Причина обращения: