Откуда HistorySelect берет историю из терминала или с сервера?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Grigoriy Chaunin
4807
Grigoriy Chaunin  

Откуда HistorySelect берет историю из терминала или с сервера?

В документации не написано.

fxsaber
16704
fxsaber  
Grigoriy Chaunin:

Откуда HistorySelect берет историю из терминала или с сервера?

В документации не написано.

Терминал.

Vladimir
1191
Vladimir  

Справка к MQL5 по этой функции:

Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().

После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.


Мое, по памяти, так сразу в справке не нашел: Точнее, для каждого экземпляра из запущенных в этом терминале MQL5 программ поддерживается свой экземпляр истории. Есть еще и история, принадлежащая терминалу.

Denis Kirichenko
11715
Denis Kirichenko  

Есть статья, имхо, must-read для каждого (кто не пишет на MQL4)  "ОРДЕРA, ПОЗИЦИИ И СДЕЛКИ В METATRADER 5". В ней чётко указана схема.


Точно скажет только разработчик. Но мысль такая: если при запросе истории её нет в терминале, или она не синхронизирована с сервером, то идёт обращение к серверу. В любом случае, терминал проверяет факт синхронизации.

А вообще вопрос поставлен некорректно.


Grigoriy Chaunin
4807
Grigoriy Chaunin  

В общем ситуация такая. Есть советник. В нем есть функция расчета лота. Советник работал правильно. Когда надо удваивал лот. В тестере работает правильно. А сейчас вдруг прекратил удваивать. Единственная причина которую я вижу советник перестал подгружать историю ордеров из терминала. Код:

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);
  }
fxsaber
16704
fxsaber  
Grigoriy Chaunin:

В общем ситуация такая. Есть советник. В нем есть функция расчета лота. Советник работал правильно. Когда надо удваивал лот. В тестере работает правильно. А сейчас вдруг прекратил удваивать. Единственная причина которую я вижу советник перестал подгружать историю ордеров из терминала. Код:

Если владеете MQL4, то под MT5 будет просто. А если нет, то сложно объяснить. В код не вникал, но два места сразу бросились

HistorySelect(0,TimeCurrent()); // Лучше INT_MAX вместо TimeCurrent()
if(HistoryOrdersTotal()==0)return(Lot); // Условие должно быть < 2
Vladimir
1191
Vladimir  
Grigoriy Chaunin:

В общем ситуация такая. Есть советник. В нем есть функция расчета лота. Советник работал правильно. Когда надо удваивал лот. В тестере работает правильно. А сейчас вдруг прекратил удваивать. Единственная причина которую я вижу советник перестал подгружать историю ордеров из терминала. Код:

А попроще причину не искали? Может, средств не хватает?

Grigoriy Chaunin
4807
Grigoriy Chaunin  

Средств хватает.

Замечания по коду правильны.

Grigoriy Chaunin
4807
Grigoriy Chaunin  

Так что это баг терминала? И можно ли это как-то исправить средствами MQL?

Grigoriy Chaunin
4807
Grigoriy Chaunin  

Все перепроверил. Код правильный! В тестере работает как часы. На реале удваивается когда не надо и не удваивается когда надо. Что это козни брокера? В Открывашке не должны в роди бы так себя вести. Ведь они выводят на биржу. Или все таки могут? Баг терминала? Тогда почему советник месяц проработал нормально. Пробовал перезапускать терминал, не помогло.

fxsaber
16704
fxsaber  
Grigoriy Chaunin:

Все перепроверил. Код правильный! В тестере работает как часы. На реале удваивается когда не надо и не удваивается когда надо. Что это козни брокера? В Открывашке не должны в роди бы так себя вести. Ведь они выводят на биржу. Или все таки могут? Баг терминала? Тогда почему советник месяц проработал нормально. Пробовал перезапускать терминал, не помогло.

Нет кода.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий