Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 42

 

Что-то вы очень усложнили.

Проверять, сработал ли СЛ или ТП, нужно только при изменении OrdersHistoryTotal(). Обратный цикл, поиск последнего ордера с нужным магиком и символом.
На каждом тике ничего перебирать не надо.


Если стоп сработает с процессе выполнения функции start() (или OnTick()), то советник об этом не узнает. Собственно, как и об изменении цены.
Но в этом и нет необходимости, текущий запуск должен обработать текущую ситуацию, а не отслеживать все возможные следующие.

 

Чтоб посоветовать что-то более конкретное, нужна более конкретная задача. 

 
Лукавите .... 
 
Scriptong:


В оперативной памяти, которая занята процессом MT4. Не файлах, если Вы об этом.

МТ4, независимо от того, нужна трейдеру/программе информация по ордерам или нет, получает эти данные с сервера на каждом тике соответствующего символа. То есть эта информация всегда есть и всегда актуальна (при наличии связи). Эксперт/индикатор запрашивает ее у терминала, а терминал отдает то, что у него уже есть. Лишний запрос на сервер здесь не требуется.

Что-то здесь не так. Между приходами тиков соответствующего символа, выходит, история в терминале может и не совпадать с историей на сервере. У меня в советнике после успешного завершения запроса на открытие сделки вновь открытая сделка сразу же (в следующих строках) обнаруживается в истории. Всегда, без ожидания следующего тика. Это в MT4. В MT5 иначе - приходится ждать 15-30 миллисекунд, пока не актуализируется еще один экземпляр истории, самого советника.

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



 
Vlad143:

У меня в советнике после успешного завершения запроса на открытие сделки вновь открытая сделка сразу же (в следующих строках) обнаруживается в истории. Всегда, без ожидания следующего тика. 

Мы говорим о событии срабатывания SL/TP. Они не могут сработать без прихода нового тика.

При открытии/установке/закрытии/удалении ордера алгоритм обновления данных диктуется совершением торгового запроса.

 
komposter:

Что-то вы очень усложнили.

Проверять, сработал ли СЛ или ТП, нужно только при изменении OrdersHistoryTotal(). Обратный цикл, поиск последнего ордера с нужным магиком и символом.
На каждом тике ничего перебирать не надо.

Такой алгоритм не универсален, т. к. пользователь может поменять порядок сортировки в "Истории счета". Он подходит только для тестера.
 
Подскажите, кто-нибудь, если с индикатором идет библиотека ххх.dll, в какую папку ее надо поместить ? Спасибо.
 
Ctmcn:
Подскажите, кто-нибудь, если с индикатором идет библиотека ххх.dll, в какую папку ее надо поместить ? Спасибо.

Документация.


Наблюдения показывают, что вызваный через iCustom индикатор "дремлет" до следующего вызова, а после вызова допросчитывается и снова "дремлет". Это действительно так?

И нельзя ли что-нибудь сказать по #1060392 в Сервисдеск?


 
Y.A.K._:

Документация.


Наблюдения показывают, что вызваный через iCustom индикатор "дремлет" до следующего вызова, а после вызова допросчитывается и снова "дремлет". Это действительно так?


каждый раз индикатор выгружается, а потом снова загружается и полностью просчитывает все доступные бары при следующем вызове, никакой "дремоты" нет.
 
evillive:

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

Извините, но я только что экспериментировал с принтами.

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

 
Y.A.K._:

Извините, но я только что экспериментировал с принтами.

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



может и правда индикатор не выгружается, запринтовал иниты-деиниты с подсчётом в теле OnCalculate:

***
static int initn=0;

int OnInit()
  {
****
   Print("Init number: ", initn);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
{     Print("DeInit number: ", initn);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---
***
   initn++;
   return(rates_total);
}


получается, что индикатор не выгружается, по крайней мере в тестере на протяжении теста:

15:42:39 *** EURGBP,M15: Init number: 0
15:42:39 *** EURGBP,M15: DeInit number: 1
15:42:39 Custom indicator *** EURGBP,M15: removed
15:42:39 TestGenerator: current spread 3 used

15:42:41 2013.08.01 00:15  Custom indicator *** EURGBP,M15: loaded successfully
15:42:41 2013.08.01 00:15  *** EURGBP,M15: Init number: 0

*** много букв, работа советника, словосочетаний "Init number:" или "DeInit number:" не обнаружено

15:42:42 2014.09.01 23:59  *** EURGBP,M15: DeInit number: 26560
15:42:42 EURGBP,M15: 26562 tick events (27562 bars, 54050 bar states) processed within 672 ms (total time 2812 ms)
Причина обращения: