Ayuda a la codificación - página 143

 
arroganzmaschine:
Hola mladen, una pregunta más:

¿Cómo puedo comprobar todas las órdenes abiertas, si su beneficio es inferior a -20 y cerrarlas entonces?

¿Algo como esto?

//int currentTicket;

for(int i0=Total de Órdenes()-1; i0>=0; i0--) {

//currentTicket = OrderSelect(i0, SELECT_BY_POS, MODE_TRADES);

if(OrderProfit() <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

arroganzmaschine

Sí, eso debería servir.

Podrías cambiar sólo la línea donde se comprueba el beneficio por esto :

if ((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

para asegurarte de que es un beneficio "puro" el que estás comprobando

 

¿Tengo que establecer una oferta o una demanda en OrderClose? ¿O la línea es correcta?

 

Hm, hay algo que no funciona. El backtest no cierra las órdenes que están en beneficio negativo. Al final de la prueba hay órdenes abiertas con -230 de beneficio.

 

int inicio()

{

for(int i0=Total de Pedidos()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Esto no funciona.

 
arroganzmaschine:
int inicio()

{

for(int i0=Total de Pedidos()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Esto no funciona.

Has olvidado el OrderSelect() (siempre hay que seleccionar el pedido antes de hacer nada con él). También sería buena idea añadir la parte que comprueba qué tipo de orden estás intentando cerrar

Algo como esto :

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if (OrderSelect(u0,SELECT_BY_POS,MODE_TRADES))

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

{

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

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

}

 

¿podría alguien ayudarme a convertir el histograma en barras en el indicador TrendHistogram? Me gustaría obtener las mismas barras que las del indicador TrendFilter adjunto

TrendHistogram necesita el indicador EMA_Adaptive para funcionar correctamente

Archivos adjuntos:
 
freakout:
¿alguien podría ayudarme a convertir el histograma en barras en el indicador TrendHistogram? Me gustaría obtener las mismas barras que en el indicador TrendFilter adjunto TrendHistogram necesita el indicador EMA_Adaptive para funcionar correctamente

freakout

Aquí tienes

Pon el parámetro DrawAsBars en true y se dibujará como has descrito. Si dejas ese parámetro en false funcionará como el original

Archivos adjuntos:
 

Hola,

¿Puede alguien ayudarme a editar este código de back-testing es bueno, pero EA no funciona en Demo / Cuenta Real.

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

//| Hans123Trader v1 ||||||||||||||

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

#include

#property copyright "hans123"

#property link ""

// programado por fukinagashi

extern int BeginSession1=6;(durante el backtest edité y puse 0 para todas las sesiones y así obtuve los resultados finales)

extern int EndSession1=10;

extern int BeginSession2=10;

extern int FinSesión2=14;

extern double TrailingStop = 0;

extern double TakeProfit = 452;

extern double InitialStopLoss=40;

double Lotes = 0.1;

datetime bartime = 0;

double Slippage=3;

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

//| |

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

int inicio()

{

int cnt, ticket, err, i, j, cmd;

int NúmeroMágico;

double ts, tp, LowestPrice, HighestPrice, Price;

bool Orden[5];

string setup;

datetime Validity=0;

if(IsTesting() && Bars<100) return(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Symbol();

if (bartime == Time[0]) {

return(0);

} else {

bartime = Time[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICACIONES EN LAS ÓRDENES ABIERTAS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=Total de órdenes();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Error al cerrar la orden de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} de lo contrario { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Error al modificar la orden de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

si (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Error al cerrar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} de lo contrario { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

si (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// CONFIGURACIÓN DE ÓRDENES ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0);

Validez=StrToTime(TiempoAño(Tiempo[0]) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + " 23:59");

if (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

PrecioMásAlto=Alto;

//// lo siguiente es necesario, para evitar un Precio BUYSTOP/SELLSTOP demasiado cercano al Bid/Ask,

//// en cuyo caso obtenemos un 130 de paradas no válidas.

//// Experimenté para cambiar a OP_BUY y OP_SELL adecuados, pero los resultados no fueron satisfactorios

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

//Precio=Precio;

//} si no {

cmd=OP_BUYSTOP;

Precio=PrecioMáximo+5*Punto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//si (PrecioMínimo-5*Punto>Propaganda*Punto) {

// cmd=OP_SELL;

//Precio=Oferta;

//} si no {

cmd=OP_SELLSTOP;

Precio=PrecioMínimo-5*Punto;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//si (PrecioMásAlto+5*Punto<Precio+Distribución*Punto) {

// cmd=OP_BUY;

//Precio=Precio;

//} si no {

cmd=OP_BUYSTOP;

Precio=PrecioMáximo+5*Punto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//si (PrecioMínimo-5*Punto>Propaganda*Punto) {

// cmd=OP_SELL;

//Precio=Oferta;

//} si no {

cmd=OP_SELLSTOP;

Precio=PrecioMínimo-5*Punto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSAS SUBRUTINAS /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("Símbolo inesperado"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime;

int timeout=30;

int entrada;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Error en OrderSendExtended(): Timeout encountered");

return(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // establecer indicador de bloqueo

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // borrar el indicador de bloqueo

return(ticket);

}

 
ccd:
Hola,

Puede alguien ayudarme a editar este código back-testing es bueno, pero EA no funciona en Demo / Cuenta Real.

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

//| Hans123Trader v1 |||||||||

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

#include

#property copyright "hans123"

#property link ""

// programado por fukinagashi

extern int BeginSession1=6;(durante el backtest edité y puse 0 para todas las sesiones y así obtuve los resultados finales)

extern int EndSession1=10;

extern int BeginSession2=10;

extern int FinSesión2=14;

extern double TrailingStop = 0;

extern double TakeProfit = 452;

extern double InitialStopLoss=40;

double Lotes = 0.1

datetime bartime = 0;

double Slippage=3;

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

//| |

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

int inicio()

{

int cnt, ticket, err, i, j, cmd;

int NúmeroMágico;

double ts, tp, LowestPrice, HighestPrice, Price;

bool Orden[5];

string setup;

datetime Validity=0;

if(IsTesting() && Bars<100) return(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Symbol();

if (bartime == Time[0]) {

return(0);

} else {

bartime = Time[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICACIONES EN LAS ÓRDENES ABIERTAS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=Total de órdenes();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Error al cerrar la orden de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} de lo contrario { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Error al modificar la orden de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

si (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Error al cerrar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} de lo contrario { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

si (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// CONFIGURACIÓN DE ÓRDENES ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0);

Validez=StrToTime(TiempoAño(Tiempo[0]) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + " 23:59");

if (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

PrecioMásAlto=Alto;

//// lo siguiente es necesario, para evitar un Precio BUYSTOP/SELLSTOP demasiado cercano al Bid/Ask,

//// en cuyo caso obtenemos un 130 de paradas no válidas.

//// Experimenté para cambiar a OP_BUY y OP_SELL adecuados, pero los resultados no fueron satisfactorios

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

//Precio=Precio;

//} si no {

cmd=OP_BUYSTOP;

Precio=PrecioMáximo+5*Punto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//si (PrecioMínimo-5*Punto>Propaganda*Punto) {

// cmd=OP_SELL;

//Precio=Oferta;

//} si no {

cmd=OP_SELLSTOP;

Precio=PrecioMínimo-5*Punto;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//si (PrecioMásAlto+5*Punto<Precio+Spread*Punto) {

// cmd=OP_BUY;

//Precio=Precio;

//} si no {

cmd=OP_BUYSTOP;

Precio=PrecioMáximo+5*Punto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//si (PrecioMínimo-5*Punto>Propaganda*Punto) {

// cmd=OP_SELL;

//Precio=Oferta;

//} si no {

cmd=OP_SELLSTOP;

Precio=PrecioMínimo-5*Punto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error al modificar la orden de venta [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSAS SUBRUTINAS /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("Símbolo inesperado"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime;

int timeout=30;

int entrada;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Error en OrderSendExtended(): Timeout encountered");

return(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // establecer indicador de bloqueo

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // borrar el indicador de bloqueo

return(ticket);

}

Prueba a multiplicar el InitialStopLoss por 10 en una cuenta real. Ese EA está escrito para brokers de 4 dígitos

______________________

PD : también deberías multiplicar el TakeProfit por 10 para ser consistente y tener eso como pips, pero si lo probaste con esos números, no obtendrás los mismos resultados que cuando hiciste el back test (simplemente porque el back test te permitía usar valores para esos dos que ni la cuenta demo ni la cuenta real te permiten)

 
mladen:
zigflip ¿Últimos dos psar como en "último par superior/inferior de psar" o "últimas 2 barras"?

Perdón por la respuesta tardía mladen, pensé que tenía la suscripción de correo electrónico en pero...

¡Me refiero al último par de psars!

Principalmente quiero monitorear el último psar pero cuando se produce el cambio superior / inferior necesitaría los dos últimos niveles, hmm tal vez debería ser x barras de vuelta ... agh veo lo que dices ahora, en los pensamientos de los segundos tal vez el último conjunto de superiores / inferiores, que recorta al último cambio en la llegada de la primera nueva dirección psar!

Gracias por su ayuda en esto,