//+------------------------------------------------------------------+ //| 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 int mitick=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.00003 ;// 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 = 80; // Nivel de sobrecompra input uint oversoldLevel = 20; // Nivel de sobreventa //Include Files #include 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[]; 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]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; } else if(rsiValue < oversoldLevel) { // Señal de compra Print("Señal de COMPRA por RSI"); signal=0; } } // 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=1)if(Equity=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 ); }