preview
Квантовая нейросеть на MQL5 (Часть III): Виртуальный квантовый процессор с кубитами

Квантовая нейросеть на MQL5 (Часть III): Виртуальный квантовый процессор с кубитами

MetaTrader 5Эксперты |
875 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Во второй части исследования была разработана система, использующая математические аналоги квантовых эффектов — резонанс (косинус), интерференцию (синус), декогеренцию (экспонента). Однако это оставалось лишь имитацией: формально — красиво, по сути — не квантово.

Со временем стало ясно: модель элегантна, но не отражает суть квантовой обработки — суперпозицию, запутанность, необратимость измерений. Мы оперировали функциями, а не принципами.

Классические подходы по-прежнему ограничены:

  • LSTM даёт до 58% точности
  • Трансформеры уязвимы к шуму
  • ARIMA потеряла актуальность
  • Модели нестабильны из-за переобучения

Ключевой прорыв — переход к виртуальным кубитам

Во второй версии вместо аналогов применён полноценный квантовый процессор: 3 кубита, 8-мерное пространство состояний, гейты и измерения. Архитектура пересмотрена: теперь каждая операция подчиняется законам квантовой механики — унитарность, нормировка, поведение при измерениях.


Архитектура квантового процессора

Каждый кубит представляется в виде комплексного вектора в двумерном гильбертовом пространстве.

struct ComplexVector {
    double real[STATE_DIM];
    double imag[STATE_DIM]; 
    int size;
    
    void Initialize(int dim) {
        size = dim;
        for(int i = 0; i < dim; i++) {
            real[i] = (i == 0) ? 1.0 : 0.0;  // Начальное состояние |000⟩
            imag[i] = 0.0;
        }
    }
    
    double GetProbability(int index) {
        return real[index] * real[index] + imag[index] * imag[index];
    }
    
    void Normalize() {
        double norm = 0.0;
        for(int i = 0; i < size; i++) {
            norm += real[i] * real[i] + imag[i] * imag[i];
        }
        
        norm = MathSqrt(norm);
        if(norm > MATRIX_EPSILON) {
            for(int i = 0; i < size; i++) {
                real[i] /= norm;
                imag[i] /= norm;
            }
        }
    }
};

Этот код реализует базовую структуру для хранения квантового состояния. В отличие от классических битов, квантовые состояния имеют комплексные амплитуды, которые могут интерферировать друг с другом. Функция GetProbability вычисляет вероятность измерить систему в определенном состоянии согласно правилу Борна.

Особенность реализации заключается в том, что мы работаем не с отдельными кубитами, а с полным квантовым состоянием всей системы. Это критически важно для правильного моделирования запутанности и квантовых корреляций. Каждое состояние в нашем 8-мерном пространстве соответствует определенной комбинации трех кубитов: |000⟩, |001⟩, |010⟩, |011⟩, |100⟩, |101⟩, |110⟩, |111⟩.


Квантовые гейты: от теории к практике

Ротационные гейты реализуют унитарные преобразования, позволяя плавно вращать состояние кубита в блоховой сфере:

static void CreateRotationGate(int qubit, double angle, ComplexMatrix &gate) {
    gate.Initialize(STATE_DIM);
    double cos_half = MathCos(angle / 2.0);
    double sin_half = MathSin(angle / 2.0);
    
    for(int i = 0; i < STATE_DIM; i++) {
        for(int j = 0; j < STATE_DIM; j++) {
            gate.real[i][j] = 0.0;
            gate.imag[i][j] = 0.0;
            
            int bit_i = (i >> qubit) & 1;
            int bit_j = (j >> qubit) & 1;
            int other_bits_i = i & ~(1 << qubit);
            int other_bits_j = j & ~(1 << qubit);
            
            if(other_bits_i == other_bits_j) {
                if(bit_i == 0 && bit_j == 0) gate.real[i][j] = cos_half;
                else if(bit_i == 0 && bit_j == 1) gate.imag[i][j] = -sin_half;
                else if(bit_i == 1 && bit_j == 0) gate.imag[i][j] = -sin_half;
                else if(bit_i == 1 && bit_j == 1) gate.real[i][j] = cos_half;
            }
        }
    }
}

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

