Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 723

 

La gente me dice qué estoy haciendo mal, por qué dos indicadores iRSI,iCCI no causa ningún problema, pero los muwings y BB dan un aviso (posible pérdida de datos debido a la conversión del tipo Indicador.mqh )

//+------------------------------------------------------------------+
//|                                                    Indicator.mqh |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
// интерфейс к индикаторам.  

class CIndicators
{
public:

   double iRSI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift);
   double iCCI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift);  
   double iBands(string symbol,ENUM_TIMEFRAMES tf,int BBPeriod,int shift,double BBDeviation,ENUM_APPLIED_PRICE BBPrice );  
   double iMA(string symbol,ENUM_TIMEFRAMES tf, int nMAPeriod,int shift, ENUM_MA_METHOD eMAMethod ,ENUM_APPLIED_PRICE MAPrice);
      
};
// -Создадим экземпляр индикатора iRSI
double CIndicators::iRSI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift)
{
//---  
   int hRSI = iRSI(symbol, tf, period, applied);
   if(hRSI == INVALID_HANDLE)
      return 0.0;
   double rsi[];
   CopyBuffer(hRSI, 0, shift, 1, rsi);
   if(ArraySize(rsi))
      return rsi[0];
   return 0.0;
//--Создадим экземпляр индикатора iCCI
}
//----------------------------------
double CIndicators::iCCI(string symbol, ENUM_TIMEFRAMES tf, int period, ENUM_APPLIED_PRICE applied, int shift)
{
   int hCCI = iCCI(Symbol(), PERIOD_CURRENT, 55, PRICE_CLOSE);
   if(hCCI == INVALID_HANDLE)return 0.0;
   double cci[];
   ArrayResize(cci, 1);
   CopyBuffer(hCCI, 0, 0, 1, cci);
   return cci[0];
}
//--------------------------------------------------
// Создадим экземпляр индикатора ВВ
double CIndicators::iBands(string symbol,ENUM_TIMEFRAMES tf,int BBPeriod,int shift,double BBDeviation,ENUM_APPLIED_PRICE BBPrice)
{

   int hBands = iBands(Symbol(),tf,BBPeriod,0,BBDeviation,PRICE_CLOSE);
   if(hBands==INVALID_HANDLE)return 0.0;
  // Создадим массив значений верхней границы ВВ
   double fBBUpper[];
   ArrayResize(fBBUpper,true);
   CopyBuffer(hBands,UPPER_BAND,0,3,fBBUpper);
   return fBBUpper[0];  
   // Создадим массив значений нижней границы ВВ
   double fBBLower[];
   ArraySetAsSeries(fBBLower,true);
   CopyBuffer(hBands,LOWER_BAND,0,3,fBBLower);
   return  fBBLower[0];
   }
  
// Создадим экземпляр индикатора МА  
double CIndicators::iMA(string symbol,ENUM_TIMEFRAMES tf, int nMAPeriod,int shift, ENUM_MA_METHOD eMAMethod ,ENUM_APPLIED_PRICE MAPrice)
{
// получим его хэндл
   int hMA=iMA(Symbol(), PERIOD_CURRENT, nMAPeriod,0,MODE_EMA,PRICE_CLOSE);
   if(hMA == INVALID_HANDLE)return 0.0;
// Создадим массив значений МА,заполним тремя последними значениями мувинга.
   double fMA[];
   ArraySetAsSeries(fMA,true);
   CopyBuffer(hMA,0,0,3,fMA);
   return fMA[0];

}
 

También me gustaría preguntar: ¿Qué debo cambiar en la solicitud de comercio, apareció el error 10030, el año anterior el código del Asesor Experto funcionaba sin problemas, y ahora me hace leer/buscar cambios en MQL5 de nuevo


// функция открытия позиции с рынка
bool MarketOrder(const string sSymbol, const ENUM_POSITION_TYPE eType, const double fLot, const int nSL = 0, const int nTP = 0, const ulong nMagic = 0, const uint nSlippage = 1000)
{
        bool bRetVal = false;
        
        // запрос
        MqlTradeRequest oRequest = {0};
        MqlTradeResult   oResult = {0};
        
        double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
        int nDigits     = (int) SymbolInfoInteger(sSymbol, SYMBOL_DIGITS);

        oRequest.action         = TRADE_ACTION_DEAL;
        oRequest.symbol         = sSymbol;
        oRequest.volume         = fLot;
        oRequest.stoplimit      = 0;
        oRequest.deviation      = nSlippage;
        
        if(eType == POSITION_TYPE_BUY)
        {
                oRequest.type           = ORDER_TYPE_BUY;
                oRequest.price          = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_ASK), nDigits);
                oRequest.sl                     = NormalizeDouble(oRequest.price - nSL * fPoint, nDigits) * (nSL > 0);
                oRequest.tp                     = NormalizeDouble(oRequest.price + nTP * fPoint, nDigits) * (nTP > 0);
        }
        
        if(eType == POSITION_TYPE_SELL)
        {
                oRequest.type           = ORDER_TYPE_SELL;
                oRequest.price          = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_BID), nDigits);
                oRequest.sl                     = NormalizeDouble(oRequest.price + nSL * fPoint, nDigits) * (nSL > 0);
                oRequest.tp                     = NormalizeDouble(oRequest.price - nTP * fPoint, nDigits) * (nTP > 0);
        }
        
        // определим допустимый тип заливки ордера (зависит от типа исполнения - Instant, Market, биржевое и т.д.)
        switch((int) SymbolInfoInteger(sSymbol, SYMBOL_FILLING_MODE))
        {
        case SYMBOL_FILLING_FOK:
                oRequest.type_filling = ORDER_FILLING_FOK;
                break;
        case SYMBOL_FILLING_IOC:
                oRequest.type_filling = ORDER_FILLING_IOC;
                break;
        default:
                oRequest.type_filling = ORDER_FILLING_RETURN;
        }

        oRequest.magic                          = nMagic;
        
        
        // проверка перед отправкой
        MqlTradeCheckResult oCheckResult= {0};
        
        bool bCheck = OrderCheck(oRequest, oCheckResult);

        Print("Проверка заявки MarketOrder:",
                        " OrderCheck = ",               bCheck,
                        ", retcode = ",         oCheckResult.retcode,
                        ", balance = ",         NormalizeDouble(oCheckResult.balance, 2),
                        ", equity = ",                  NormalizeDouble(oCheckResult.equity, 2),
                        ", margin = ",                  NormalizeDouble(oCheckResult.margin, 2),
                        ", margin_free = ",     NormalizeDouble(oCheckResult.margin_free, 2),
                        ", margin_level = ",    NormalizeDouble(oCheckResult.margin_level, 2),
                        ", comment = ",         oCheckResult.comment);
        
        // если проверка удачная - отправка заявки
        if(bCheck == true && oCheckResult.retcode == 0)
        {
                bool bResult = false;
                
                // 3 попытки выставления ордера
                for(int k = 0; k < 3; k++)
                {
                        bResult = OrderSend(oRequest, oResult);
                        
                        if(bResult == true && oResult.retcode == TRADE_RETCODE_DONE)
                                break;
                        
                        if(k == 2)
                                break;
                                
                        Sleep(100);
                }
        
                Print("Отправка заявки:",
                                " OrderSend = ",        bResult,
                                ", retcode = ", oResult.retcode,
                                ", deal = ",            oResult.deal,
                                ", order = ",           oResult.order,
                                ", volume = ",          NormalizeDouble(oResult.volume, 2),
                                ", price = ",           NormalizeDouble(oResult.price, _Digits),
                                ", bid = ",                     NormalizeDouble(oResult.bid, _Digits),
                                ", ask = ",                     NormalizeDouble(oResult.ask, _Digits),
                                ", comment = ", oResult.comment,
                                ", request_id = ",oResult.request_id);  
                                
                if(oResult.retcode == TRADE_RETCODE_DONE)
                        bRetVal = true;
        }
        else if(oResult.retcode == TRADE_RETCODE_NO_MONEY)
        {
                Print("Недостаточно денег для открытия позиции. Работа эксперта прекращена.");
                ExpertRemove();
        }
        
        return(bRetVal);
}
 
Alexander Antoshkin:

Y también quería preguntar: ¿Qué tengo que cambiar en la solicitud de comercio, hay un error 10030 , el año anterior el código del Asesor Experto funcionaba sin problemas, pero ahora me obliga a leer / buscar los cambios en MQL5 de nuevo


// функция открытия позиции с рынка
bool MarketOrder(const string sSymbol, const ENUM_POSITION_TYPE eType, const double fLot, const int nSL = 0, const int nTP = 0, const ulong nMagic = 0, const uint nSlippage = 1000)
{
        bool bRetVal = false;
        
        // запрос
        MqlTradeRequest oRequest = {0};
        MqlTradeResult   oResult = {0};
        
        double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
        int nDigits     = (int) SymbolInfoInteger(sSymbol, SYMBOL_DIGITS);

        oRequest.action         = TRADE_ACTION_DEAL;
        oRequest.symbol         = sSymbol;
        oRequest.volume         = fLot;
        oRequest.stoplimit      = 0;
        oRequest.deviation      = nSlippage;
        
        if(eType == POSITION_TYPE_BUY)
        {
                oRequest.type           = ORDER_TYPE_BUY;
                oRequest.price          = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_ASK), nDigits);
                oRequest.sl                     = NormalizeDouble(oRequest.price - nSL * fPoint, nDigits) * (nSL > 0);
                oRequest.tp                     = NormalizeDouble(oRequest.price + nTP * fPoint, nDigits) * (nTP > 0);
        }
        
        if(eType == POSITION_TYPE_SELL)
        {
                oRequest.type           = ORDER_TYPE_SELL;
                oRequest.price          = NormalizeDouble(SymbolInfoDouble(sSymbol, SYMBOL_BID), nDigits);
                oRequest.sl                     = NormalizeDouble(oRequest.price + nSL * fPoint, nDigits) * (nSL > 0);
                oRequest.tp                     = NormalizeDouble(oRequest.price - nTP * fPoint, nDigits) * (nTP > 0);
        }
        
        // определим допустимый тип заливки ордера (зависит от типа исполнения - Instant, Market, биржевое и т.д.)
        switch((int) SymbolInfoInteger(sSymbol, SYMBOL_FILLING_MODE))
        {
        case SYMBOL_FILLING_FOK:
                oRequest.type_filling = ORDER_FILLING_FOK;
                break;
        case SYMBOL_FILLING_IOC:
                oRequest.type_filling = ORDER_FILLING_IOC;
                break;
        default:
                oRequest.type_filling = ORDER_FILLING_RETURN;
        }

        oRequest.magic                          = nMagic;
        
        
        // проверка перед отправкой
        MqlTradeCheckResult oCheckResult= {0};
        
        bool bCheck = OrderCheck(oRequest, oCheckResult);

        Print("Проверка заявки MarketOrder:",
                        " OrderCheck = ",               bCheck,
                        ", retcode = ",         oCheckResult.retcode,
                        ", balance = ",         NormalizeDouble(oCheckResult.balance, 2),
                        ", equity = ",                  NormalizeDouble(oCheckResult.equity, 2),
                        ", margin = ",                  NormalizeDouble(oCheckResult.margin, 2),
                        ", margin_free = ",     NormalizeDouble(oCheckResult.margin_free, 2),
                        ", margin_level = ",    NormalizeDouble(oCheckResult.margin_level, 2),
                        ", comment = ",         oCheckResult.comment);
        
        // если проверка удачная - отправка заявки
        if(bCheck == true && oCheckResult.retcode == 0)
        {
                bool bResult = false;
                
                // 3 попытки выставления ордера
                for(int k = 0; k < 3; k++)
                {
                        bResult = OrderSend(oRequest, oResult);
                        
                        if(bResult == true && oResult.retcode == TRADE_RETCODE_DONE)
                                break;
                        
                        if(k == 2)
                                break;
                                
                        Sleep(100);
                }
        
                Print("Отправка заявки:",
                                " OrderSend = ",        bResult,
                                ", retcode = ", oResult.retcode,
                                ", deal = ",            oResult.deal,
                                ", order = ",           oResult.order,
                                ", volume = ",          NormalizeDouble(oResult.volume, 2),
                                ", price = ",           NormalizeDouble(oResult.price, _Digits),
                                ", bid = ",                     NormalizeDouble(oResult.bid, _Digits),
                                ", ask = ",                     NormalizeDouble(oResult.ask, _Digits),
                                ", comment = ", oResult.comment,
                                ", request_id = ",oResult.request_id);  
                                
                if(oResult.retcode == TRADE_RETCODE_DONE)
                        bRetVal = true;
        }
        else if(oResult.retcode == TRADE_RETCODE_NO_MONEY)
        {
                Print("Недостаточно денег для открытия позиции. Работа эксперта прекращена.");
                ExpertRemove();
        }
        
        return(bRetVal);
}

Yo escribiría el resaltado de la siguiente manera:

switch((ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(sSymbol, SYMBOL_TRADE_EXEMODE);
 
Buen día. ¿Puede sugerir un EA con un trailing stop?
 
Alexey Viktorov:

Yo escribiría el resaltado así:

switch((ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(sSymbol, SYMBOL_TRADE_EXEMODE);

¡¡¡De todo corazón...!!! )

¡Funcionó, funcionó!

¡¡¡¡¡¡¡¡¡¡¡¡¡¡Gracias Alexei!!!!!!!!!!!!!!

 
Buen día.¿Puede sugerirnosun EA para MT5? ¿Puede sugerirnos un EA con trailing stop? Preferiblementeun SCALPER o uno que funcione en NEWS u otros . Gracias de antemano.
 
Alex2018:
Buen día.¿Puede sugerirnos un EA para MT5? ¿Puede sugerirnos un EA con trailing stop? Preferiblementeun SCALPER o uno que funcione en NEWS u otros . Gracias de antemano.
¿Usaste un motor de búsqueda? Incluso hay enlaces aquí:EAs con trailing stops
 
Puedes explicar el algoritmo para instalar el indicador comprado en el terminal, porque lo he comprado, pero no puedo activarlo, no sé cuál es el problema.
 
act1on:
Por favor, expliquen cómo instalar el indicador comprado en el terminal, porque lo compré, pero no puedo activarlo, no sé cuál es el problema.
Por favor, aclare: ¿lo compró en el mercado?
 
Vladimir Karputov:
Aclara: ¿compraste en el mercado?
Sí del mercado: https://www.mql5.com/ru/market/mt5/indicator
Después de la compra hice clic en "Instalar en la terminal" y luego fui a la terminal de comercio, pero no pasó nada, el indicador no apareció
MQL5 Маркет: Индикаторы
MQL5 Маркет: Индикаторы
  • www.mql5.com
Маркет - магазин программ для MetaTrader 5 и MetaTrader 4
Razón de la queja: