overdrive90 Опубликовано 22 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 августа, 2017 Здравствуйте, уважаемые!Проблема вот в чем: при инициализации советника необходимо иметь историю в несколько недель по текущему инструменту и на текущем ТФ.Как организовать проверку средствами MQL и, при необходимости, подкачку истории?Спасибо. Можно создать массив и заполнить его функцией ArrayCopySeries. Если с историей все ок, вернет кол-во скопированных элементов. Если же нет, вернет -1 в случае неудачи, или начнет качать историю и вернет ошибку 4066 (запрошенные исторические данные в состоянии обновления) 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 22 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 августа, 2017 вернет кол-во скопированных элементов. Если же нет, вернет -1 в случае неудачи, или начнет качать историю и вернет ошибку 4066 (запрошенные исторические данные в состоянии обновления) А чем он(а) отличается в данном случает от Bar?Или все таки производится попытка подкачать историю?В сети видел решения на dll, но как-то хочется внутренними резервами обойтись...Попробовал, не подкачивает историю ArrayCopySeries, возвращает количество имеющихся баров.Ручная прокрутка "решает" проблему.. :( Изменено 22 августа, 2017 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
machine Опубликовано 22 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 августа, 2017 Пройтись циклом от требуемого кол-ва баров до нуля, вызывая какую-нибудь функцию, обращающуюся к истории (iTime, iHigh, ...). После каждого вызова - делать проверку на ошибки. В случае, если во время выполнения цикла были ошибки, повторить после некоторой паузы.Не пробовал. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 23 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 августа, 2017 Пройтись циклом от требуемого кол-ва баров до нуля, вызывая какую-нибудь функцию, обращающуюся к истории (iTime, iHigh, ...). После каждого вызова - делать проверку на ошибки. В случае, если во время выполнения цикла были ошибки, повторить после некоторой паузы.Не пробовал. Попробовал.iTime на определенной глубине ошибку не дает, возвращает 0, т.е. 01.01.1970.Open(i) выдает ошибку "array out of range". Изменено 23 августа, 2017 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
overdrive90 Опубликовано 23 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 августа, 2017 Попробуй все таки ArrayCopySeries через цикл. Должно сработать. Раньше точно работало. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 23 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 августа, 2017 Попробуй все таки ArrayCopySeries через цикл. Должно сработать. Раньше точно работало. Так? datetime arr[]; for (int k=0; k { int CountBarsArr= ArrayCopySeries(arr,MODE_TIME,Symbol(),_Period); Print(__FUNCTION__ , " Скопировано ", CountBarsArr, " баров из истории в массив"); Sleep(500); } Результат: Цитата AUDUSDf,H4: OnInit Скопировано 1707 баров из истории в массивAUDUSDf,H4: OnInit Скопировано 1707 баров из истории в массивAUDUSDf,H4: OnInit Скопировано 1707 баров из истории в массивAUDUSDf,H4: OnInit Скопировано 1707 баров из истории в массивAUDUSDf,H4: OnInit Скопировано 1707 баров из истории в массив Ссылка на сообщение Поделиться на другие сайты More sharing options...
Leery Опубликовано 25 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 25 августа, 2017 Подскажите пожалуйста что исправить в данной функции, чтобы она закрывала только тот ордер на котором сработал сигнал (в частности закрытие по времени), а не все открытые при срабатывании сигнала на одном из ордеров? void CloseOrders(int dir){ double PriceClose = 0; color Color = Black; for (int i = OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if (OrderType() == dir) { if((SignalExit(dir) && ExitProfit (dir, ExitPips)) || (ExitTimeProfit(dir, OrderExitHour) && ExitProfit (dir, ExitPips))) { if (OrderType() == OP_BUY) {PriceClose = Bid; Color = Blue;} if (OrderType() == OP_SELL) {PriceClose = Ask; Color = Red;} { if(!OrderClose(OrderTicket(), OrderLots(), PriceClose, Slippage, Color)) { Print ("Не удалось закрыть ордер"); } } } } }}PS; извините не разобрался как отправить функцию под спойлер Ссылка на сообщение Поделиться на другие сайты More sharing options...
lordsamven Опубликовано 27 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 августа, 2017 Добрый день!Сделал советник мартингейл по уроку из курса программирования в мт4. Скомпилировал, ошибки и замечания все исправил. Запустил в тестере и обратил внимание, что ордера на покупку не наращиваются при противоходе цены на заданный шаг. При этом ордера на продажу выставляются четко по алгоритму. Подскажите, плиз, что не так. Извиняюсь, если вопрос уже кем-то, но я не нашел.В журнале ошибок нет. Получается покупки просто пересиживаются в случае попадания в просадку. mart001.mq4mart001.ex4 Изменено 27 августа, 2017 пользователем lordsamven Ссылка на сообщение Поделиться на другие сайты More sharing options...
вут716 Опубликовано 29 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2017 Подскажите кто знает, как сделать так чтоб советник в течении дня открывал в одном направлении только одну сделку. Т.е. открыл один ордер например на покупку и все . следующий только на следующий день Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 30 августа, 2017 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2017 Добрый день!Сделал советник мартингейл по уроку из курса программирования в мт4. Скомпилировал, ошибки и замечания все исправил. Запустил в тестере и обратил внимание, что ордера на покупку не наращиваются при противоходе цены на заданный шаг. При этом ордера на продажу выставляются четко по алгоритму. Подскажите, плиз, что не так. Извиняюсь, если вопрос уже кем-то, но я не нашел.В журнале ошибок нет. Получается покупки просто пересиживаются в случае попадания в просадку. День добрый!Всё в порядке, проблем не вижу.Работает как часы...2017-1.png2017-2.png 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
lordsamven Опубликовано 30 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2017 Добрый день!Сделал советник мартингейл по уроку из курса программирования в мт4. Скомпилировал, ошибки и замечания все исправил. Запустил в тестере и обратил внимание, что ордера на покупку не наращиваются при противоходе цены на заданный шаг. При этом ордера на продажу выставляются четко по алгоритму. Подскажите, плиз, что не так. Извиняюсь, если вопрос уже кем-то, но я не нашел.В журнале ошибок нет. Получается покупки просто пересиживаются в случае попадания в просадку. День добрый!Всё в порядке, проблем не вижу.Работает как часы... Не совсем так, обратите внимание что в журнале модифицируются только ордера sell, а ордера типа buy ниодного модифицированного нет. На имитации видно что ордера buy просто пересиживают просадку до сробатывания takeprofit.Добавлено: 30-08-2017 18:58:34 Добрый день!Сделал советник мартингейл по уроку из курса программирования в мт4. Скомпилировал, ошибки и замечания все исправил. Запустил в тестере и обратил внимание, что ордера на покупку не наращиваются при противоходе цены на заданный шаг. При этом ордера на продажу выставляются четко по алгоритму. Подскажите, плиз, что не так. Извиняюсь, если вопрос уже кем-то, но я не нашел.В журнале ошибок нет. Получается покупки просто пересиживаются в случае попадания в просадку. День добрый!Всё в порядке, проблем не вижу.Работает как часы... Не совсем так, обратите внимание что в журнале модифицируются только ордера sell, а ордера типа buy ниодного модифицированного нет. На имитации видно что ордера buy просто пересиживают просадку до сробатывания takeprofit. Ниже прикрепил скрин примера. Выделил сделку 19 buy с явным пересиживанием без наращивания дополнительных позиций.пример.jpg Изменено 30 августа, 2017 пользователем lordsamven Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 31 августа, 2017 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 августа, 2017 В журнале ошибок нет. Получается покупки просто пересиживаются в случае попадания в просадку. Да, увидел.Проблема в функции FindLastOrderType() .Она недописана.Замените её на эту://+------------------------------------------------------------------+//| Expert function |//+------------------------------------------------------------------+int FindLastOrderType() { int order_type = -1; int oldticketnumber = 0; int ticketnumber = 0; for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { oldticketnumber = OrderTicket(); if (oldticketnumber > ticketnumber) { order_type = OrderType(); ticketnumber = oldticketnumber; } } } } return (order_type);} 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 31 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 августа, 2017 Подскажите пожалуйста что исправить в данной функции, чтобы она закрывала только тот ордер на котором сработал сигнал (в частности закрытие по времени), а не все открытые при срабатывании сигнала на одном из ордеров? Вам надо переписать функцию ExitTimeProfit(dir, OrderExitHour) сейчас она закрывает ордера не по времени жизни ордера, а по некому времени OrderExitHour.Или вообще её выкинуть и заменить выражением (TimeCurrent() - OrderOenTime())/*в секундах*/ > ВремяЖизни Ссылка на сообщение Поделиться на другие сайты More sharing options...
Leery Опубликовано 31 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 августа, 2017 Подскажите пожалуйста что исправить в данной функции, чтобы она закрывала только тот ордер на котором сработал сигнал (в частности закрытие по времени), а не все открытые при срабатывании сигнала на одном из ордеров?Вам надо переписать функцию ExitTimeProfit(dir, OrderExitHour) сейчас она закрывает ордера не по времени жизни ордера, а по некому времени OrderExitHour.Или вообще её выкинуть и заменить выражением (TimeCurrent() - OrderOenTime())/*в секундах*/ > ВремяЖизни Это выражение и написано как раз в этой функции ,а OrderExitHour это и есть ВремяЖизни, вынесенное в глобальные переменные. Просто когда открыто несколько ордеров (допустим BUY) соответственно с разным временем открытия, при достижении ВремениЖизни одним из ордеров, почему-то закрываются и все остальные, открытые гораздо позже. Изменено 31 августа, 2017 пользователем Leery Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 31 августа, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 августа, 2017 Leery может код функции дадите глянуть и проверьте время жизни в секундах Ссылка на сообщение Поделиться на другие сайты More sharing options...
Leery Опубликовано 1 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 сентября, 2017 Leery может код функции дадите глянуть и проверьте время жизни в секундах Нет проблем ( ВремяЖизни не меняется! Первый ордер закрывается правильно и остальные одновременно с ним) Спойлер extern int OrderExitHour = 16; //+------------------------------------------------------------------+bool ExitTimeProfit (int dir, int ExitHour){ if(!UseExitTimeProfit) return(true); for (int i = OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if ((OrderType()==OP_BUY && dir==OP_BUY) || (OrderType()==OP_SELL && dir==OP_SELL)) { if (TimeCurrent()-OrderOpenTime() >= 60*60*ExitHour) return(true); } } return(false);}//+------------------------------------------------------------------+bool ExitProfit (int dir, double ExitProfitPips){ if(!UseExitProfit) return(true); for (int i = OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if (OrderType()==OP_BUY && dir==OP_BUY) { if (Bid-OrderOpenPrice() > ExitProfitPips*_Point) return(true); } if (OrderType()==OP_SELL && dir==OP_SELL) { if (OrderOpenPrice()-Ask > ExitProfitPips*_Point) return(true); } } return(false);}//+------------------------------------------------------------------+//| Функция закрытия ордеров |//+------------------------------------------------------------------+void CloseOrders(int dir){ double PriceClose = 0; color Color = Black; for (int i = OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if (OrderType() == dir) { if((SignalExit(dir) && ExitProfit (dir, ExitPips)) || (ExitTimeProfit(dir, OrderExitHour) && ExitProfit (dir, ExitPips))) { if (OrderType() == OP_BUY) {PriceClose = Bid; Color = Blue;} if (OrderType() == OP_SELL) {PriceClose = Ask; Color = Red;} { if(!OrderClose(OrderTicket(), OrderLots(), PriceClose, Slippage, Color)) { Print ("Не удалось закрыть ордер"); } } } } }} В void OnTick() идет проверка только есть ли открытые ордера. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 2 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 сентября, 2017 Leery В закрывающей функции цикл по ордерам, в функции проверки времени жизни свой цикл по ордерам - который доходит до нужного ордера и выдаёт = тру; в это время в закрывающей функции другой ордер.Мой совет: избавьтесь от лишних циклов, все проверки в один цикл. если не хотите менять структуру программы, то имейте в виду: в основном цикле ордер выбирается селектом - и становится активным, с ним можно работать в других функциях без дополнительных манипуляций. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Leery Опубликовано 2 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 сентября, 2017 Oll Спасибо огромное. буду исправлять Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 5 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 сентября, 2017 Здравствуйте.Если при открытии ордера есть желание контролировать спред, то нужно проверить при открытии как БАЙ так и СЕЛЛ ордеров или можно проверять только при открытии БАЙ?Спасибо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 5 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 сентября, 2017 Дык какая разница? или без СЛ торгуете? 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
master_255 Опубликовано 5 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 сентября, 2017 Если стопы короткие то нужно проверять и для продаж, иначе после открытия стоп может оказаться слишком близко к цене. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 5 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 сентября, 2017 без стопов :) Я спросил с точки зрения входа по лучшей цене.Когда спред расширяется (больше интересует во время открытия рынка), то раздвигаются обе цены или только Аск подпрыгивает? Изменено 5 сентября, 2017 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
master_255 Опубликовано 5 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 сентября, 2017 Вот тиковый график в ролловер. EURAUD.JPGGBPUSD.JPG Изменено 5 сентября, 2017 пользователем master_255 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 6 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 сентября, 2017 скрипт подкачивает котировки всех таймфреймов, не нужно выбирать каждый таймфрейм отдельно. можно в советник встроить, определив его в OnInit(). вытащил из советника поэтому некоторые переменные левые, можешь подчистить. по умолчанию i=10000баров. Al.ex4Al.mq4 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 6 сентября, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 сентября, 2017 скрипт подкачивает котировки всех таймфреймов, не нужно выбирать каждый таймфрейм отдельно. можно в советник встроить, определив его в OnInit(). вытащил из советника поэтому некоторые переменные левые, можешь подчистить. по умолчанию i=10000баров.Посмотрел. Это то же самое, что советовал machine. Результат отрицательный.Добавил Принт в подкачку часовых свеч. Выдает0 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 1970.01.01 00:000 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 1970.01.01 00:000 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 1970.01.01 00:000 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 2017.05.10 11:000 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 2017.05.10 12:000 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 2017.05.10 13:000 20:04:25.620 QuoteLoader AUDCADf,H1: Load H1 2017.05.10 14:00, т.е. в результат попадает только существующая история :( Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти