Подскажите пожалуйста, как нарисовать прямоугольник с заливкой в цвет фона, в левом верхнем углу с небольшим отступом ( для эстетичности) поверх графика и под текстом выводимым экспертом?
if(!trend)
{
(if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) // Если бар соответствует требуемым признакам..
cnt++; // .. прибавим 1 к счётчикуif (Close[i] < Open[i]) // Если бар, не соответствует основному признаку..
cnt = 0;
}
else
{
...
}
Ребята подскажите где можно скачать библиотеку Звуковых уведомлений. тоесть чтобы голосом воспроизводилось например "Позиция Buy закрыта по тейкпрофиту". чтобы можно было воспроизводить в PlaySound("Buy_close_tp.wav");
Есть вопрос по работе тестера: После того, как прошел тест, меняешь параметры (даты, валютную пару, таймфрейм), запускаешь заново тест - он идет, а по его завершению абсолютно не меняется информация во вкладках типа "график" и "отчет"-все остается с предыдущего теста. Сохраненный отчет тоже оказывается старый. С чем связано, и как это решить? Может быть, есть какая-нибудь функция сброса результатов?
Выкурил мануал, статьи, провел поиск по форуму - упоминания подобной проблемы не встречал..
Не должно такого быть, может быть у Вас галочка "Оптимизация" стоит?.
Не должно такого быть, может быть у Вас галочка "Оптимизация" стоит?.
О, похоже в этом дело: при запуске нового теста не обращал внимание на то, что включена оптимизация, думал - не критично. Немного странное решение интерфейса...
TarasBY: В логику сильно не вникал, но, что-то мне подсказывает, что есть лишние вычисления. Год-полтора назад я решал однотипную задачу со сбором котировок и формированием М1 свечей с чёткой нарезкой по началу астрономической минуты. Если будет интересно, можете глянуть несколько моментов чисто по оптимизации Вашего кода (файл). Правда, если серъёзно говорить об оптимизации, нужно замерять время исполнения кода. ;)
Сейчас пробую по-другому полностью с нуля.
Вопрос к Вадиму по маппингу. Итак. Начал всё с чистого листа. Берём изначальный тиковый ТФ owner'а:
Там логика в принципе-то простая-простейшая: Ловим бид-аск, формируем RateInfo, тоько время заносим в Volume, а Time моделируем. Теперь не разбираясь, как моделируется Time, убираем моделирование полностью, делаем по стандартному TOLHCV, а перед этим ставим "если прошло больше 0 секунд с последнего вызова start()". Если прошло меньше в другой ветке того же условия редактируем High-Low и делаем инкремент Volume. То есть по-сути то же самое что и выкладывал, только с полностью убранным циклом, т.е. получаем секундный ТФ "с дырами" (с пропусками секунд):
Также полностью оставил градацию на бычьи-медвежьи. Стоит игра свеч? Проверяем, ставим GetTickCount() с принтованием на этот вариант и изначальный от owner'а, запускаем их одновременно на одном графике, смотрим лог:
16:14:56 Сек.тф с проп. AUDUSD,M1: 016:14:56 Тик.тф AUDUSD,M1: 016:14:56 Сек.тф с проп. AUDUSD,M1: 016:14:56 Тик.тф AUDUSD,M1: 016:14:56 Сек.тф с проп. AUDUSD,M1: 016:14:57 Тик.тф AUDUSD,M1: 016:14:57 Сек.тф с проп. AUDUSD,M1: 016:14:58 Тик.тф AUDUSD,M1: 016:14:58 Сек.тф с проп. AUDUSD,M1: 016:14:58 Тик.тф AUDUSD,M1: 016:14:58 Сек.тф с проп. AUDUSD,M1: 016:14:58 Тик.тф AUDUSD,M1: 016:14:58 Сек.тф с проп. AUDUSD,M1: 016:15:00 Тик.тф AUDUSD,M1: 016:15:00 Сек.тф с проп. AUDUSD,M1: 016:15:00 Тик.тф AUDUSD,M1: 016:15:00 Сек.тф с проп. AUDUSD,M1: 016:15:04 Тик.тф AUDUSD,M1: 016:15:04 Сек.тф с проп. AUDUSD,M1: 016:15:04 Тик.тф AUDUSD,M1: 016:15:04 Сек.тф с проп. AUDUSD,M1: 016:15:05 Тик.тф AUDUSD,M1: 016:15:05 Сек.тф с проп. AUDUSD,M1: 016:15:05 Тик.тф AUDUSD,M1: 016:15:05 Сек.тф с проп. AUDUSD,M1: 016:15:05 Тик.тф AUDUSD,M1: 016:15:05 Сек.тф с проп. AUDUSD,M1: 016:15:06 Тик.тф AUDUSD,M1: 016:15:06 Сек.тф с проп. AUDUSD,M1: 016:15:07 Тик.тф AUDUSD,M1: 016:15:07 Сек.тф с проп. AUDUSD,M1: 016:15:08 Тик.тф AUDUSD,M1: 016:15:08 Сек.тф с проп. AUDUSD,M1: 016:15:08 Тик.тф AUDUSD,M1: 016:15:08 Сек.тф с проп. AUDUSD,M1: 016:15:09 Тик.тф AUDUSD,M1: 016:15:09 Сек.тф с проп. AUDUSD,M1: 016:15:09 Тик.тф AUDUSD,M1: 016:15:09 Сек.тф с проп. AUDUSD,M1: 016:15:09 Тик.тф AUDUSD,M1: 1616:15:09 Сек.тф с проп. AUDUSD,M1: 016:15:10 Тик.тф AUDUSD,M1: 016:15:10 Сек.тф с проп. AUDUSD,M1: 1616:15:11 Тик.тф AUDUSD,M1: 016:15:11 Сек.тф с проп. AUDUSD,M1: 016:15:11 Тик.тф AUDUSD,M1: 016:15:11 Сек.тф с проп. AUDUSD,M1: 016:15:12 Тик.тф AUDUSD,M1: 016:15:12 Сек.тф с проп. AUDUSD,M1: 15
Это в коде секундного тф. У советника, который будет висеть на самом секундном тф, значения TOLHCV x секунд назад тогда можно будет получить как ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1, если конечно этот массив как-то передать. Итак, пользуемся маппингом:
//в шапке#import "SharedMemoryMT4.dll"int MemoryCreate(int nArea, string sPrefixArea, int hFileUser, int nIndex, string sName, int nSize);
bool MemoryWriteInt(int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte, int nValue);
bool MemoryCloseHandle(int nArea, string sPrefixArea, int hMemory);
#import//в инит
hMapping=MemoryCreate(1, "", NULL, -1, "ind", 60*GlobalVariableGet("ADXBars"));
//в деинит
MemoryCloseHandle(1, "", hMapping);
//в старт вместо for(; i<Σ; i++) MemoryWriteInt(1, "", -1, "ind", i, iBars(sn, 1));//ind[i]=iBars(sn, 1);
Пишем тестовый скрипт, который будет висеть на секундах и прочитает значения TOLHCV икс секунд назад (а не свечей):
#property show_inputs#import "SharedMemoryMT4.dll"int MemoryOpen(int nArea, string sPrefixArea, int nIndex, string sName);
int MemoryReadInt(int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte);
#importexternint x;//сколько секунд назад с данного момента прикрепления смотрим значения TOLHCVint init()
{
MemoryOpen(1, "", -1, "ind");
return(0);
}
int start()
{
//MemoryReadInt(1, "", -1, "ind", i) это ind[i], GlobalVariableGet("final") это последний элемент в массиве, а ф-ла выглядит так: n=ind[final]-ind[final-x]+1int n=MemoryReadInt(1, "", -1, "ind", GlobalVariableGet("final"))-MemoryReadInt(1, "", -1, "ind", GlobalVariableGet("final")-x)+1;
Alert(TimeToStr(TimeCurrent(),TIME_SECONDS), ": Time=", TimeToStr(Time[n], TIME_SECONDS), ", Open=", Open[n], ", High=", High[n], ", Low=", Low[n], ", Close=", Close[n], ", Volume=", Volume[n]);
return(0);
}
Запускаем секундный таймфрейм. При инициализации выводится окно
Ошибка в методе "Utils::Memory::Mapping::Create()".
В файловом отображении ""
не выделена память при отсутствии дескриптора пользовательского файла.
В логе 58.572 раза
10:45:42 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.
...
10:48:43 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.
а при деинициализации выводит окно
В методе "MT4::Memory::SearchIndexOrHandle()" не установлен параметр для поиска в области памяти терминала.
Ну деинициализация это потом, ставлю скрипт - алерт ни разу. Закомменчиваю MemoryCreate и MemoryCloseHandle, ничего не выводит (скрипт алерт выводит), в логе
- и всё. Значит, логически рассуждая, я использую вызовы не в том порядке, или неправильно объявляю, или не то объявляю. Ось WinXP. Вадим, хотя бы подскажите, в каком направлении двигаться.
Здравствуйте гуру программирования
Подскажите пожалуйста, как нарисовать прямоугольник с заливкой в цвет фона, в левом верхнем углу с небольшим отступом ( для эстетичности) поверх графика и под текстом выводимым экспертом?
Заранее спасибо
if(!trend) { (if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) // Если бар соответствует требуемым признакам.. cnt++; // .. прибавим 1 к счётчику if (Close[i] < Open[i]) // Если бар, не соответствует основному признаку.. cnt = 0; } else { ... }это тоже самое.. Расписывать тоже, только для другой ситуации.
Дык а это разве не оно?
Артём, не сочти за труд, писни кодом, а? Или дай мне вон ту штуку, что у тебя в руке, я закончу эти мучения...
Есть вопрос по работе тестера: После того, как прошел тест, меняешь параметры (даты, валютную пару, таймфрейм), запускаешь заново тест - он идет, а по его завершению абсолютно не меняется информация во вкладках типа "график" и "отчет"-все остается с предыдущего теста. Сохраненный отчет тоже оказывается старый. С чем связано, и как это решить? Может быть, есть какая-нибудь функция сброса результатов?
Выкурил мануал, статьи, провел поиск по форуму - упоминания подобной проблемы не встречал..
Не должно такого быть, может быть у Вас галочка "Оптимизация" стоит?.
Не должно такого быть, может быть у Вас галочка "Оптимизация" стоит?.
О, похоже в этом дело: при запуске нового теста не обращал внимание на то, что включена оптимизация, думал - не критично. Немного странное решение интерфейса...
Но теперь все работает, большее спасибо!
В логику сильно не вникал, но, что-то мне подсказывает, что есть лишние вычисления. Год-полтора назад я решал однотипную задачу со сбором котировок и формированием М1 свечей с чёткой нарезкой по началу астрономической минуты.
Если будет интересно, можете глянуть несколько моментов чисто по оптимизации Вашего кода (файл). Правда, если серъёзно говорить об оптимизации, нужно замерять время исполнения кода. ;)
Сейчас пробую по-другому полностью с нуля.
Вопрос к Вадиму по маппингу. Итак. Начал всё с чистого листа. Берём изначальный тиковый ТФ owner'а:
Там логика в принципе-то простая-простейшая: Ловим бид-аск, формируем RateInfo, тоько время заносим в Volume, а Time моделируем. Теперь не разбираясь, как моделируется Time, убираем моделирование полностью, делаем по стандартному TOLHCV, а перед этим ставим "если прошло больше 0 секунд с последнего вызова start()". Если прошло меньше в другой ветке того же условия редактируем High-Low и делаем инкремент Volume. То есть по-сути то же самое что и выкладывал, только с полностью убранным циклом, т.е. получаем секундный ТФ "с дырами" (с пропусками секунд):
Также полностью оставил градацию на бычьи-медвежьи. Стоит игра свеч? Проверяем, ставим GetTickCount() с принтованием на этот вариант и изначальный от owner'а, запускаем их одновременно на одном графике, смотрим лог:
что и ожидалось. Тиковый - оригинальный, секундный с пропусками - модифицированный. Теперь формируем вспомогательный массив перед time=TimeCurrent():
Это в коде секундного тф. У советника, который будет висеть на самом секундном тф, значения TOLHCV x секунд назад тогда можно будет получить как ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1, если конечно этот массив как-то передать. Итак, пользуемся маппингом:
Пишем тестовый скрипт, который будет висеть на секундах и прочитает значения TOLHCV икс секунд назад (а не свечей):
Запускаем секундный таймфрейм. При инициализации выводится окно
В логе 58.572 раза
а при деинициализации выводит окно
В методе "MT4::Memory::SearchIndexOrHandle()" не установлен параметр для поиска в области памяти терминала.Ну деинициализация это потом, ставлю скрипт - алерт ни разу. Закомменчиваю MemoryCreate и MemoryCloseHandle, ничего не выводит (скрипт алерт выводит), в логе
- и всё. Значит, логически рассуждая, я использую вызовы не в том порядке, или неправильно объявляю, или не то объявляю. Ось WinXP. Вадим, хотя бы подскажите, в каком направлении двигаться.