EA de MT4 no abre posiciones con el SL que le estoy diciendo.

 

Buenas tardes. ¿Alguien podrá explicarme qué está pasando con este código?

Estoy aprendiendo mql4, haciendo pruebas de lo que voy leyendo (voy poco a poco).  Estoy utilizando una cuenta demo de ******* para hacer las pruebas, y estoy colocando en el código del EA, que abra una posición en EUR/USD con salidas según el mínimo requerido para las salida por el broker, pero no está abriendo los trades según el Stop Loss que puse en el código, pues le estoy diciendo que coloque como Stop Loss (SL) y como Take Profit (TP) lo que diga que es el " MODE_STOPLEVEL", y abre los trades colocándole otro SL.

Para verificar, he pedido al EA que, además de abrir el trade colocándole SL y TP según  "MODE_STOPLEVEL", que también me diga (con la función "Alert") cuál es la cantidad de "MODE_STOPLEVEL", y con la función "Alert" me indica una cantidad, pero abre la posición con otra en el SL.


A continuación el código, por si ayuda, y al final, debajo de este, he colocado las cantidades que me dice en función "Alert" y lo precios a qué colocó las salida en los trades que abrió:



#property version   "1.00"
#property strict

double StopLevel0, StopLevel2, StopLevel;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
StopLevel0 = MarketInfo(Symbol(), MODE_STOPLEVEL);
StopLevel2= StopLevel0*Point; 
StopLevel = NormalizeDouble(StopLevel2, Digits);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
double SMA7Previous=iMA(NULL,PERIOD_M1,7,0,MODE_SMA,PRICE_CLOSE,1);  
double SMA9Previous=iMA(NULL,PERIOD_M1,9,0,MODE_SMA,PRICE_CLOSE,1);
double PrecioM=Ask+(Ask-Bid);
double SL=0.0005;
double TP=0.0005;
//---
if(OrdersTotal() == 0)
   {
   Alert("StopLevel = ", StopLevel0);
   Alert("StopLevel0*Point=",StopLevel2);
   Alert("StopLeveNormalizado=",StopLevel);
   if (SL < StopLevel) SL = StopLevel;
   if (TP < StopLevel) TP = StopLevel;
   if(SMA7Previous>SMA9Previous)
      {
      if (Bid - SL < StopLevel) SL = Bid - StopLevel;
      if (TP - Bid < StopLevel) TP = Bid + StopLevel;
      int ticket=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-SL,Ask+TP,"SMA",12345,0,Green);       
      if(ticket < 0) // Si la orden falla 
         { 
         Alert("Error abriendo larga:", GetLastError()); // Imprimir el error 
         } 
      else // Si la orden se ejecuta 
         { 
         Alert("Posición larga abierta con éxito: ", ticket); // Imprimir el número de ticket 
         }   
      }
   if(SMA7Previous<SMA9Previous)
      {
      if (SL - Ask < StopLevel) SL = Ask + StopLevel;
      if (Ask - TP < StopLevel) TP = Ask - StopLevel;
      int ticket=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Bid+SL,Bid-TP,"SMA",23456,0,Red);         
      if(ticket < 0) // Si la orden falla 
         { 
         Alert("Error abriendo corta:", GetLastError()); // Imprimir el error 
         } 
      else // Si la orden se ejecuta 
         { 
         Alert("Posición corta abierta con éxito: ", ticket); // Imprimir el número de ticket 
         }   
      }
   }  
}


//+------------------------------------------------------------------+


En las 3 "Alert" me dice lo siguiente: 

StopLevel = 36.0

StopLevel0*Point=0.00036

StopLeveNormalizado=0.00036


Sin embargo, cuando abre el trade, tiene los siguientes precios (abrió venta en corto):

Precio de entrada:1,0768

Stop Loss: 2,15414

Take profit:1,0763


El TP es de 0.0005, pero el SL debería ser: 

1,0773 ( 1,0768 + 0.0005) ó 1,07716 ( 1,0768 + 0.00036). Lo que está colocando es una cantidad muy grande que no veo en ninguna parte del código. 


Notar otra cosa: además de que el SL no es ni 0.0005 ni "MODE_STOPLEVEL", tanto el SL como el TP tienen como condición ser 0.0005, salvo 0.0005 sea menor que "MODE_STOPLEVEL", así que no tiene sentido que en el TP ponga 0.0005 si no lo pone en el SL también; lo que sería otro error que estoy viendo.

¿Alguien sabe a qué se debe estos errores y cómo corregirlos?


Muchas gracias de antemano. 

Principios generales - Operaciones comerciales - Guía de ayuda de MetaTrader 5
  • www.metatrader5.com
Antes de empezar a estudiar las funciones comerciales de la plataforma, es necesario formar una idea clara sobre los términos principales...