Ayuda con la codificación... ¿Cómo puedo hacer que el indicador filtre en lugar de alertar? - página 6

 
elihayun:
hasta ahora no veo ningún problema (orientado al código)

Pero lógicamente, mira esto

if(isCrossed == 1 && Ask < upLevel)

No estás comprobando que estén cerca, sólo que el precio sea inferior a la línea

Eso es lo que quería... filtrar... quiero usar la línea como una forma de no permitir las operaciones. Esa era la intención. No necesito hacer una forma de ver si está cerca de la línea si puedo cambiar el ancho de la línea en sí puedo usar la línea en sí como el limitador. Al cambiar el ancho de las bandas será lo mismo que si hubiera otro factor que comprobara lo cerca que está de la línea. Al hacer esto una condición de entrada filtra o debería impedir que las órdenes de compra se abran a menos que estén por debajo de la línea superior o que las órdenes de venta se abran si están por encima de la línea inferior.

Estoy confundido, ¿por qué hacer esto haría que se generen errores en las órdenes?

 

parece que el error se debe a un tamaño de lote inadecuado que tiene que ver con los parámetros de MM...

Estoy cambiando mi enfoque un poco... volviendo a mi enfoque original..

He llegado a la conclusión de que el indicador de bandas de tendencia no producirá el tipo de efecto de filtrado que deseo. Simplemente no lo hará.

Originalmente estaba mirando el indicador de canal 'ang_AutoCh_HL-v1'. Puedo ver que me daría el efecto de filtro que quiero, sin embargo, no tiene los búferes para llamar a...so.....

¿puedo hacer buffers en él? para los valores de la línea? del objeto 1 y del objeto 2? para poder usarlos como soporte y resistencia en el EA?

aquí está el indicador...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

return(0);}

//*******************************

int deinit() {

ObjectDelete("1"+sName);

ObjectDelete("0"+sName);

ObjectDelete("2"+sName); }

//*******************************

int start() {

int i,n;

//------------------------------------------------------------------------------

if (f==1) {

p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName,OBJPROP_TIME1));

p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName,OBJPROP_TIME1));

p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName,OBJPROP_TIME1));

if (fp==0 && p!=p1) {p=p1; fp=1;}

if (fp==0 && p!=p0) {p=p0; fp=1;}

if (fp==0 && p!=p2) {p=p2; fp=1;}

}

//====================================================

sx=0; sy=0; sxy=0; sx2=0;

for (n=0; n<=p; n++) {sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);}

aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);

//----------------------------------------------------

for (i=0; i<=p; i++) {

lr=bb+aa*i;

dh=High-lr; dl=Low-lr;

//----------------------------------------------------

if (i<p/2) {if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}

if (dh>=dh_1) {dh_1=dh; ai_1=i;}

if (dl<=dl_1) {dl_1=dl; bi_1=i;}}

//----------------------------------------------------

if (i>=p/2) {if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}

if (dh>=dh_2) {dh_2=dh; ai_2=i;}

if (dl<=dl_2) {dl_2=dl; bi_2=i;}}}

//-------------------------------------

lr0=bb; lrp=bb+aa*(i+p);

//===================================================

if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;

if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;

if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {if (MathAbs(dh_1-dh_2)=MathAbs(dl_1-dl_2)) f=2;}

//=================================================

if (f==1) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

if (i==0 || i==p/2) dhm=0.0;

if (High-hai>dhm && i<p/2) {ai_1=i; f1=1;}

if (High-hai>dhm && i>=p/2) {ai_2=i; f1=1;} }

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

dli=Low-hai;

if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}

ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);

hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);

//----------------------------

price_p1=hap;

price_p0=hap+dlm/2;

price_p2=hap+dlm;

price_01=ha0;

price_00=ha0+dlm/2;

price_02=ha0+dlm;

}

//=================================================

if (f==2) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

if (i==0 || i==p/2) dlm=0.0;

if (Low-lai<dlm && i<p/2) {bi_1=i; f1=1;}

if (Low-lai=p/2) {bi_2=i; f1=1;}}

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

dhi=High-lai;

if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}

la0=Low*(0-bi_2)/(bi_1-bi_2)+Low*(0-bi_1)/(bi_2-bi_1);

lap=Low*(p-bi_2)/(bi_1-bi_2)+Low*(p-bi_1)/(bi_2-bi_1);

//----------------------------------------------------------------

price_p1=lap;

price_p0=lap+dhm/2;

price_p2=lap+dhm;

price_01=la0;

price_00=la0+dhm/2;

price_02=la0+dhm;

}

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//-----------------------------------------------------------------

ObjectSet("1"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);

ObjectSet("2"+sName,OBJPROP_COLOR,col);

//---------------------------------------------

ObjectSet("1"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("1"+sName,OBJPROP_PRICE1,price_p1);

ObjectSet("1"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("1"+sName,OBJPROP_PRICE2,price_01);

ObjectSet("0"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("0"+sName,OBJPROP_PRICE1,price_p0);

ObjectSet("0"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("0"+sName,OBJPROP_PRICE2,price_00);

ObjectSet("2"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("2"+sName,OBJPROP_PRICE1,price_p2);

ObjectSet("2"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("2"+sName,OBJPROP_PRICE2,price_02);

//==================================================================

f=1; p1=p; p0=p; p2=p; fp=0;

//*************************************************************************************

return(0);}

//=====================================================================================[/PHP]

here is what I'm trying to add a buffer so I can extract the values I need...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double ExtBufferResistance[];

double ExtBufferMiddle[];

double ExtBufferSupport[];

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

SetIndexBuffer (4, ExtBufferResistance); //--resistance line

SetIndexBuffer (5, ExtBufferMiddle); //--middle line

SetIndexBuffer (6, ExtBufferSupport); //--support line

return(0);}

//*******************************

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//------------------make indicator buffer for EA-------------------------------------

somehow get object 1 to put it's value into buffer 4

somehow get object 0 to put it's value into buffer 5

somehow get object 2 to put it's value into buffer 6

//------------------------draw chart-------------------------------------------------

[/php]

and then upgrade this EA....

[PHP]#property copyright "Copyright 2005, Chris Battles."

#property link "cbattles@neo.rr.com"

extern double TrailingStop = 5;

extern double TrailingStopTrigger = 19;

extern double StopLoss = 186;

extern double TakeProfit = 250;

extern double Lots = 0.4;

//---- ang_AutoCh_HL-v1 and Filter Parameters

extern int Hours=24;

extern color col=SkyBlue;

extern double TF = 30; //--which bar period for the custom indicator to use

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

//| |

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

int start(){

int cnt, ticket;

if(Bars<100){

Print("bars less than 100");

return(0);

}

double ema1a=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);

double ema2a=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,0);

double ema3a=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0);

double ema1b=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);

double ema2b=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);

double ema3b=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1);

//----------channel filter

double resistance = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 4, 0);

double support = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 6, 0);

//--- end channel filter

and then make the order logic have second condition for entry...

[PHP]if (ema3bema1a && Ask < resistance){

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);

if(ticket>0){

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

if (ema3b>ema1b && ema3a support){

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);

if(ticket>0) {

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

Realmente mi punto de fricción es sacar los valores del indicador para que el EA pueda utilizarlos... Creo que puedo manejar el resto bien si usted pudiera mostrarme cómo sacar los valores del indicador hacia el EA.

 

Realmente no sé lo que estoy haciendo con los buffers. Voy tirando líneas de setbuffer y ni siquiera sé si es necesario o qué

 
raff1410:
Hola...

Indycator con buffers,

Puedes llamar a res && sup como abajo:

double resistencia = iCustom(NULL,TF, "Channel",24,col,0,0);

double support = iCustom(NULL,TF, "Channel",24,col,2,0);

Raff

oh hombre ver!! eso es lo que estoy hablando bout....I apenas puede esperar a probar esto para ver si va a trabajar.

ahora tengo que poner estas cosas en la parte superior de la ea? para decirle al indicador de lo que los ajustes que utilizan?

//---- Parámetros del canal y del filtro

extern int Horas=24;

extern color col=SkyBlue;

extern double TF = 30; //--que periodo de barra para el indicador personalizado a utilizar

y luego...

double resistencia = iCustom(NULL,TF, "Channel",Hours,col,0,0);

double support = iCustom(NULL,TF, "Channel",Hours,col,2,0);

 

ok estoy recibiendo este error 130 de nuevo ¿qué es eso?

oh si, stop loss demasiado cerca..ok...

 

Hola...

Indycator con buffers,

canal.mq4

Puedes llamar a res && sup como abajo:

double resistencia = iCustom(NULL,TF, "Channel",24,col,0,0);

double support = iCustom(NULL,TF, "Channel",24,col,2,0);

Raff

Archivos adjuntos:
channel.mq4  6 kb
 

Nuevo problema...

Tengo varias versiones de paradas operando en esto... Los drawdowns están viniendo de una falla del gatillo del trailing stop para enganchar. Cuando no se engancha entonces la caída hacia atrás 'parada de la equidad' es lo que cierra la posición y ESO es lo que está perjudicando ...

Puedo ver de los muchos pequeños draw downs que cuando el trailing stop se activa no hace casi tanto daño a la equidad de la cuenta. Puede sostener mucho ese tipo de pérdidas y compensarlas pero no puede superar las pérdidas más grandes de tener el stop de equidad cerrado.

Así que ....

¿Hay alguna manera de cerrar la posición si la barra que sigue a la apertura no se mueve lo suficiente como para activar el trailing stop?

He comenzado en esto ahora llamando para el período actual, así como los tres períodos anteriores de las líneas de media móvil. Básicamente mi pensamiento era que la señal y la confirmación de una barra podrían salir de los tres períodos anteriores al actual y el período actual podría ser utilizado para ver si ahora se movió lo suficiente para activar el trailing stop. Pensé que esta condición podría ser añadida como una || o condición a la parada de la equidad que cierra todas las órdenes abiertas.

Lo que me tiene desconcertado es cómo saber si se ha movido lo suficiente como para disparar el trailing stop, ya que si va en largo tendrá que moverse hacia arriba, pero si va en corto tendrá que moverse hacia abajo. Así que la detección del trailing stop tiene que prestar atención a si es una posición larga o corta para saber en qué dirección moverse para disparar. No estoy seguro de cómo hacer que detecte eso.

Puedo imaginar este informe con los grandes draw downs que no parecen más grandes que los pequeños y si eso fuera así entonces sería rentable.

Archivos adjuntos:
whatever2.htm  292 kb
whatever2.gif  6 kb
 

se necesita un ajuste más...

esto es cerrar posiciones perdedoras antes de que se hagan grandes... también es cerrar posiciones ganadoras antes de que se hagan grandes también

lo que tiene que hacer es cerrar la posición sólo si no se ha movido lo suficiente en los primeros diez minutos para activar el trailing stop...sólo tiene que moverse 1 pip para hacer eso creo...así que no estoy pidiendo mucho en los primeros diez minutos. Realmente solo quiero asegurarme de que no se ponga de cola y vuelva a la posición inmediatamente después de abrirla. Esos son los que pierden....

Así que.... si se puede hacer para detectar si el trailing stop se ha disparado y si es así dejar que se ejecute!! dejar que el trailing stop lo cierre en lugar de cerrar en función del tiempo. El parámetro de cierre en función del tiempo no está destinado a ser la estrategia de cierre principal, es sólo para manejar el cierre hasta que el trailing stop se haga cargo.

Archivos adjuntos:
whatever3.htm  304 kb
whatever3.gif  6 kb
 

Esto no está haciendo lo que pretendía...no puedo dar sentido a estos resultados..

https://c.mql5.com/forextsd/forum/9/whatever3.htm

solo mirando por encima la mayoria de las ordenes estan abiertas 10 mins o menos ( lo puse para que se cerrara en diez mins. si no se cumplian los criterios) con solo unas pocas excepciones como la orden #52 que esta abierta 19 mins y la #48 que esta abierta 15 mins.

esta parte no funciona... OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice()

tampoco funciona... if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

lo que tenemos que comprobar es si el trailing stop se ha activado. No quiero que esto se cierre basado en el precio. Quiero que se cierre basándose en que el trailing stop no se haya disparado. Me doy cuenta de que originalmente dije que necesitábamos comprobar si había subido lo suficiente para activar el trailing stop... pero no entiendo completamente el código de activación del trailing stop o hasta qué punto es... No sé si esto sigue repitiendo para comprobar incluso después del intervalo especificado y lo cerraría a los 15 o 19 minutos si/cuando el criterio de la oferta+ganancia es el OrderOpenPrice? Lo que está haciendo esto es hacerse el criterio de cierre dominante en lugar del criterio de stop gap hasta que se dispare el trailing stop... eso es lo que parece...

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

void CloseOrder()

{

double Profit=ThresholdMove*Point;

int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)

{

if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);

}

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

}

}

}

}

//+------------------------------------------------------------------+[/PHP]

Somewhere in this closing strategy there must be a way to detect if it's been triggered or not...

[PHP]//+------------------------------------------------------------------+

//| Variable End |

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

//Check position

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

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

//| Signal Begin(Exit Buy) |

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

if (CloseBuy1_1 == CloseBuy1_2) Order = SIGNAL_CLOSEBUY;

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

//| Signal End(Exit Buy) |

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

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

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

//| Signal Begin(Exit Sell) |

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

if (CloseSell1_1 == CloseSell1_2) Order = SIGNAL_CLOSESELL;

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

//| Signal End(Exit Sell) |

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

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

En resumen, el parámetro de cierre de tiempo es demasiado agresivo a menos que pueda ser modificado para llevar a cabo como se pretende.

 

Lo siento, no tengo tiempo para examinar todo el código, pero examinemos sólo este fragmento.

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

Digamos que el OrderOpenPrice = 1,2100

y el beneficio es de 0,0010

Entonces, usted quiere cerrar la operación corta si la oferta es menor o igual a 1.2100-0.0010 = 1.2090.

Supongamos que hubo una brecha a la baja y los precios se saltaron 1,2090 y el precio de oferta ahora es 1,2088. Según su fórmula

Bid + Profit = 1,2088 + 0,0010 = 1,2098. NO es mayor que OrderOpenPrice aunque su sistema haya superado el umbral de beneficio. Por lo tanto, la orden no se cerrará. La lógica de la condición de cierre necesita ser reevaluada y reestructurada, en mi opinión. Además, usted debe tratar con los precios de venta cuando se trata de operaciones cortas, ya que sólo puede cerrar la operación al precio de venta.

Otro consejo,

El bucle de conteo de for (int cnt = 0 ; cnt = 0; cnt--) o algo similar.

Buena suerte.

Razón de la queja: