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

 
User_mt5:

Vladimir Karputov, y yo).

No puedo asegurarlo, pero prueba con 0.0


Añadido: Parece que no se puede cancelar 'INDICATOR_MINIMUM' e 'INDICATOR_MAXIMUM' con MQL5.

 
Vladimir Karputov:

No puedo asegurarlo, pero prueba con 0.0


Añadido: Parece que 'INDICATOR_MINIMUM' e 'INDICATOR_MAXIMUM' no pueden ser cancelados por MQL5.

Por desgracia...

Gracias por su respuesta.

(el mismo problema con los niveles, en realidad; pero se resuelve fijando el número de niveles)

 
User_mt5:

Por desgracia...

Gracias por la respuesta.

(El problema de los niveles es en realidad el mismo; pero se resuelve fijando el número de niveles)

Experimenta y todo saldrá bien.

 
User_mt5:


He comparado las propiedades que guarda el gráfico (usando el indicador'Stochastic Oscillator' como ejemplo)



<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=1
scale_fix_min_val=0.000000
scale_fix_max=1
scale_fix_max_val=100.000000
expertmode=0
fixed_height=-1


<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=0
scale_fix_min_val=-10.500000
scale_fix_max=0
scale_fix_max_val=110.500000
expertmode=0
fixed_height=-1


Esta es claramente una propiedad de tipo 'bool', pero no hay acceso a esta propiedad desde el lenguaje MQL5.

 
Vladimir Karputov:

He comparado las propiedades que guarda el gráfico (usando el indicador'Stochastic Oscillator' como ejemplo)

Es claramente una propiedad de tipo 'bool' pero no hay acceso a esta propiedad desde MQL5.

Sí, por desgracia.

Gracias de nuevo)

 

Hay un problema. Usando la función (ver abajo), podemos obtener los valores de TakeProfit y StopLoss por el ID de la posición desde el historial (es decir, cuando la posición ya está cerrada), esta función funciona en tiempo real, pero en el probador de estrategias, no puede encontrar el TakeProfit y el StopLoss, porque no ve las órdenes históricas que establecen los stops (importantemente, los stops se establecen después de la apertura de la posición)

Pregunta: ¿Cómo puedo utilizar el Probador de Estrategias para averiguar el TP/Pérdida de una posición cerrada basada en una entrada?

#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>

CDealInfo deal;
CHistoryOrderInfo ord;


void GetPosStops(ulong ticket, int& tp, int& sl, double& lot){
   HistorySelectByPosition(ticket);
   tp=0;sl=0;
   double open=0, tp_=0, sl_=0;
   string symbol="";
   ENUM_DEAL_TYPE type=-1;
   for(int i=0; i<HistoryDealsTotal(); i++){
      if(!deal.SelectByIndex(i))continue;
      if(deal.Entry() ==DEAL_ENTRY_IN){
         open=deal.Price();
         symbol=deal.Symbol();
         type=deal.DealType();
         lot=deal.Volume();
         break;
      }
   }
   for(int i=0; i<HistoryOrdersTotal(); i++){
      if(!ord.SelectByIndex(i))continue;
      if(tp_==0)tp_=ord.TakeProfit();
      if(sl_==0)sl_=ord.StopLoss();
      if(tp_>0 && sl_>0)break;
   }
   if(symbol !=""){
      double coef=type==DEAL_TYPE_BUY ? 1:-1;
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      if(tp_>0 && coef*tp_>coef*open)
         tp=(int)(MathAbs(tp_-open)/point);
      if(sl_>0 && coef*sl_<coef*open)
         sl=(int)(MathAbs(sl_-open)/point);   
   }
}
 
Hola a todos !
Estoy intentando programar EAs, y quiero empezar escribiendo un recolector de spreads estadístico.
Es decir, ¿qué me gustaría que hiciera? En el probador, un EA se pone en marcha y recoge los datos del historial de ticks durante un determinado período de tiempo, por ejemplo, diez días.
Y luego genera los siguientes datos en archivo csv o xlsx:
Spread medio para un periodo de tiempo: 00:00 - 09:00 en el servidor, 09:00 - 18:00, 18:00 - 00:00 (para todos los diez días), spread máximo para este tiempo, spread mínimo y spread medio del par de divisas para todo el periodo de diez días.
Estoy realmente cansado de recoger estos datos manualmente.

Sé que hay programas que lo hacen por sí mismos... Pero quiero el mío propio, como un entrenamiento.
¿Tal vez los conocedores respetados puedan decirme por dónde empezar? ¿Y es posible escribir un programa así?

Gracias de antemano a todos los que han respondido y han sido comprensivos con un recién llegado.
 

Hola a todos. Tal vez alguien tenga un trozo de código listo. Hay 2 parámetros, depósito = 3000 y lote 0,01 es decir, con depósito 3000 lote será 0,01, ahora estrictamente en la duplicación es decir, cuando depo será 6000 lote será 0,02 en 9000 será 0,03 ¿cómo hacerlo?

 
Pavel Komarovsky:

Hola a todos. Tal vez alguien tenga un trozo de código listo. Hay 2 parámetros, depósito = 3000 y lote 0,01 es decir, con depósito 3000 lote será 0,01, ahora estrictamente en la duplicación es decir, cuando depo será 6000 lote será 0,02 en 9000 será 0,03 ¿cómo hacerlo?

Es más o menos así:

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double start_deposit=3000;
   double start_lot=0.01;
   double deposit=start_deposit;
   for(int i=0; i<10; i++)
     {
      
      double d=MathFloor(deposit/start_deposit);
      Print(i,"#: ,deposit ",DoubleToString(deposit,2),", d ",DoubleToString(d*start_lot,2));
      //---
      deposit=deposit+start_deposit*0.55;
     }
  }
//+------------------------------------------------------------------+

Resultado:

2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    0#: ,deposit 3000.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    1#: ,deposit 4650.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    2#: ,deposit 6300.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    3#: ,deposit 7950.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    4#: ,deposit 9600.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    5#: ,deposit 11250.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    6#: ,deposit 12900.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    7#: ,deposit 14550.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    8#: ,deposit 16200.00, d 0.05
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    9#: ,deposit 17850.00, d 0.05
Archivos adjuntos:
Script_1.mq5  3 kb
 

Buen tiempo,

Por favor, ayúdenme a encontrar un error... Copio los valores de las barras (BarsCount) del buffer del indicador en el script, luego hago un bucle con los valores, detecto una señal y los imprimo con Print(); parece sencillo, pero no lo es tanto... Obtengo todas las señales como quería, excepto el cruce de la línea cero.

CROSSOVER_OR_REVERSE

¿Quizás el script no debería hacerlo así? Adjunto el código y una captura de pantalla del log... ¡Muchas gracias!

//+------------------------------------------------------------------+
//|                                                B_O_P_Signals.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
  
input int       inpSmoothPeriod = 14;       // Result smoothing period
input enMaTypes inpSmoothMethod =  ma_sma;  // Result smoothing type
input double    inpLevelUp      =  0.2;     // Level up
input double    inpLevelDown    = -0.2;     // Level down
input int       BarsCount       = 100;

double Mid_line[1] = {0.0};
int handle=0;
double TREND_VAL[];

void OnStart()
  {
      handle = iCustom(_Symbol,PERIOD_CURRENT,"Balance of Market Power",inpSmoothPeriod,inpSmoothMethod,inpLevelUp,inpLevelDown);
      
      CopyBuffer(handle,2,0,BarsCount,TREND_VAL);
      
      ArraySetAsSeries(TREND_VAL,true);
      
      string Signal ="";
      
        for (int i=ArraySize(TREND_VAL)-1; i>=0; i--)
        {
           int k=1;
            if(TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] > inpLevelUp)
            
               Signal = "TREND_UP";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] < inpLevelUp)
            
               Signal = "TREND_UP_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] >= Mid_line[0] && TREND_VAL[i+k] <= Mid_line[0])
            
               Signal ="CROSSOVER_OR_REVERSE_UP";
            
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] < inpLevelDown)
            
               Signal = "TREND_DN";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] > inpLevelDown)
            
               Signal = "TREND_DN_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] < Mid_line[0] && TREND_VAL[i+k] > Mid_line[0])
            
               Signal = "CROSSOVER_OR_REVERSE_DN";
            else Signal = "UNKNOWN_SIGNAL";
            
            Print(string(i),"_", Signal);
        }
      
   
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
Question.png  150 kb