Auftrag beendet
Spezifikation
Мне нужна оптимизация стратегий есть код для открытия сделки 3 валютных пар EURUSD, GBPUSD - по 1 лоту, EURGBP- 3 лот. Когда прибыль достигает в 17 долларов закрываются сделки и открываются заново. Вот нужно оптимизировать то есть проверить на исторических данных при каком объёме лотов будет максимальное количество итераций и при каком запросе то есть две на продажу и один на куплю или тому подобнее. Нужно проверить на год ли больше на исторических данных. Если будут вопросы задавайте. Ниже будет рабочий код но он работает в реальном времени мне нужно чтоб он работал на тестере стратегий и на исторических данных.
//------------------------------------------------------------//
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Скрипт для автоматического закрытия и открытия сделок |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;
input double target_profit = 17.0; // Целевая прибыль в долларах
double max_profit = 0.0; // Переменная для хранения максимальной прибыли
double max_drawdown = 0.0; // Переменная для хранения максимальной просадки
int iteration_count = 0; // Переменная для хранения количества итераций
//+------------------------------------------------------------------+
//| Скрипт для открытия и управления тремя сделками |
//+------------------------------------------------------------------+
void OnTick()
{
static bool positions_opened = false;
// Открытие позиций, если еще не открыты
if (!positions_opened && PositionsTotal() == 0)
{
OpenThreePositions();
positions_opened = true;
}
double total_profit = CheckTotalProfit();
// Выводим отладочные сообщения для отслеживания прибыли
Print("Текущая общая прибыль: ", total_profit);
Print("Целевая прибыль: ", target_profit);
// Обновление максимальной прибыли и просадки
UpdateMaxProfitAndDrawdown(total_profit);
// Вывод текущей максимальной просадки и количества итераций
Print("Максимальная просадка: ", max_drawdown);
Print("Количество итераций: ", iteration_count);
// Если достигнута целевая прибыль
if (total_profit >= target_profit)
{
iteration_count++; // Увеличиваем количество итераций при достижении целевой прибыли
Print("Достигнута целевая прибыль. Закрываем позиции и открываем новые.");
CloseAllPositions();
OpenThreePositions();
}
}
//+------------------------------------------------------------------+
//| Функция для открытия трех позиций |
//+------------------------------------------------------------------+
void OpenThreePositions()
{
double lot_size = 1;
if (OpenPosition("EURUSD", ORDER_TYPE_SELL, lot_size * 0.7))
Print("EURUSD позиция открыта.");
if (OpenPosition("EURGBP", ORDER_TYPE_SELL, lot_size * 3))
Print("EURGBP позиция открыта.");
if (OpenPosition("GBPUSD", ORDER_TYPE_SELL, lot_size * 0.7))
Print("GBPUSD позиция открыта.");
Print("Три новые позиции открыты.");
}
//+------------------------------------------------------------------+
//| Функция для открытия позиции |
//+------------------------------------------------------------------+
bool OpenPosition(string symbol, ENUM_ORDER_TYPE type, double lot_size)
{
double price = (type == ORDER_TYPE_BUY) ? SymbolInfoDouble(symbol, SYMBOL_ASK) : SymbolInfoDouble(symbol, SYMBOL_BID);
if (!trade.PositionOpen(symbol, type, lot_size, price, 0, 0, "Позиция открыта скриптом"))
{
Print("Ошибка открытия позиции для ", symbol, ". Ошибка: ", GetLastError());
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| Функция для проверки общей прибыли |
//+------------------------------------------------------------------+
double CheckTotalProfit()
{
double total_profit = 0;
for (int i = 0; i < PositionsTotal(); i++)
{
if (PositionSelectByTicket(PositionGetTicket(i)))
{
total_profit += PositionGetDouble(POSITION_PROFIT);
}
}
return total_profit;
}
//+------------------------------------------------------------------+
//| Функция для обновления максимальной прибыли и просадки |
//+------------------------------------------------------------------+
void UpdateMaxProfitAndDrawdown(double current_profit)
{
// Обновление максимальной прибыли
if (current_profit > max_profit)
max_profit = current_profit;
// Вычисление текущей просадки
double current_drawdown = max_profit - current_profit;
// Обновление максимальной просадки, если текущая больше
if (current_drawdown > max_drawdown)
max_drawdown = current_drawdown;
}
//+------------------------------------------------------------------+
//| Функция для закрытия всех позиций |
//+------------------------------------------------------------------+
void CloseAllPositions()
{
for (int i = PositionsTotal() - 1; i >= 0; i--)
{
if (PositionSelectByTicket(PositionGetTicket(i)))
{
trade.PositionClose(PositionGetTicket(i));
}
}
Print("Все позиции закрыты.");
}