miércoles, 8 de agosto de 2012

34. El código del Sabueso (Ascendente y Descendente)

Observaciones:

1. Aquí abajo no hay un experto, sino dos. El Sabueso Ascendente es uno, y el segundo es El Sabueso Descendente.

2. Como lo que hice para traer el código fue "copiar y pegar", entonces algunas líneas se ven cortadas, pero no estoy seguro pues veo el código desde mi teléfono. Tal vez desde un computador se vean normales.... O sea que tal vez hay que ajustar esos cortes, creando de nuevo líneas de código más largas. Si no lo hiciera, al momento de compilar el programa saldrían 1000 errores de sintaxis. ¡¡Mejor!! Así sabría donde alargar las líneas de código.

3. Cómo de dijo arriba, este código debe ser compilado. Al compilarlo se creará un archivo ejecutable (punto exe), y ese sí que lo podrá usar si problemas.

4. ¡Buen provecho.

(Después de la línea siguiente de asteriscos viene el código de los expertos.

*****************************************





//+------------------------------------------------------------------+
//| Sabueso 050 Ascendente.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| Julio 23 de 2011 |
//+------------------------------------------------------------------+
#property copyright " - Para cuenta Real LiteForex."

//************************************************************************************
//
// P A R A A R R I B A
//
// Ajustado en progresiones hasta la 7a
// Siempre cortando los pips por la mitad
//
//
// Alarmas hasta la 4a - Envía correos de alerta
//
//************************************************************************************


extern int Senal_de_Cambio = 128; // Variación del precio para abrir posición de respaldo
extern int Cierre_Primera = 15; // Claro, el cierre de la primera posición
extern int Profit_de_corte = 100; // Cierra todo si va ganando X dólares
extern double Pro1 = 0.1 ; // Lotes de la primera posición
extern double Fraccion = 0.1 ;
extern double Expon = 4 ;
extern bool Alarmas = true ;
extern int Alarma_1a = 150 ; // Cuando la cuenta está en XXX pesos y sólo hay una posoción abierta
extern int Alarma_2a = 2000 ;
extern int Alarma_3a = 8000 ;
extern int Alarma_4a = 22000 ;

extern int Espera_entre_alarmas = 1 ; // Minutos entre correos cuando se envían una alarma se correo electrónico


double Pro2 ;
double Pro3 ;
double Pro4 ;
double Pro5 ;
double Pro6 ;
double Pro7 ;
double Pro8 ;
double Pro9 ;
double Pro10 ;
double Pro11 ;


int Pos_1 = 0 ; // Pos. 1
int Pos_2 = 0 ; // Pos. 2
int Pos_3 = 0 ; // Pos. 3
int Pos_4 = 0 ; // Etc.
int Pos_5 = 0 ;
int Pos_6 = 0 ;
int Pos_7 = 0 ;
int Pos_8 = 0 ;
int Pos_9 = 0 ;
int Pos_10 = 0 ;
int Pos_11 = 0 ;

int Posiciones_Abiertas ;

double Borde_Superior ; // Punto superior de la oscilación
double Borde_Inferior ; // Punto menor de la oscilación

double Spread ;

int Activador_de_cierre ;
string Par ; // Nombre del par
double Este_par ; // Cantidad de ransacciones abiertas en este par
double Ganancia ;
double Acumulado ;
int Intentos ;

double Medio ;
double Cuarto ;
double Octavo ;
double Dieciseisavo ;
double Treintaidosavo ;

int Contador_de_alarma = 0 ;
int Tiempo_inside_1a ;
int Futuro ;



//+------------------------------------------------------------------+
//| expert initializaion function |
//+------------------------------------------------------------------+
int init() // El init() se necesita para qe el experto funcione
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() // El deinit() se necesita para que el experto funcione
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

Contar_este_par();

if(Alarmas == True)
{
Enviar_alarma();
}

Calcular_ganancia();


if (Acumulado > Profit_de_corte)
{
Cierra_Par();
}

if(Este_par!=0)
{
Recuperar_variables();
}

RefreshRates();


if(Este_par==0)
{
Cero_Posiciones();
}
if(Este_par==1)
{
Analiza_1_Abre_2();
}
if(Este_par==2)
{
Analiza_2_Abre_3();
}
if(Este_par==3)
{
Analiza_3_Abre_4();
}
if(Este_par==4)
{
Analiza_4_Abre_5();
}
if(Este_par==5)
{
Analiza_5_Abre_6();
}
if(Este_par==6)
{
Analiza_6_Abre_7();
}
if(Este_par==7)
{
Analiza_7_Abre_8();
}
if(Este_par==8)
{
Analiza_8_Abre_9();
}
if(Este_par==9)
{
Analiza_9_Abre_10();
}
if(Este_par==10)
{
Analiza_10_Abre_11();
}

Pro2= (MathCeil((MathPow(2,Expon) * Fraccion)*10))/10;
Pro3= (MathCeil((MathPow(3,Expon) * Fraccion)*10))/10;
Pro4= (MathCeil((MathPow(4,Expon) * Fraccion)*10))/10;
Pro5= (MathCeil((MathPow(5,Expon) * Fraccion)*10))/10;
Pro6= (MathCeil((MathPow(6,Expon) * Fraccion)*10))/10;
Pro7= (MathCeil((MathPow(7,Expon) * Fraccion)*10))/10;


Comment("Posiciones : ", Este_par, " ; Par : ", Par, " ; Apalancamiento: 1/", AccountLeverage(), " "+" \n"+"Progresión ", Pro2, " ", Pro3, " ", Pro4, " ", Pro5, " ", Pro6, " ", Pro7, " " +" \n"+ "BI: ", Borde_Inferior, " ; BS: ", Borde_Superior, " ; Balance : $", AccountBalance(), " ; Fecha y hora : ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), "; 2a : ", Borde_Inferior, "; 3a : ", Borde_Superior - Medio, "; 4a : ", Borde_Inferior + Cuarto, "; 5a : ", Borde_Inferior + Cuarto + Dieciseisavo, " "+" \n"+ "Equity Tebille : $",AccountEquity(), " ; Margen : $", AccountMargin(), " ; Free Margin : $", AccountFreeMargin()," ; Par Profit : $",Acumulado);
Sleep(50);
Comment(" ");
Sleep(50);
Comment("Posiciones : ", Este_par, " ; Par : ", Par, " ; Apalancamiento: 1/", AccountLeverage(), " "+" \n"+"Progresión ", Pro2, " ", Pro3, " ", Pro4, " ", Pro5, " ", Pro6, " ", Pro7, " " +" \n"+ "BI: ", Borde_Inferior, " ; BS: ", Borde_Superior, " ; Balance : $", AccountBalance(), " ; Fecha y hora : ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), "; 2a : ", Borde_Inferior, "; 3a : ", Borde_Superior - Medio, "; 4a : ", Borde_Inferior + Cuarto, "; 5a : ", Borde_Inferior + Cuarto + Dieciseisavo, " "+" \n"+ "Equity Tebille : $",AccountEquity(), " ; Margen : $", AccountMargin(), " ; Free Margin : $", AccountFreeMargin()," ; Par Profit : $",Acumulado);
//Comment("Posiciones : ", Este_par, " ; Par : ", Par, " ; Apalancamiento: 1/", AccountLeverage(), " "+" \n"+"Progresión ", Pro2, " ", Pro3, " ", Pro4, " ", Pro5, " ", Pro6, " ", Pro7, " " +" \n"+ "BI: ", Borde_Inferior, " ; BS: ", Borde_Superior, " ; Balance : $", AccountBalance(), " ; Fecha y hora : ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), "; 2a : ", Borde_Inferior, "; 3a : ", Borde_Superior - Medio, "; 4a : ", Borde_Inferior + Cuarto, " " +" \n"+ "Equity Tebille : $",AccountEquity(), " ; Margen : $", AccountMargin(), " ; Free Margin : $", AccountFreeMargin()," ; Par Profit : $",Acumulado);


return(0);
}
//+--------------------------------------------------------------------------------------------------------+
int Contar_este_par()
{
RefreshRates();

Par=Symbol();

Este_par = 0;

for(int i=0;i<OrdersTotal();i++) // Cuenta el número de posiciones de este par en específico
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Par)
{
Este_par++;
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Enviar_alarma()
{

RefreshRates(); // > <

//------------------------
if(Este_par==1)
{
if(AccountFreeMargin() < Alarma_1a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
//------------------------
if(Este_par==2)
{
if(AccountFreeMargin() < Alarma_2a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
//------------------------
if(Este_par==3)
{
if(AccountFreeMargin() < Alarma_3a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
//------------------------
if(Este_par==4)
{
if(AccountFreeMargin() < Alarma_4a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Calcular_ganancia()
{
RefreshRates();

double Ganancia;
string Par ;
double Este_par ;

Ganancia = 0 ;
Acumulado = 0 ;

Par = Symbol();

Este_par = 0;

for(int i=0;i<OrdersTotal();i++) // Cuenta el número de posiciones de este par en específico
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol() == Par)
{
Ganancia = OrderProfit() + OrderSwap() ;
Acumulado = Ganancia + Acumulado;
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Recuperar_variables()
{
RefreshRates();

Par = Symbol();

for(int i=0;i<OrdersTotal();i++) // Cuenta el número de posiciones de este par en específico
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol() == Par)
{
Borde_Superior = OrderOpenPrice();
Borde_Inferior = Borde_Superior - Senal_de_Cambio * Point ;


Medio = (Borde_Superior - Borde_Inferior)/2;
Cuarto = Medio/2;
Octavo = Cuarto/2;
Dieciseisavo = Octavo/2 ;
Treintaidosavo = Dieciseisavo/2 ;

return ;
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Cierra_Par() // Cierra todas las posiciones


{

while (Este_par>0)
{

if(OrderSymbol() == Par)
{
if (OrderType()==OP_BUY )
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);
/*
if (GetLastError() != 0)
{
_GetLastError = GetLastError();
//Alert("Error #", _GetLastError, " en ", Par );
break ;
}
*/
if (OrderType()==OP_SELL )
OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);


Contar_este_par();
}
}
}

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

int Cero_Posiciones() // Abre la primera posición (UNA COMPRA DE 0.01 LOTES)
{
MathSrand(TimeLocal());
MathRand();

int Magic_1 = MathRand()+1;

RefreshRates();

Spread = Ask - Bid ;


Borde_Inferior = Ask - (Senal_de_Cambio * Point);
Borde_Superior = Ask ; //+ Spread ;

Medio = (Borde_Superior - Borde_Inferior)/2;
Cuarto = Medio/2;
Octavo = Cuarto/2;
Dieciseisavo = Octavo/2 ;
Treintaidosavo = Dieciseisavo/2 ;

Pos_1=OrderSend(Symbol(),OP_BUY,Pro1,Ask,3,0,1000,"1a",Magic_1,0,Yellow);

if (GetLastError() == 0) // Si la transacción se hizo sin novedad
{
//Alert ("Abierta la 1a posición, Una COMPRA con ", Lots, " Lotes");
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_1_Abre_2() // ANALIZA 1A POSICIÓN
{

MathSrand(TimeLocal());
MathRand();
int Magic_2 = MathRand()+1;

RefreshRates(); // Renew data

if (Acumulado > Cierre_Primera)
{
Cierra_Par();
}

Pro2= (MathCeil((MathPow(2,Expon) * Fraccion)*10))/10;

if (Borde_Inferior >= Bid) // Si la señal para la 2a posición, una venta, se activa
{
Pos_2=OrderSend(Symbol(),OP_SELL,Pro2,Bid,3,1000,0,"2a",Magic_2,0,Blue);
if (GetLastError() == 0)
{
//Alert ("Abierta la 2a posición. Una VENTA con ", Lots*Pro2, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_2_Abre_3() // ANALIZA 2A POSICIÓN
{
MathSrand(TimeLocal());
MathRand();

int Magic_3 = MathRand()+1;

RefreshRates(); // Renew data

Pro3= (MathCeil((MathPow(3,Expon) * Fraccion)*10))/10;

if ((Borde_Superior - Medio) <= Ask) // Si la señal para la 3a posición, una compra, se activa...
{
Pos_3=OrderSend(Symbol(),OP_BUY,Pro3,Ask,3,0,1000,"3a",Magic_3,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_3_Abre_4() // ANALIZA 3A POSICIÓN
{
MathSrand(TimeLocal());
MathRand();

int Magic_4 = MathRand()+1;

RefreshRates(); // Renew data

Pro4= (MathCeil((MathPow(4,Expon) * Fraccion)*10))/10;

if ((Borde_Inferior + Cuarto) >= Bid) // Si la senal para la venta No. 2 se activa
{
Pos_4=OrderSend(Symbol(),OP_SELL,Pro4,Bid,3,1000,0,"4a",Magic_4,0,Black);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_4_Abre_5()
{
MathSrand(TimeLocal());
MathRand();

int Magic_5 = MathRand()+1;

RefreshRates(); // Renew data

Pro5= (MathCeil((MathPow(5,Expon) * Fraccion)*10))/10;

if ((Borde_Inferior + Cuarto + Octavo) <= Ask) // Si la señal para la 3a posición, una compra, se activa...
{
Pos_5=OrderSend(Symbol(),OP_BUY,Pro5,Ask,3,0,1000,"5a",Magic_5,0,White);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_5_Abre_6()
{
RefreshRates(); // Renew data

Pro6= (MathCeil((MathPow(6,Expon) * Fraccion)*10))/10;

if (Borde_Inferior + Cuarto + Dieciseisavo >= Bid) // Si la senal para la venta No. 2 se activa
{
Pos_6=OrderSend(Symbol(),OP_SELL,Pro6,Bid,3,1000,0,"6a",66523,0,Red);
//OrderSelect(Pos_4, SELECT_BY_TICKET, MODE_TRADES); // segunda venta...
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_6_Abre_7()
{
MathSrand(TimeLocal());
MathRand();

int Magic_6 = MathRand()+1;

RefreshRates(); // Renew data

Pro7= (MathCeil((MathPow(7,Expon) * Fraccion)*10))/10;

if (Borde_Inferior + Cuarto + Dieciseisavo + Treintaidosavo <= Ask) // Si la señal para la 3a posición, una compra, se activa...
{
Pos_7=OrderSend(Symbol(),OP_BUY,Pro7,Ask,3,0,1000,"7a",Magic_6,0,Green);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_7_Abre_8()
{
RefreshRates(); // Renew data

Pro8= (MathCeil((MathPow(8,Expon) * Fraccion)*10))/10;

if (Borde_Inferior >= Bid) // Si la senal para la venta No. 2 se activa
{
Pos_8=OrderSend(Symbol(),OP_SELL,Pro8,Bid,3,1000,0,"8a",887867,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_8_Abre_9()
{
MathSrand(TimeLocal());
MathRand();

int Magic_7 = MathRand()+1;

RefreshRates(); // Renew data

Pro9= (MathCeil((MathPow(9,Expon) * Fraccion)*10))/10;

if (Borde_Superior <= Ask) // Si la señal para la 3a posición, una compra, se activa...
{
Pos_3=OrderSend(Symbol(),OP_BUY,Pro9,Ask,3,0,1000,"9a",Magic_7,0,Green);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_9_Abre_10()
{
MathSrand(TimeLocal());
MathRand();

int Magic_8 = MathRand()+1;

RefreshRates(); // Renew data

Pro10= (MathCeil((MathPow(10,Expon) * Fraccion)*10))/10;

if (Borde_Inferior >= Bid) // Si la senal para la venta No. 2 se activa
{
Pos_10=OrderSend(Symbol(),OP_SELL,Pro10,Bid,3,1000,0,"10a",Magic_8,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}
}
//--------------------------------------------------------------------------------------------------------+
int Analiza_10_Abre_11()
{
MathSrand(TimeLocal());
MathRand();

int Magic_9 = MathRand()+1;

RefreshRates(); // Renew data

Pro11= (MathCeil((MathPow(11,Expon) * Fraccion)*10))/10;

if (Borde_Superior <= Ask) // Si la señal para la 3a posición, una compra, se activa...
{
Pos_11=OrderSend(Symbol(),OP_BUY,Pro11,Ask,3,0,1000,"11a",Magic_9,0,Green);
if (GetLastError() == 0)
{
//Alert ("Abierta la 5a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}

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





***************************************
ESTE ES EL LÍMITE ENTRE LOS DOS EXPERTOS.
***************************************




//+------------------------------------------------------------------+
//| Sabueso 049 Descendente.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| Julio 20 de 2011 |
//+------------------------------------------------------------------+
#property copyright " - Para cuenta Real LiteForex."

//************************************************************************************
//
// P A R A A B A J O
//
// Ajustado en progresiones hasta la 7a
// Siempre cortando pos pips por la mitad
//
//
// Alarmas hasta la 4a - Envía correos de alerta
//
//************************************************************************************


extern int Senal_de_Cambio = 128; // Variación del precio para abrir posición de respaldo
extern int Cierre_Primera = 15; // Claro, el cierre de la primera posición
extern int Profit_de_corte = 100; // Cierra todo si va ganando X dólares
extern double Pro1 = 0.1 ; // Lotes de la primera posición
extern double Fraccion = 0.1 ;
extern double Expon = 4 ;
extern bool Alarmas = true ;
extern int Alarma_1a = 150 ; // Cuando la cuenta está en XXX pesos y sólo hay una posoción abierta
extern int Alarma_2a = 2000 ;
extern int Alarma_3a = 8000 ;
extern int Alarma_4a = 22000 ;

extern int Espera_entre_alarmas = 1 ; // Minutos entre correos cuando se envían una alarma se correo electrónico


double Pro2 ;
double Pro3 ;
double Pro4 ;
double Pro5 ;
double Pro6 ;
double Pro7 ;
double Pro8 ;
double Pro9 ;
double Pro10 ;
double Pro11 ;


int Pos_1 = 0 ; // Pos. 1
int Pos_2 = 0 ; // Pos. 2
int Pos_3 = 0 ; // Pos. 3
int Pos_4 = 0 ; // Etc.
int Pos_5 = 0 ;
int Pos_6 = 0 ;
int Pos_7 = 0 ;
int Pos_8 = 0 ;
int Pos_9 = 0 ;
int Pos_10 = 0 ;
int Pos_11 = 0 ;

int Posiciones_Abiertas ;

double Borde_Superior ; // Punto superior de la oscilación
double Borde_Inferior ; // Punto menor de la oscilación

double Spread ;

int Activador_de_cierre ;
string Par ; // Nombre del par
double Este_par ; // Cantidad de ransacciones abiertas en este par
double Ganancia ;
double Acumulado ;
int Intentos ;

double Medio ;
double Cuarto ;
double Octavo ;
double Dieciseisavo ;
double Treintaidosavo ;

int Contador_de_alarma = 0 ;
int Tiempo_inside_1a ;
int Futuro ;

//+------------------------------------------------------------------+
//| expert initializaion function |
//+------------------------------------------------------------------+
int init() // El init() se necesita para qe el experto funcione
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() // El deinit() se necesita para que el experto funcione
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{


Contar_este_par();

if(Alarmas == True)
{
Enviar_alarma();
}
Calcular_ganancia();

if (Acumulado > Profit_de_corte)
{
Cierra_Par();
}
if(Este_par!=0)
{
Recuperar_variables();
}
RefreshRates();

if(Este_par==0)
{
Cero_Posiciones();
}
if(Este_par==1)
{
Analiza_1_Abre_2();
}
if(Este_par==2)
{
Analiza_2_Abre_3();
}
if(Este_par==3)
{
Analiza_3_Abre_4();
}
if(Este_par==4)
{
Analiza_4_Abre_5();
}
if(Este_par==5)
{
Analiza_5_Abre_6();
}
if(Este_par==6)
{
Analiza_6_Abre_7();
}
if(Este_par==7)
{
Analiza_7_Abre_8();
}
if(Este_par==8)
{
Analiza_8_Abre_9();
}
if(Este_par==9)
{
Analiza_9_Abre_10();
}
if(Este_par==10)
{
Analiza_10_Abre_11();
}

Pro2= (MathCeil((MathPow(2,Expon) * Fraccion)*10))/10;
Pro3= (MathCeil((MathPow(3,Expon) * Fraccion)*10))/10;
Pro4= (MathCeil((MathPow(4,Expon) * Fraccion)*10))/10;
Pro5= (MathCeil((MathPow(5,Expon) * Fraccion)*10))/10;
Pro6= (MathCeil((MathPow(6,Expon) * Fraccion)*10))/10;
Pro7= (MathCeil((MathPow(7,Expon) * Fraccion)*10))/10;


Comment("Posiciones : ", Este_par, " ; Par : ", Par, " ; Apalancamiento: 1/", AccountLeverage(), " "+" \n"+"Progresión ", Pro2, " ", Pro3, " ", Pro4, " ", Pro5, " ", Pro6, " ", Pro7, " " +" \n"+ "BI: ", Borde_Inferior, " ; BS: ", Borde_Superior, " ; Balance : $", AccountBalance(), " ; Fecha y hora : ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), "; 2a : ", Borde_Superior, "; 3a : ", Borde_Superior - Medio, "; 4a : ", Borde_Inferior + Cuarto, "; 5a : ", Borde_Inferior + Cuarto + Dieciseisavo, " "+" \n"+ "Equity Tebille : $",AccountEquity(), " ; Margen : $", AccountMargin(), " ; Free Margin : $", AccountFreeMargin()," ; Par Profit : $",Acumulado);
Sleep(50);
Comment(" ");
Sleep(50);
Comment("Posiciones : ", Este_par, " ; Par : ", Par, " ; Apalancamiento: 1/", AccountLeverage(), " "+" \n"+"Progresión ", Pro2, " ", Pro3, " ", Pro4, " ", Pro5, " ", Pro6, " ", Pro7, " " +" \n"+ "BI: ", Borde_Inferior, " ; BS: ", Borde_Superior, " ; Balance : $", AccountBalance(), " ; Fecha y hora : ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), "; 2a : ", Borde_Superior, "; 3a : ", Borde_Superior - Medio, "; 4a : ", Borde_Inferior + Cuarto, "; 5a : ", Borde_Inferior + Cuarto + Dieciseisavo, " "+" \n"+ "Equity Tebille : $",AccountEquity(), " ; Margen : $", AccountMargin(), " ; Free Margin : $", AccountFreeMargin()," ; Par Profit : $",Acumulado);
//Comment("Posiciones : ", Este_par, " ; Par : ", Par, " ; Apalancamiento: 1/", AccountLeverage(), " "+" \n"+"Progresión ", Pro2, " ", Pro3, " ", Pro4, " ", Pro5, " ", Pro6, " ", Pro7, " " +" \n"+ "BI: ", Borde_Inferior, " ; BS: ", Borde_Superior, " ; Balance : $", AccountBalance(), " ; Fecha y hora : ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS), "; 2a : ", Borde_Inferior, "; 3a : ", Borde_Superior - Medio, "; 4a : ", Borde_Inferior + Cuarto, " " +" \n"+ "Equity Tebille : $",AccountEquity(), " ; Margen : $", AccountMargin(), " ; Free Margin : $", AccountFreeMargin()," ; Par Profit : $",Acumulado);


return(0);
}
//+--------------------------------------------------------------------------------------------------------+
int Contar_este_par()
{
RefreshRates();

Par=Symbol();

Este_par = 0;

for(int i=0;i<OrdersTotal();i++) // Cuenta el número de posiciones de este par en específico
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Par)
{
Este_par++;
}
}
}
//+--------------------------------------------------------------------------------------------------------+
//+--------------------------------------------------------------------------------------------------------+
int Enviar_alarma()
{

RefreshRates(); // > <

//------------------------
if(Este_par==1)
{
if(AccountFreeMargin() < Alarma_1a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
//------------------------
if(Este_par==2)
{
if(AccountFreeMargin() < Alarma_2a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
//------------------------
if(Este_par==3)
{
if(AccountFreeMargin() < Alarma_3a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
//------------------------
if(Este_par==4)
{
if(AccountFreeMargin() < Alarma_4a)
{
if(Contador_de_alarma == 0)
{
Tiempo_inside_1a = TimeCurrent();
Futuro = Tiempo_inside_1a + Espera_entre_alarmas*60 ;
Contador_de_alarma = Contador_de_alarma + 1 ;
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La sigueinte cuenta necesita fondos "+AccountNumber()) ;
}
else
{
if(Futuro < TimeCurrent())
{
Alert("¡PILAS CON EL MARGEN EN: ", AccountNumber());
SendMail("Mensaje del Sabueso", "La siguiente cuenta necesita fondos "+AccountNumber()) ;
Contador_de_alarma = 0;
}
}

}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Calcular_ganancia()
{
RefreshRates();

double Ganancia;
string Par ;
double Este_par ;

Ganancia = 0 ;
Acumulado = 0 ;

Par = Symbol();

Este_par = 0;

for(int i=0;i<OrdersTotal();i++) // Cuenta el número de posiciones de este par en específico
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol() == Par)
{
Ganancia = OrderProfit() + OrderSwap() ;
Acumulado = Ganancia + Acumulado;
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Recuperar_variables()
{
RefreshRates();

Par = Symbol();

for(int i=0;i<OrdersTotal();i++) // Cuenta el número de posiciones de este par en específico
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol() == Par)
{

Spread = Bid - Ask ;

Borde_Inferior = OrderOpenPrice();
Borde_Superior = Borde_Inferior + Senal_de_Cambio * Point;

Medio = (Borde_Superior - Borde_Inferior)/2;
Cuarto = Medio/2;
Octavo = Cuarto/2;
Dieciseisavo = Octavo/2 ;
Treintaidosavo = Dieciseisavo/2 ;

return ;
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Cierra_Par() // Cierra todas las posiciones

{
while (Este_par>0)
{

if(OrderSymbol() == Par)
{
if (OrderType()==OP_BUY )
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);

if (OrderType()==OP_SELL )
OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);

Contar_este_par();
}
}
}

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

int Cero_Posiciones()
{
MathSrand(TimeLocal());
MathRand();

int Magic_1 = MathRand()+1;

RefreshRates();

Spread = Bid - Ask ;

Borde_Inferior = Bid ; //+ Spread ;
Borde_Superior = Borde_Inferior + (Senal_de_Cambio * Point);


Medio = (Borde_Superior - Borde_Inferior)/2;
Cuarto = Medio/2;
Octavo = Cuarto/2;
Dieciseisavo = Octavo/2 ;
Treintaidosavo = Dieciseisavo/2 ;

Pos_1=OrderSend(Symbol(),OP_SELL,Pro1,Bid,3,1000,0,"1a",Magic_1,0,Yellow);

if (GetLastError() == 0) // Si la transacción se hizo sin novedad
{
//Alert ("Abierta la 1a posición, Una COMPRA con ", Lots, " Lotes");
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_1_Abre_2()
{

MathSrand(TimeLocal());
MathRand();
int Magic_2 = MathRand()+1;

RefreshRates(); // Renew data

if (Acumulado > Cierre_Primera)
{
Cierra_Par();
}

Pro2= (MathCeil((MathPow(2,Expon) * Fraccion)*10))/10;

if (Borde_Superior <= Ask)
{
Pos_2=OrderSend(Symbol(),OP_BUY,Pro2,Ask,3,0,10000,"2a",Magic_2,0,Blue);
if (GetLastError() == 0)
{
//Alert ("Abierta la 2a posición. Una VENTA con ", Lots*Pro2, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_2_Abre_3()
{
MathSrand(TimeLocal());
MathRand();

int Magic_3 = MathRand()+1;

RefreshRates(); // Renew data

Pro3= (MathCeil((MathPow(3,Expon) * Fraccion)*10))/10;

if ((Borde_Superior - Medio) >= Bid)
{
Pos_3=OrderSend(Symbol(),OP_SELL,Pro3,Bid,3,10000,0,"3a",Magic_3,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_3_Abre_4()
{
MathSrand(TimeLocal());
MathRand();

int Magic_4 = MathRand()+1;

RefreshRates(); // Renew data

Pro4= (MathCeil((MathPow(4,Expon) * Fraccion)*10))/10;

if ((Borde_Superior - Cuarto) <= Ask)
{
Pos_4=OrderSend(Symbol(),OP_BUY,Pro4,Ask,3,0,10000,"4a",Magic_4,0,Black);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_4_Abre_5()
{
MathSrand(TimeLocal());
MathRand();

int Magic_5 = MathRand()+1;

RefreshRates(); // Renew data

Pro5= (MathCeil((MathPow(5,Expon) * Fraccion)*10))/10;

if ((Borde_Superior - Cuarto - Octavo) >= Ask)
{
Pos_5=OrderSend(Symbol(),OP_SELL,Pro5,Ask,3,1000,0,"5a",Magic_5,0,White);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_5_Abre_6()
{
RefreshRates(); // Renew data

Pro6= (MathCeil((MathPow(6,Expon) * Fraccion)*10))/10;

if (Borde_Superior - Cuarto - Dieciseisavo <= Ask)
{
Pos_6=OrderSend(Symbol(),OP_BUY,Pro6,Ask,3,0,1000,"6a",66523,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}

}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_6_Abre_7()
{
MathSrand(TimeLocal());
MathRand();

int Magic_6 = MathRand()+1;

RefreshRates(); // Renew data

Pro7= (MathCeil((MathPow(7,Expon) * Fraccion)*10))/10;

if (Borde_Superior - Cuarto - Dieciseisavo - Treintaidosavo >= Bid)
{
Pos_7=OrderSend(Symbol(),OP_SELL,Pro7,Bid,3,1000,0,"7a",Magic_6,0,Green);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}

}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_7_Abre_8()
{
RefreshRates(); // Renew data

Pro8= (MathCeil((MathPow(8,Expon) * Fraccion)*10))/10;

if (Borde_Inferior >= Bid)
{
Pos_8=OrderSend(Symbol(),OP_BUY,Pro8,Ask,3,0,1000,"8a",887867,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}

}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_8_Abre_9()
{
MathSrand(TimeLocal());
MathRand();

int Magic_7 = MathRand()+1;

RefreshRates(); // Renew data

Pro9= (MathCeil((MathPow(9,Expon) * Fraccion)*10))/10;

if (Borde_Superior <= Ask)
{
Pos_3=OrderSend(Symbol(),OP_SELL,Pro9,Bid,3,1000,0,"9a",Magic_7,0,Green);
if (GetLastError() == 0)
{
//Alert ("Abierta la 3a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}

}
//+--------------------------------------------------------------------------------------------------------+
int Analiza_9_Abre_10()
{
MathSrand(TimeLocal());
MathRand();

int Magic_8 = MathRand()+1;

RefreshRates(); // Renew data

Pro10= (MathCeil((MathPow(10,Expon) * Fraccion)*10))/10;

if (Borde_Inferior >= Bid)
{
Pos_10=OrderSend(Symbol(),OP_BUY,Pro10,Ask,3,0,1000,"10a",Magic_8,0,Red);
if (GetLastError() == 0)
{
//Alert ("Abierta la 4a posición. Una VENTA con ", Lots*Pro4, " Lotes");
}
}

}
//--------------------------------------------------------------------------------------------------------+
int Analiza_10_Abre_11()
{
MathSrand(TimeLocal());
MathRand();

int Magic_9 = MathRand()+1;

RefreshRates(); // Renew data

Pro11= (MathCeil((MathPow(11,Expon) * Fraccion)*10))/10;

if (Borde_Superior <= Ask)
{
Pos_11=OrderSend(Symbol(),OP_SELL,Pro11,Bid,3,1000,0,"11a",Magic_9,0,Green);
if (GetLastError() == 0)
{
//Alert ("Abierta la 5a posición, Una COMPRA con ", Lots*Pro3, " Lotes");
}
}
}

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

No hay comentarios:

Publicar un comentario