Николай, так ведь это проще простого. Копируем тики бара, математическими функциями находим бар с максимальным значением и с минимальным. И по индексу в массиве определяется что было раньше, high или low.
А как это может повлиять на построение зиг-зага?
Это понятно. Для текущего момента почти нет проблем, за исключением дополнительного кода и дополнительного снижения производительности .
А вот для всей истории придется скачивать почти Гб тиков. Тем более тики не везде есть и иногда расходятся со значением баров.
Речь о том, что реально не хватает. При этом даже не нужно увеличивать размер данных, ведь речь о одном бите данных из 480
А почему этот 1 бит (int у нас 4 байта правда, а datetime, long и doudle 8 байта :) ) не писать в свою базу и периодически ее читать?
Кому-то нужна последовательность через 1 бит, а кому-то datetime и doudle для минимума и для максимума.
1 ГБ тиков можно скачать раз. 1 ГБ это около 1 года котировок по евробаксу (там что-то около 30 млн тиков)
скрипт обработки такого объема отрабатывает за 1-5 минут, в зависимости от обрабатывающей железяки и задач.
а для тех кому не хватает тиков своего брокера и нужен это 1 бит - идем к соседнему ( "Тем более тики не везде есть и иногда расходятся со значением баров" - для 1 бита это не принципиально).
А почему этот 1 бит (int у нас 4 байта правда, а datetime, long и doudle 8 байта :) ) не писать в свою базу и периодически ее читать?
Кому-то нужна последовательность через 1 бит, а кому-то datetime и doudle для минимума и для максимума.
1 ГБ тиков можно скачать раз. 1 ГБ это около 1 года котировок по евробаксу (там что-то около 30 млн тиков)
скрипт обработки такого объема отрабатывает за 1-5 минут, в зависимости от обрабатывающей железяки и задач.
а для тех кому не хватает тиков своего брокера и нужен это 1 бит - идем к соседнему ( "Тем более тики не везде есть и иногда расходятся со значением баров" - для 1 бита это не принципиально).
У меня все давно реализовано.
Но поверьте, существует много сложностей и тупиков из-за несоответствия тиков и баров.
Просто высказал сожаление о том что структура MqlQuotes не содержит такой простой и важной информации, как последовательность High и Low.
Понимаю, что MQ не будут с этим заморачиваться.
Для моей стратегии важна вся многолетняя история символа, так как в момент инициализации EA происходит глубокий внутренний анализ и распознание поведения символа и быстрый внутренний тест, который намного быстрее штатного. Наличие бы информации о очередности событий High и Low намного бы упростило задачу и повысило производительность.
...о том что структура MqlQuotes не содержит такой простой и важной информации, как последовательность High и Low.
...
Для моей стратегии важна вся многолетняя история символа, так как в момент инициализации EA происходит глубокий внутренний анализ и распознание поведения символа и быстрый внутренний тест, который намного быстрее штатного. Наличие бы информации о очередности событий High и Low намного бы упростило задачу и повысило производительность.
1) Вы представляете количество кода написанного за десяток лет как не коммерческого, так и коммерческого на старой структуре.
измените вы два/четыре байта, или их последовательность, и это все накроется, в том числе и то, что куплено в маркете или на фрилансе.
Проблема совместимости версий это еще тот зверь.
Тут лет 10 назад один брокер, большой, очень большой брокер, задумал менять порядок формирования комментариев к ордерам - народ влетел на бабки, на большие бабки.
Много кто туда писал своего, а брокер никого не предупреждая взял и поменял.
2) кешировать данные по глубокому анализу не пытались? говорят очень помогает - зачем многократно проделывать одну и ту же работу?
Вы в момент инициализации EA читайте данные из кеша, и если их нет, то проводите анализ недостающей информации.
Очень хочется разобраться с открытием сделок на основе встроенных в мт5 индикаторов например Moving Averages подскажите пожалуйста где проблема код никак нехочет компилироваться.
// Объявление переменныхdouble previousPrice = 0.0;
double takeProfit = 70.0;
double stopLoss = 9000.0;
int tickCount = 0;
bool openTradeUp = false;
double baseLotSize = 0.01;
double ma1 = 0.0;
double ma2 = 0.0;
// Функция для вычисления скользящих среднихvoid calculateMovingAverages(conststring& symbol, ENUM_TIMEFRAMES timeframe, int period1, int period2, double& ma1, double& ma2)
{
int ma1Handle = iMA(symbol, timeframe, period1, 0, MODE_SMA, PRICE_CLOSE);
int ma2Handle = iMA(symbol, timeframe, period2, 0, MODE_SMA, PRICE_CLOSE);
ma1 = iMA(symbol, timeframe, period1, 0, MODE_SMA, PRICE_CLOSE, ma1Handle, 0);
ma2 = iMA(symbol, timeframe, period2, 0, MODE_SMA, PRICE_CLOSE, ma2Handle, 0);
}
// Функция обновления цены и открытия сделкиvoid UpdateAndTrade()
{
// Вычисление значений Moving Averages
calculateMovingAverages(_Symbol, PERIOD_CURRENT, 10, 20, ma1, ma2);
// Получение баланса счетаdouble accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
// Получение текущей ценыMqlTick tick;
if (SymbolInfoTick(_Symbol, tick))
{
double currentPrice = tick.bid;
if (ma1 > ma2)
{
openTradeUp = true;
}
if (openTradeUp)
{
// Открытие ордера на покупкуMqlTradeRequest request;
ZeroMemory(request);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = baseLotSize;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = NormalizeDouble(request.price - stopLoss * _Point, _Digits);
request.tp = NormalizeDouble(request.price + takeProfit * _Point, _Digits);
request.type_filling = ORDER_FILLING_FOK;
MqlTradeResult result;
ZeroMemory(result);
if (OrderSend(request, result))
{
Print("Открыт ордер на покупку: ", result.deal);
}
else
{
Print("Ошибка при открытии ордера: ", result.retcode);
}
// Сброс флага открытия сделки вверх
openTradeUp = false;
}
// Обновление значения предыдущей цены
previousPrice = currentPrice;
}
}
// Главная функция роботаvoidOnTick()
{
// Увеличение счетчика тиков цены
tickCount++;
// Получение текущей датыdatetime currentDate = iTime(_Symbol, PERIOD_D1, 0);
// Вызов функции обновления цены и открытия сделки
UpdateAndTrade();
// Вывод информации на графикstring tickCountText = "Текущий счетчик тиков: " + IntegerToString(tickCount);
Comment(tickCountText);
}
// Инициализация роботаintOnInit()
{
// Установка интервала вызова функции OnTick (10 секунд)EventSetTimer(10);
returnINIT_SUCCEEDED;
}
// Освобождение ресурсов при завершении работы роботаvoidOnDeinit(constint reason)
{
// Удаление интервала вызова функции OnTickEventKillTimer();
}
Очень хочется разобраться с открытием сделок на основе встроенных в мт5 индикаторов например Moving Averages подскажите пожалуйста где проблема код никак нехочет компилироваться.
Николай, так ведь это проще простого. Копируем тики бара, математическими функциями находим бар с максимальным значением и с минимальным. И по индексу в массиве определяется что было раньше, high или low.
А как это может повлиять на построение зиг-зага?
А почему этот 1 бит (int у нас 4 байта правда, а datetime, long и doudle 8 байта :) ) не писать в свою базу и периодически ее читать?
Кому-то нужна последовательность через 1 бит, а кому-то datetime и doudle для минимума и для максимума.
1 ГБ тиков можно скачать раз. 1 ГБ это около 1 года котировок по евробаксу (там что-то около 30 млн тиков)
скрипт обработки такого объема отрабатывает за 1-5 минут, в зависимости от обрабатывающей железяки и задач.
а для тех кому не хватает тиков своего брокера и нужен это 1 бит - идем к соседнему ( "Тем более тики не везде есть и иногда расходятся со значением баров" - для 1 бита это не принципиально).
А почему этот 1 бит (int у нас 4 байта правда, а datetime, long и doudle 8 байта :) ) не писать в свою базу и периодически ее читать?
Кому-то нужна последовательность через 1 бит, а кому-то datetime и doudle для минимума и для максимума.
1 ГБ тиков можно скачать раз. 1 ГБ это около 1 года котировок по евробаксу (там что-то около 30 млн тиков)
скрипт обработки такого объема отрабатывает за 1-5 минут, в зависимости от обрабатывающей железяки и задач.
а для тех кому не хватает тиков своего брокера и нужен это 1 бит - идем к соседнему ( "Тем более тики не везде есть и иногда расходятся со значением баров" - для 1 бита это не принципиально).
Nikolai Semko #:
...о том что структура MqlQuotes не содержит такой простой и важной информации, как последовательность High и Low.
...1) Вы представляете количество кода написанного за десяток лет как не коммерческого, так и коммерческого на старой структуре.
измените вы два/четыре байта, или их последовательность, и это все накроется, в том числе и то, что куплено в маркете или на фрилансе.
Проблема совместимости версий это еще тот зверь.
Тут лет 10 назад один брокер, большой, очень большой брокер, задумал менять порядок формирования комментариев к ордерам - народ влетел на бабки, на большие бабки.
Много кто туда писал своего, а брокер никого не предупреждая взял и поменял.
2) кешировать данные по глубокому анализу не пытались? говорят очень помогает - зачем многократно проделывать одну и ту же работу?
Вы в момент инициализации EA читайте данные из кеша, и если их нет, то проводите анализ недостающей информации.
Очень хочется разобраться с открытием сделок на основе встроенных в мт5 индикаторов например Moving Averages подскажите пожалуйста где проблема код никак нехочет компилироваться.
Очень хочется разобраться с открытием сделок на основе встроенных в мт5 индикаторов например Moving Averages подскажите пожалуйста где проблема код никак нехочет компилироваться.