Descargar MetaTrader 5

Lógica difusa para crear estrategias de trading manual

11 agosto 2016, 12:09
Alexander Fedosov
0
589

Introducción

Un rápido desarrollo de la tecnología ha llevado a una tendencia más fuerte para utilizar sistemas de trading automatizados en los mercados de divisas moderno. Sin embargo, muchos traders todavía van usando trading manual. Los pros y los contras de ambos planteamientos de trading son muy conocidos: el trading automatizado carece de flexibilidad hacia los cambios constantes del mercado, y trade manual, por el contrario, puede ser demasiado flexible debido a un factor frecuente de interferencia humana. De hecho, en esta comparación, estos son dos extremos de la misma esencia.

En mi artículo anterior he dado ejemplos, donde traté de compensar desventajas del trading automatizado mediante la aplicación de la teoría de lógica difusa, por ejemplo, formalizando el desenfoque estrategias demasiado estrictas, aplicado en un robot de trading o un indicador. En este artículo, se considerará una oportunidad de mejorar el manual de la estrategia. El uso de la tecnología moderna, incluso en el régimen de trading manual donde una decisión final siempre corresponde a los traders, trae más beneficio que daño.

 

La selección de uns estrategia de manual con una formalización específica de condiciones

Muchos trders modernos deciden asumir la responsabilidad en la entrada y salida de posiciones, en lugar de depender de sistemas automatizados. Para desarrollar su propia estrategia de trading necesitan que tenga en cuenta todos los resultados posibles del comportamiento del mercado. Luego, hay que seguirla estrictamente y resistir cualquier impulso que podría ser provocado por el miedo y la codicia.

Por lo tanto, primero tenemos que elaborar una estrategia de trading. Permitidme describir tres etapas de cómo vamos a construirla.

  • Etapa Num 1. Encontrar e identificar los instrumentos que se utilizarán para nuestra estrategia.
  • Etapa Num 2. Condiciones específicas de ajuste utilizadas por un trader para abrir una posición en el mercado.
  • Etapa Num 3. Establecer condiciones específicas cuando una posición se tiene que cerrar con resultado positivo o negativo.

Etapa Num 1.

En la primera etapa he elegido tres indicadores para la construcción de una estrategia de trading como por ejemplo:

  1. Average Directional Movement Index, ADX. Este es un indicador de tendencia que determina la fuerza de la tendencia actual.
  2. Relative Vigor Index, RVI oscillator.
  3. Accelerator Oscillator(AC) indicator by Bill Williams.

Selecciona vista general y configuración del MQL4 terminal de trading:

Fig. 1. Vista general de configuración de la estrategia

Etapa Num 2.

En la segunda etapa vamos a descubrir una forma de utilizar los instrumentos seleccionados, las condiciones para su operación y también los parámetros de posición para la entrada en el mercado.

Vamos a empezar desde el principio.

  • El primer indicador es ADX. Como se ve en la figura 1, el período del indicador especificado es igual a 10. Además, se estableció específicamente un nivel de la línea de tendencia principal (color verde) que es igual a 30. Cualquier valor que sea igual o superior, se considerará como una señal positiva para la entrada en el mercado. Cabe señalar, que la señal de compra de este indicador será el caso cuando + DI (línea verde discontinua) es mayor que -DI (línea discontinua roja). Por consiguiente, la señal de venta enfrenta una situación inversa cuando -DI es superior a + DI.
  • El segundo indicador es AC. Aquí vamos a utilizar las señales descritas en la documentación oficial. En concreto, si el indicador está por debajo de 0 y crece en el análisis y dos barras anteriores, entonces es una señal de compra. Por lo tanto, si el indicador es superior a 0 y cae en el análisis y dos barras anteriores, obtenemos una señal de venta.
  • El tercer indicador es RVI. Vamos a definir el periodo de su funcionamiento igual a 10. Como condición para la compra, nosotros determinaremos el momento cuando la línea de señal (rojo fino) cruza la línea principal (verde). En esta intersección, el valor de la línea en la barra de análisis debe estar por debajo del punto cero. Asimismo, establecimos las condiciones de venta: la línea de señal cruza la línea principal, pero los valores se colocan por encima de cero.
  • La siguiente condición para una operación será un timeframe de hora (H1).
  • La condición para la entrada de posición implica pasar las señales similares de los tres indicadores.
  • Y, finalmente, decidimos en el tamaño de la posición. Por ejemplo, se establecerá lo siguiente: 0,01 lote, Take Profit de 50 puntos, Stop Loss de 30 puntos.

Los términos se formalizará para una mejor claridad.

Entrar en una posición larga (señal de compra)

  1. La principal línea verde del indicador ADX tiene un valor que es mayor o igual a 30, mientras que el valos + DI es mayor que -DI.
  2. El valor AC crece en la barra actual y es más alta que en las anteriores dos barras que también crecen constantemente. Visualmente, estas son tres columnas del histograma verde, donde cada columna es más corta que la anterior, y los tres están situados en la zona negativa.
  3. La línea de señal (rojo fino) RVI cruza la línea principal (verde), ambos crecen pero siguen por debajo del punto cero.
  4. Comprar con 0,01 lote, Take Profit de 50 puntos y Stop Loss de 30 puntos.
Entrar en una posición corta (señal de venta)
  1. La principal línea verde del indicador ADX tiene un valor que es superior o igual a 30, mientras que el valor + DI está por debajo de -DI.
  2. El valor de AC cae en la barra actual y es menor que en las anteriores dos barras que se mantienen constantemente. Visualmente, estas son tres columnas del histograma rojo, donde cada columna es más corta que la anterior, y los valores de las tres están por encima de cero.
  3. La línea de señal RVI (fino rojo) cruza la línea principal (verde), ambos declinaran pero permanecerán en el área positiva.
  4. Vendemos con lote de 0,01, colocar el Take Profit en 50 puntos y Stop Loss de 30 puntos

Etapa Num 3

Todo lo que tenemos que hacer es determinar cómo salir de la posición. Como condición para salir, fijamos el objetivo de precio que hemos obtenido anteriormente: ejecución de Stop Loss de 30 puntos o lograr la ganancia de 50 puntos.

Por lo tanto, nuestra estrategia de trading se define ahora. Hemos fijado las condiciones para apertura y cierre de posiciones, seleccionamos los indicadores y establecemos sus parámetros de funcionamiento, definimos los tamaños de entrada de posición y sus metas. Y, finalmente, hemos decidido los eventos de salida del mercado.

En la siguiente fase vamos a comprobar la estrategia de trading creada en condiciones reales. Lo primero que debemos entender es que no hay ninguna estrategia ideal en una perspectiva a largo plazo y absolutamente todas las etapas de mercado. Y los traders que utilizan el trading automatizado y aquellos que operar manualmente con frecuencia observan que su sistema se comprueba diferentemente en diversas condiciones. Además, no es raro cuando las condiciones iniciales en el sistema de trading ya especificado podrían demostrar mejores resultados.

Por ejemplo, con respecto a nuestro sistema, un trader puede haber notado que con la configuración del Take Profit se podría haber hecho más. Esto no es porque simplemente quiere ganar más, pero dado que constantemente analiza su sistema y sus estadísticas demostraron que tras el cierre de trades exitosos, el precio se mantuvo moviendose en la dirección deseada durante algún tiempo. Por lo tanto, un comerciante puede tener una pregunta razonable: ¿Cómo aplicar los datos estadísticos y observaciones obtenidas para su sistema de trading con el fin de mejorar los resultados?

 

Remediar las deficiencias de formalización estricta con lógica difusa

Echemos un vistazo a los indicadores utilizados en nuestro sistema desde la perspectiva de la teoría de lógica difusa. En mi artículo anterior traté de transmitir su principal ventaja: flexibilidad en el análisis de las partes de la estrategia de operaciones donde se aplica la clasificación estricta. La Lógica difusa fue desdibujando límites estrictos dando un panorama más amplio de evaluación y reacción del sistema en las secciones de la frontera de su funcionamiento. También fue un ejemplo de un enfoque más adaptable a la operación del indicador ADX que utiliza. En primer lugar, se aplicó una división estricta entre las tendencias débiles, medias y fuertes, pero luego estas categorías borrosas determinan la fuerza de la tendencia no ya estrictamente ligada a la subjetividad de los valores del indicador.

Pero vamos a volver a nuestro sistema y nos preguntamos: ¿Cómo todo esto nos puede ayudar?

Imaginar que nuestro operador observa el mercado y ve la señal de su primer indicador: ADX ha llegado a 32, por ejemplo. Esto marca y espera confirmación de los otros dos indicadores. Pronto llega la señal del AC, mientras que el ADX muestra un aumento de hasta 40. La línea de la señal RVI cruza la línea principal después de algún tiempo, lo que significa que finalmente se han cumplido la totalidad de las tres condiciones para entrar en la posición. ADX ha alcanzado ya el punto 45. Pero el valor absoluto de ADX en nuestro sistema no es tan importante. Lo principal es que supere 30. Por lo tanto un trader sigue sus reglas y entra en el mercado con un lote de 0,01, Take Profit en 50 puntos y Stop Loss en 30.

Ahora, vamos a simular otro escenario posible. En principio, la situación se desarrolla de la misma manera que en el primer caso. ADX=32, la señal llega desde el AC, ADX alcanza simultáneamente 40 puntos. Pero cuando la última señal que falta para la apertura de la posición llega del RVI, luego ADX cohetes al 55, en vez de 45. Al comparar las dos opciones descritas, se muestra que la segunda señal es más fuerte que la anterior, pero nuestro trader abre todavía la posición con el mismo lote y los mismos valores de Take Profit y Stop Loss.

Aquí encontramos la primera desventaja de nuestra estrategia. Se evalúa sólo la existencia de la señal entrante, sin prestar mucha atención en la calidad. Y aunque logremos evaluar y definir la categoría, la exactitud de la evaluación todavía se perderá en las zonas de transición.

Entonces, ¿cómo podemos aprobar un determinado caso con los indicadores ADX, RVI y sus parámetros uniendose a la posición que utilizamos para la entrada en el mercado? Para ello, necesitamos llevar a cabo los siguientes pasos:

  • Para establecer categorías claras de evaluar tendremos la fuerza de la tendencia (ADX) y el índice de Vigor relativa (RVI). Se trata de una señal de entrada, basada en que vamos a hacer una decisión adicional.
  • Para establecer categorías claras de los objetivos de la posición (Take Profit o Stop Loss en nuestra estrategia, aunque aquí podemos establecer un tamaño de lote). Esto es una señal de salida que corrige nuestra posición en el mercado dada la fuerza de la tendencia.
  • Para describir categorías de señales de entrada y salidas con funciones de membresía de teoría de conjuntos difusa.
  • Para crear la interfaz que muestra recomendaciones para el cambio de posición de la estrategia inicial basada en las nuevas condiciones.
  • Para crear una configuración flexible para el cambio de funciones de pertenencia que permitan corregir este sistema de recomendación cuando sea necesario.

Para comenzar, describimos la primera variable entrada — valor de la fuerza de la tendencia.

1. Se establecen 4 categorías de fuerza de tendencia: bajo, moderado, medio y alto. Se trata cómo se verá:

Fig. 2. Fuerza de la tendencia visual dividida en categorías

2. Para establecer las categorías de la señal de salida, es necesario determinar cómo la categoría ADX influirá en nuestra posición. Normalmente, cuanto mayor es la tendencia, más tiempo dura. Por lo tanto, se procederá en consecuencia: dependiendo donde esta ADX en este momento se reciben las tres señales jutas de la estrategia, vamos a aumentar el Take Profit en 10-50 puntos.

Participarán las siguientes categorías de valor de la meta de beneficio que se agregará a los iniciales 50 puntos de nuestra estrategia.

  • low_take Categoría: tendencia baja, añadir 10-20 puntos a los objetivos.
  • mod_take Categoría: tendencia moderada, agregar 20-30 puntos a los objetivos.
  • med_take Categoría: tendencia media, añadir 30 - 40 puntos a los objetivos.
  • high_take Categoría: alta tendencia, añadir 40-50 puntos a los objetivos.

3. En la etapa siguiente Describimos las condiciones establecidas anteriormente con funciones de membresía de teoría de conjuntos difusa. La descripción de las cuatro categorías de tendencia es la siguiente:


Fig. 3. Descripción de las cuatro categorías de tendencia de la lógica difusa

Como se muestra en la figura 3, cada categoría fue establecida por la función de membresía, tales como: baja tendencia y tendencia alta con dos funciones de trapecio y las categorías moderadas y medio con dos funciones triangulares.

Ahora, vamos a definir la misma para el RVI.

1. Let's set the categories for Relative Vigor Index. There will be four: low, medium, high and higher. Se trata cómo se verá:

Fig. 4. División visual de Relative Vigor Index por categoría

2. Ahora, describiremos las categorías con funciones de membresía. Las funciones del trapecio se utilizarán para describir categorías de bajo y alto , y se aplicarán funciones triangulares en cuanto a las categorías media y alta .


Fig. 5. Descripción de categorías del índice RVI

Asimismo, Describimos cuatro categorías para los valores de objetivos de beneficio: primeras y cuarta categorías (10-20 y 40-50 puntos) usando funciones de trapecio y dos restantes (20-30 y 30-40 puntos), con funciones triangulares. Se trata de cómo sería la descripción de la señal de entrada.


Fig. 6. Descripción de categorías para los valores de objetivos de beneficio

 

Implementación de la interfaz del panel para mostrar recomendaciones para cambiar la posición

Al construir el panel de información, seleccionamos cuatro parámetros para las observaciones:

  • Valor ADX. Sólo cuando los criterios especificados se satisfacen, por ejemplo — 30 o superior.
  • Valor RVI. Sólo cuando es superior a 0,1 (para señal de venta), o por debajo de - 0,1 (para señal de compra).
  • El número recomendado de puntos que hay que añadir que el objetivo inicial de 50.
  • Valor de Take Profit en el formato de negociación cotización del instrumento (teniendo en cuenta el precio inicial y recomendaciones sobre cómo aumentarlo).

El aspecto general de la estrategia de trading en plena ejecución se verá como sigue (Fig. 6).

Fig. 7. Plena aplicación, aspecto general y ajuste de la estrategia comercial

Ahora echemos un vistazo a esta aplicación de panel con herramientas MQL4 y librería de FuzzyNet.

Aplicar y analizar los principales bloques lógicos de este panel informativo con herramientas MQL4.

//+------------------------------------------------------------------+
//| Panel FuzzyNet                                                   |
//+------------------------------------------------------------------+
#property copyright "Alexander Fedosov"
#property version "1.0"
#property strict
#property link "https://www.mql5.com/ru/users/alex2356/"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Green
//+------------------------------------------------------------------+
//| Conexión de librerías                                            |
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>

Definimos las propiedades iniciales y conectamos la librería para operar con lógica difusa. Se establece la opción de encontrar el panel en la ventana del gráfico. Vamos a definir un indicador buffer y su color (verde) para un indicador de flecha de la barra que hemos analizado.

//--- Parámetros de entrada
input string  p1="==== Parameters ====";
input int fontSize=15;
input int adx_period=10;
input int rvi_period=10;
input int num_bar=0;
input int Screen_corner=4;
input color label_clr=Red;
input color textColor=Black;

Se verá en el primer bloque de parámetros de entrada en más detalles. Contiene los siguientes elementos:

  • fontSize — tamaño de la fuente de información textual (rango recomendado: 8 — 15).
  • adx_period — período de funcionamiento del indicador ADX.
  • num_bar — se calcula el número de barra para el sistema.
  • Screen_corner — ángulo para mostrar el panel.
  • label_clr — color del texto del encabezado.
  • textColor — color del valor del texto.

El segundo bloque de Parámetros de lógica difusa contiene la mayoría de los parámetros de configuración flexible de todas las funciones de membresía que describen ambos parámetros de entrada (ADX tendencia resistencia, índice RVI) y salida (valores recomendados de beneficio objetivo en puntos).

input string  p2="==== Fuzzy Logic Parameters ====";
//--- ADX
input double in_term1a = 20;
input double in_term1b = 30;
input double in_term1c = 40;
input double in_term1d = 45;
input double in_term2a = 40;
input double in_term2b = 50;
input double in_term2c = 60;
input double in_term3a = 50;
input double in_term3b = 60;
input double in_term3c = 70;
input double in_term4a = 60;
input double in_term4b = 70;
input double in_term4c = 100;
input double in_term4d = 120;
//--- RVI
input double in_term1a1 = -0.25;
input double in_term1b1 = 0.1;
input double in_term1c1 = 0.15;
input double in_term1d1 = 0.25;
input double in_term2a1 = 0.15;
input double in_term2b1 = 0.25;
input double in_term2c1 = 0.35;
input double in_term3a1 = 0.25;
input double in_term3b1 = 0.35;
input double in_term3c1 = 0.45;
input double in_term4a1 = 0.4;
input double in_term4b1 = 0.45;
input double in_term4c1 = 1;
input double in_term4d1 = 1.2;
//--- Salida
input double out_term1a = 5;
input double out_term1b = 10;
input double out_term1c = 15;
input double out_term1d = 22.5;
input double out_term2a = 17.5;
input double out_term2b = 25;
input double out_term2c = 32.5;
input double out_term3a = 27.5;
input double out_term3b = 35;
input double out_term3c = 42.5;
input double out_term4a = 37.5;
input double out_term4b = 45;
input double out_term4c = 50;
input double out_term4d = 60;
input double min_tp = 10;
input double max_tp = 50;


En el siguiente bloque declaramos variables, nombres de las partidas, la actual plantilla del panel de información (tamaño, ubicación, fuentes y otros) y los parámetros de visualización del elemento que indica la barra en curso (en nuestro caso la flecha).

int scaleX=55,scaleY=25,offsetX=35;
//--- declarar matriz con nombres de indicador
string signalName[]={"ADX_val:","RVI_val:","TP_plus:","TP_prc:"};
double adx,adx_di_minus,adx_di_plus,rvi,rvi_sig,mdm;
double Buffer[];
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizado            |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(fontSize>15 || fontSize<8)
     {
      Print("ERROR: Incorrect fontSize. Must be 8-15.");
      Alert("ERROR: Incorrect fontSize. Must be 8-15.");
      return(0);
     }
   if(Screen_corner>4 || Screen_corner<1)
     {
      Print("ERROR: Incorrect Screen_corner. Must be 1-4.");
      Alert("ERROR: Incorrect Screen_corner. Must be 1-4.");
      return(0);
     }
//---
   SetIndexStyle(0,DRAW_ARROW,EMPTY,1);
   SetIndexArrow(0,234);
   SetIndexBuffer(0,Buffer);
   ArrayInitialize(Buffer,0.0);
//---
   for(int y=0;y<4;y++)
     {
      ObjectCreate("lb_ind_nm"+string(y),OBJ_LABEL,0,0,0,0,0);
      //--- change anchor corner    
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_SELECTABLE,false);
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_CORNER,Screen_corner);
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_XDISTANCE,offsetX-30);
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_YDISTANCE,y*scaleY+20);
      ObjectSetText("lb_ind_nm"+string(y),signalName[y],fontSize,"Tahoma",label_clr);
     }
//---
   for(int y=0;y<4;y++)
     {
      ObjectCreate("lb_ind0"+string(y),OBJ_LABEL,0,0,0,0,0);
      //--- change anchor corner
      ObjectSet("lb_ind0"+string(y),OBJPROP_SELECTABLE,false);
      ObjectSet("lb_ind0"+string(y),OBJPROP_CORNER,Screen_corner);
      ObjectSet("lb_ind0"+string(y),OBJPROP_XDISTANCE,scaleX+offsetX);
      ObjectSet("lb_ind0"+string(y),OBJPROP_YDISTANCE,y*scaleY+20);
      ObjectSetText("lb_ind0"+string(y),"",fontSize,"Tahoma",textColor);
     }
   return(INIT_SUCCEEDED);
  }


Ahora, vamos a echar un vistazo en el bloque principal de proceso las señales de los indicadores ADX y RVI.

Se establecen las condiciones bajo las cuales los valores del indicador satisfacen las señales de compra y venta. Cuando coinciden, los valores se controlan con la función mamdani(double t, double v) y aparece en el panel. Todo esto tiene la siguiente forma: valores del indicador actual que demuestra que hemos recibido una señal de compra o venta; recomienda Take Profit (en puntos y en valor numérico).

//+------------------------------------------------------------------+
//| Función de iteración de indicador personalizado                  |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Buffer[num_bar]=High[num_bar]+20*_Point;
   adx=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_MAIN,num_bar),_Digits);
   adx_di_plus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_PLUSDI,num_bar),_Digits);
   adx_di_minus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_MINUSDI,num_bar),_Digits);
//---
   rvi=NormalizeDouble(iRVI(_Symbol,PERIOD_CURRENT,rvi_period,MODE_MAIN,num_bar),_Digits);
   rvi_sig=NormalizeDouble(iRVI(_Symbol,PERIOD_CURRENT,rvi_period,MODE_SIGNAL,num_bar),_Digits);
//---   
   if(adx>30 && adx_di_plus>adx_di_minus && rvi>rvi_sig && rvi<-0.1)
     {
      mdm=MathCeil(mamdani(adx,MathAbs(rvi)));
      ObjectSetText("lb_ind00","buy_signal: "+DoubleToString(adx,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind01","buy_signal: "+DoubleToString(rvi,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind02",DoubleToString(mdm,0),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind03",DoubleToString(tp_prc(mdm),_Digits),fontSize,"Tahoma",textColor);
     }
   else if(adx>30 && adx_di_plus<adx_di_minus && rvi<rvi_sig && rvi>0.1)
     {
      mdm=MathCeil(mamdani(adx,rvi));
      ObjectSetText("lb_ind00","sell_signal: "+DoubleToString(adx,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind01","sell_signal: "+DoubleToString(rvi,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind02",DoubleToString(mdm,0),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind03",DoubleToString(tp_prc(mdm),_Digits),fontSize,"Tahoma",textColor);
     }
   else
     {
      ObjectSetText("lb_ind00","no_signal",fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind01","no_signal",fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind02"," - ",fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind03"," - ",fontSize,"Tahoma",textColor);
     }
   return(rates_total);
  }


La función crea el sistema de lógica difusa. Contiene dos señales de entrada de los indicadores — tendencia y vigor (cada uno de ellos consta de cuatro términos descritos por funciones de pertenencia), y una señalde salida. Cuatro reglas relacionadas con las señales de entrada y salida también se incluyen en el sistema.

//+------------------------------------------------------------------+
//| Función de crear y calcular el sistema basado en lógica difusa           |
//+------------------------------------------------------------------+
double mamdani(double t,double v)
  {
   double res=0;
//--- Sistema difuso Mamdani  
   MamdaniFuzzySystem *fsSignal=new MamdaniFuzzySystem();
//--- Crear las variables de entrada para el sistema
   FuzzyVariable *fsTrend=new FuzzyVariable("trend",30.0,100.0);
   FuzzyVariable *fsVigor=new FuzzyVariable("vigor",0.1,1.0);
//--- ADX
   fsTrend.Terms().Add(new FuzzyTerm("low", new TrapezoidMembershipFunction(in_term1a, in_term1b, in_term1c, in_term1d)));
   fsTrend.Terms().Add(new FuzzyTerm("moderate", new TriangularMembershipFunction(in_term2a, in_term2b, in_term2c)));
   fsTrend.Terms().Add(new FuzzyTerm("medium", new TriangularMembershipFunction(in_term3a, in_term3b, in_term3c)));
   fsTrend.Terms().Add(new FuzzyTerm("high",new TrapezoidMembershipFunction(in_term4a, in_term4b, in_term4c, in_term4d)));
   fsSignal.Input().Add(fsTrend);
//--- RVI
   fsVigor.Terms().Add(new FuzzyTerm("low", new TrapezoidMembershipFunction(in_term1a1, in_term1b1, in_term1c1, in_term1d1)));
   fsVigor.Terms().Add(new FuzzyTerm("medium", new TriangularMembershipFunction(in_term2a1, in_term2b1, in_term2c1)));
   fsVigor.Terms().Add(new FuzzyTerm("high", new TriangularMembershipFunction(in_term3a1, in_term3b1, in_term3c1)));
   fsVigor.Terms().Add(new FuzzyTerm("higher",new TrapezoidMembershipFunction(in_term4a1, in_term4b1, in_term4c1, in_term4d1)));
   fsSignal.Input().Add(fsVigor);
//--- Crear Salida
   FuzzyVariable *fvSignal=new FuzzyVariable("signal",min_tp,max_tp);
   fvSignal.Terms().Add(new FuzzyTerm("low_take", new TrapezoidMembershipFunction(out_term1a, out_term1b, out_term1c, out_term1d)));
   fvSignal.Terms().Add(new FuzzyTerm("mod_take", new TriangularMembershipFunction(out_term2a, out_term2b, out_term2c)));
   fvSignal.Terms().Add(new FuzzyTerm("med_take", new TriangularMembershipFunction(out_term3a, out_term3b, out_term3c)));
   fvSignal.Terms().Add(new FuzzyTerm("high_take", new TrapezoidMembershipFunction(out_term4a, out_term4b, out_term4c, out_term4d)));
   fsSignal.Output().Add(fvSignal);
//--- Crear cuatro reglas de difusión de Mamdani
   MamdaniFuzzyRule *rule1 = fsSignal.ParseRule("si (la tendencia es baja) y (vigor es bajo) entonces la señal es low_take");
   MamdaniFuzzyRule *rule2 = fsSignal.ParseRule("si (la tendencia es moderada) y (es de vigor medio) entonces señal es mod_take");
   MamdaniFuzzyRule *rule3 = fsSignal.ParseRule("si (la tendencia es medio) y (vigor es alta) entonces señal es med_take");
   MamdaniFuzzyRule *rule4 = fsSignal.ParseRule("si (la tendencia es alta) y (vigor) señal es high_take");
//--- Añadir cuatro reglas de difusión de Mamdani en el sistema
   fsSignal.Rules().Add(rule1);
   fsSignal.Rules().Add(rule2);
   fsSignal.Rules().Add(rule3);
   fsSignal.Rules().Add(rule4);
//--- Configurar valores de entrada
   CList *in=new CList;
   Dictionary_Obj_Double *p_od_adx=new Dictionary_Obj_Double;
   Dictionary_Obj_Double *p_od_rvi=new Dictionary_Obj_Double;
   p_od_adx.SetAll(fsTrend,t);
   p_od_rvi.SetAll(fsVigor,v);
   in.Add(p_od_adx);
   in.Add(p_od_rvi);
//--- Obtener resultado
   CList *result;
   Dictionary_Obj_Double *p_od_out;
   result=fsSignal.Calculate(in);
   p_od_out=result.GetNodeAtIndex(0);
   res=NormalizeDouble(p_od_out.Value(),_Digits);
//---
   delete in;
   delete result;
   delete fsSignal;
   return res;
  }


Vamos a proceder al bloque final , "Funciones adicionales". El primero de ellos — tp_prc(double take) convierte el value de Take Profit en puntos a un valor numérico del precio actual del instrumento de moneda. El segundo define el número de signos en el actual instrumento de la moneda.

//+------------------------------------------------------------------+
//| Función para determinar los objetivos de beneficio                    |
//+------------------------------------------------------------------+
double tp_prc(double take)
  {
   int tip;
   double opr,tp;
   take+=50;
   adx_di_plus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_PLUSDI,num_bar),_Digits);
   adx_di_minus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_MINUSDI,num_bar),_Digits);
//---
   if(adx_di_plus>adx_di_minus)
      tip=0;
   else if(adx_di_plus<adx_di_minus)
      tip=1;
//---
   switch(tip)
     {
      case 0:
         opr=Ask;
         break;
      case 1:
         opr=Bid;
         break;
     }
   if(MathMod(tip,2.0)==0.0)
     {
      tp=opr+take*Dig()*_Point;
     }
   else
     {
      tp=opr-take*Dig()*_Point;
     }
   return(tp);
  }
//+------------------------------------------------------------------+
//| Función devuelve la cantidad de decimales |
//+------------------------------------------------------------------+
int Dig()
  {
   return((_Digits==5 || _Digits==3 || _Digits==1)?10:1);
  }
//+------------------------------------------------------------------+

También me gustaría llamar su atención sobre la corrección de los ajustes y nueva comprobación de la corrección de parámetro en la sección Parámetros de lógica borrosa durante la prueba. Recomiendo confiar en su primera representación gráfica en la figura 3, 5, 6, ya que los valores incorrectos pueden llevar a errores y mal funcionamiento de todo el sistema. Por favor tener cuidado!

 

Conclusión

En conclusión, vamos a resumir lo que hemos aprendido.

  • La primera parte del trabajo para la creación de un manual de la estrategia con la lógica difusa se encuentra en el desarrollo de reglas terminantemente formalizadas de esta estrategia. Esto fue examinado en las etapas Num — Num 3.
  • Entonces es necesario encontrar desventajas de la formalización estricta donde se aplica la estricta clasificación de bloques estimados o parámetros. En el ejemplo proporcionado, se encontró una parte de la estrategia que no nos permite determinar el momento de entrada en el mercado con la suficiente flexibilidad.
  • Además, todas las categorías claras se describen usando la teoría de conjuntos difusa y, por lo tanto, ser más flexibles. Ahora, en los valores de frontera puede ser un perteneciente a no sólo una categoría específica como antes, sino a los dos al mismo tiempo en un diverso grado.
  • Esta estrategia se implementa bajo la forma de indicador, panel o alerta. En este artículo, se seleccionó un panel en el lenguaje MQL4.
Hemos considerado la oportunidad de mejorar el manual de estrategia de trading mediante la aplicación de teoría de conjuntos difusa. Utilizando el ejemplo se revelan más detalles sobre cómo la estrategia de trading ya formada es modificada y complementada mediante la aplicación de la lógica difusa y se deshace de los defectos descubiertos.

Traducción del ruso hecha por MetaQuotes Software Corp.
Artículo original: https://www.mql5.com/ru/articles/2195

Archivos adjuntos |
fuzzy_panel.mq4 (23.67 KB)
Evaluando la efectividad de los sistemas comerciales mediante el análisis de sus componentes Evaluando la efectividad de los sistemas comerciales mediante el análisis de sus componentes

En este artículo vamos a investigar la efectividad de los sistemas comerciales complejos mediante el análisis de la efectividad de sus componentes por separado. Cualquier análisis, sea de tipo gráfico, basado en indicadores o de cualquier otro tipo, es uno de los componentes clave para comerciar con éxito en los mercados financieros. Este artículo es una investigación sui generis de varios sistemas comerciales sencillos independientes, en la que se analiza su efectividad y la utilidad de su aplicación conjunta.

Cómo crear un indicador de gráficos no estándar para MetaTrader Market Cómo crear un indicador de gráficos no estándar para MetaTrader Market

Con la ayuda de gráficos offline, de la programación en el lenguaje MQL4 y un poco de empeño usted podrá conseguir gráficos de cualquier tipo: "Punto-figura", "Renko", "Kagi", "Range bars", equivolumen, etc. En este artículo le mostraremos cómo hacer esto sin usar DLL, de forma que pueda publicar y adquirir estos indicadores "dos en uno" en el Mercado.

Protección contra activaciones erróneas del robot comercial Protección contra activaciones erróneas del robot comercial

La rentabilidad de los sistemas comerciales se determina no solo por la lógica y la precisión del análisis de la dinámica de los instrumentos financieros, sino también por la calidad del algoritmo de ejecución de esta lógica. Una expresión característica de ejecución defectuosa de la lógica principal del robot comercial son las activaciones erróneas. En el artículo se analizan variantes para resolver este problema.

Red neuronal profunda con Stacked RBM. Auto-aprendizaje, auto-control Red neuronal profunda con Stacked RBM. Auto-aprendizaje, auto-control

El artículo es la continuación de artículos anteriores sobre neuroredes profundas y elección de predictores. En este veremos las particularidades de una neurored iniciada con Stacked RBM, así como su implementación en el paquete "darch".