Проблема с историей

 
Уважаемые разработчики!

Я использую следующую функцию для записи в файл истории торгов данным экспертом (см. ниже).
Судя по результатам, записывается не вся история. А именно, если кликнуть в окне Account History правой кнопкой мыши, и выбрать, например, одну неделю в качестве периода, за который надо показывать сделки, то соответствующие функции MQL тоже работают только с периодом в 1 неделю !

Я, конечно, понимаю, что это можно назвать "фичей", но мне кажется, это все-таки баг, и серьезный.

С уважением,
Кварк

void Report(string strFileName)
{
	if(Hour() == 0 && Minute() >= nMagic && IsTesting() == false)
	{
		if(bReportDone == false)
		{
			int hFile = FileOpen(strFileName + "_" + Symbol() + "_" + Period() + ".rpt", 
				FILE_BIN | FILE_WRITE, ',');
			
			string str = "CloseDateTime,Type,Profit\r\n";
			FileWriteString(hFile, str, StringLen(str)); 

			for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++)
			{
				OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);	
				if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
				{
					str = "";
					str = str + TimeToStr(OrderCloseTime(), TIME_DATE|TIME_MINUTES);
					
					if(OrderType() == OP_BUY)
						str = str + ", buy";
					else
						str = str + ", sell";
					
					str = str + "," + OrderProfit();
					str = str + "\r\n";
					
					FileWriteString(hFile, str, StringLen(str));
				}
			}			

			FileFlush(hFile); 
			FileClose(hFile); 
			
			bReportDone = true;
		}
	}
	else if(Hour() != 0)
		bReportDone = false;
}
 
Я, конечно, понимаю, что это можно назвать "фичей", но мне кажется, это все-таки баг, и серьезный.

Почему баг? Один раз выставите тип запрашиваемой истории и именно этот период будет всегда загружаться.

Кстати, поправки по коду
1) hFile = FileOpen(....)
if(hFile>0) { .... } // всегда проверяйте результат открытия файла

2) if(OrderSelect( .... )==false) break; // можно нарваться на асинхронную перезагрузку истории - проверяйтесь всегда
3) FileFlush(hFile); перед самим FileClose() совершенно лишнее
 
С поправками к коду согласен :) спасибо.
А вот насчет истории... Представьте, как трейдеру, мне удобно видеть сделки за последнюю неделю, а не за всю жизнь счета. А вот для отчетности, для того, чтобы в Экселе построить график прибыли, например, и показать начальству, мне нужны все данные. Причем, поскольку приведенная выше функция работает автоматически, раз в сутки, то мне не надо присутствовать, начальство само запустит Эксель, и все увидит. Но оно (начальство) не полезет в МТ, чтобы изменить отображаемый диапазон дат.

Словом, мне кажется, это все-таки очень неудобная фича. Нужно или добавить туда аргумент (OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY,
nDaysToShow = 0), или пусть уж всю историю грузит.

С уважением,
Кварк
 
Все-таки, будет ли в этой логике что-нибудь изменено?

И если нет, не поделитесь ли предложениями, как решить задачу, описанную выше: периодичеки и независимо от настроек окна истории, получать доступ ко всей истории счета?
 
Все-таки, будет ли в этой логике что-нибудь изменено?

И если нет, не поделитесь ли предложениями, как решить задачу, описанную выше: периодичеки и независимо от настроек окна истории, получать доступ ко всей истории счета?

К сожалению, из экспертов нельзя управлять глубиной истории.
 
Попробую описать проблему, как я ее вижу, хотелось бы, чтобы Вы посоветовали пути ее решения, или (в идеальном для меня варианте) все же согласились изменить логику работы этой части МТ. Итак.

Есть эксперт. Он "прикручен" к некоему окну, и работает постоянно. Он зарабатывает что-то, и размер лота, который он использует в торговле растет, соответственно, например:
dLotSize = 0.1 * dInitAmount + 0.1 * dProfit;



Даже для такого примитивного мани менеджмента необходим доступ ко всей глубине истории счета. А поскольку я не знаю, когда эксперту потребуется вычислить размер нового лота, то получается, что в окне Account History ВСЕГДА должна быть показана вся история. Это неудобно, за год, на нескольких экспертах, да с учетом отмененных сделок, это могут быть тысячи строк.

Поэтому я повторяю свое предложение - "отвязать" окно Account History от способности скриптов МТ получать доступ к данным.

Альтернативно, могли бы помочь функции типа GetTotalExpertProfit(nMagic), но по-моему, первый путь проще.

С уважением,
Кварк

 
Прошу прощения за некоторые проблемы с форматированием в предыдущем посте.
 
Даже для такого примитивного мани менеджмента необходим доступ ко всей глубине истории счета.

А можно узнать, зачем?
ИМХО, пример неудачный.
(или я чегото не понял)

При любом (правильном) ММ поведение системы не может зависеть от InitAmount.
ММ не может зависеть от того, откуда взялись эти 100р на вашем счете,
толи вы их перечислили только что, толи заработали в предыдущих операциях.
В любом случае это уже ваши деньги ...

Попытки менять ММ в зависимости от близости к InitAmount не более чем психология.

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

Насчет истории согласен.
Это очень неудачный вариант, когда глубина истории в скриптах зависит от выбранного периода в закладке МТ. Эти длины истории не должны быть связаны. Получается что вроде бы безобидные действия пользователя МТ (не обязательно разработчика) могут приводить к неожиданным побочным эффектам.

Более реальный ИМХО пример.
Работа эксперта может зависеть от результатов предыдущих трейдов.
Например при выставлении стопов/тейков могут использоваться MAE, MFE,
которые считаются по предыдущим трейдам и ценам.
 
Даже для такого примитивного мани менеджмента необходим доступ ко всей глубине истории счета.

А можно узнать, зачем?
ИМХО, пример неудачный.
(или я чегото не понял)


Наконец-то хоть кто-то откликнулся, кроме разработчиков :) А то я думал, эта проблема только мне интересна.

Отвечаю на первый вопрос. Наверное, я неправильно выразился. Не мани менеджмент, а просто управление размером лота. Вы начали торговлю с $1000, и работали с лотом размером 0.1. Затем стало $2000, и лот стал 0.2. Затем $3000, и лот стал 0.3.

Если бы мы работали с одним экспертом, то все было бы просто - все деньги на счету наши. Но что, если экспертов больше: два, три... Я сейчас тестирую пять одновременно, да еще на разных валютных парах. Как узнать, какой эксперт сколько заработал? Ведь если просто брать доступные на счету деньги, и тупо делить их на число экспертов, то прибыль - это очень легко показать - резко упадет, да и отследить, какой эксперт ее \"кушает\" вы сможете только вручную.

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

double dProfit = 0;
for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
{
    OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);
    if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
    {
        dProfit += OrderProfit();
    }
}   



Все хорошо, но если в окне AccountHistory задать интервал, отличный от \"показать все сделки\", то и вышеприведенный цикл начнет работать неправильно. Вот эту проблему я и хотел бы видеть решенной (разработчиками). Во-первых, поскольку я не знаю, когда эксперту потребуется рассчитать текущую прибыль, то и менять отображаемый в окне AccountHistory интервал я не могу НИКОГДА. Во-вторых, если в этом окне показыватеся вся история (представьте! десять окон, в каждом эксперт, занимается скальпингом), то это окно начинает тормозить при перерисовке, и я не знаю, сколько записей оно без риска может показать. И в третьих, это просто противоречит внутренней логике программы, это не интуитивно. Дурной тон программирования, если хотите.


Более реальный ИМХО пример.
Работа эксперта может зависеть от результатов предыдущих трейдов.
Например при выставлении стопов/тейков могут использоваться MAE, MFE,
которые считаются по предыдущим трейдам и ценам.


Может и так. Это некий индикатор, использующий историю торгов, и у меня есть пара систем, которые показывали значительно лучший результат с подобным ММ. Системы эти, как назло, торговали редко, а значит, чтобы получить доступ к двум-трем последним сделкам, мне опять же нельзя сильно сокращать отображаемый в Account History период.

Кварк

 

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


Забыл ответить на этот пункт. Так вот, ГДЕ взять этот глобальный параметр? То есть, этот параметр - это прибыль, которую заработал данный эксперт. Хранить ее в переменной - но что, если компьютер выключен? Сохранить перед выходом? Но что, если он "упал"? Единственный надежный способ, это запросить ее заново, всю историю, и суммированием, получить прибыль. Увы. Все остальные методы ненадежны, а тут все-таки деньги...
 
Единственный вариант что мы можем сделать - это дать возможность из экспертов выставлять период запроса Account History. То есть, эта история будет потом вся видна в окне Account History.

Не забывайте, запрос Account History (особенно по всей истории) - это очень серьезная и затратная выборка из базы данных. Если каждый терминал начнет по запросам экспертов бездумно дергать базу сделок, то о высокой производительности придется забыть. Конечно же, на это мы никогда не согласимся. Чтобы предсказать наш ответ и его обоснование - думайте, пожалуйста, о технической стороне дела.

Кстати, для манименеджмента в 80% случаев достаточно знать всего лишь несколько последних сделок.
Принимать какие-то решения с проходом на всю глубину - это явно лишнее.
Причина обращения: