////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//   Sistema Andamio
//   En función de los precios que se recorren en la mañana, marcamos un máximo y un mínimo en la mañana, la ooperativa es sobre estos niveles
//   Sistema intradía de temporalidad 1 minuto que sólo opera los futuros del DAX
//   Entradas
//		  Sólo entra al mercado entre las 14:30 y las 22:00
//        El precio toca una de las zonas 
//   Salida
//        Cerramos en TP si alcanza la zona superior
//        
//        Cerramos si el objetivo no se alcanza antes de las 22:00
//        Cerramos si el precio alcanza la zona de STOP
//        
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

_SECTION_BEGIN("Andamio Setup 4");

// Iniciado de variables
cierre = 0;
apertura =0;
Price_Apertura = L1 = S1 = L2 = S2 = L3 = S3 = SL = SS = Morning_Min = Morning_Max = O;
Price_Cierre   = C;
NumPos = 1;


/* --- SETTINGS --- */
SetOption("MaxOpenLong",NumPos); //Maximo numero de posiciones abiertas Largas simultáneamente
SetOption("MaxOpenShort",NumPos); //Maximo numero de posiciones abiertas Cortas simultáneamente
SetOption("MaxOpenPositions",NumPos); //Maximo numero de posiciones abiertas simultáneamente
SetOption("AllowPositionShrinking",False); //Permite la compra parcial si no hay capital suficiente
SetOption("AllowSameBarExit",True); //Permite la compra y venta el mismo día
SetOption("HoldMinBars",1); //Mantiene la posición abierta mínimo una barra
SetOption("ExtraColumnsLocation", 1);//ExtraColumnsLocation - allows the user to change the location of custom columns added during backtest/optimization
SetOption("ActivateStopsImmediately", True); //no tome stop inmediatos
SetTradeDelays(0,0,0,0); //0 sin retraso, SetTradeDelays( buydelay, selldelay, shortdelay, coverdelay ) 
//RoundLotSize = 1; //Con esta función podemos establecer la compra parcial de acciones/contratos, es el redondeo. Si hay un 1, entonces la cantidad mínima a comprar será de 1.
SetPositionSize(NumPos, spsShares); //Sólo compramos 1 contrato cada vez
//PositionSize = -100/NumPos;

//Parámetros de volatilidad
vdax = Foreign("VDAX","C");
Vola = IIf(vdax < 20, 40, IIf(vdax < 25, 50, IIf(vdax < 30, 55, 65))); 

//En la varialbe time_20xx fijamos el cambio de hora cada año

time_2009 = DateNum() < 1100328 AND DateNum() > 1091025;
time_2010 = DateNum() < 1110327 AND DateNum() > 1101031;
time_2011 = DateNum() < 1120325 AND DateNum() > 1111030;
time_2012 = DateNum() < 1130331 AND DateNum() > 1121028;
time_2013 = DateNum() < 1140330 AND DateNum() > 1131029;
time_2014 = DateNum() < 1150329 AND DateNum() > 1141026;
time_2015 = DateNum() < 1160327 AND DateNum() > 1151025;
time_2016 = DateNum() < 1170326 AND DateNum() > 1161030;
time_2017 = DateNum() < 1180325 AND DateNum() > 1171029;
time_2018 = DateNum() < 1190331 AND DateNum() > 1181028;
time_2019 = DateNum() < 1200329 AND DateNum() > 1191027;
time_2020 = DateNum() < 1210328 AND DateNum() > 1201025;
time_2021 = DateNum() < 1220327 AND DateNum() > 1211031;
time_2022 = DateNum() < 1230326 AND DateNum() > 1221030;
time_2023 = DateNum() < 1240331 AND DateNum() > 1231029;
//time_2024   ------------>>> Para cada año ir añadiendo las fechas de cambio de hora

TimeNum_Apertura = IIf(time_2009 OR time_2010 OR time_2011 OR time_2012 OR time_2013 OR time_2014 OR time_2015 OR time_2016 OR time_2017 OR time_2018 
               OR time_2019 OR time_2020 OR time_2021 OR time_2022 OR time_2023, 70000, 60000);
TimeNum_Cierre   = IIf(time_2009 OR time_2010 OR time_2011 OR time_2012 OR time_2013 OR time_2014 OR time_2015 OR time_2016 OR time_2017 OR time_2018 
               OR time_2019 OR time_2020 OR time_2021 OR time_2022 OR time_2023, 205900, 195900);


//Condiciones del horario de Apertrua y Cierre
Condicion_Cierre = TimeNum() == TimeNum_Cierre;
Condicion_Apertura = TimeNum() == TimeNum_Apertura; 

for( bar = 1; bar < BarCount; bar++ )
{
	if( Condicion_Cierre[bar] ) 
    {
        Price_Cierre[bar] = C[bar];
        Price_Apertura[bar] = Price_Apertura[bar-1];
    } 
	else if( Condicion_Apertura[bar] )
	{
	    Price_Apertura[bar] = O[bar];
        Price_Cierre[bar] = Price_Cierre[bar-1];
    }
    else
    {
	    Price_Apertura[bar] = Price_Apertura[bar-1];
        Price_Cierre[bar] = Price_Cierre[bar-1];
        L1[bar]= Min(Price_Apertura[bar],Price_Cierre[bar]) - Vola[bar];
        S1[bar]= Max(Price_Apertura[bar],Price_Cierre[bar]) + Vola[bar];
        L2[bar]= Min(Price_Apertura[bar],Price_Cierre[bar]) - Vola[bar]*2;
        S2[bar]= Max(Price_Apertura[bar],Price_Cierre[bar]) + Vola[bar]*2;
        L3[bar]= Min(Price_Apertura[bar],Price_Cierre[bar]) - Vola[bar]*3;
        S3[bar]= Max(Price_Apertura[bar],Price_Cierre[bar]) + Vola[bar]*3;
        SL[bar]= Min(Price_Apertura[bar],Price_Cierre[bar]) - Vola[bar]*3-35;
        SS[bar]= Max(Price_Apertura[bar],Price_Cierre[bar]) + Vola[bar]*3+35;
    }
}


//Condiciones comunes para Buy, Short sell y Cover
Sesion_Time  = IIf( TimeNum() > (TimeNum_Apertura + 063000) AND TimeNum() < TimeNum_Cierre, True, False); //Definimos el horario de dibujado, es decir, 6h30min desde la apertura (hasta las 14.30)
Sesion_Trade = IIf( TimeNum() > TimeNum_Apertura+000500 AND TimeNum() < (TimeNum_Apertura +050000), True, False);// No se entra al mercado después de las 13:00
//BarsStop = 10000; //La posición se cierra tras 45 minutos
// Precios Max y Min de la mañana
NBARS = BarsSince(TimeNum() == TimeNum_Apertura);
Morning_Max = ValueWhen (TimeNum() == TimeNum_Apertura +063000, HHV(H,NBARS),1);
Morning_Min = ValueWhen (TimeNum() == TimeNum_Apertura +063000, LLV(L,NBARS),1);

//Buy Setup 4
Condicion1_Buy_Setup4 = Cross(H, Morning_Min) OR Cross(Morning_Min, H);
Condicion2_Buy_Setup4 = Sesion_Time == 1;
BuySetup = Condicion1_Buy_Setup4 AND Condicion2_Buy_Setup4;
Buy = BuySetup;
BuyPrice = ValueWhen(BuySetup, Morning_Min);

//Sell Setup4
Condicion1_Sell_Setup4 = Cross(H,Min(Price_Apertura, Price_Cierre)/*Morning_Min+Vola*/) OR Cross(/*Morning_Min+Vola*/Min(Price_Apertura, Price_Cierre),H);//El High cruza hacia arriba el menor del precio de apertura o cierre de ayer
Condicion2_Sell_Setup4 = TimeNum() == TimeNum_Cierre; // Cerramos posición antes de que el mercado cierre
Condicion3_Sell_Setup4 = 0;//TimeNum() >= Entry_Buy_Time + 004500; // Cerramos a los 45 minutos de la apertura
Condicion4_Sell_Setup4 = Cross(Morning_Min-Vola*2-35,L) OR Cross(L, Morning_Min-Vola*2-35); //Cerramos por STOP, el precio cruza hacia abajo el SL
SellSetup = Condicion1_Sell_Setup4 OR Condicion2_Sell_Setup4 /*OR Condicion3_SellL1*/ OR Condicion4_Sell_Setup4;
Sell = SellSetup;
SellPrice = IIf(Condicion1_Sell_Setup4,Morning_Min+Vola,IIf(Condicion2_Sell_Setup4,ValueWhen(Condicion2_Sell_Setup4,O,1),IIf(Condicion3_Sell_Setup4,ValueWhen(Condicion3_Sell_Setup4,O,1),IIf(Condicion4_Sell_Setup4,ValueWhen(Condicion4_Sell_Setup4,O,1),Null))));

//No operamos cortos
//Short = Cover = 0;
//Short Setup 4
Condicion1_Short_Setup4 = Cross(Morning_Max, L) OR Cross(L, Morning_Max);
Condicion2_Short_Setup4 = Sesion_Time == 1;
ShortSetup = Condicion1_Short_Setup4 AND Condicion2_Short_Setup4;
Short = ShortSetup;
ShortPrice = ValueWhen(ShortSetup, Morning_Max);

//Cover Setup4
Condicion1_Cover_Setup4 = Cross(/*Morning_Max-Vola*/Max(Price_Apertura, Price_Cierre),L) OR Cross(L,Max(Price_Apertura, Price_Cierre)/*Morning_Max-Vola*/); //El High cruza hacia arriba el menor del precio de apertura o cierre de ayer
Condicion2_Cover_Setup4 = TimeNum() == TimeNum_Cierre; // Cerramos posición antes de que el mercado cierre
Condicion3_Cover_Setup4 = 0;//TimeNum() >= Entry_Buy_Time + 004500; // Cerramos a los 45 minutos de la apertura
Condicion4_Cover_Setup4 = Cross(H,Morning_Max+Vola*2+35) OR Cross(Morning_Max+Vola*2+35, H); //Cerramos por STOP, el precio cruza hacia abajo el SL
CoverSetup = Condicion1_Cover_Setup4 OR Condicion2_Cover_Setup4 /*OR Condicion3_SellL1*/ OR Condicion4_Sell_Setup4;
Cover = CoverSetup;
CoverPrice = IIf(Condicion1_Cover_Setup4,Morning_Min-Vola,IIf(Condicion2_Cover_Setup4,ValueWhen(Condicion2_Cover_Setup4,O,1),IIf(Condicion3_Cover_Setup4,ValueWhen(Condicion3_Cover_Setup4,O,1),IIf(Condicion4_Cover_Setup4,ValueWhen(Condicion4_Cover_Setup4,O,1),Null))));

/* [OPCIONAL] --- STOPLOSS --- */
//ApplyStop(stopTypeNBar,stopModeBars,BarsStop,ExitAtStop = 1,volatile = 0); 

/* [OPCIONAL] --- ELIMINAR SEÑALES EXTRAS --- */
Buy = ExRem(Buy,Sell); 
Sell = ExRem(Sell,Buy);  
Short = ExRem(Short,Cover);
Cover = ExRem(Cover,Short);

//Filter
/*
Filter = DateNum() >= 1231024;//

NBARS = BarsSince(TimeNum() == TimeNum_Apertura);
X = ValueWhen (TimeNum() == TimeNum_Apertura +063000, HHV(H,NBARS),1);
Y = ValueWhen (TimeNum() == TimeNum_Apertura +063000, LLV(L,NBARS),1);
AddColumn( TimeNum(), "tIME nUME");
AddColumn( NBARS, "nBARS");
AddColumn( x, "Highest Since");
AddColumn( y, "Lowest Since");
*/



//Plot code

Plot(Morning_Max,"Precio Max Mañanas",IIf(Sesion_Time,colorOrange, colorWhite), styleLine);
Plot(Morning_Min,"Precio Min Mañanas",IIf(Sesion_Time,colorOrange, colorWhite), styleline);


_SECTION_END();