Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1632

 
amsgif80 #:

Este es el código que he intentado insertar:

En la parte superior del código tirar esto:
enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // comprar sólo
DIRECTION_SELL = 1, // vender sólo
DIRECTION_ANY = 2, // comprar & vender
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // dirección de comercio permitida


además encontrar donde en el código abre comprar y donde vender. Mira dentro de la función start() o OnTick()
dondecomprar está enlas condiciones añadir:
if(inp_direction!=DIRECTION_SELL)
donde vender está en las condiciones añadir:
if(inp_direction!=DIRECTION_BUY )

¿Dónde lo has puesto?
 
MakarFX #:
¿Dónde lo pusiste?
//+------------------------------------------------------------------+
//| Promedios móviles.mq5 |
//| Copyright 2009-2013, MetaQuotes Software Corp.
//+------------------------------------------------------------------+





#property copyright "Copyright 2009-2013, MetaQuotes Software Corp.
#enlace de propiedad"https://www.mql5.com"
#versión de la propiedad "1.00"

enum ENUM_DIRECTION{
DIRECCIÓN_BUY = 0, // sólo compra
DIRECCIÓN_VENTA = 1, // sólo venta
DIRECTION_ANY = 2, // comprar y vender
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // dirección comercial permitida

#include <Trade\Trade.mqh>

input double RiesgoMáximo = 0.02; // Riesgo máximo en porcentaje
input double DecreaseFactor = 3; // Factor de reducción
input int MovingPeriod = 12; // Periodo de la media móvil
input int MovingShift = 6; // Desplazamiento de la media móvil



//---
int ExtHandle=0;


//+------------------------------------------------------------------+
//| Función de inicialización de expertos |
//+------------------------------------------------------------------+




int OnInit(void)
{
//---
ExtHandle=iMA(_Símbolo,_Período,PeríodoMóvil,DesplazamientoMóvil,MODE_SMA,PRECIO_CIERRE);
if(ExtHandle==INVALID_HANDLE)
{
printf("Error al crear el indicador MA");
return(INIT_FAILED);
}
//---
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| función de tic experto |
//+------------------------------------------------------------------+
void OnTick(void)
{
//---
if(PositionSelect(_Symbol))
CheckForClose();
si no
CheckForOpen();
//---
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calcular el tamaño óptimo del lote |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
{
doble precio=0,0;
doble margen=0,0;
//--- calcular el tamaño del lote
if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
return(0.0);
if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
return(0.0);
if(margen<=0,0)
return(0.0);

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/margin,2);
//--- calcular la duración de una serie de operaciones perdedoras ininterrumpidas
si(Factor de disminución>0)
{
//--- solicitar todo el historial de operaciones
HistorySelect(0,TimeCurrent());
//--
int orders=HistoryDealsTotal(); //número total de operaciones
int losses=0; // número de operaciones perdedoras en la serie

for(int i=órdenes-1;i>=0;i--)
{
ulong ticket=HistoryDealGetTicket(i);
if(ticket==0)
{
Print("HistoryDealGetTicket falló, no hay historial de operaciones");
romper;
}
//--- comprobar el símbolo comercial
if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
continuar;
//--- comprobar el beneficio
double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
si(beneficio>0,0)
romper;
si(beneficio<0,0)
pérdidas++;
}
//---
si(pérdidas>1)
lote=NormalizarDoble(lote*pérdidas/Factor de disminución,1);
}
//--- normalizar y comprobar los valores permitidos del volumen de comercio
double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lote=volumen de paso*NormalizarDoble(lote/volumen de paso,0);

double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(lote<minvol)
lote=minvol;

double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
if(lote>máxvol)
lote=volumen máximo;
//--devolver el valor del volumen de operaciones
devolución(lote);
}


//+------------------------------------------------------------------+
//| Comprueba las condiciones de posición abierta ||
//+------------------------------------------------------------------+
void CheckForOpen(void)
{
MqlRates rt[2];
//--- copiar los valores de los precios
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates de ",_Symbol," falló, no hay historial");
volver;
}
//--comercio sólo en el primer tick de la nueva barra
if(rt[1].tick_volumen>1)
volver;
//--- obtener el valor actual del indicador de Media Móvil
doble ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
volver;
}
//--- comprobación de la señal
ENUM_ORDER_TYPE signal=WRONG_VALUE;

if(rt[0].open>ma[0] && rt[0].close<ma[0])
signal=ORDER_TYPE_SELL; // condición para vender if(inp_direction!=DIRECTION_BUY)
si no
{
if(rt[0].open<ma[0] && rt[0].close>ma[0])
signal=ORDER_TYPE_BUY; // condición para comprar if(inp_direction!=DIRECTION_SELL)
}
//--- comprobaciones adicionales
if(señal!=WRONG_VALUE)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
if(Bars(_Symbol,_Period)>100)
{
El comercio de CTrade;
trade.PositionOpen(_Símbolo,señal,TradeSizeOptimized(),
SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK,)
0,0);
}
//---
}
//+------------------------------------------------------------------+
//| Comprueba las condiciones de la posición cercana |
//+------------------------------------------------------------------+
void CheckForClose(void)
{
MqlRates rt[2];
//--- copiar los valores de los precios
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates de ",_Symbol," falló, no hay historial");
volver;
}
//--comercio sólo en el primer tick de la nueva barra
if(rt[1].tick_volumen>1)
volver;
//--- obtener el valor actual del indicador de Media Móvil
doble ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
volver;
}
//--- obtener el tipo de la posición, seleccionada anteriormente a través de la PositionSelect().
bool signal=false;
long type=PositionGetInteger(POSITION_TYPE);

if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])
signal=true;
if(type==(long)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])
signal=true;
//--- comprobaciones adicionales
si(señal)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
if(Bars(_Symbol,_Period)>100)
{
El comercio de CTrade;
trade.PositionClose(_Symbol,3);
}
//---
}
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

Esta sección debería ser así

 //--- проверка сигналов
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
     {
      if(inp_direction!=DIRECTION_BUY)
         signal=ORDER_TYPE_SELL;
     }
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
        {
         if(inp_direction!=DIRECTION_SELL)
            signal=ORDER_TYPE_BUY;
        }
     }
 //--- дополнительные проверки 
 
MakarFX #:

Esta sección debería ser así.

Makar, éste.

      if(inp_direction==DIRECTION_SELL||inp_direction==DIRECTION_ANY)

es mejor sustituirlo por esto.

      if(inp_direction!=DIRECTION_BUY)
 
Alexey Viktorov #:

Makar, este

es mejor sustituirlo por esto.

Sustituido)
 
MakarFX #:

Esta sección debería ser así

Gracias de todo corazón. Todo funcionó a la vez, está funcionando. Y ya me he devanado los sesos para saber cómo hacerlo))

 
¿Puedo volver a hacerte la misma pregunta, pero sobre mi propio y sencillo EA generado por el editor? Pensé que ahora me las arreglaría para hacerlo yo mismo, pero no sé dónde poner este código de Compra/Venta. No sé dónde pegar este código de compra/venta.
 
amsgif80 #:
¿Puedo volver a hacerte la misma pregunta, pero sobre mi propio y sencillo EA generado por el editor? Pensé que ahora me las arreglaría para hacerlo yo mismo, pero no sé dónde poner este código de Compra/Venta. No puedo averiguar dónde pegar este código de compra/venta.
Muéstrame
 
amsgif80 #:

Te he mostrado cómo insertar el código en el foro


 
MakarFX #:

No has cambiado nada.

su recurso

está dentro.

Makar gracias por el consejo

Razón de la queja: