Форум » Торговые системы OnLine » Недискрентные рендж-бары » Ответить

Недискрентные рендж-бары

Admin: ...

Ответов - 189, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 All

Scriptong: Balbesik пишет: У тебя нет оснований отвечать. Но и с т.з. продолжения общения, тоже нет оснований отвечать. Вот и еще компромис На какой из твоих вопросов я не ответил?

Balbesik: Scriptong пишет: На какой из твоих вопросов я не ответил? Вопрос звучал просто (самое последнее, что мной было написано на ветке - Отправлено: 03.02.16 20:23) - где посмотреть любой пример, как вписан индикатор в советник в виде функции (подразумевал вписан в папке "Include"). Т.к. вопрос связан с памятью и эта проблема для меня старая (неоднократно поднималась мной) у тебя возможно были основания не отвечать. А я со своей стороны не уверен, что вписывание индикатора в советник решает проблему (возможно и будет лучше, но насколько?). Мне интересно сравнить. Схема - удаления графика - восстановление графика (из списка открыть автономно - через Константы нестандартных таймфреймов возможно) - открытие шаблона на вновь открытый график (не знаю как), более мне нравится, но не уверен реализуема ли эта схема. И я не знаю, как эту схему сделать и посмотреть. Да еще Scriptong пишет: Тут подумал немного. Вывод, что, действительно, лишний вызов. Так, если нужно именно выбрасывать дыры (праздники и выходные), то условие "выбрасывания" не должно срабатывать при переходе через сутки. Ведь при переходе со вторника на среду, к примеру, история идет без перерывов. Правильно все если только Т1, если используется Т2, например безразмер = (Т1-Т2)/(Т1+Т2), то еще добавить один блок IsNewTimeSeconds. Как-то так - if (IsNewTimeSeconds(i)) { tt1 = (iTime(NULL,PERIOD_CURRENT,i+1) - iTime(NULL,PERIOD_CURRENT,i+2)); // MathAbs VV1 = (int)iVolume(NULL,PERIOD_CURRENT,i+2); } else { tt1 = (iTime(NULL,PERIOD_CURRENT,i) - iTime(NULL,PERIOD_CURRENT,i+1)); VV1 = (int)iVolume(NULL,PERIOD_CURRENT,i+1); } if ( IsNewTimeSeconds_1(i) ) { tt2 = (iTime(NULL,PERIOD_CURRENT,i+2) - iTime(NULL,PERIOD_CURRENT,i+3)); VV2 = (int)iVolume(NULL,PERIOD_CURRENT,i+3); } else { tt2 = (iTime(NULL,PERIOD_CURRENT,i+1) - iTime(NULL,PERIOD_CURRENT,i+2)); VV2 = (int)iVolume(NULL,PERIOD_CURRENT,i+2); } тогда "все складывается".

Scriptong: Balbesik пишет: где посмотреть любой пример, как вписан индикатор в советник в виде функции К сожалению, нигде. Универсального способа не существует. Для каждого конкретного индикатора требуется индивидуальный подход.


Balbesik: Scriptong пишет: К сожалению, нигде. Универсального способа не существует. Для каждого конкретного индикатора требуется индивидуальный подход. Цель вопроса была - для сравнения (любой вариант). Остальное понятно. Сам я не смог бы синхронизировать и поэтому и не хочу вписывать и иду другим путем. А тут нужна твоя помощь - возможно ли функцией ChartApplyTemplate програмно из индикатора (советника), который стоит на открытом графике, вызвать шаблон на этот же график? Если "Да", то приведи пример, как и куда (в алгоритме) ставится? А то я Ваш "птичий" (программистов) язык не понимаю. Могу разобраться только по аналогии. Ну сильно надо, а странностей тут для меня хватает. В "ручную" шаблон вызывается, память сбрасывается, а параметры оптимизации передам по Глобальным.

Scriptong: Balbesik пишет: возможно ли функцией ChartApplyTemplate програмно из индикатора (советника), который стоит на открытом графике, вызвать шаблон на этот же график? Да, возможно. Но при этом сам советник будет удален с графика, если в шаблоне нет его. Но в любом случае произойдет деинициализация советника. Исходник советника (чтобы не исчез после окончания времени хранения): #property version "1.00" #property strict #define FONT_NAME "Tahoma" #define FONT_SIZE 8 #define BUTTON_NAME "BTN_APPLY" #define BUTTON_CORNER 3 #define BUTTON_WIDTH 110 #define BUTTON_HEIGHT 20 #define BUTTON_TEXT_COLOR clrBlack input string i_templateName = "ADX.tpl"; // Имя шаблона //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { ShowButton(BUTTON_NAME, 120, 25, BUTTON_WIDTH, BUTTON_HEIGHT, "Применить шаблон", false, BUTTON_TEXT_COLOR, clrRoyalBlue); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete(0, BUTTON_NAME); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Функция обработки события чарта | //+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam) { if (id != CHARTEVENT_OBJECT_CLICK) return; if (sparam != BUTTON_NAME) return; ChartApplyTemplate(0, i_templateName); } //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Отображение графического объекта "Кнопка" | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ void ShowButton(string name, int x, int y, int width, int height, string text, bool state, color clrText, color clrBackground) { if (ObjectFind(name) < 0) { ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XSIZE, width); ObjectSetInteger(0, name, OBJPROP_YSIZE, height); ObjectSetInteger(0, name, OBJPROP_CORNER, BUTTON_CORNER); ObjectSetString(0, name, OBJPROP_FONT, FONT_NAME); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, FONT_SIZE); ObjectSetInteger(0, name, OBJPROP_COLOR, clrText); ObjectSetInteger(0, name, OBJPROP_BGCOLOR, clrBackground); ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, clrNONE); ObjectSetInteger(0, name, OBJPROP_BACK, false); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); } ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, name, OBJPROP_STATE, state); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetInteger(0, name, OBJPROP_COLOR, clrText); ObjectSetInteger(0, name, OBJPROP_BGCOLOR, clrBackground); } а также ссылка на файл - test.mq4 Пользоваться так: 1. Перетащить советник на график. 2. В настроечном параметре "Имя шаблона" указать имя файла шаблона, который требуется загрузить. Этот шаблон должен присутствовать в папке каталог_терминала\templates. Расширение tpl указывать обязательно. 3. Нажать ОК. 4. В нижнем правом углу графика появится кнопка "Применить шаблон". Ее нажатие приводит к загрузке указанного шаблона и выгрузке советника.

Balbesik: Scriptong пишет: Да, возможно. Спасибо! Конечно удобно для РУЧНОЙ торговли. И кнопкой и мышкой, но немножко не то, что пытаюсь добиться Balbesik пишет: програмно ....вызвать шаблон на этот же график? ...................................................................................... В "ручную" шаблон вызывается, память сбрасывается.... Схема приведенная в "букваре" работает // if(!IsTesting() && curTime > g_optimizeTime_1 && Flag == 1) // { if(FileIsExist("319.tpl")) { Print("Шаблон 319.tpl найден в каталоге \\Files'"); // Momentum //--- применим найденный шаблон if(ChartApplyTemplate(0,"\\Files\\319.tpl")) { Print("Применили успешно шаблон '319.tpl'"); } else Print("Не удалось применить шаблон '319.tpl', ошибка ",GetLastError()); } // } else { Print("Файл '319.tpl' не найден в папке " +TerminalInfoString(TERMINAL_PATH)+"\\MQL4\\Files"); } , но как бы я не изгалялся прописать путь к папке templates не смог (ну пусть остается MQL4 / Files). Буду думать, как заставить твой советник сбрасывать память автоматически. Хотя если все сразу "патерны" ("8 советников за один проход") то, если раз в сутки, эта проблема решается (оптимизация до 24:00, сброс после), но боюсь в один прекрасный момент памяти может не хватить и все зависнит - тут почему-то от накопленной тиковой истории зависит при оптимизации (советник твой, все ограничения стоят, ничего в этом плане не переделывал). Здесь пожелание для базы тиковой истории - было бы интересно если архив в том числе был бы разбит помесячно. Хочу добиться "оптимизация - сброс" по очереди по одному. Т.к. советник не понимает, когда при установки на график задается время назад - тут же входит в режим оптимизации (советник стоит в шаблоне и время одно и тоже, при сбросе получается время назад - если это решу, то фактически задача будет решена). Кстати странно, почему этот вопрос никого не интересует, если брать стат. анализ (как наиболее "наукоприближенный"), то памяти точно не будет хватать. P.S. Надеюсь все понимают, что вопрос памяти абсолютно не зависит от компа, тут хоть "тресни" вопрос МКЛ-я .

Scriptong: Balbesik пишет: но как бы я не изгалялся прописать путь к папке templates не смог Есть такое понятие - "песочница терминала". Эта песочница ограничивается папками MQL4\Files в режиме онлайн и tester\files в режиме тестирования. В другие папки средствами MQL4 попасть нельзя. Чтобы это сделать, нужно использовать Windows API, т. е. нужно будет разрешить вызов функций из dll. При работе с функцией ChartApplyTemplate и не нужно пытаться как-то попадать в папку templates. Функция делает это автоматически. Поэтому в данном случае FileIsExists - лишнее. Balbesik пишет: Буду думать, как заставить твой советник сбрасывать память автоматически. В тестере это никак не сделать. В онлайн - да, может помочь.

Balbesik: Scriptong пишет: Есть такое понятие - "песочница терминала" Спасибо, Игорь! Ну я не программист и естественно в такие детали не вникаю - считаю это лишнее. Мах, что полагаю необходимо, приблизительно разбираться в коде, т.к."черный ящик" неприемлем при работе с деньгами, а в остальном должны разбираться "специально обученные люди" (специалисты по данному вопросу). Scriptong пишет: В тестере это никак не сделать. В онлайн - да, может помочь. В тестере этого и не надо, регулируется размером истории (я писал об этой странности). Если взять ТИКОВЫЙ график истории за год и поставить на оптимизацию Советником, то сразу "затык"- вся память"сьедается" на первом проходе. Ну а в остальном все нормально работает. Использовать шаблон, это первое, что мне пришло в голову. Картинки (в советнике Игоря) просто так на память скидываю и возможно кому-нибудь пригодится, т.к. до этого интересовался у "спецов" с Кодебазы, они предложили сбросить память за 300 баксов (уж не знаю, что там задумывалось). Это даже не предложение, а "хамло зажравшихся". По картинкам все понятно, возможно флаг - лишнее.

Scriptong: Balbesik пишет: они предложили сбросить память Ничего, кроме патча для терминала на ум не приходит. Но это уже хакерские штучки, а потому за подобное $300 это еще и немного



полная версия страницы