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

 
Valeriy Yastremskiy:

Если 1440 ордеров в день, то должна быть проверка на начало минуты, или проще на появление минутного бара. И в этот момент открывать. У Вас ее нет, поэтому советник открывает позицию на каждом тике, что само по себе жесткое условие,  по условию на нашем символе по текущей котировке. Это условие может и не соблюдаться, и тики будут пропускаться. И в какой то момент возникает критическая ошибка.

Так же тип исполнения ордера (приказа совершить сделку на создание позиции) Все или ничего.

Понял. Спасибо за помощь.

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

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

То есть открывать открывать ордер только в 10:00. Но результат - прежний.

2020.10.27 10:25:17.548 Core 1 272 Mb memory used including 36 Mb of history data, 64 Mb of tick data


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

Что я делаю не так?

Выделил цветом код который я добавил и поменял

Вот что написано в лог файле

FD 0 10:57:05.453 Core 1 agent process started on 127.0.0.1:3000

CS 0 10:57:05.453 Core 1 connecting to 127.0.0.1:3000

JD 0 10:57:05.953 Core 1 connected

OD 0 10:57:05.975 Core 1 authorized (agent build 2650)

JL 0 10:57:05.980 Tester EURUSD,M1 (Alpari-MT5-Demo): testing of Experts\ГРААЛЬ.ex5 from 2020.09.01 00:00 to 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 common synchronization completed

CJ 0 10:57:06.223 Tester quality of analyzed history is 100%

LM 0 10:57:06.248 Core 1 MetaTester 5 started on 127.0.0.1:3000

EJ 0 10:57:06.248 Core 1 initialization finished

LS 0 10:57:06.248 Core 1 login (build 2650)

KO 0 10:57:06.248 Core 1 4372 bytes of account info loaded

LI 0 10:57:06.248 Core 1 1482 bytes of tester parameters loaded

FN 0 10:57:06.248 Core 1 1724 bytes of input parameters loaded

OK 0 10:57:06.248 Core 1 423 bytes of symbols list loaded (72 symbols)

HO 0 10:57:06.248 Core 1 expert file added: Experts\ГРААЛЬ.ex5. 13680 bytes loaded

CP 0 10:57:06.248 Core 1 4077 Mb available, 50 blocks set for ticks generating

DI 0 10:57:06.248 Core 1 calculate profit in pips, initial deposit 10000, leverage 1:100

LP 0 10:57:06.248 Core 1 successfully initialized

RI 0 10:57:06.248 Core 1 15 Kb of total initialization data received

DN 0 10:57:06.248 Core 1 Intel Core i5-6400  @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD: symbol to be synchronized

RS 0 10:57:06.248 Core 1 EURUSD: symbol synchronized, 3720 bytes of symbol info received

OL 0 10:57:06.248 Core 1 EURUSD: load 27 bytes of history data to synchronize in 0:00:00.003

EK 0 10:57:06.248 Core 1 EURUSD: history synchronized from 2019.01.02 to 2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1: history cache allocated for 628432 bars and contains 619175 bars from 2019.01.02 06:00 to 2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1: history begins from 2019.01.02 06:00

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC bar states generating. OnTick executed on the bar begin only

JM 0 10:57:06.248 Core 1 EURUSD,M1: testing of Experts\ГРААЛЬ.ex5 from 2020.09.01 00:00 to 2020.09.10 00:00 started with inputs:

LS 0 10:57:06.248 Core 1   StopLoss=30

PL 0 10:57:06.248 Core 1   TakeProfit=100

FJ 0 10:57:06.248 Core 1   Lot=0.1

DP 0 10:57:06.248 Core 1 final balance 10000.00 pips

EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 ticks, 10068 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:00.247 (including ticks preprocessing 0:00:00.016).

DE 0 10:57:06.248 Core 1 EURUSD,M1: total time from login to stop testing 0:00:00.278 (including 0:00:00.031 for history data synchronization)

NQ 0 10:57:06.248 Core 1 272 Mb memory used including 36 Mb of history data, 64 Mb of tick data

KE 0 10:57:06.248 Core 1 log file "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" written

OS 0 10:57:06.260 Core 1 connection closed


 
Denis Diakonov:

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

Почему время сервера не обновляется по приходу новых тиков?

В момент запуска советника все срабатывает как надо, но дальше время то идёт, а в переменную новое значение текущей минуты не поступает.

Т.е. у меня советник работает в зависимости от числа полученного переменной int M = TimeMinute(TimeCurrent());

Собственно строка кода то из справочника и чёт не робит.

Например запустил в 12 минут - текущее время возвращаемое сервером соответствует времени в переменной, а дальше переменная так и остается на 12, хотя уже минут 15-20 на часах

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

 

Наглядный пример времени сервера и значения переменной

Valeriy Yastremskiy:

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

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

Ну тут код полностью то вот всего на всего. В функции void OnTick() запускается в работу в самом начале первой строкой к исполнению приходит. 

Срабатывает только в момент перекомпиляции или присоединению к графику/поле удаления/ . В остальное время переменная M держит в себе значение минуты полученной при первом запуске советника

 
Denis Diakonov:

Ну тут код полностью то вот всего на всего. В функции void OnTick() запускается в работу в самом начале первой строкой к исполнению приходит. 

Срабатывает только в момент перекомпиляции или присоединению к графику/поле удаления/ . В остальное время переменная M держит в себе значение минуты полученной при первом запуске советника

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

Понял, Спасибо!

Надо было 

int M = TimeMinute(TimeCurrent());

поместить в тело функции, а не перед ней присваивать значение M

 
Denis Diakonov:

Понял, Спасибо!

Надо было 

поместить в тело функции, а не перед ней присваивать значение M

Можно по разному. Глобальные и локальные переменные и их видимость прочитайте.

 

Добрый день. Пытаюсь получить угол трендовой линии по углу. Вот код:

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

angle всегда 0. Независимо использовать ли методы стандартной библиотеки или встроенные функции. При этом линия рисуется. Что не так? Как получить угол?

 
leonerd:

Добрый день. Пытаюсь получить угол трендовой линии по углу. Вот код:

angle всегда 0. Независимо использовать ли методы стандартной библиотеки или встроенные функции. При этом линия рисуется. Что не так? Как получить угол?

https://www.mql5.com/ru/forum/103591

Понятно, но как всё ж вычислить угол?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

Понятно, но как всё ж вычислить угол?

Ну Вы юморист.

Я перед кем тут распинался?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Nikolai Semko, 2020.10.26 00:34

Зачем боятся скорости. Это лишь условность для приведения типов.
Как вариант функции определения угла:

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

После MT5 ощущение от работы MT4 просто ужасное. Доступ к истории какой-то кастрированный. О тиках даже молчу.




 

Скажите, пожалуйста, такой выбор шрифта возможно сделать в индикаторе?