Jump to content

Напишу советник, скрипт, индикатор на MQL бесплатно


Capman
Message added by Capman,

Данная ветка предназначена для тех, кто ищет помощи специалистов в реализации своих торговых идей для терминала MetaTrader, а также для специалистов MQL, готовых воплощать интересные идеи трейдеров на безвозмездной основе.

 

Вот рекомендации, которым нужно следовать:

  • Идея торговой системы/индикатора/скрипта должна быть полностью описана Вами в сообщении.
  • Выкладывать декомпилированный код запрещено.
  • Программы, изготавливаемые по публичным заданиям, должны выкладываться с открытым кодом.
  • Конфиденциальность гарантируется только при заказе советника за деньги. Самым надежным способом заказа советника является сервис "Работа" от компании MetaQuotes. В этом разделе форума запрещено оставлять объявления о заказе или выполнении работ по написанию советников. Для этого используйте раздел "Реклама".
  • Если кого-либо из программистов заинтересует Ваша идея, или он просто захочет помочь, то займется написанием. Отсутствие ответов означает, что Ваша идея никого пока не заинтересовала. Повторять пост с просьбой в этом случае не нужно (такие посты нарушают правило форума 10).

Recommended Posts

Hitronrav
30.10.2021 в 15:02, loewe сказал:

у позиций удаляется стопы

 

Так себе идея. Вот близкие стоповые отложки, согласен, надо убирать на время расширения спреда. Я так понимаю, это требуется для ручных торговцев? Потому что если один советник начнёт удалять/восстанавливать ордера другого, то при определённой схеме работы этого другого может получиться лютая дичь.

 

1 час назад, Pirojoque Project сказал:

Может лучше тогда вовсе перейти на "виртуальные стопы" (когда советник с учётом "приемлемости спреда" сам будет закрывать позиции при переходе "стоп-цены")?

 

Опасно, вдруг советник слетит или VPS упадёт, или сервер перезагрузят по закону подлости как раз в тот момент, когда пошло мощнейшее движение и следовало закрыть позы по виртуальному стопу. Хотя, если ставить страховочный настоящий стоп, скажем, в 2 раза дальше обычного, то схема будет пригодна к использованию.

Link to post
Share on other sites
  • Replies 143
  • Created
  • Last Reply

Top Posters In This Topic

  • DVargo

    24

  • Ugar68

    16

  • Pirojoque Project

    13

  • BooGUY

    13

Top Posters In This Topic

Popular Posts

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

Если данные свечей больше нигде не будут нужны, то и запоминать их не зачем. Да и без массивов можно обойтись. Всё делать в момент открытия свечи. Если сформировалась свеча >= X, то переб

Советник называется cm partial closing position 1.Советник отслеживает открытые позиции по всем или заданному инструменту. 2 При достижении указанной прибыли закрывает часть позиции. Можно у

Posted Images

Ugar68
25 минут назад, Hitronrav сказал:

Опасно, вдруг советник слетит или VPS упадёт, или сервер перезагрузят по закону подлости как раз в тот момент, когда пошло мощнейшее движение и следовало закрыть позы по виртуальному стопу. Хотя, если ставить страховочный настоящий стоп, скажем, в 2 раза дальше обычного, то схема будет пригодна к использованию.

Надо контролировать. Не вручную конечно. Терминал и связь можно контролировать софтом на том же VPS. В советник внедряется функция, или можно реализовать в виде отдельного индикатора,  функция переписывает время в файле, например каждую минуту. Пишется скрипт в CMD файлике. Задаётся планировщику винды запускать его каждую минуту. Он сравнивает время в компьютере и в файле, если разница больше 2 минут, значит терминал висит, отправляется уведомление.  VPS контролируется с другого сервера. Есть программы пинговалки. Они периодически пингуют ip адрес и отправляют сообщение если не пингуется. Ну или то же можно написать скрипт и запускать планировщиком.

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Askhat2o

Здравствуйте! Могли бы вы написать 2 скрипта:
1)скриптом выставляется 4 ордера селл/бай стоп/лимит, в зависимости от цены, указанную в параметрах скрипта, при этом между селл стоп и бай лимит должно быть расстояние в виде фиксированного спреда(должно регулироваться в настройках), т.е открываться должно 2 ордера одновременно(локовые), аналогично и для селл лимит и бай стоп. Также в настройках должно быть: шаг сетки, кол-во ордеров для каждого или группы ордеров, тейк профит, лотность без стоп лосса.
2) скрипт, который открывает последние 2 закрывшиеся недавно ордера по тейк профиту через определенное время(от 1 секунды до 10) При этом скрипт после "своей работы" должен будет восстановиться и вновь выводиться на экран и так по циклу.
Вообще возможно такое?
Заранее благодарен!

Link to post
Share on other sites
Pirojoque Project
3 часа назад, Hitronrav сказал:

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

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

 

3 часа назад, Ugar68 сказал:

Терминал и связь можно контролировать софтом на том же VPS. В советник внедряется функция, или можно реализовать в виде отдельного индикатора,  функция переписывает время в файле, например каждую минуту. Пишется скрипт в CMD файлике. Задаётся планировщику винды запускать его каждую минуту. Он сравнивает время в компьютере и в файле, если разница больше 2 минут, значит терминал висит, отправляется уведомление.  VPS контролируется с другого сервера. Есть программы пинговалки. Они периодически пингуют ip адрес и отправляют сообщение если не пингуется. Ну или то же можно написать скрипт и запускать планировщиком.

Реализация watch-dog'а может быть любой. Главное, чтобы в случае отказа об этом узнать более-менее быстро. Например, отличный вариант — telegram-бот для связи советника и "сторожа". Если "сторож" обнаружит потерю связи с советником, пусть сообщит хоть по почте, хоть по тому же телеграму.

Link to post
Share on other sites
Ugar68
1 час назад, Pirojoque Project сказал:

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

 

Реализация watch-dog'а может быть любой. Главное, чтобы в случае отказа об этом узнать более-менее быстро. Например, отличный вариант — telegram-бот для связи советника и "сторожа". Если "сторож" обнаружит потерю связи с советником, пусть сообщит хоть по почте, хоть по тому же телеграму.

Следить за зависанием надо из вне контролируемого объекта. Например если следить за потерей связи терминала из самого терминала, следилка обнаружит потерю связи, но сообщение не отправит из за отсутствия связи. Например, бессмысленно отправлять сообщение Push или email с помощью терминала о потере связи. Ведь без связи терминал не может отправить сообщение. Я делал индикатор, который следил за связью и запускал CMD скрипт, а уже он отправлял уведомление.

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

Телегабот на MQL скорее подходит для сообщений от работающего советнике или индикатора. Например следить за рынком и сообщать об интересующих событиях. Но для этого уже есть встроенный в терминал Push и email. Ещё до появления  Push я использовал отправку на email совместно с бесплатной услугой сотовых операторов email на sms.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Pirojoque Project

Отсутствие сообщений = сообщение о потере связи. Разумеется, нужен приёмник-сторож, который и поднимет тревогу, если постоянная переписка с наблюдаемой стороной прекратится.

  • Upvote 1
Link to post
Share on other sites
loewe
23 часа назад, Pirojoque Project сказал:

Код, отслеживающий спред, должен быть внедрён в торгующий советник, иначе выйдет добротный велосипед на костылях. Более того, от ТС поведение при событиях по спреду могут сильно различаться, т.е. подобные решения не универсальны.

Согласен. Но для этого нужен код. Желательно модульный, чтобы его можно было встраивать и в советник и в скрипт.

  

  

23 часа назад, Ugar68 сказал:

Ну допустим советник удалил отложки и стопы на ночь запомнив куда их вернуть. А когда спред нормализовался цена пересекла уровни стопов или срабатывания отложки. Вернуть на то же место не сможет.

 

Отличное замечение. В этом случае работаем по рынку. Т.е. закрываем позиции со сработавшими стопами и открываем сработавшие отложки.

Edited by loewe
Link to post
Share on other sites
Pirojoque Project
2 часа назад, loewe сказал:

Согласен. Но для этого нужен код. Желательно модульный, чтобы его можно было встраивать и в советник и в скрипт.

Под МТ5 решение из статьи можно приспособить под себя, хотя о модульности и универсальности речи не идёт, реализовать всё это можно очень по-разному. Под МТ4 я использовал примитивную схему с применением глобальных переменных, может быть пригодится для использования "по-простому" (т.е. с усреднением по всем накопленным за время работы тикам, без статистик по времени и т.п.):

Скрытый текст

  //=====================================================================================//
 // Описание класса                                                                                    (CLASS) //
//=====================================================================================//

class c_AverageSpread /// Average Spread
{
    private:
        bool        Loaded;                // Флаг полной загрузки
        double    ASpreadValue;        // Значение среднего спреда
        uint        SpreadTicks;        // Статистика. Количество тиков
        uint        SpreadSum;            // Статистика. Сумма спредов
        uint        SpreadLast;            // Статистика. Время последнего тика
        uint        SpreadCtrl;            // Статистика. Контрольная сумма пунктов (Ask + Bid)
        string    Symbol;                // Инструмент
        string    GV_Ticks;            // Имя ГП. Количество тиков
        string    GV_Sum;                // Имя ГП. Сумма спредов
        string    GV_Last;                // Имя ГП. Время последнего тика
        string    GV_Ctrl;                // Имя ГП. Контрольная сумма пунктов (Ask + Bid)
    
        void        GV_Names();            // Загрузка имён глобальных переменных (ГП)
        void        Stat_Optimize();    // Оптимизировать статистику
        void        Stat_Save();        // Запись статистики
        void        Stat_Refresh();    // Запись статистики
        bool        Stat_Load();        // Загрузка статистики (возвращает актуальность данных)
        bool        System_Loaded();    // Система полностью загружена?
//—————————————————————————————————————————————————————————————————————————————————————//
    public:
        c_AverageSpread(string symbol);    // Конструктор

        double    GetValue();        // Значение среднего спреда
        void        Refresh();        // Обновить статистику
};//~

  //=====================================================================================//
 // Конструктор                                                                                         (INIT) //
//=====================================================================================//

c_AverageSpread :: c_AverageSpread(string symbol) /// Конструктор
{
    Loaded    = false;
    Symbol    = symbol;

    GV_Ticks    = "";
    GV_Sum    = "";
    GV_Last    = "";
    GV_Ctrl    = "";

    SpreadTicks    = 0;
    SpreadSum    = 0;
    SpreadLast    = 0;
    SpreadCtrl    = 0;

    Refresh();
}//~

  //=====================================================================================//
 // Методы                                                                                              (METHODS) //
//=====================================================================================//

double c_AverageSpread :: GetValue() /// Значение среднего спреда
{
    return ASpreadValue;
}//~ ——————————————————————————————————————————————————————————————————————————————————//

void c_AverageSpread :: Refresh() /// Обновить статистику
{
    ASpreadValue = MarketInfo(Symbol, MODE_SPREAD);
    if(IsTesting()) return; // При тестировании используем только текущий спред

    if(!Loaded) // Если нет полной загрузки
    {
        if(IsAccLoaded()) // Проверяем состояние
        {
            GV_Names(); // Если всё хорошо, инициализируем имена ГП
        }
        else return; // Если провал, выходим
    }

    if(!Stat_Load()) // Если статистика устарела
    {
        Stat_Refresh(); // Обновить статистику

        if(SpreadTicks > 1500000) // Если слишком много тиков накопилось
        {
            Optimize(); // Оптимизировать статистику
        }
        Stat_Save(); // Сохранить состояние
    }
}//~ ——————————————————————————————————————————————————————————————————————————————————//

void c_AverageSpread :: Stat_Optimize() /// Оптимизировать статистику
{
    if(SpreadSum > 1000 * 1000 * ASpreadValue)
    {
        SpreadTicks    = 500 * 1000;
        SpreadSum    = (uint)MathRound(ASpreadValue * SpreadTicks);
    }
}//~ ——————————————————————————————————————————————————————————————————————————————————//

void c_AverageSpread :: GV_Names() /// Загрузка имён глобальных переменных (ГП)
{
    string server = AccountServer();
    string identify = StringConcatenate("AvSpread_", server, "_", Symbol);

    GV_Ticks    = StringConcatenate(identify, "_Ticks");
    GV_Sum    = StringConcatenate(identify, "_Sum");
    GV_Last    = StringConcatenate(identify, "_Last");
    GV_Ctrl    = StringConcatenate(identify, "_Ctrl");
}//~ ——————————————————————————————————————————————————————————————————————————————————//

void c_AverageSpread :: Stat_Save() /// Запись статистики
{
    GlobalVariableSet(GV_Ticks, SpreadTicks);
    GlobalVariableSet(GV_Sum, SpreadSum);
    GlobalVariableSet(GV_Last, SpreadLast);
    GlobalVariableSet(GV_Ctrl, SpreadCtrl);
}//~ ——————————————————————————————————————————————————————————————————————————————————//

void c_AverageSpread :: Stat_Refresh() /// Обновление статистики
{
    SpreadSum += (uint)ASpreadValue;        // Добавляем текущий тик (текущий спред)
    SpreadTicks++;                                // Добавляем текущий тик (счётчик тиков)

    double    ask    = SymbolInfoDouble(Symbol, SYMBOL_ASK);
    double    bid    = SymbolInfoDouble(Symbol, SYMBOL_BID);
    double    point    = SymbolInfoDouble(Symbol, SYMBOL_POINT);

    uint        ctrl    = (uint)(ask / point + bid / point);
    uint        time    = (uint)SymbolInfoInteger(Symbol, SYMBOL_TIME);

    SpreadLast        = time;    // Время последнего тика
    SpreadCtrl        = ctrl;    // Контрольное число

    ASpreadValue    = (double)SpreadSum / (double)SpreadTicks; // Вычисляем средний спред
}//~ ——————————————————————————————————————————————————————————————————————————————————//

bool c_AverageSpread :: Stat_Load() /// Загрузка статистики (возвращает актуальность данных)
{
    double    ask    = SymbolInfoDouble(Symbol, SYMBOL_ASK);
    double    bid    = SymbolInfoDouble(Symbol, SYMBOL_BID);
    double    point    = SymbolInfoDouble(Symbol, SYMBOL_POINT);

    uint        ctrl    = (uint)(ask / point + bid / point);
    uint        time    = (uint)SymbolInfoInteger(Symbol, SYMBOL_TIME);

    if(GlobalVariableCheck(GV_Ticks))    SpreadTicks    = (uint)GlobalVariableGet(GV_Ticks);
    if(GlobalVariableCheck(GV_Sum))        SpreadSum    = (uint)GlobalVariableGet(GV_Sum);
    if(GlobalVariableCheck(GV_Last))        SpreadLast    = (uint)GlobalVariableGet(GV_Last);
    if(GlobalVariableCheck(GV_Ctrl))        SpreadCtrl    = (uint)GlobalVariableGet(GV_Ctrl);

    if(time == SpreadLast && ctrl == SpreadCtrl) return true;
    return false;
}//~ ——————————————————————————————————————————————————————————————————————————————————//

bool c_AverageSpread :: System_Loaded() /// Система полностью загружена?
{
    if(Loaded)                             return true;    // Проверка уже не требуется

    if(AccountNumber() < 1)            return false;    // Проверка номера счёта
    if(AccountServer() == "")        return false;    // Проверка имени сервера
    if(AccountCompany() == "")        return false;    // Проверка имени компании

    Loaded = true;    // Проверки пройдены, счёт полностью загружен
    return Loaded;
}//~

//=====================================================================================//

В одном эксперте или скрипте можно создать несколько таких объектов под разные символы, если требуется. Обновлять Refresh() нужно на каждом тике. Получать значение можно где требуется, можно даже по несколько раз за тик. Для оценки адекватности текущих цен этого может хватить (мне хватает).

 

2 часа назад, loewe сказал:

Отличное замечение. В этом случае работаем по рынку. Т.е. закрываем позиции со сработавшими стопами и открываем сработавшие отложки.

Получается поведение, как при работе "виртуальных стопов". Лучше при этом иметь настоящие страховочные стопы, как предлагает Hitronrav. На всякий случай, конечно 🙂

Edited by Pirojoque Project
Link to post
Share on other sites
loewe

Похоже, все тонкости обсуждены. Автора ветки в студию...

Link to post
Share on other sites
BooGUY

Доброго времени суток. 

 

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

 
Дано N свечей назад. Найти в них свечи размером >= X пунктов, запомнить их общее количество и размер каждого из них. Если текущая свеча после закрытия оказалась >= X пунктов, то сравнить её размер с общим кол-вом найденных свечей и вывести следующий результат - какое место она занимает по размеру среди всех найденных.
 
На мкл сайте затруднились выполнить, но указали на использование массивов. 

Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites
Pirojoque Project
3 часа назад, BooGUY сказал:

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

Если я всё правильно понял, то неоптимизированный вариант может быть таким:

int BarRank(uint n, double x)
{
	double bars[]; // Массив хранения отобранных свечей
	double last_bar = 0; // Размер последней рассматриваемой свечи

	for(int i = 0; i < n; i++) // Перебираем n последних свечей
	{
		double bar_size = High[i] - Low[i]; // Размер свечи

		if(i == 0) last_bar = bar_size; // Размер последней свечи
		if(bar_size >= x) // Если размер свечи больше/равен x
		{
			int newsize = ArraySize(bars) + 1;
			ArrayResize(bars, newsize);

			bars[newsize - 1] = bar_size; // Добавляем этот размер в массив
		}
	}
	if(bars[0] < x) // Если последняя свеча меньше порога
	{
		return 0; // Возвращаем ноль
	}
	ArraySort(bars, WHOLE_ARRAY, 0, MODE_DESCEND); // Сортируем массив отобранных свечей

	int rank = ArraySize(bars); // Позиция последней свечи изначально последняя

	for(int i = 1; i <= ArraySize(bars); i++) // Перебираем отобранные отсортированные свечи
	{
		if(last_bar >= bars[i]) rank = i; // Если последняя больше рассматриваемой, даём место
		else break; // Если меньше, заканчиваем перебор
	}
	return rank; // Возвращаем результат (место последней свечи среди отобранных по критерию)
}

 

Функция требует отладки! Запускать такую функцию нужно на открытии новой свечи, а не на каждом тике — каждый раз она занимается отбором свечей по критерию и сортировкой. Чтобы этого избежать, можно использовать модифицированные кольцевые массивы (это потребует использование класса) и сохранять состояние между запусками (т.е. хранить массивы отобранных свечей в глобальных переменных). Короче, оптимизация сложней, а значит бесплатно вряд ли кто станет это делать.

  • Thanks 1
Link to post
Share on other sites
BooGUY
2 часа назад, Pirojoque Project сказал:

Если я всё правильно понял, то неоптимизированный вариант может быть таким:


int BarRank(uint n, double x)
{
	double bars[]; // Массив хранения отобранных свечей
	double last_bar = 0; // Размер последней рассматриваемой свечи

	for(int i = 0; i < n; i++) // Перебираем n последних свечей
	{
		double bar_size = High[i] - Low[i]; // Размер свечи

		if(i == 0) last_bar = bar_size; // Размер последней свечи
		if(bar_size >= x) // Если размер свечи больше/равен x
		{
			int newsize = ArraySize(bars) + 1;
			ArrayResize(bars, newsize);

			bars[newsize - 1] = bar_size; // Добавляем этот размер в массив
		}
	}
	if(bars[0] < x) // Если последняя свеча меньше порога
	{
		return 0; // Возвращаем ноль
	}
	ArraySort(bars, WHOLE_ARRAY, 0, MODE_DESCEND); // Сортируем массив отобранных свечей

	int rank = ArraySize(bars); // Позиция последней свечи изначально последняя

	for(int i = 1; i <= ArraySize(bars); i++) // Перебираем отобранные отсортированные свечи
	{
		if(last_bar >= bars[i]) rank = i; // Если последняя больше рассматриваемой, даём место
		else break; // Если меньше, заканчиваем перебор
	}
	return rank; // Возвращаем результат (место последней свечи среди отобранных по критерию)
}

 

Функция требует отладки! Запускать такую функцию нужно на открытии новой свечи, а не на каждом тике — каждый раз она занимается отбором свечей по критерию и сортировкой. Чтобы этого избежать, можно использовать модифицированные кольцевые массивы (это потребует использование класса) и сохранять состояние между запусками (т.е. хранить массивы отобранных свечей в глобальных переменных). Короче, оптимизация сложней, а значит бесплатно вряд ли кто станет это делать.

 

Как оперативно! 

Ещё и с комментариями... 

Спасибо большое! 

 

Попробую разобраться в коде. Про платную часть имею ввиду. 


Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites
Ugar68
6 часов назад, BooGUY сказал:

Доброго времени суток. 

 

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

 
Дано N свечей назад. Найти в них свечи размером >= X пунктов, запомнить их общее количество и размер каждого из них. Если текущая свеча после закрытия оказалась >= X пунктов, то сравнить её размер с общим кол-вом найденных свечей и вывести следующий результат - какое место она занимает по размеру среди всех найденных.
 
На мкл сайте затруднились выполнить, но указали на использование массивов. 

Если данные свечей больше нигде не будут нужны, то и запоминать их не зачем. Да и без массивов можно обойтись.

Всё делать в момент открытия свечи.

Если сформировалась свеча >= X, то перебрать N свечей. Считать свечи > 1 свечи. Результат +1 и будет место в рейтинге по размеру свечей.

   int N=100;//Количество свечей для поиска
   int X=150;//Размеры свечей для учёта
   static datetime PrevT0=0;
   datetime T0=Time[0];
   int i, SizeBarI, SizeBar1, C=1;
   if(PrevT0!=T0)//Если открылся новый бар
      {
      PrevT0=T0;
      SizeBar1=(int)round((High[1]-Low[1])/_Point);//Размер 1 свечи
      if(SizeBar1>=X)//Если 1 свеча >=X
         {
         for(i=2; i<N+2; i++)//цикл перебора свечей начиная со второй
            {
            SizeBarI=(int)round((High[i]-Low[i])/_Point);//Размер i свечи
            if(SizeBarI>SizeBar1)C++;//Счётчик свечей > 1 свечи
            }
         //Печать результата
   	     Print("1 бар на ",C," месте по размеру");
         }
      }
   

 

Edited by Ugar68
  • Upvote 1
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Pirojoque Project
34 минуты назад, BooGUY сказал:

Попробую разобраться в коде. Про платную часть имею ввиду. 

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

  • Upvote 1
Link to post
Share on other sites
BooGUY
8 часов назад, Ugar68 сказал:

Если данные свечей больше нигде не будут нужны, то и запоминать их не зачем. Да и без массивов можно обойтись.

Всё делать в момент открытия свечи.

Если сформировалась свеча >= X, то перебрать N свечей. Считать свечи > 1 свечи. Результат +1 и будет место в рейтинге по размеру свечей.


   int N=100;//Количество свечей для поиска
   int X=150;//Размеры свечей для учёта
   static datetime PrevT0=0;
   datetime T0=Time[0];
   int i, SizeBarI, SizeBar1, C=1;
   if(PrevT0!=T0)//Если открылся новый бар
      {
      PrevT0=T0;
      SizeBar1=(int)round((High[1]-Low[1])/_Point);//Размер 1 свечи
      if(SizeBar1>=X)//Если 1 свеча >=X
         {
         for(i=2; i<N+2; i++)//цикл перебора свечей начиная со второй
            {
            SizeBarI=(int)round((High[i]-Low[i])/_Point);//Размер i свечи
            if(SizeBarI>SizeBar1)C++;//Счётчик свечей > 1 свечи
            }
         //Печать результата
   	     Print("1 бар на ",C," месте по размеру");
         }
      }
   

 

СПасибо Вам большое!
Покручу в руках код


Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites
Trader-San

Можете помочь переписать простой советник из мт4 в мт5?

Link to post
Share on other sites
Pirojoque Project
10 часов назад, Trader-San сказал:

Можете помочь переписать простой советник из мт4 в мт5?

Допустим, работу с ордерами можно перенести из МТ4 в МТ5 одной строкой. Остальная "простота" кода под вопросом. Если он без особых извращений, то с помощью талмуда можно все остальные моменты поправить.

  • Upvote 1
Link to post
Share on other sites
Trader-San
1 час назад, Pirojoque Project сказал:

Допустим, работу с ордерами можно перенести из МТ4 в МТ5 одной строкой. Остальная "простота" кода под вопросом. Если он без особых извращений, то с помощью талмуда можно все остальные моменты поправить.

спасибо

Link to post
Share on other sites
BooGUY

Подскажите, пожалуйста, как можно посчитать тики или свечи за большое время? (год, например). 
Пробую через Close[], но индекс больше 5000 не дает. 
 

UPD
Попробую через эту штуку, код в сети лежит

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites
Pirojoque Project
2 часа назад, BooGUY сказал:

индекс больше 5000 не дает

В настройках терминала какое ограничение баров на графике? И это в тестере или откуда вообще запуск?

Link to post
Share on other sites
BooGUY
2 часа назад, Pirojoque Project сказал:

В настройках терминала какое ограничение баров на графике? И это в тестере или откуда вообще запуск?

 

Закачал евробакс все котировки, в настройках терминала 10 000 000 для истории и 1 500 000 для окна. Перезагрузил.

Запуск на реале, то есть, советник учебный, без торговых функций, поставил таймер 5 секунд, чтобы производил подсчет свечей, накинул на график. И, если установлено Close[976], допустим, то принтом покажет цену в журнале. А если Close[5487], например, то укажет на ошибку array out of range 

 

Странно. Ни с того ни с сего заработало. Даже миллионный бар проверяется. Ничего не делал, читал документацию, пил чай. Просто еще раз запустил и заработало. Весь день выдавало ошибку, хотя загрузил историю и настройки поменял еще вчера. 
То есть, и дополнительный код (выше) проверять не потребовалось. 
МТ4 - темпераментный какой-то. 

  • Upvote 1

Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites
Pirojoque Project
14 часов назад, BooGUY сказал:

МТ4 - темпераментный какой-то. 

Рекомендую сразу уйти от него к МТ5. В нём, конечно, есть свои нюансы, но преимуществ больше. Например, доступ к данным там лучше, мощный тестер и т.п. "Переучиваться" не придётся, лишь освоить нюансы работы с индикаторами. Иначе потом обрастаешь кодом, который в итоге приходится переписывать и адаптировать под пятёрку. Лучше сразу делать хорошо.

  • Thanks 1
Link to post
Share on other sites
BooGUY

Можно ли как-то закачать историю только за год-два-три? Если более ранние данные не нужны. 
Может скрипт такой есть


Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites
Pirojoque Project

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

  • Thanks 1
Link to post
Share on other sites
BooGUY

Почему NormalizeDouble иногда не срабатывает? 

Принтом вывожу массив в журнал, почти все double значения выводятся до указанного 1 знака после запятой, а какие-нибудь 3-4 значения (из ста) с 15 знаками.

...

2021.11.15 04:01:07.821   Сов2 EURUSD,M1: 9.9
2021.11.15 04:01:07.724 Сов2 EURUSD,M1: 9.800000000000001
2021.11.15 04:01:07.675   Сов2 EURUSD,M1: 9.9
2021.11.15 04:01:07.626   Сов2 EURUSD,M1: 9.6
2021.11.15 04:01:07.577   Сов2 EURUSD,M1: 9.1

...


Пишу на mql5 и mql4. Примеры. Пишите в личку.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...