Come faccio a far filtrare l'indicatore al posto dell'avviso? - pagina 6

 
elihayun:
Finora non vedo alcun problema (orientato al codice)

Ma logicamente, guardate questo

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

Non stai controllando che siano vicini, solo che il prezzo sia inferiore alla linea

Questo è quello che volevo... per filtrare... voglio usare la linea come un modo per non permettere le transazioni. Questo era l'intento. Non ho bisogno di fare un modo per vedere se è vicino alla linea se posso cambiare la larghezza della linea stessa posso semplicemente usare la linea stessa come limitatore. Cambiando la larghezza delle bande sarà come se ci fosse un altro fattore che controlla quanto è vicino alla linea. Facendo questa condizione di entrata filtra o dovrebbe fermare l'apertura degli ordini di acquisto se non sono sotto la linea superiore o l'apertura degli ordini di vendita se sono sopra la linea inferiore.

Sono confuso: perché fare questo dovrebbe far generare errori negli ordini?

 

sembra che l'errore sia dovuto a una dimensione impropria del lotto che ha qualcosa a che fare con i parametri MM...

Sto cambiando un po' il mio obiettivo... tornando al mio obiettivo originale...

Ho concluso che l'indicatore delle bande di tendenza non produrrà il tipo di effetto di filtraggio che desidero. Semplicemente non lo farà.

Originariamente stavo guardando l'indicatore di canale 'ang_AutoCh_HL-v1'. Posso vedere che mi darebbe l'effetto di filtro che voglio, tuttavia non ha i buffer da chiamare...quindi.....

posso crearmi dei buffer per i valori delle linee dell'oggetto 1 e dell'oggetto 2, in modo da poterli usare come supporto e resistenza nell'EA?

Ecco l'indicatore...

#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);

in realtà il mio punto debole è far uscire i valori dall'indicatore in modo che l'EA possa usarli... penso di poter gestire il resto in modo corretto se solo potessi mostrarmi come far uscire i valori dall'indicatore all'interno dell'EA.

 

Non so davvero cosa sto facendo con i buffer. Vado lanciando linee di setbuffer e non so nemmeno se è necessario o cosa

 
raff1410:
Ciao...

Indycator con i buffer,

Puoi chiamare res && sup come qui sotto:

doppia resistenza = iCustom(NULL,TF, "Canale",24,col,0,0);

doppio supporto = iCustom(NULL,TF, "Canale",24,col,2,0);

Raff

Oh, amico, guarda! Questo è ciò di cui sto parlando .... Non vedo l'ora di provarlo per vedere se funziona.

Ora devo mettere questa roba nella parte superiore dell'ea? per dire all'indicatore quali impostazioni usare?

//---- Parametri canale e filtro

extern int Hours=24;

extern color col=SkyBlue;

extern double TF = 30; //-quale periodo di barra utilizzare per l'indicatore personalizzato

e poi...

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

doppio supporto = iCustom(NULL,TF, "Canale",Ore,col,2,0);

 

Ok, sto ricevendo di nuovo questo errore 130 che cos'è?

oh sì, stop loss troppo vicino...ok...

 

Ciao...

Indycator con buffer,

canale.mq4

Puoi chiamare res && sup come qui sotto:

doppia resistenza = iCustom(NULL,TF, "Canale",24,col,0,0);

doppio supporto = iCustom(NULL,TF, "Canale",24,col,2,0);

Raff

File:
channel.mq4  6 kb
 

Nuovo problema...

Ho diverse versioni di stop che operano su questo... I drawdowns provengono da un fallimento del trigger del trailing stop per impegnarsi. Quando non si innesta, allora il fall back 'equity stop' è ciò che chiude la posizione e questo è ciò che fa male...

Posso vedere dai molti piccoli draw down che quando il trailing stop viene attivato non fa quasi lo stesso danno al conto. Può sostenere molti di questi tipi di perdite e recuperarle, ma non può superare le perdite maggiori dovute alla chiusura dell'equity stop.

so....

C'è un modo per chiudere la posizione se la barra che segue l'apertura non si muove abbastanza da impegnare il trailing stop?

Ho iniziato a farlo chiamando il periodo attuale e i tre periodi precedenti dalle linee della media mobile. Fondamentalmente il mio pensiero era che il segnale e la barra di conferma potessero provenire dai tre periodi precedenti a quello corrente e che il periodo corrente potesse essere usato per vedere se ora si è mosso abbastanza per innescare il trailing stop. Pensavo che questa condizione potesse essere aggiunta come un || o condizione all'equity stop che chiude tutti gli ordini aperti.

Quello che mi lascia perplesso è come capire se si è mosso abbastanza da far scattare il trigger del trailing stop, dipende dal fatto che se sta andando lungo dovrà muoversi verso l'alto ma se sta andando corto dovrà muoversi verso il basso. Quindi il rilevamento dell'innesco del trailing stop deve prestare attenzione se si tratta di una posizione lunga o corta per sapere da che parte muoversi per innescare. Non sono sicuro di come farlo rilevare.

Posso immaginare questo rapporto con i grandi draw down che non sembrano più grandi di quelli piccoli e se fosse così allora sarebbe redditizio.

File:
whatever2.htm  292 kb
whatever2.gif  6 kb
 

è necessaria un'altra modifica...

questo è chiudere le posizioni perdenti prima che diventino grandi... è anche chiudere le posizioni vincenti prima che diventino grandi

la cosa che deve fare è chiudere la posizione solo se non si è mossa abbastanza nei primi dieci minuti per far scattare il trailing stop... deve muovere solo 1 pip per farlo credo... quindi non sto chiedendo molto nei primi dieci minuti. In realtà voglio solo assicurarmi che non giri la coda e non torni sulla posizione subito dopo l'apertura. Sono quelli che perdono....

quindi.... se si può fare in modo che rilevi se il trailing stop è stato attivato e, in tal caso, che lo lasci correre!!! lasciare che il trailing stop lo chiuda piuttosto che chiuderlo in funzione del tempo. Il parametro di chiusura a tempo non è pensato per essere la strategia di chiusura primaria, è solo per gestire la chiusura fino a quando il trailing stop prende il sopravvento.

File:
whatever3.htm  304 kb
whatever3.gif  6 kb
 

Questo non sta facendo quello che volevo... non riesco a dare un senso a questi risultati.

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

Guardando sopra, la maggior parte di tutto è aperto solo 10 minuti o meno (l'ho impostato per chiudere in dieci minuti se i criteri non sono soddisfatti) con solo poche eccezioni come l'ordine #52 che è aperto 19 minuti e #48 che è aperto 15 minuti.

questa parte non funziona... OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice()

e nemmeno questo funziona... if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

quello che dobbiamo controllare è se il trailing stop è scattato. Non voglio che questo si chiuda in base al prezzo. Voglio che si chiuda in base al fatto che il trailing stop non sia scattato. Mi rendo conto che originariamente ho detto che abbiamo bisogno di controllare se è salito abbastanza da far scattare il trailing stop...ma non capisco bene il codice di innesco del trailing stop o quanto è lontano...non so se questo continua a ripetere di controllare anche dopo l'intervallo specificato e lo chiuderebbe a 15 o 19 minuti se/quando il criterio del bid+Profit è l'OrderOpenPrice? Quello che questo sta facendo è diventare il criterio di chiusura dominante invece del criterio di stop gap fino a quando il trailing stop non viene attivato...questo è quello che sembra...

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

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;

}

}

}

}

}

}

In conclusione, il parametro di chiusura temporale è troppo aggressivo, a meno che non possa essere modificato per funzionare come previsto.

 

Mi dispiace, non ho tempo di esaminare l'intero codice, ma esaminiamo solo questo frammento.

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

Diciamo che l'OrderOpenPrice = 1,2100

e il profitto è di 0,0010

Quindi, si vuole chiudere l'operazione allo scoperto se l'offerta è inferiore o uguale a 1,2100-0,0010 = 1,2090.

Supponiamo che ci sia stato un gap down e che i prezzi abbiano saltato 1.2090 e che il prezzo di offerta sia ora 1.2088. Secondo la tua formula,

Bid + Profit = 1.2088 + 0.0010 = 1.2098. NON è maggiore di OrderOpenPrice anche se il tuo sistema ha superato la soglia di profitto. Pertanto, l'ordine non sarà chiuso. La logica della condizione di chiusura deve essere rivista e riscritta, secondo me. Inoltre, dovresti trattare con i prezzi Ask quando hai a che fare con le operazioni short, dato che puoi chiudere l'operazione solo al prezzo ask.

Un altro consiglio,

Il ciclo di conteggio di for (int cnt = 0 ; cnt = 0; cnt--) o qualcosa di simile.

Buona fortuna.