Откуда HistorySelect берет историю из терминала или с сервера?
В документации не написано.
Терминал.
Справка к MQL5 по этой функции:
Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().
После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.
Мое, по памяти, так сразу в справке не нашел: Точнее, для каждого экземпляра из запущенных в этом терминале MQL5 программ поддерживается свой экземпляр истории. Есть еще и история, принадлежащая терминалу.
Есть статья, имхо, must-read для каждого (кто не пишет на MQL4) "ОРДЕРA, ПОЗИЦИИ И СДЕЛКИ В METATRADER 5". В ней чётко указана схема.
Точно скажет только разработчик. Но мысль такая: если при запросе истории её нет в терминале, или она не синхронизирована с сервером, то идёт обращение к серверу. В любом случае, терминал проверяет факт синхронизации.
А вообще вопрос поставлен некорректно.
В общем ситуация такая. Есть советник. В нем есть функция расчета лота. Советник работал правильно. Когда надо удваивал лот. В тестере работает правильно. А сейчас вдруг прекратил удваивать. Единственная причина которую я вижу советник перестал подгружать историю ордеров из терминала. Код:
double Martingail::Lot(void) { double Lot=MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)/Shape)*SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); if(Lot==0)Lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); if(DoublingCount<=0) return Lot; double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX); if(Lot>MaxLot){Lot=MaxLot; return Lot;} double lt1=Lot; HistorySelect(0,TimeCurrent()); if(HistoryOrdersTotal()==0)return(Lot); double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN); double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN); long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE); if(typeor==ORDER_TYPE_BUY) { if(op>cl) { if(ud<DoublingCount) { lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*2; ud++; } else ud=0; } else ud=0; } if(typeor==ORDER_TYPE_SELL) { if(cl>op) { if(ud<DoublingCount) { lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*2; ud++; } else ud=0; } else ud=0; } if(lt1>MaxLot)lt1=MaxLot; return(lt1); }
В общем ситуация такая. Есть советник. В нем есть функция расчета лота. Советник работал правильно. Когда надо удваивал лот. В тестере работает правильно. А сейчас вдруг прекратил удваивать. Единственная причина которую я вижу советник перестал подгружать историю ордеров из терминала. Код:
Если владеете MQL4, то под MT5 будет просто. А если нет, то сложно объяснить. В код не вникал, но два места сразу бросились
HistorySelect(0,TimeCurrent()); // Лучше INT_MAX вместо TimeCurrent() if(HistoryOrdersTotal()==0)return(Lot); // Условие должно быть < 2
В общем ситуация такая. Есть советник. В нем есть функция расчета лота. Советник работал правильно. Когда надо удваивал лот. В тестере работает правильно. А сейчас вдруг прекратил удваивать. Единственная причина которую я вижу советник перестал подгружать историю ордеров из терминала. Код:
А попроще причину не искали? Может, средств не хватает?
Средств хватает.
Замечания по коду правильны.
Так что это баг терминала? И можно ли это как-то исправить средствами MQL?
Все перепроверил. Код правильный! В тестере работает как часы. На реале удваивается когда не надо и не удваивается когда надо. Что это козни брокера? В Открывашке не должны в роди бы так себя вести. Ведь они выводят на биржу. Или все таки могут? Баг терминала? Тогда почему советник месяц проработал нормально. Пробовал перезапускать терминал, не помогло.
Все перепроверил. Код правильный! В тестере работает как часы. На реале удваивается когда не надо и не удваивается когда надо. Что это козни брокера? В Открывашке не должны в роди бы так себя вести. Ведь они выводят на биржу. Или все таки могут? Баг терминала? Тогда почему советник месяц проработал нормально. Пробовал перезапускать терминал, не помогло.
Нет кода.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Откуда HistorySelect берет историю из терминала или с сервера?
В документации не написано.