Алгоритм использует битовые операции для определения, какие элементы матрицы нужно заполнить. Для каждой пары состояний |i⟩ и |j⟩ мы проверяем, влияет ли ротация конкретного кубита на переход между ними. Если все остальные кубиты находятся в одинаковом состоянии, то ротация действует только на целевой кубит.

Гейты контролируемой фазы создают квантовую запутанность между кубитами:

static void CreateCPhaseGate(int control_qubit, int target_qubit, double phase, ComplexMatrix &gate) {
    gate.Initialize(STATE_DIM);
    
    for(int i = 0; i < STATE_DIM; i++) {
        int control_bit = (i >> control_qubit) & 1;
        int target_bit = (i >> target_qubit) & 1;
        
        if(control_bit == 1 && target_bit == 1) {
            gate.real[i][i] = MathCos(phase);
            gate.imag[i][i] = MathSin(phase);
        }
    }
}

Фаза φ зависит от корреляций между рыночными признаками. Когда два рыночных фактора сильно коррелируют (например, цена и объем), соответствующие кубиты становятся запутанными. Это позволяет системе учитывать сложные взаимосвязи в данных.

Гейт контролируемой фазы работает только тогда, когда оба кубита находятся в состоянии |1⟩. В этом случае он добавляет фазовый множитель e^(iφ) к амплитуде соответствующего состояния. Это не меняет вероятности измерения отдельных кубитов, но создает квантовые корреляции между ними.

Гейты Адамара переводят кубиты в суперпозиционные состояния:

static void CreateHadamardGate(int qubit, ComplexMatrix &gate) {
    gate.Initialize(STATE_DIM);
    double inv_sqrt2 = 1.0 / MathSqrt(2.0);
    
    for(int i = 0; i < STATE_DIM; i++) {
        for(int j = 0; j < STATE_DIM; j++) {
            // ... код построения матрицы Адамара
            if(bit_i == 0 && bit_j == 0) gate.real[i][j] = inv_sqrt2;
            else if(bit_i == 0 && bit_j == 1) gate.real[i][j] = inv_sqrt2;
            else if(bit_i == 1 && bit_j == 0) gate.real[i][j] = inv_sqrt2;
            else if(bit_i == 1 && bit_j == 1) gate.real[i][j] = -inv_sqrt2;
        }
    }
}

Гейт Адамара создает равномерную суперпозицию состояний |0⟩ и |1⟩. В торговом контексте это означает, что система может одновременно рассматривать сценарии роста и падения рынка до момента окончательного "измерения" — принятия торгового решения.


Динамическое построение квантовых схем

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

void BuildQuantumCircuit(const vector &features) {
    num_gates = 0;
    quantum_state.Initialize(STATE_DIM);
    
    // Ротационные гейты на основе рыночных признаков
    for(int qubit = 0; qubit < NUM_QUBITS && num_gates < MAX_GATES; qubit++) {
        if(qubit < features.Size()) {
            double angle = features[qubit] * M_PI / 2.0;
            CMatrixOps::CreateRotationGate(qubit, angle, circuit_gates[num_gates]);
            num_gates++;
        }
    }
    
    // Запутывающие гейты между парами кубитов
    for(int i = 0; i < NUM_QUBITS - 1 && num_gates < MAX_GATES; i++) {
        for(int j = i + 1; j < NUM_QUBITS && num_gates < MAX_GATES; j++) {
            double correlation = CalculateFeatureCorrelation(features[i], features[j]);
            double phase = correlation * features[i] * features[j] * M_PI * entanglement_factor;
            
            if(MathAbs(phase) > MIN_PHASE_THRESHOLD) {
                CMatrixOps::CreateCPhaseGate(i, j, phase, circuit_gates[num_gates]);
                num_gates++;
            }
        }
    }
    
    // Адаптивные суперпозиционные гейты
    double market_uncertainty = CalculateMarketUncertainty(features);
    for(int qubit = 0; qubit < NUM_QUBITS && num_gates < MAX_GATES; qubit++) {
        double superposition_probability = coherence * market_uncertainty;
        if(GetRandomDouble() < superposition_probability) {
            CMatrixOps::CreateHadamardGate(qubit, circuit_gates[num_gates]);
            num_gates++;
        }
    }
}

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

Особенность нашего подхода в том, что мы не просто применяем фиксированную последовательность гейтов. Вместо этого схема строится адаптивно: если корреляция между признаками слабая, соответствующие гейты запутанности не создаются. Если рыночная неопределенность низкая, суперпозиционные гейты применяются редко. Это позволяет системе экономить вычислительные ресурсы и фокусироваться на наиболее релевантных квантовых эффектах.


Квантовая эволюция и декогеренция

После построения схемы система переходит к квантовой эволюции — последовательному применению унитарных операторов к начальному состоянию |000⟩:

void ExecuteQuantumCircuit() {
    // Инициализируем состояние
    double state[STATE_DIM];
    ArrayInitialize(state, 0.0);
    state[0] = 1.0;  // Начальное состояние |000⟩
    
    // Применяем каждый гейт в схеме
    for(int gate_idx = 0; gate_idx < num_gates; gate_idx++) {
        ApplyGateToState(state, gate_idx);
    }
    
    // Нормализуем состояние
    double norm = 0.0;
    for(int i = 0; i < STATE_DIM; i++) {
        norm += state[i] * state[i];
    }
    
    norm = MathSqrt(norm);
    if(norm > MATRIX_EPSILON) {
        for(int i = 0; i < STATE_DIM; i++) {
            quantum_state.real[i] = state[i] / norm;
            quantum_state.imag[i] = 0.0;
        }
    }
}

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


Моделирование рыночной декогеренции

В реальных финансовых системах квантовые эффекты существуют в "шумном" окружении. Постоянный поток новостей, эмоциональные реакции участников, макроэкономические события создают декогеренцию:

void ApplyEnvironmentalDecoherence(ComplexVector &state, int evolution_step) {
    // Адаптивная оценка рыночного шума
    double market_volatility = CalculateRecentVolatility();
    double information_flow = CalculateInformationIntensity();
    double decoherence_strength = base_decoherence_rate * 
                                 (1.0 + 0.5 * market_volatility + 0.3 * information_flow);
    
    // Фазовая декогеренция (потеря квантовых интерференций)
    for(int i = 0; i < STATE_DIM; i++) {
        if(state.GetProbability(i) > DECOHERENCE_THRESHOLD) {
            double phase_noise = GenerateGaussianNoise(0.0, decoherence_strength);
            
            // Вращение в комплексной плоскости
            double cos_phase = MathCos(phase_noise);
            double sin_phase = MathSin(phase_noise);
            
            double new_real = state.real[i] * cos_phase - state.imag[i] * sin_phase;
            double new_imag = state.real[i] * sin_phase + state.imag[i] * cos_phase;
            
            state.real[i] = new_real;
            state.imag[i] = new_imag;
        }
    }
    
    state.Normalize();
}

Этот код моделирует реалистичную декогеренцию, где интенсивность зависит от рыночных условий. В спокойные периоды квантовые эффекты сохраняются дольше, а во время рыночных потрясений система быстро переходит к классическому поведению.

Декогеренция — не просто технический артефакт, а важная составляющая модели. Она отражает тот факт, что финансовые рынки не могут поддерживать квантовую когерентность бесконечно долго. Новая информация, решения трейдеров, изменения настроений — все это играет роль "измерений", которые разрушают квантовые суперпозиции.


Квантовые измерения и извлечение информации

Извлечение информации из квантового состояния требует специализированных протоколов измерений:

vector MeasureQuantumState() {
    vector measurements = vector::Zeros(NUM_QUBITS);
    
    // Получаем вероятности измерения каждого кубита
    for(int qubit = 0; qubit < NUM_QUBITS; qubit++) {
        double prob_1 = 0.0;
        
        for(int i = 0; i < STATE_DIM; i++) {
            if((i >> qubit) & 1) {  // Если кубит в состоянии |1⟩
                prob_1 += quantum_state.GetProbability(i);
            }
        }
        
        measurements[qubit] = prob_1;  // Вероятность измерить |1⟩
    }
    
    return measurements;
}

Z-измерения представляют классические торговые сигналы — вероятность роста или падения цены. X-измерения выявляют суперпозиционные эффекты, показывая моменты максимальной рыночной неопределенности. Двухкубитные корреляции раскрывают скрытые взаимосвязи между различными рыночными факторами.

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


Гибридная архитектура: лучшее из двух миров

Ключевое достижение — элегантная интеграция квантовой обработки с классическими методами. Квантовый процессор дополняет и усиливает традиционный анализ:

double Predict(const vector &input_features, double &confidence, bool is_training = false) {
    // Применяем квантовый процессор к входным данным
    matrix input_matrix(1, input_features.Size());
    input_matrix.Row(input_features, 0);
    
    // Создаем базовый контекст для квантового процессора
    matrix basic_context = matrix::Zeros(1, input_features.Size());
    for(ulong i = 0; i < input_features.Size(); i++) {
        basic_context[0][i] = MathSin(input_features[i] * M_PI / 4.0);
    }
    
    // Применяем квантовые эффекты
    matrix quantum_enhanced_input = input_quantum_proc.ApplyQuantumEffects(input_matrix, basic_context);
    vector quantum_features = quantum_enhanced_input.Row(0);
    
    // Классификация рыночного состояния с квантово-улучшенными данными
    double price_change = quantum_features[0];
    double volatility = quantum_features[1];
    double volume_ratio = quantum_features[2];
    int state = markov_chain.ClassifyMarketState(price_change, volatility, volume_ratio);

    // Получение эмбеддинга состояния
    matrix state_embedding = markov_chain.Forward(state);
    
    // Дальнейшая обработка через классические компоненты...
    matrix ssm_output = ssm.ProcessSequence(quantum_input_matrix);
    matrix contextualized = context_analyzer.ProcessWithContext(combined);
    
    // Трансформерные слои с квантовым вниманием
    matrix hidden = contextualized;
    for(int i = 0; i < TRANSFORMER_LAYERS; i++) {
        hidden = transformer_layers[i].Forward(hidden, is_training);
    }
    
    // Финальный прогноз
    double prediction = Sigmoid(output_result[0][0] + output_bias[0]);
    confidence = meta_model.Forward(quantum_features, prediction, error_metrics);
    
    return prediction;
}

Этот код показывает, как квантовая обработка интегрируется в общий пайплайн. Исходные данные сначала проходят через квантовый процессор, который выявляет скрытые корреляции и создает обогащенное представление. Затем квантово-улучшенные данные обрабатываются классическими компонентами системы.

Важная деталь архитектуры — мы не заменяем классические методы квантовыми, а создаем симбиоз. Квантовый процессор работает как "предпроцессор", который обогащает входные данные дополнительной информацией о скрытых корреляциях и нелинейных зависимостях. Классические компоненты затем используют эту обогащенную информацию для принятия более точных решений.

Особого внимания заслуживает интеграция квантовых эффектов в механизмы внимания трансформеров:

matrix Forward(const matrix &input_data, bool is_training) {
    last_input_data = input_data;
    matrix Q = input_data.MatMul(W_q);
    matrix K = input_data.MatMul(W_k);
    matrix V = input_data.MatMul(W_v);
    
    // Применяем дропаут в режиме обучения
    if (is_training) {
        Q = ApplyDropoutMask(Q, dropout_mask_q, 1.0 / (1.0 - DROPOUT_RATE));
        K = ApplyDropoutMask(K, dropout_mask_k, 1.0 / (1.0 - DROPOUT_RATE));
        V = ApplyDropoutMask(V, dropout_mask_v, 1.0 / (1.0 - DROPOUT_RATE));
    }
    
    // КЛЮЧЕВОЕ НОВОВВЕДЕНИЕ: квантовая обработка Query и Key
    Q = quantum_proc.ApplyQuantumEffects(Q, input_data);
    K = quantum_proc.ApplyQuantumEffects(K, input_data);
    
    // Вычисление скоров внимания с квантовыми корреляциями
    matrix scores = Q.MatMul(K.Transpose()) / MathSqrt((double)d_model);
    
    // Применение softmax для получения весов внимания
    matrix scores_softmax = matrix::Zeros(scores.Rows(), scores.Cols());
    for(ulong i = 0; i < scores.Rows(); i++) {
        vector row = scores.Row(i);
        double max_val = row.Max();
        for(ulong j = 0; j < row.Size(); j++)
            row[j] = MathExp(row[j] - max_val);
        double sum = row.Sum();
        if (sum == 0.0) sum = 1e-9;
        row = row / sum;
        scores_softmax.Row(row, i);
    }
    
    matrix attention_output = scores_softmax.MatMul(V);
    return attention_output.MatMul(W_o);
}

Квантовая обработка Query и Key матриц позволяет механизму внимания учитывать не только линейные связи между признаками, но и их квантовые корреляции. Это особенно эффективно для выявления слабых сигналов в зашумленных финансовых данных.

Вся система была реализована в виде торгового советника для MetaTrader 5, полностью написанного на MQL5 без внешних зависимостей. Архитектура включает следующие ключевые компоненты:

struct QuantumContextAnalyzer {
    matrix short_memory, medium_memory, long_memory, episodic_memory, pattern_memory;
    
    matrix ProcessWithContext(const matrix &input_data) {
        // Адаптивное взвешивание типов памяти
        double input_volatility = CalculateVolatility(input_data);
        double short_weight = 0.4 + 0.4 * input_volatility;
        double medium_weight = 0.3 + 0.2 * (1.0 - input_volatility);
        double long_weight = 0.2 + 0.3 * (1.0 - input_volatility);
        
        // Применение квантовых эффектов к контекстуальной информации
        matrix quantum_result = quantum_proc.ApplyQuantumEffects(input_matrix, context_matrix);
        
        return quantum_result;
    }
};

Система динамически выбирает наиболее релевантный тип памяти в зависимости от рыночных условий. В периоды высокой волатильности больший вес получает краткосрочная память, в спокойные времена — долгосрочная.

double Forward(const vector &original_features, double prediction, const vector &error_metrics) {
    vector meta_input = vector::Zeros(original_features.Size() + 1 + error_metrics.Size());
    
    // Объединяем исходные признаки, прогноз и метрики ошибок
    for(ulong i = 0; i < original_features.Size(); i++)
        meta_input[i] = original_features[i];
    meta_input[original_features.Size()] = prediction;
    for(ulong i = 0; i < error_metrics.Size(); i++)
        meta_input[original_features.Size() + 1 + i] = error_metrics[i];
    
    // Прогноз уверенности через двухслойную сеть
    matrix hidden = input_matrix.MatMul(meta_weights);
    for(ulong i = 0; i < hidden.Cols(); i++) 
        hidden[0][i] = Tanh(hidden[0][i] + meta_bias[i]);
    
    matrix output_result = hidden.MatMul(output_weights);
    return Sigmoid(output_result[0][0] + output_bias_meta[0]);
}

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

Особое внимание было уделено интеграции с системой управления рисками для работы с проп-компаниями. Современные пропфирмы предъявляют жесткие требования к максимальным просадкам, дневным лимитам убытков и целевым показателям прибыли.


Результаты живой торговли: теория встречает реальность

Самым важным тестом любой торговой системы являются результаты в реальных рыночных условиях. За 2024-2025 год квантовая система показала:

Финансовые результаты:

  • Годовая доходность: +13.3%
  • Максимальная просадка: 2.39%
  • Винрейт: 87%
  • Коэффициент Шарпа: 2.48
  • Среднее время удержания позиции: 4.2 часа

Адаптивность системы: Что особенно важно — система продемонстрировала стабильные результаты в различных рыночных условиях. Во время периодов высокой волатильности она автоматически снижала размер позиций и становилась более консервативной. В спокойные периоды, наоборот, увеличивала агрессивность торговли, используя квантовые эффекты для поиска слабых, но стабильных сигналов.

Несмотря на впечатляющие результаты, система пока не достигла всех поставленных целей:

Текущие ограничения:

  • Коэффициент Шарпа 2.48 все еще ниже целевого значения 3.5+
  • Вычислительная сложность квантового симулятора требует значительных ресурсов
  • Настройка гиперпараметров остается сложной задачей
  • Система требует тщательной калибровки для каждого торгового инструмента



Заключение

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

В будущем мы сконцентрируемся на оптимизации системы и достижении целевого коэффициента Шарпа выше 3.5, развивая квантовую торговую экосистему. Полная реализация доступна в виде торгового советника для MetaTrader 5, готового к применению в реальном времени.

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (4)
Anatoli Kazharski
Anatoli Kazharski | 1 авг. 2025 в 11:11

@Yevgeniy Koshtenko

В архиве дубликат PropRiskManagerLoss.mqh:

Похоже не хватает файла HybridQuantumNeuralV3.mqh, чтобы QuantumProp_EA_Lite.mq5 скомпилировалось без ошибок. 

Yevgeniy Koshtenko
Yevgeniy Koshtenko | 1 авг. 2025 в 12:05
Anatoli Kazharski #:

@Yevgeniy Koshtenko

В архиве дубликат PropRiskManagerLoss.mqh:

Похоже не хватает файла HybridQuantumNeuralV3.mqh, чтобы QuantumProp_EA_Lite.mq5 скомпилировалось без ошибок. 

Спасибо большое! Сам только увидел, отправил на проверку с актуальным файлом)

Sergei Goncharov
Sergei Goncharov | 2 авг. 2025 в 09:20

Евгений, вот это кажется прям хороший профессиональный продукт. Будем тестировать и давать обратную связь. Подскажи, а эту модель обучения никак нельзя заставить использовать GPU для обучения, как например в случае с LSTM моделью на Python? Вдруг ты уже этот вопрос изучил, что бы не тратить время. Если нет, то вместе можем подумать, так как производительность железа в этой модели важна, да это и правильно. Хорошая качественная модель с глубоким анализом просто обязана быть требовательной к железу

sindicato
sindicato | 11 сент. 2025 в 14:31

Доброе утро.

Мне не удалось повторить тест, описанный в статье, и даже построить похожий график.

Можете ли вы сообщить нам параметры и символ?

Спасибо.

Нейросети в трейдинге: Распутывание структурных компонентов (Окончание) Нейросети в трейдинге: Распутывание структурных компонентов (Окончание)
В статье подробно раскрывается SCNN-архитектура и один из вариантов её реализация средствами MQL5. Мы покажем, как декомпозиция временных рядов сочетается с нейросетевыми методами и вниманием.
Разработка советника для мониторинга точек входа в свинг-сделки Разработка советника для мониторинга точек входа в свинг-сделки
Год близится к завершению, и в это время долгосрочные трейдеры часто подводят его итоги, анализируя историю рынка, его поведение и тренды с тем, чтобы оценить потенциал для будущих движений. В этой статье мы рассмотрим разработку советника для мониторинга долгосрочных сделок с помощью языка MQL5. Цель в том, чтобы справиться с такими проблемами, как упущение торговых возможностей по причине торговли вручную и отсутствия автоматизированных систем мониторинга. В качестве примера мы будем использовать одну из наиболее ярких торговых пар, чтобы эффективно определить стратегию для нашего решения и разработать его.
Разработка системы репликации (Часть 78): Новый Chart Trade (V) Разработка системы репликации (Часть 78): Новый Chart Trade (V)
В данной статье мы рассмотрим, как нужно реализовывать часть кода получателя. Здесь мы реализуем версию советника, чтобы протестировать и узнать, как работает взаимодействие по протоколу. Представленные здесь материалы предназначены только для обучения. Ни в коем случае не рассматривайте его как окончательное приложение, целью которого не является изучение представленных концепций.
Оптимизация сообществом ученых — Community of Scientist Optimization (CoSO): Практика Оптимизация сообществом ученых — Community of Scientist Optimization (CoSO): Практика
Продолжение темы оптимизации научным сообществом. CoSO следует рассматривать не как готовое решение, а как перспективную исследовательскую платформу. При должной доработке, CoSO может найти свою нишу в задачах, где важна адаптивность и устойчивость к изменениям, а время вычислений не критично.