рекордный минимум, сделанный свечой после значительного максимума - страница 2

 
Alexey Viktorov #:

Николай, так ведь это проще простого. Копируем тики бара, математическими функциями находим бар с максимальным значением и с минимальным. И по индексу в массиве определяется что было раньше, high или low.

А как это может повлиять на построение зиг-зага? 

Это понятно. Для текущего момента почти нет проблем, за исключением дополнительного кода и дополнительного снижения производительности .
А вот для всей истории придется скачивать почти Гб тиков. Тем более тики не везде есть и иногда расходятся со значением баров.
Речь о том, что реально не хватает. При этом даже не нужно увеличивать размер данных, ведь речь о одном бите данных из 480
 

А почему этот 1 бит (int у нас 4 байта правда, а datetime, long и doudle 8 байта :)  ) не писать в свою базу и периодически ее читать?

Кому-то нужна последовательность через 1 бит, а кому-то datetime и doudle для минимума и для максимума.


1 ГБ тиков можно скачать раз. 1 ГБ это около 1 года котировок по евробаксу (там что-то около 30 млн тиков)

скрипт обработки такого объема отрабатывает за 1-5 минут, в зависимости от обрабатывающей железяки и задач.


а для тех кому не хватает тиков своего брокера и нужен это 1 бит - идем к соседнему ( "Тем более тики не везде есть и иногда расходятся со значением баров" - для 1 бита это не принципиально).

 
Denis Vasyutin #:

А почему этот 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 намного бы упростило задачу и повысило производительность.
 

Nikolai Semko #:

...о том что структура 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(const string& 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;
    }
}

// Главная функция робота
void OnTick()
{
    // Увеличение счетчика тиков цены
    tickCount++;
    
    // Получение текущей даты
    datetime currentDate = iTime(_Symbol, PERIOD_D1, 0);      
    
    // Вызов функции обновления цены и открытия сделки
    UpdateAndTrade();
    
    // Вывод информации на график
    string tickCountText = "Текущий счетчик тиков: " + IntegerToString(tickCount);
    Comment(tickCountText);
}

// Инициализация робота
int OnInit()
{
    // Установка интервала вызова функции OnTick (10 секунд)
    EventSetTimer(10);

    return INIT_SUCCEEDED;
}

// Освобождение ресурсов при завершении работы робота
void OnDeinit(const int reason)
{
    // Удаление интервала вызова функции OnTick
    EventKillTimer();
}
 
Vitalin #:

Очень хочется разобраться с открытием сделок на основе встроенных в мт5 индикаторов например Moving Averages подскажите пожалуйста где проблема код никак нехочет компилироваться.


    //ma1 = iMA(symbol, timeframe, period1, 0, MODE_SMA, PRICE_CLOSE, ma1Handle/*, 0*/);
    //ma2 = iMA(symbol, timeframe, period2, 0, MODE_SMA, PRICE_CLOSE, ma2Handle/*, 0*/);

    double buffer[];
    CopyBuffer(ma1Handle, 0, 0, 1, buffer);
    ma1 = buffer[0];
    CopyBuffer(ma2Handle, 0, 0, 1, buffer);
    ma2 = buffer[0];
Причина обращения: