Если 1440 ордеров в день, то должна быть проверка на начало минуты, или проще на появление минутного бара. И в этот момент открывать. У Вас ее нет, поэтому советник открывает позицию на каждом тике, что само по себе жесткое условие, по условию на нашем символе по текущей котировке. Это условие может и не соблюдаться, и тики будут пропускаться. И в какой то момент возникает критическая ошибка.
Так же тип исполнения ордера (приказа совершить сделку на создание позиции) Все или ничего.
Понял. Спасибо за помощь.
Я то же так сразу подумал, что советнику трудно открывать так много ордеров. Я пытался ограничить количество ордеров вот этим кодом
То есть открывать открывать ордер только в 10:00. Но результат - прежний.
2020.10.27 10:25:17.548Core 1272 Mb memory used including 36 Mb of history data, 64 Mb of tick data
inputint StopLoss=30; // Stop Lossinputint TakeProfit=100; // Take Profitinputdouble Lot=0.1; // Количество лотов для торговлиint A; ////+------------------------------------------------------------------+voidOnTick()
{
//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;
}
Что я делаю не так?
Выделил цветом код который я добавил и поменял
Вот что написано в лог файле
FD010:57:05.453Core 1agent process started on 127.0.0.1:3000
IG010:57:06.248Core 1EURUSD: symbol to be synchronized
RS010:57:06.248Core 1EURUSD: symbol synchronized, 3720 bytes of symbol info received
OL010:57:06.248Core 1EURUSD: load 27 bytes of history data to synchronize in 0:00:00.003
EK010:57:06.248Core 1EURUSD: history synchronized from 2019.01.02 to 2020.10.23
LK010:57:06.248Core 1EURUSD,M1: history cache allocated for 628432 bars and contains 619175 bars from 2019.01.02 06:00 to 2020.08.31 23:59
LH010:57:06.248Core 1EURUSD,M1: history begins from 2019.01.02 06:00
LN010:57:06.248Core 1EURUSD,M1 (Alpari-MT5-Demo): OHLC bar states generating. OnTick executed on the bar begin only
JM010:57:06.248Core 1EURUSD,M1: testing of Experts\ГРААЛЬ.ex5 from 2020.09.01 00:00 to 2020.09.10 00:00 started with inputs:
LS010:57:06.248Core 1 StopLoss=30
PL010:57:06.248Core 1 TakeProfit=100
FJ010:57:06.248Core 1 Lot=0.1
DP010:57:06.248Core 1final balance 10000.00 pips
EE010:57:06.248Core 1EURUSD,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).
DE010:57:06.248Core 1EURUSD,M1: total time from login to stop testing 0:00:00.278 (including 0:00:00.031 for history data synchronization)
NQ010:57:06.248Core 1272 Mb memory used including 36 Mb of history data, 64 Mb of tick data
KE010:57:06.248Core 1log file "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" written
Почему время сервера не обновляется по приходу новых тиков?
В момент запуска советника все срабатывает как надо, но дальше время то идёт, а в переменную новое значение текущей минуты не поступает.
Т.е. у меня советник работает в зависимости от числа полученного переменной int M = TimeMinute(TimeCurrent());
Собственно строка кода то из справочника и чёт не робит.
Например запустил в 12 минут -текущее времявозвращаемое сервером соответствует времени в переменной, а дальше переменная так и остается на 12, хотя уже минут 15-20 на часах
Код полностью лучше, вернее где создаете функцию и в какой функции (ОнИнит, ОнТик, ОнТайм) получаете значение минут и вызываете функцию печати. Если в ОнИнит или вне полей терминальных функций, так и должно быть. Если в ОнТик то на каждом тике будет печатать и с новой минутой обновлять значение.
Код полностью лучше, вернее где создаете функцию и в какой функции (ОнИнит, ОнТик, ОнТайм) получаете значение минут и вызываете функцию печати. Если в ОнИнит или вне полей терминальных функций, так и должно быть. Если в ОнТик то на каждом тике будет печатать и с новой минутой обновлять значение.
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 держит в себе значение минуты полученной при первом запуске советника
Ну тут код полностью то вот всего на всего. В функции void OnTick() запускается в работу в самом начале первой строкой к исполнению приходит.
Срабатывает только в момент перекомпиляции или присоединению к графику/поле удаления/ . В остальное время переменная M держит в себе значение минуты полученной при первом запуске советника
//--------------------------------------------------------------------////--------------------------------------------------------------------int m1,m2;
voidOnTick() // Спец. функция 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);
}
}
angle всегда 0. Независимо использовать ли методы стандартной библиотеки или встроенные функции. При этом линия рисуется. Что не так? Как получить угол?
Добрый день. Пытаюсь получить угол трендовой линии по углу. Вот код:
angle всегда 0. Независимо использовать ли методы стандартной библиотеки или встроенные функции. При этом линия рисуется. Что не так? Как получить угол?
Зачем боятся скорости. Это лишь условность для приведения типов. Как вариант функции определения угла:
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 - количество минутных баров во временном промежутке отрезка. staticint 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("Время левой границы вне диапазона исторических данных");
returnDBL_MAX;
}
int bar1 = iBarShift(_Symbol,tf[i],p1.time);
int bar2 = iBarShift(_Symbol,tf[i],p2.time);
if(bar1==bar2)
return0.0;
returnatan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
}
После MT5 ощущение от работы MT4 просто ужасное. Доступ к истории какой-то кастрированный. О тиках даже молчу.
Если 1440 ордеров в день, то должна быть проверка на начало минуты, или проще на появление минутного бара. И в этот момент открывать. У Вас ее нет, поэтому советник открывает позицию на каждом тике, что само по себе жесткое условие, по условию на нашем символе по текущей котировке. Это условие может и не соблюдаться, и тики будут пропускаться. И в какой то момент возникает критическая ошибка.
Так же тип исполнения ордера (приказа совершить сделку на создание позиции) Все или ничего.
Понял. Спасибо за помощь.
Я то же так сразу подумал, что советнику трудно открывать так много ордеров. Я пытался ограничить количество ордеров вот этим кодом
То есть открывать открывать ордер только в 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
Что я делаю не так?
Выделил цветом код который я добавил и поменял
Вот что написано в лог файле
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
Подскажите пожалуйста!
Почему время сервера не обновляется по приходу новых тиков?
В момент запуска советника все срабатывает как надо, но дальше время то идёт, а в переменную новое значение текущей минуты не поступает.
Т.е. у меня советник работает в зависимости от числа полученного переменной int M = TimeMinute(TimeCurrent());
Собственно строка кода то из справочника и чёт не робит.
Например запустил в 12 минут - текущее время возвращаемое сервером соответствует времени в переменной, а дальше переменная так и остается на 12, хотя уже минут 15-20 на часах
Код полностью лучше, вернее где создаете функцию и в какой функции (ОнИнит, ОнТик, ОнТайм) получаете значение минут и вызываете функцию печати. Если в ОнИнит или вне полей терминальных функций, так и должно быть. Если в ОнТик то на каждом тике будет печатать и с новой минутой обновлять значение.
Valeriy Yastremskiy:
Код полностью лучше, вернее где создаете функцию и в какой функции (ОнИнит, ОнТик, ОнТайм) получаете значение минут и вызываете функцию печати. Если в ОнИнит или вне полей терминальных функций, так и должно быть. Если в ОнТик то на каждом тике будет печатать и с новой минутой обновлять значение.
Ну тут код полностью то вот всего на всего. В функции void OnTick() запускается в работу в самом начале первой строкой к исполнению приходит.
Срабатывает только в момент перекомпиляции или присоединению к графику/поле удаления/ . В остальное время переменная M держит в себе значение минуты полученной при первом запуске советника
Ну тут код полностью то вот всего на всего. В функции void OnTick() запускается в работу в самом начале первой строкой к исполнению приходит.
Срабатывает только в момент перекомпиляции или присоединению к графику/поле удаления/ . В остальное время переменная M держит в себе значение минуты полученной при первом запуске советника
Понял, Спасибо!
Надо было
поместить в тело функции, а не перед ней присваивать значение M
Понял, Спасибо!
Надо было
поместить в тело функции, а не перед ней присваивать значение M
Можно по разному. Глобальные и локальные переменные и их видимость прочитайте.
Добрый день. Пытаюсь получить угол трендовой линии по углу. Вот код:
angle всегда 0. Независимо использовать ли методы стандартной библиотеки или встроенные функции. При этом линия рисуется. Что не так? Как получить угол?
Добрый день. Пытаюсь получить угол трендовой линии по углу. Вот код:
angle всегда 0. Независимо использовать ли методы стандартной библиотеки или встроенные функции. При этом линия рисуется. Что не так? Как получить угол?
https://www.mql5.com/ru/forum/103591
Понятно, но как всё ж вычислить угол?
https://www.mql5.com/ru/forum/103591
Понятно, но как всё ж вычислить угол?
Ну Вы юморист.
Я перед кем тут распинался?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Nikolai Semko, 2020.10.26 00:34
Зачем боятся скорости. Это лишь условность для приведения типов.
Как вариант функции определения угла:
После MT5 ощущение от работы MT4 просто ужасное. Доступ к истории какой-то кастрированный. О тиках даже молчу.
Скажите, пожалуйста, такой выбор шрифта возможно сделать в индикаторе?