PROGERMAN
PROGERMAN
好友

通过他们的个人资料或用户搜索添加好友,您将能够看到他们是否在线

PROGERMAN
PROGERMAN
// Настройки торгового робота
input int PeriodEMA = 10; // Период EMA
input double StopLoss = 100; // Стоп-лосс в пунктах
input double TakeProfit = 100; // Тейк-профит в пунктах

// Параметры генетического алгоритма
#define POPULATION_SIZE 20 // Размер популяции
#define GENERATIONS 50 // Количество поколений
#define MUTATION_RATE 0.1 // Шанс мутации
#define CROSSOVER_RATE 0.7 // Шанс кроссинговера

// Структура для хранения параметров робота
struct Genome {
int emaPeriod;
double stopLoss;
double takeProfit;
double fitness; // Выигрыш или прибыль
};

// Генерация случайных параметров
void GenerateRandomGenome(Genome &genome) {
genome.emaPeriod = MathRand() % 30 + 5; // Период EMA от 5 до 35
genome.stopLoss = MathRand() % 150 + 50; // Стоп-лосс от 50 до 200 пунктов
genome.takeProfit = MathRand() % 150 + 50; // Тейк-профит от 50 до 200 пунктов
}

// Оценка пригодности (прибыль по данным параметрам)
double EvaluateFitness(Genome &genome) {
double profit = 0;
// Запускаем тестирование на истории, например, за последний год
// Используем встроенную функцию тестирования торговой стратегии
// Параметры стратегии: EMA, StopLoss, TakeProfit
// Вернуть значение прибыли по итогам теста
return profit; // Подразумевается результат тестирования
}

// Скрещивание двух геномов
void Crossover(Genome &parent1, Genome &parent2, Genome &child1, Genome &child2) {
if (MathRand() / (double)RAND_MAX < CROSSOVER_RATE) {
// Одноточечный кроссинговер
int crossoverPoint = MathRand() % 3;
switch (crossoverPoint) {
case 0:
child1.emaPeriod = parent1.emaPeriod;
child1.stopLoss = parent2.stopLoss;
child1.takeProfit = parent2.takeProfit;

child2.emaPeriod = parent2.emaPeriod;
child2.stopLoss = parent1.stopLoss;
child2.takeProfit = parent1.takeProfit;
break;
// Другие комбинации
}
} else {
child1 = parent1;
child2 = parent2;
}
}

// Мутация генома
void Mutate(Genome &genome) {
if (MathRand() / (double)RAND_MAX < MUTATION_RATE) {
genome.emaPeriod += (MathRand() % 5 - 2); // Мутация периода EMA
genome.stopLoss += (MathRand() % 20 - 10); // Мутация стоп-лосса
genome.takeProfit += (MathRand() % 20 - 10); // Мутация тейк-профита
}
}

// Основная функция генетического алгоритма
void GeneticAlgorithm() {
Genome population[POPULATION_SIZE];
Genome nextPopulation[POPULATION_SIZE];

// 1. Генерация начальной популяции
for (int i = 0; i < POPULATION_SIZE; i++) {
GenerateRandomGenome(population[i]);
}

// 2. Основной цикл по поколениям
for (int generation = 0; generation < GENERATIONS; generation++) {
// Оценка пригодности (fitness) каждого генома
for (int i = 0; i < POPULATION_SIZE; i++) {
population[i].fitness = EvaluateFitness(population[i]);
}

// Сортировка популяции по пригодности
ArraySort(population, WHOLE_ARRAY, 0, MODE_DESCEND);

// 3. Отбор лучших геномов для следующего поколения
for (int i = 0; i < POPULATION_SIZE / 2; i += 2) {
// Скрещивание и мутация
Crossover(population[i], population[i + 1], nextPopulation[i], nextPopulation[i + 1]);
Mutate(nextPopulation[i]);
Mutate(nextPopulation[i + 1]);
}

// 4. Замена старого поколения новым
for (int i = 0; i < POPULATION_SIZE; i++) {
population[i] = nextPopulation[i];
}

Print("Generation ", generation, " best fitness: ", population[0].fitness);
}

// Лучший геном по итогам последнего поколения
Print("Best parameters: EMA Period = ", population[0].emaPeriod,
", StopLoss = ", population[0].stopLoss,
", TakeProfit = ", population[0].takeProfit);
}

// Стартовая функция для эксперта
int OnInit() {
GeneticAlgorithm();
return INIT_SUCCEEDED;
}

// Главная торговая функция
void OnTick() {
// Логика торговли, если нужно
}
PROGERMAN
已在MQL5.community注册