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

 
Hola! He intentado crear un indicador que utiliza 2 símbolos (EURUSD y GBPUSD por ejemplo), no dibuja (da un error 4806) ... Obtengo los handles del indicador en la función OnInit (iRSI por ejemplo) de cada símbolo, copio los datos del indicador en los buffers y realizo otras operaciones con ellos ...Recibe los datos del indicador para un símbolo (el mismo que coincide con el símbolo en el gráfico, al que adjunto el indicador) está bien, pero los datos del indicador para el segundo símbolo no se reciben ... es decir, recibe los datos sólo para el símbolo que coincide con el símbolo en el gráfico, al que se adjunta ... ¿qué estoy haciendo mal?
 
FinEngineer:
Hola! He intentado crear un indicador que utiliza 2 símbolos (EURUSD y GBPUSD por ejemplo), no dibuja (da un error 4806) ... Obtengo los handles del indicador en la función OnInit (iRSI por ejemplo) de cada símbolo, copio los datos del indicador en los buffers y realizo otras operaciones con ellos ...Recibe los datos del indicador para un símbolo (el mismo que coincide con el símbolo en el gráfico, al que adjunto el indicador) está bien, pero los datos del indicador para el segundo símbolo no se recibe ... es decir, recibe los datos sólo para el símbolo que coincide con el símbolo en el gráfico, al que se adjunta el indicador ... ¿qué estoy haciendo mal?
Así que muéstrame la parte del código que causó el problema.
 

Pongo el código completo, porque no funciona nada, en mql4 todo era mucho más fácil, quizás sea porque no estoy acostumbrado... estos manejadores y buffers auxiliares me están matando el cerebro.

Creo que el significado es claro (diferencia en el rsi de 2 símbolos correlativos), por favor, ayuda.... señalar los errores?

#property copyright "Copyright 2012, MetaQuotes Software Corp.
#enlace de propiedad "http://www.mql5.com"
#versión de la propiedad "1.00"

//---- propiedades de representación del indicador
#property indicator_buffers 3
#property indicator_label1 "Pair_delta_RSI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Rojo
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#parámetros de entrada de la propiedad
cadena de entrada Symbol1_Name = "EURUSD";
cadena de entrada Nombre_símbolo2 = "GBPUSD";
input int PeriodRSI=7;
input bool Inversia=false;
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;

doubleRSI_Buffer[];
double RSI1_Buffer[];
double RSI2_Buffer[];

int RSI1_Handle;
int RSI2_Handle;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICATOR_DATA);
SetIndexBuffer(1,RSI1_Buffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,RSI2_Buffer,INDICATOR_CALCULATIONS);

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE);//Obtener las asas del indicador
RSI2_Handle=iRSI(Nombre_símbolo2,0,PeriodRSI,PRECIO_CIERRE);
return(0);
}

int OnCalculate(const int rates_total,const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volumen[],
const int &Spread[])
{
int calculated=BarsCalculated(RSI1_Handle);
if(calculado<total de tarifas)
{
Print("No se han calculado todos los datos de RSI1_Handle (",calculated, "bars ). Error",GetLastError());
return(0);
}
calculated=BarsCalculated(RSI2_Handle);
if(calculado<total de tarifas)
{
Print("No se han calculado todos los datos de RSI2_Handle (",calculated, "bars ). Error",GetLastError());
return(0);
}
//--- podemos copiar no todos los datos
int to_copy;
if(prev_calculado>total de tarifas || prev_calculado<0) to_copy=total de tarifas;
si no
{
to_copy=tasa_total-prev_calculada;
if(prev_calculado>0) to_copy++;
}
//recibir el buffer RSI1
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("¡La obtención de RSI1 ha fallado! Error",GetLastError());
return(0);
}
//Obtener el buffer RSI2
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("¡La obtención de RSI2 ha fallado! Error",GetLastError());
return(0);
}
//---
int límite;
if(prev_calculado==0)
límite=0;
si no, limit=prev_calculado-1;
//calcular el indicador rsi delta
for(int i=limit;i< rates_total; i++)
DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i];
return(rates_total);
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

error #1

no utilizar la tecla SRC

 

Este error se produce, por ejemplo, si se toma un indicador MACD estándar personalizado y se cambia la siguiente línea

ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

a

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

Si el MACD se adjunta al gráfico EURUSD, se dibujará todo, si se adjunta a otro gráfico - aparecerá el error 4806... ¿Cómo puedo hacer para que en este indicador pueda utilizar tantos símbolos como quiera?

Si sabes cómo hacer funcionar el indicador publicado anteriormente, te lo agradecería mucho.

 
mario065:

Lester: Aquí puse una plantilla, dentro hay una modificación - te mostré cómo rastrear.

https://www.mql5.com/ru/forum/6343/page73

Si no quieres, tienes que contar las variables correctamente.

Tengo la idea del archivo de Schablon con un éxito mixto, lo llevé a mis condiciones un poco y estableció paradas y ganancias. Sin embargo, hay un punto muerto importante para mí - se fijan en la siguiente vela, no en una garrapata. Aquí está la parte del EA.

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  
  if(PositionSelect(_Symbol))
  {
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits()); 
    
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }
 
Lester:

Con más o menos éxito, conseguí lo esencial del archivo de Schablon, lo ajusté un poco a mis condiciones y ¡Hurra! Sin embargo, hay un punto muerto importante para mí - se fijan en la siguiente vela, no en una garrapata. Aquí está una parte del código.

input double TP            = 0.003;
input double STR           = 0.0012;
input double TR            = 0.0002;
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
Ну ладно-обяснения:

  if(PositionSelect(_Symbol)){//Ест ли позиция по символа
     Open = PositionGetDouble(POSITION_PRICE_OPEN);//цена опен для поза
     SL   = PositionGetDouble(POSITION_SL);//цена стоп для поза
     T_P  = PositionGetDouble(POSITION_TP);//цена тейк для поза
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);//цена бид
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);//цена аск
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);//стоп ниво,если ест такое-оно в пункты
     buy_trail = NormalizeDouble(Bid - Open,Digits());//вычисляем разстояние от цена бид и цена опен позиции-ето для бай
     sel_trail = NormalizeDouble(Open - Ask,Digits());//вычисляем разстояние от цена опен позиции и цена аск-ето для сел
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)//если ест бай поза
      {
      if(buy_trail > STR)//если разстояние болше указаное
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
//если цена бид минус указаное разстояние болше щем цена опен и цена опен болше цена стоп-вызиваем модификация
//сама модификация-для стоп будет цена опен,цена тейк не меняем.
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
//если цена бид минус указаное разстояние TR = 0.0002 болше уже от новый стоп(который поменяли уже) и цена опен менше новый стоп 
//вызиваем модификация
//сама модификация - для стоп будет прошлый стоп минус стоп ниво* _Point(что б стали пипси) плюс указаное TR,цена тейк не меняем.
//Т.е. будем двигат стоп через каждые 2 пипса  
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//===============================================

El código debe contener siempre condiciones para algunas acciones, pero todo debe ser comprobado y tener alguna lógica.

Si quieres ayudar, imprime(", ); ) y mira el resultado.

 
mario065:

Las descripciones son todas claras y funcionan. Pero se trata de una modificación del "breakeven" y del "trailing". Debería escribir una modificación para establecer StopLimit y TakeProfit después de la apertura de la orden, es decir

1. apertura del pedido

--------

2. Modificación de la configuración del límite de parada (¡todavía no está disponible!)

 if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }

------

3. Modificación del punto de equilibrio

4.Modificación del trailing stop

5.Cerrar orden


Puede utilizar el punto 2 para modificar el orden, pero sólo al principio de la siguiente barra.

 

Se escribe una función para abrir eats:

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
bool BuyPositionOpen(const string symbol,double volume,ulong deviation,double StopLoss,double Takeprofit,int Magic)     
    if(Какое то условие)
      {
       BuyPositionOpen(_Symbol,Lot,0,NormalizeDouble(Ask - 0.003,_Digits),NormalizeDouble(Ask + 0.003,_Digits),MagicNumber);
      }
     if(Какое то условие)
      {
       SellPositionOpen(_Symbol,Lot,0,NormalizeDouble(Bid + 0.003,_Digits),NormalizeDouble(Bid - 0.003,_Digits),MagicNumber);
      }
Функция для закрития:
Сама функция(символ,проскалзивание,магик)
bool BuyPositionClose(const string symbol,ulong deviation,int Magic)
// Логика за затваряне на дългите
      if(Какое то условие){
         BuyPositionClose(_Symbol,0,MagicNumber);}                        
// Логика за затваряне на късите
      if(Какое то условие){
         SellPositionClose(_Symbol,0,MagicNumber);} 

Если не хочете сразу ставит стоп и тейк,тогда:
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  if(PositionSelect(_Symbol)){
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits());
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
if(SL = 0 && T_P = 0)//если стоп и тейк равни нулю-вызиваете модофикация и там акуратно ложите нужная вам цена
{
  ModifyPosition(_Symbol,NormalizeDouble((Open - 0.003),Digits()),NormalizeDouble((Open + 0.003),Digits()));
}
//Далше вам понятно:
      if(buy_trail > STR)
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//=============================================== 
 
¿Hay algún desarrollador de MQL5 en este hilo? ¿Estoy haciendo una pregunta en la rama equivocada? Entonces, dígame cómo hacer una pregunta a los desarrolladores. La pregunta anterior es elemental para un programador experimentado...