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

 
Igor Makanu:

используйте https://www.mql5.com/ru/docs/dateandtime/timecurrent

второй вариант вызова функции

в общем случае это https://www.mql5.com/ru/docs/dateandtime/timetostruct

Большое спасибо за ценную информацию.

Что такое структура и как она работает , в целом,  я понял.  Но еще не до конца осмыслил все тонкости

, связанные с ней. Я намного лучше усваиваю новый материал на наглядных примерах.
Буду Вам очень признателен если покажете как пишется код нижеприведенного  условия на mql5
Открывать ордер при помощи структуры  я уже научился


if(Hour()==10)

открыть ордер.

Образец открытия ордера можно не писать.... только запись условия.

Спасибо еще раз за помощь.

 
Igor Makanu:

наверное так хотите цену и время бара определить:

вернее это координаты клика мышки в значениях время + цена на чарте, бар нужно определять через iBarShift()

Да, это оно, как дальше понятно. Спасибо)

 
ANDREY:

Большое спасибо за ценную информацию.

Что такое структура и как она работает , в целом,  я понял.  Но еще не до конца осмыслил все тонкости

, связанные с ней. Я намного лучше усваиваю новый материал на наглядных примерах.
Буду Вам очень признателен если покажете как пишется код нижеприведенного  условия на mql5
Открывать ордер при помощи структуры  я уже научился


if(Hour()==10)

открыть ордер.

Образец открытия ордера можно не писать.... только запись условия.

Спасибо еще раз за помощь.

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10)
{
//открыть ордер
}
 
Igor Makanu:

Большое спасибо за помощь. Теперь все ясно и понятно.

 

Всем доброго времени суток!
Пытаюсь перейти с mql4 на mql5 . Создал для тестирования  простой код открывающий ордера . Советник в тестере ордера открывает . Поместил в начало функции void OnTick() функцию Print().На четверке советник заходил бы в эту функцию на каждом тике и печатал бы ее на каждом тике в Журнале. А на пятерке - ни на одном из тиков Советник в функцию  Print() не заходит и ничего не печатает в Журнале. Визуализация и оптимизация на Советнике отключены.
Подскажите пожалуйста как нужно изменить код, что бы  Print() печаталась в журнале на каждом тике, как в четверке.
Заранее благодарен всем кто мне поможет .

Вот мой код

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;     // Будет использоваться для получения результатов выполнения торговых запросов
 if(!SymbolInfoTick(_Symbol,latest_price))
   {
         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_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

Увеличил депозит в Советнике до 100 000. В результате на каждом тике Print() стала печататься в журнале....Но не открылась ни одна сделка.

А мне нужно что бы и сделки открывались и  Print() выводилась.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
ANDREY:

Всем доброго времени суток!
Пытаюсь перейти с mql4 на mql5 . Создал для тестирования  простой код открывающий ордера . Советник в тестере ордера открывает . Поместил в начало функции void OnTick() функцию Print().На четверке советник заходил бы в эту функцию на каждом тике и печатал бы ее на каждом тике в Журнале. А на пятерке - ни на одном из тиков Советник в функцию  Print() не заходит и ничего не печатает в Журнале. Визуализация и оптимизация на Советнике отключены.
Подскажите пожалуйста как нужно изменить код, что бы  Print() печаталась в журнале на каждом тике, как в четверке.
Заранее благодарен всем кто мне поможет .

Вот мой код

Увеличил депозит в Советнике до 100 000. В результате на каждом тике Print() стала печататься в журнале....Но не открылась ни одна сделка.

А мне нужно что бы и сделки открывались и  Print() выводилась.

Посмотрите в логах что печатает, там на каждом шаге сведения заносятся. Скорее всего что то не так с открытием ордеров и советник не работает.

C:\Users\....\AppData\Roaming\MetaQuotes\Terminal\99193835FC75DE8874B99F9A3B93F15E\MQL5\Logs

 
Igor Makanu:

мы же уже обсуждали с Вами стоит ли много раз обращаться к данным терминала из MQL4, тогда про OrderSelect  https://www.mql5.com/ru/forum/342989#comment_16743716

можно так же протестировать и получение текущих цен, думаю тоже по 100500 раз можно на одном тике использовать, т.к. миллионами раз в секунду будет производительность


единственное, да - чем больше символов в окне обзор рынка, тем больше будет нагружаться сам терминал, ну и соответственно если будете вызывать данные от много разных символов, тогда тоже будут лаги

т.е. если разумно использовать терминал, то ничего не зависнет - в окне обзор рынка штук десять символов, те которые используете


сколько одновременно чартов можно открыть не проверял, но думаю, что если историю ограничить 1000 баров, то скорее всего пару десятков окон чартов без проблем терминал потянет

100

 
Valeriy Yastremskiy:

Посмотрите в логах что печатает, там на каждом шаге сведения заносятся. Скорее всего что то не так с открытием ордеров и советник не работает.

C:\Users\....\AppData\Roaming\MetaQuotes\Terminal\99193835FC75DE8874B99F9A3B93F15E\MQL5\Logs

Спасибо за подсказку.

Действительно не работает. Пишет.

2020.10.27 06:40:45.311 Tester EURUSD: history data begins from 2018.01.02 00:00

2020.10.27 06:40:45.312 Core 1 connecting to 127.0.0.1:3000

2020.10.27 06:40:45.312 Core 1 connected

2020.10.27 06:40:45.320 Core 1 authorized (agent build 2650)

2020.10.27 06:40:45.323 Tester EURUSD,M1 (Alpari-MT5-Demo): testing of Experts\ГРААЛЬ.ex5 from 2020.09.01 00:00 to 2020.09.03 00:00

2020.10.27 06:40:45.327 Core 1 common synchronization completed

2020.10.27 06:40:45.328 Tester quality of analyzed history is 100%

2020.10.27 06:40:45.348 Core 1 test Experts\ГРААЛЬ.ex5 on EURUSD,M1 thread finished

2020.10.27 06:40:45.348 Core 1 prepare for shutdown

2020.10.27 06:40:45.348 Core 1 login (build 2650)

2020.10.27 06:40:45.348 Core 1 account info found with currency USD

2020.10.27 06:40:45.348 Core 1 1482 bytes of tester parameters loaded

2020.10.27 06:40:45.348 Core 1 1724 bytes of input parameters loaded

2020.10.27 06:40:45.348 Core 1 calculate profit in pips, initial deposit 10000, leverage 1:100

2020.10.27 06:40:45.348 Core 1 successfully initialized

2020.10.27 06:40:45.348 Core 1 731 bytes of total initialization data received

2020.10.27 06:40:45.348 Core 1 Intel Core i5-6400  @ 2.70GHz, 7883 MB

2020.10.27 06:40:45.348 Core 1 EURUSD: symbol to be synchronized

2020.10.27 06:40:45.348 Core 1 EURUSD: symbol synchronized already, 18 bytes received

2020.10.27 06:40:45.348 Core 1 EURUSD,M1: history cached from 2019.01.02 06:00

2020.10.27 06:40:45.348 Core 1 EURUSD,M1 (Alpari-MT5-Demo): every tick generating

2020.10.27 06:40:45.348 Core 1 EURUSD,M1: testing of Experts\ГРААЛЬ.ex5 from 2020.09.01 00:00 to 2020.09.03 00:00 started with inputs:

2020.10.27 06:40:45.348 Core 1   StopLoss=30

2020.10.27 06:40:45.348 Core 1   TakeProfit=100

2020.10.27 06:40:45.348 Core 1   Lot=0.1

2020.10.27 06:40:45.348 Core 1 final balance 10000.00 pips

2020.10.27 06:40:45.348 Core 1 EURUSD,M1: 111967 ticks, 2880 bars generated. Test passed in 0:00:00.019.

2020.10.27 06:40:45.348 Core 1 270 Mb memory used including 35 Mb of history data, 64 Mb of tick data

2020.10.27 06:40:45.348 Core 1 log file "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" written

2020.10.27 06:40:45.371 Core 1 connection closed

Я тестирую на периоде один день. То есть советник должен открыть 1440 ордеров. Может быть проблема в этом. Может есть какие то ограничения на количество одновременно открытых ордеров.
Ведь когда на депозите советника было 10 000 он открывал только 300  ордеров , а остальные пропускал по какой то  причине связанной с деньгами(как я понял из записей в журнале). А потом я увеличил депозит Советника до 100 000 и пропускать он уже не имел права. И он вообще перестал открывать ордера.

Но потом я депозит Советника снова уменьшил до 10 000. Но Советник не смотря на это уже ничего не открывает и пишет всегда то что я указал вверху.

Создал другой советник. Загрузил в него тот же код. Депозит 10 000. Все то же самое - ордеров не открывает.
Подскажите пожалуйста как заставить Советника нормально работать. Пишет то же самое только в выделенной мной желтой строк вместо 270 mb стоит значение 271
У меня Windows 10 . 64 разрядная ОС 8ГБ оперативной памяти.
Спасибо.

 
ANDREY:

Спасибо за подсказку.

Действительно не работает. Пишет.


2020.10.27 06:40:45.348 Core 1 EURUSD,M1: 111967 ticks, 2880 bars generated. Test passed in 0:00:00.019.

2020.10.27 06:40:45.348 Core 1 270 Mb memory used including 35 Mb of history data, 64 Mb of tick data

2020.10.27 06:40:45.348 Core 1 log file "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" written

2020.10.27 06:40:45.371 Core 1 connection closed

Я тестирую на периоде один день. То есть советник должен открыть 1440 ордеров. Может быть проблема в этом. Может есть какие то ограничения на количество одновременно открытых ордеров.
Ведь когда на депозите советника было 10 000 он открывал только 300  ордеров , а остальные пропускал по какой то  причине связанной с деньгами(как я понял из записей в журнале). А потом я увеличил депозит Советника до 100 000 и пропускать он уже не имел права. И он вообще перестал открывать ордера.

Но потом я депозит Советника снова уменьшил до 10 000. Но Советник не смотря на это уже ничего не открывает и пишет всегда то что я указал вверху.
Подскажите пожалуйста как заставить Советника нормально работать.
Спасибо.

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

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

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;     // Будет использоваться для получения результатов выполнения торговых запросов
 if(!SymbolInfoTick(_Symbol,latest_price))
   {
         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_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult); // получите (запросите) результаты исполнения / сделки и распечатайте, будет понятней
    }   
     return;
  }
 
int M = TimeMinute(TimeCurrent());
int TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
}

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

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

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

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

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

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

Документация по MQL5: Дата и время / TimeCurrent
Документация по MQL5: Дата и время / TimeCurrent
  • www.mql5.com
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это –...
Причина обращения: