279 lines
23 KiB
MQL5
279 lines
23 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| SimpleEATemplatev1.2.mq5 coded on DELL-SP3|
|
|
//| Copyright 2024, Singularity Partners Sarl. |
|
|
//| https://www.SingularityPartners.ch |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2024, Singularity Partners Sarl."
|
|
#property link "https://www.SingularityPartners.ch"
|
|
#property version "1.0" // based on A6.16.4
|
|
// Idea of this EA is (Describe the intention of this EA)
|
|
//Versión 1.3 Intento garantizar sólo un corto o largo abierto y estrategia con algún beneficio 2019-2024
|
|
// Results from 1 Jan 2017 until 1 Jan 2024: UR:3 RDD:22% Sharpe Ratio:2.08 %Profit:33% or so. T=980 R7=36,529
|
|
#include <Math\Stat\Math.mqh>
|
|
|
|
int mitick=0;
|
|
uint porrsi=0;
|
|
double sumadeproporciones=0.0;
|
|
datetime cuando_fue;
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Input Variables |
|
|
//+------------------------------------------------------------------+
|
|
//Input Variables
|
|
input group "Copyright 2024, www.SingularityPartners.ch "
|
|
input double IL = 0.1; // IL Initial Lot
|
|
input double SL = 0.05; // SL Stop Loss as Percent of Balance
|
|
//input double TP = 0.03; // TP Take Profit as Percent of Balance
|
|
input double TPP = 2000; // TPP Take Profit in Points originalmente venia con 1000
|
|
input double SLP = 2600; // SLP Stop Loss in Points
|
|
|
|
input group "Signal Inputs"
|
|
input uint Period = 67; // Period iMA
|
|
input uint Shift = 6; // Shift iMA
|
|
input double Proporcion=0.00023 ;// Proporcion -> la media es 0.00005
|
|
|
|
input ENUM_MA_METHOD METHOD = MODE_LWMA;
|
|
input ENUM_APPLIED_PRICE APPLIED_PRICE = PRICE_WEIGHTED;
|
|
input uint CBA =9; // CBA CopyBufferAmount
|
|
input uint EMAFirst = 2 ;
|
|
input uint EMASecond = 4 ;
|
|
|
|
input uint rsiPeriod = 60; // Período del RSI originalmente era 14
|
|
input uint overboughtLevel = 100; // Nivel de sobrecompra
|
|
input uint oversoldLevel = 0; // Nivel de sobreventa
|
|
|
|
|
|
//Include Files
|
|
#include<Trade\Trade.mqh>
|
|
CTrade trade; //Trade Class
|
|
|
|
// Variables Definitions
|
|
//bool signal;
|
|
int signal=-1;
|
|
bool CS; // Close Shorts - en español ciérrame cortos
|
|
bool CL; // Close Longs - en español ciérrame largos.
|
|
int LT; // Counter of Long Trades
|
|
int ST; // Counter of Short Trades
|
|
int T; // Counter of Total Trades
|
|
int L; // Code Line
|
|
double EMAArray[];
|
|
|
|
double OnTester()
|
|
{
|
|
double RDD = TesterStatistics ( STAT_EQUITY_DDREL_PERCENT ) ;
|
|
double Numerator = (TesterStatistics (STAT_PROFIT) + TesterStatistics (STAT_INITIAL_DEPOSIT));
|
|
double Denominator = (TesterStatistics (STAT_INITIAL_DEPOSIT)*(1)*RDD*0.01); // 5+5/12 as Measured from Jan 2019 until May 2024
|
|
//string UR = TesterStatistics ((STAT_PROFIT+STAT_INITIAL_DEPOSIT)/STAT_INITIAL_DEPOSIT/7/STAT_EQUITY_DDREL_PERCENT*0.01);
|
|
double UR = Numerator/Denominator;
|
|
//double URR2 = UR/RDD/RDD;
|
|
|
|
string concatenatedString = DoubleToString(UR,0)+ "." + DoubleToString(RDD,0) ; // UR.RDD
|
|
// return (RDD);
|
|
//return (UR);
|
|
return StringToDouble(concatenatedString);
|
|
|
|
}
|
|
|
|
void OnTick()
|
|
{
|
|
mitick++;
|
|
// Print ("Estas cosicas que vienen a continuación se producen en el tick número ",mitick);
|
|
// Trade structures
|
|
MqlTradeRequest request;
|
|
MqlTradeResult result;
|
|
ZeroMemory(request);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Price |
|
|
//+------------------------------------------------------------------+
|
|
|
|
// Price
|
|
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
|
|
double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Balance, Equity, Profit |
|
|
//+------------------------------------------------------------------+
|
|
|
|
// Balance, Equity, Profit
|
|
double Balance=NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE),0);
|
|
double Equity=NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY),0);
|
|
double Profit=NormalizeDouble(AccountInfoDouble(ACCOUNT_PROFIT),0);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Longs Shorts Counter |
|
|
//+------------------------------------------------------------------+
|
|
|
|
LT=0; ST=0; T=0;
|
|
Print (" Las position total que me da en el preconteo de largos y cortos es ",PositionsTotal());
|
|
for(int i = 0; i < PositionsTotal(); i++)
|
|
{
|
|
ulong ticket = PositionGetTicket(i);
|
|
PositionSelectByTicket(ticket);
|
|
|
|
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // if it's a long'
|
|
{
|
|
LT ++;
|
|
// Print ("sumo un largo y van ",LT, " en la positiongetinteger ",PositionSelectByTicket(ticket));
|
|
}
|
|
else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) // if it's short
|
|
{
|
|
ST ++;
|
|
// Print ("Sumo un corto y van ",ST, " en la positiongetinteger ",PositionSelectByTicket(ticket));
|
|
}
|
|
T=(LT+ST);
|
|
//Print ("TOTALES LLEVAMOS : ",T);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Sensing |
|
|
//+------------------------------------------------------------------+
|
|
|
|
int EMA = iMA(_Symbol,_Period,Period,Shift,METHOD,PRICE_CLOSE);
|
|
Print ("Que sepas que EMA ha valido : ",EMA);
|
|
ArraySetAsSeries(EMAArray,true);
|
|
CopyBuffer(EMA,0,0,CBA,EMAArray);
|
|
double proporcioncalculada=(EMAArray[EMAFirst]-EMAArray[EMASecond])/EMAArray[EMASecond];
|
|
if (!MathIsValidNumber(proporcioncalculada))
|
|
proporcioncalculada=0;
|
|
sumadeproporciones=sumadeproporciones+MathAbs(proporcioncalculada);
|
|
double mediaproporciones=(sumadeproporciones/mitick);
|
|
Print (" media proporciones ",mediaproporciones, " suma de proporciones ",sumadeproporciones, "proporcion calculada ",proporcioncalculada);
|
|
signal=-1;
|
|
/*if(EMAArray[EMAFirst]>EMAArray[EMASecond]) signal=0;L=__LINE__; // Signal Long or Buy is Zero
|
|
if(EMAArray[EMAFirst]<EMAArray[EMASecond]) signal=1;L=__LINE__; // Signal Short or Sell is One*/
|
|
if (proporcioncalculada>Proporcion) {
|
|
signal=0;//L=__LINE__; // Signal Long or Buy is Zero
|
|
// Print (" da mayor, da señal de 0");
|
|
}
|
|
else if (proporcioncalculada<-Proporcion) {
|
|
|
|
signal=1;
|
|
// Print (" da menor, da señak de 1 ");//L=__LINE__; // Signal Short or Sell is One*/
|
|
}
|
|
|
|
//oportunidad de poner signal a 0 ó 1 por rsi
|
|
/* if (signal==-1) {
|
|
// Obtener el valor del RSI
|
|
double rsiValue = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE);
|
|
|
|
// Determinar la señal de compra o venta
|
|
if(rsiValue > overboughtLevel)
|
|
{
|
|
// Señal de venta
|
|
Print("Señal de VENTA por RSI");
|
|
signal=1;
|
|
porrsi++;
|
|
}
|
|
else if(rsiValue < oversoldLevel)
|
|
{
|
|
// Señal de compra
|
|
Print("Señal de COMPRA por RSI");
|
|
signal=0;
|
|
porrsi++;
|
|
}
|
|
}*/
|
|
// fin de sensoreando
|
|
|
|
|
|
Print ("EMA ha sido : ",EMA,"- signal : ",signal, " con Valor EMA de first ",EMAArray[EMAFirst], "con valor EMA de Second ",EMAArray[EMASecond], " Propor ",Proporcion);
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Control |
|
|
//+------------------------------------------------------------------+
|
|
// aquí comprueba sl y tp, si se produjera alguno, pone CL o CS a 1.
|
|
if(CL==0)if(LT>=1)if(Equity<Balance*(1-SL)){CL=1;L=__LINE__;Print("************ CL=1 L:",L);} // Stop Loss when Equity goes below (1-SL)
|
|
if(CS==0)if(ST>=1)if(Equity<Balance*(1-SL)){CS=1;L=__LINE__;Print("************ CS=1 L:",L);}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Actuation |
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| OPENING LONGS |
|
|
//+------------------------------------------------------------------+
|
|
|
|
if(signal==0 && PositionsTotal()<1) {
|
|
trade.Buy(IL,NULL,Ask,(Ask-SLP*_Point),(Ask+TPP*_Point),NULL);L=__LINE__;Print("############ open longo OL=1 L:",__LINE__);
|
|
cuando_fue=TimeCurrent();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| OPENING SHORTS |
|
|
//+------------------------------------------------------------------+
|
|
|
|
if(signal==1 && PositionsTotal()<1) {
|
|
trade.Sell(IL,NULL,Bid,(Bid+SLP*_Point),(Bid-TPP*_Point),NULL);L=__LINE__;Print("########### open corto OS=1 L:",__LINE__);
|
|
cuando_fue=TimeCurrent();
|
|
}
|
|
|
|
|
|
if (signal==1 && LT==1) {
|
|
CL=1;
|
|
}
|
|
if (signal==0 && ST==1) {
|
|
CS=1;
|
|
}
|
|
//esto lo hago por si llega señal de venta/compra con largo/corto abierto, lo cierro, a ver qué resultado da. Nada, mal en peor.
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| CLOSING LONGS |
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
if(CL==1)
|
|
{
|
|
for(int i=PositionsTotal()-1;i>=0; i--)
|
|
{
|
|
ulong ticket=PositionGetTicket(i);
|
|
PositionSelectByTicket(ticket);
|
|
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
|
|
|
|
{
|
|
Print (" Por curiosidad cierro y el valor ticket es = ",ticket, " la position select por ticket es ",PositionSelectByTicket(ticket));
|
|
trade.PositionClose(ticket);
|
|
}
|
|
}
|
|
CL=0;
|
|
L=__LINE__;Print("CL=1 CONFIRMED. L:",__LINE__);
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| CLOSING SHORTS |
|
|
//+------------------------------------------------------------------+
|
|
|
|
if(CS==1)
|
|
{
|
|
for(int i=PositionsTotal()-1;i>=0; i--)
|
|
{
|
|
ulong ticket2=PositionGetTicket(i);
|
|
PositionSelectByTicket(ticket2);
|
|
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
|
|
{
|
|
Print (" Por curiosidad cierro y el valor ticket es = ",ticket2, " la position select por ticket es ",PositionSelectByTicket(ticket2));
|
|
trade.PositionClose(ticket2);
|
|
}
|
|
}
|
|
CS=0;
|
|
L=__LINE__;Print("CS=1 CONFIRMED. L:",__LINE__);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Dashboard |
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
/*Comment("© Singularity Partners 2024","\n",
|
|
"CODE LINE:",L,"\n",
|
|
"Balance:",DoubleToString(Balance,0)," Equity:",DoubleToString(Equity,0)," Profit:",DoubleToString(Profit,0),"\n",
|
|
|
|
"LT: ",LT," ST: ",ST," T:",PositionsTotal(),"\n",
|
|
"CL:",CL," CS:",CS,"\n",
|
|
" EMAFirst:",NormalizeDouble(EMAArray[EMAFirst],_Digits)," EMASecond:",NormalizeDouble(EMAArray[EMASecond],_Digits)," signal:",signal, "\n"
|
|
"poporcion : ",proporcioncalculada*100 ," --- media proporcion ---> ",mediaproporciones
|
|
);*/
|
|
|
|
|
|
}
|