Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1560

 
MrBrooklin #:

После stochasticDPeriod не указали значение замедления slowing. Кроме того, последним значением может быть либо STO_LOWHIGH, либо STO_CLOSECLOSE, но никак не PRICE_CLOSE.

С уважением, Владимир.

Владимир, спасибо большое!

 

Друзья, приветствую!


Подскажите новичку, скрипт открывает первую позицию и все, ни TP ни SL. В чем может быть ошибка?, при компиляции все норм.


//+------//+------------------------------------------------------------------+
//|                                                      EMA_RSI.mq5 |
//|                        Copyright 2023, Your Name                 |
//|                                       https://www.yourwebsite.com |
//+------------------------------------------------------------------+
#property strict

input int emaPeriod = 50;                // Период EMA
input int rsiPeriod = 7;                  // Период RSI для входа
input int rsiLength50 = 50;               // Период для дополнительного расчета RSI
input int rsiTakeProfitPeriod = 14;       // Период RSI для Take Profit
input int stochasticKPeriod = 14;         // Период K Stochastic
input int stochasticDPeriod = 3;          // Период D Stochastic
input double lotSize = 0.1;               // Размер лота

double emaValue;
double rsiValue;
double rsi50Value;
double stochasticK;
double stochasticD;

//+------------------------------------------------------------------+
//| Expert initialization function                                     |
//+------------------------------------------------------------------+
int OnInit()
{
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // Получаем данные индикаторов
    emaValue = iMA(NULL, PERIOD_M15, emaPeriod, 0, MODE_EMA, PRICE_CLOSE);
    rsiValue = iRSI(NULL, PERIOD_M1, rsiPeriod, PRICE_CLOSE);
    rsi50Value = iRSI(NULL, PERIOD_M1, rsiLength50, PRICE_CLOSE);
    double rsiTakeProfitValue = iRSI(NULL, PERIOD_M1, rsiTakeProfitPeriod, PRICE_CLOSE);

    // Исправленный вызов iStochastic
    double stochasticBufferK[];
    double stochasticBufferD[];

    int handle = iStochastic(NULL, PERIOD_M1, stochasticKPeriod, stochasticDPeriod, 3, MODE_SMA, STO_LOWHIGH);
    
    if (handle != INVALID_HANDLE)
    {
        if (CopyBuffer(handle, 0, 0, 1, stochasticBufferK) > 0 &&
            CopyBuffer(handle, 1, 0, 1, stochasticBufferD) > 0)
        {
            stochasticK = stochasticBufferK[0];
            stochasticD = stochasticBufferD[0];
        }
        else
        {
            Print("Ошибка при копировании буфера стохастика: ", GetLastError());
        }
    }
    else
    {
        Print("Ошибка при создании хендла стохастика: ", GetLastError());
    }

    double currentBid = SymbolInfoDouble(Symbol(), SYMBOL_BID); // Текущая цена Bid
    double currentAsk = SymbolInfoDouble(Symbol(), SYMBOL_ASK); // Текущая цена Ask

    // Условия для покупки
    if (currentAsk > emaValue && rsiValue < 30 && rsi50Value > 50 && stochasticK < 20)
    {
        // Проверяем открыты ли уже позиции
        if (PositionsTotal() == 0)
        {
            MqlTradeRequest request;
            MqlTradeResult result;

            ZeroMemory(request);
            ZeroMemory(result);

            request.action = TRADE_ACTION_DEAL;
            request.symbol = Symbol();
            request.volume = lotSize;
            request.type = ORDER_TYPE_BUY; // Используем правильный идентификатор
            request.price = currentAsk;
            request.tp = 0; // Установите TP по желанию
            request.sl = 0; // Установите SL по желанию

            if (!OrderSend(request, result))
            {
Print("Ошибка при открытии ордера на покупку: ", GetLastError());
            }
        }
    }

    // Условия для продажи
    if (currentBid < emaValue && rsiValue > 70 && rsi50Value < 50 && stochasticK > 80)
    {
        // Проверяем открыты ли уже позиции
        if (PositionsTotal() == 0)
        {
            MqlTradeRequest request;
            MqlTradeResult result;

            ZeroMemory(request);
            ZeroMemory(result);

            request.action = TRADE_ACTION_DEAL;
            request.symbol = Symbol();
            request.volume = lotSize;
            request.type = ORDER_TYPE_SELL; // Используем правильный идентификатор
            request.price = currentBid;
            request.tp = 0; // Установите TP по желанию
            request.sl = 0; // Установите SL по желанию

            if (!OrderSend(request, result))
            {
                Print("Ошибка при открытии ордера на продажу: ", GetLastError());
            }
        }
    }

    // Закрытие позиций на основе RSI
    if (PositionsTotal() > 0)
    {
        for (int i = PositionsTotal() - 1; i >= 0; i--)
        {
            ulong ticket = PositionGetTicket(i);
            if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
            {
                if (rsiTakeProfitValue > 30)
                {
                    MqlTradeRequest closeRequest;
                    MqlTradeResult closeResult;

                    ZeroMemory(closeRequest);
                    ZeroMemory(closeResult);

                    closeRequest.action = TRADE_ACTION_DEAL;
                    closeRequest.position = ticket;

                    if (!OrderSend(closeRequest, closeResult))
                    {
                        Print("Ошибка при закрытии ордера на покупку: ", GetLastError());
                    }
                }
            }

            if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
            {
                if (rsiTakeProfitValue < 70)
                {
                    MqlTradeRequest closeRequest;
                    MqlTradeResult closeResult;

                    ZeroMemory(closeRequest);
                    ZeroMemory(closeResult);

                    closeRequest.action = TRADE_ACTION_DEAL;
                    closeRequest.position = ticket;

                    if (!OrderSend(closeRequest, closeResult))
                    {
                        Print("Ошибка при закрытии ордера на продажу: ", GetLastError());
                    }
                }
            }
        }
    }
}
//+------------------------------------------------------------------+
 
antonrex #:

Друзья, приветствую!


Подскажите новичку, скрипт открывает первую позицию и все, ни TP ни SL. В чем может быть ошибка?, при компиляции все норм.


Сначала разберитесь что такое скрипт и что такое советник. Потом удалите из кода ненужные строки.

 

Здравствуйте, только начал осваивать MT5. Не знаю, в нужную ли тему написал. Подскажите, пожалуйста, создаю сделку на покупку и при увеличении цены (обвел красным) увеличивается прибыль, ведь чем дороже покупаю, тем прибыль должна быть ниже? Цена на момент покупки 1,11563, а на текущий момент 1,11623, то есть продажа идет по более высокой цене или что обозначает цена в предпоследнем столбце? Или это цена продажи? То есть при завершении сделки у меня совершится уже продажа?

Тоже самое со сделкой на продажу, при завершении совершается уже покупка?  Иначе почему чем выше цена продажи в предпоследнем столбце, тем меньше прибыль? Опыта в подобной сфере еще не было, но со многим в этой программе уже смог разобраться, а вот этот момент никак понять не могу и нигде найти информации не смог. Подскажите, кто может. Прикрепил пример

Файлы:
 
kompos12 #:

Здравствуйте, только начал осваивать MT5. Не знаю, в нужную ли тему написал. Подскажите, пожалуйста, создаю сделку на покупку и при увеличении цены (обвел красным) увеличивается прибыль, ведь чем дороже покупаю, тем прибыль должна быть ниже? Цена на момент покупки 1,11563, а на текущий момент 1,11623, то есть продажа идет по более высокой цене или что обозначает цена в предпоследнем столбце? Или это цена продажи? То есть при завершении сделки у меня совершится уже продажа?

Тоже самое со сделкой на продажу, при завершении совершается уже покупка?  Иначе почему чем выше цена продажи в предпоследнем столбце, тем меньше прибыль? Опыта в подобной сфере еще не было, но со многим в этой программе уже смог разобраться, а вот этот момент никак понять не могу и нигде найти информации не смог. Подскажите, кто может. Прикрепил пример

Это цена закрытия сделки на текущий момент. То-есть для позиции Sell это текущая цена Ask, а для позиции Buy это текущая цена Bid.