Tecnica Bailout
Tecnica Bailout
Ragazzi vi chiedo con grande gentilezza e urgenza un aiuto importante per me.
Sto cercando di creare una funzione di uscita ma sto avendo non pochi problemi.E' banale, ma non riesco proprio a programmarla in mql4, se volete vi mando la funzione che ho provato a creare ma che non va. La funzione non fa altro che: "dopo X barre esci alla prima apertura in profitto"
Grazie in anticipo.
Sto cercando di creare una funzione di uscita ma sto avendo non pochi problemi.E' banale, ma non riesco proprio a programmarla in mql4, se volete vi mando la funzione che ho provato a creare ma che non va. La funzione non fa altro che: "dopo X barre esci alla prima apertura in profitto"
Grazie in anticipo.
-
- Messaggi: 42
- Iscritto il: 06/07/2015, 15:45
Re: Tecnica Bailout
Ciao.
Ti propongo un approccio diverso da far avere all'EA:
se sono in profitto e sono passate x barre dall'apertura allora chiudi.
io personalmente creerei 2 funzioni
bool SonoInProfitto()
bool SonoPassateAbbastanzaBarre()
C'è aperta una posizione per volta?
cmq, gira il codice e vediamo un po' se riesco a capire.
Ti propongo un approccio diverso da far avere all'EA:
se sono in profitto e sono passate x barre dall'apertura allora chiudi.
io personalmente creerei 2 funzioni
bool SonoInProfitto()
bool SonoPassateAbbastanzaBarre()
C'è aperta una posizione per volta?
cmq, gira il codice e vediamo un po' se riesco a capire.
Re: Tecnica Bailout
Si, viene aperta un'operazione per volta.
Ecco il codice dove ovviamente prende sempre stop loss siccome non c'è un take profit che io voglio sostituire alla tecnica di bailout che ti ho detto, come vedi nel codice ho messo commentato la funzione che non riesco a fare.
Secondo me con le due funzioni che mi hai esposto penso sia perfetto come approccio.
Grazie per la disponibilità
Ecco il codice dove ovviamente prende sempre stop loss siccome non c'è un take profit che io voglio sostituire alla tecnica di bailout che ti ho detto, come vedi nel codice ho messo commentato la funzione che non riesco a fare.
Codice: Seleziona tutto
extern int Magic_Number = 500;
extern double Percentuale_Break_Out = 50.00;
extern double Lotti=0.1;
int Ticket=0;
void OnTick()
{
if(OrdersTotal()==0){
if((High[1]-Low[1]) > ((High[2]-Low[2]) + (Percentuale_Break_Out/100.00)*(High[2]-Low[2])))
if(Open[2]-Close[2] < 0 && Open[1]-Close[1] < 0 )
if(Low[2]<Low[1])
Ticket=OrderSend(Symbol(),OP_BUY,Lotti,Ask,0,Bid-100*Point,0,"Buy",Magic_Number,0,clrBlue);
}
//bailout();
;
if(OrdersTotal()==0){
if((High[1]-Low[1]) > ((High[2]-Low[2]) + (Percentuale_Break_Out/100.00)*(High[2]-Low[2])))
if(Open[2]-Close[2] > 0 && Open[1]-Close[1] > 0 )
if(High[2]>High[1])
Ticket=OrderSend(Symbol(),OP_SELL,Lotti,Bid,0,Ask+100*Point,0,"Sell",Magic_Number,0,clrRed);
}
//bailout();
;
}
Grazie per la disponibilità
-
- Messaggi: 42
- Iscritto il: 06/07/2015, 15:45
Re: Tecnica Bailout
ok... tu devi creare da zero la funzione bailout()...
Non mi è troppo chiaro il perché richiami proprio lì la funzione beilout, ne tanto meno perché richiamarla 2 volte.
Codice: Seleziona tutto
void OnTick()
{
if(
(OrdersTotal()==0)
&& (High[1]-Low[1]) > ((High[2]-Low[2]) + (Percentuale_Break_Out/100.00)*(High[2]-Low[2]))
)
{
if (Open[2]-Close[2]<0 && Open[1]-Close[1]<0 && Low[2]<Low[1])
int Ticket=OrderSend(Symbol(),OP_BUY,Lotti,Ask,0,Bid-100*Point,0,"Buy",Magic_Number,0,clrBlue);
else
if(Open[2]-Close[2]>0 && Open[1]-Close[1]>0 && High[2]>High[1])
int Ticket=OrderSend(Symbol(),OP_SELL,Lotti,Bid,0,Ask+100*Point,0,"Sell",Magic_Number,0,clrRed);
}
if (OrdersTotal()>0) BeilOut();
}
//--------------------------------------------------------------------------------------------------------------------------------
void BeilOut()
{
if (SonoInProfitto() && SonoPassateAbbastanzaBarre()) ChiudoLaPosizione();
}
//--------------------------------------------------------------------------------------------------------------------------------
bool SonoInProfitto()
{
int i=OrdersTotal();
int TicketTrovato=False;
while (i>=0 && TicketTrovato==False)
{
if (
OrderSelect(i,SELECT_BY_POS,MODE_TRADES)
&& OrderMagicNumber()==MagicNumber
&& OrderSymbol()==Symbol()
)
{
TicketTrovato=True;
}
i--;
if (TicketTrovato==True && OrderProfit()>0) return(True); else return (False);
}
//--------------------------------------------------------------------------------------------------------------------------------
bool SonoPassateAbbastanzaBarre()
{
.............
}
//--------------------------------------------------------------------------------------------------------------------------------
bool ChiudoLaPosizione()
{
...........
}
Non mi è troppo chiaro il perché richiami proprio lì la funzione beilout, ne tanto meno perché richiamarla 2 volte.
Re: Tecnica Bailout
effettivamente hai ragione..
per dirgli sono passate abbastanza barre secondo te va bene in questo modo:
oppure in questo modo mi controlla se è in profitto solo la prima barra dopo le "BARRE_DA_PASSARE" messe da me esternamente? senza controllare tutte le barre fino alla chiusura del contratto
per dirgli sono passate abbastanza barre secondo te va bene in questo modo:
Codice: Seleziona tutto
bool abbastanza_barre_passate(){
for(int i=OrdersTotal() -1; i>=0; i--)
{
Ticket=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Number);
{
if(OrderType()==OP_BUY && OrderOpenTime()<Time[BARRE_DA_PASSARE+1])
{
return true;
}
else return false;
}
-
- Messaggi: 42
- Iscritto il: 06/07/2015, 15:45
Re: Tecnica Bailout
il profitto non dipende dalle barre, per cui vai liscio... ma forse non ho capito cosa intendi. spiegami meglio l'ultima frase per favore...
io non controllerei il tipo di operazione: che sia buy o sell non fa differenza.
io userei il while e non il for visto che c'è solo un ordine aperto per volta.
io non controllerei il tipo di operazione: che sia buy o sell non fa differenza.
io userei il while e non il for visto che c'è solo un ordine aperto per volta.
Re: Tecnica Bailout
Prova ad adattare questo:
Codice: Seleziona tutto
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
input int NumeroBarre = 10;
struct BarTools{
private:
datetime lastBarOpenTime;
public:
BarTools(datetime inputLastBarOpenTime){
this.lastBarOpenTime = inputLastBarOpenTime;
}
~BarTools(){}
bool isNewBar(){
if(this.lastBarOpenTime != Time[0]){
this.lastBarOpenTime = Time[0];
return true;
}
return false;
}
};
struct Strategy{
private:
int maxHoldingTimeInBars;
public:
Strategy(int inputMaxHoldingTimeInBars){
this.maxHoldingTimeInBars = inputMaxHoldingTimeInBars;
}
~Strategy(){}
bool isLong(){
if(true){ //condizioni long
//apri long
return true;
}
return false;
}
bool isShort(){
if(true){ //condizioni short
//apri short
return true;
}
return false;
}
bool checkForExit(){
for(int i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol()==_Symbol && (OrderType()==OP_BUY || OrderType()==OP_SELL) ){ //aggiungi anche il controllo del magicnumber
if(OrderProfit()>0 && iBarShift(NULL,0,OrderOpenTime(),false)>this.maxHoldingTimeInBars){
double priceToClose = OrderType()==OP_BUY ? Bid : OrderType()==OP_SELL ? Ask : -1;
bool closeResult = OrderClose(OrderTicket(),OrderLots(), priceToClose, 10);
return closeResult;
//scegli cosa fare se la chiusura fallisce. potresti aggiungere ulteriori tentativi o una stampa
}
}
}
return false;
}
};
BarTools strumentiBarra(Time[0]);
Strategy strategia(NumeroBarre);
int OnInit(){
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason){}
void OnTick(){
if(strategia.isLong()){
Print("aperto ordine long");
}else if (strategia.isShort()){
Print("aperto ordine short");
}
if(strumentiBarra.isNewBar()){
if(strategia.checkForExit()){
Print("ordine chiuso");
}
Alert("Nuova barra aggiunta");
}
}
Re: Tecnica Bailout
Non parlo della funzione per vedere se si è in profitto , ma della seconda, ovvero SonoPassateAbbastanzaBArre(). Quella che si deve verificare insieme a SonoInProfitto().
Re: Tecnica Bailout
La struttura BarTools ha un metodo (puoi aggiugere altri metodi se necessario) che ritorna true ogni volta che viene aggiunta una nuova barra.
Infatti nella funzione OnTick l'ho usato per eseguire "checkForExit" solo una volta per barra in modo tale da renderlo meno pesante.
La struttura Strategy definisce il comportamento della tua strategia: isLong() controlla che le condizioni per il long siano valide, quindi apre un ordine long(lo devi aggiungere tu) e ritorna true se l'ordine viene aperto correttamente, altrimenti false. isShort è uguale. checkForExit itera su tutti gli ordini aperti di tipo OP_BUY o OP_SELL, quindi, se l'ordine è in profitto e iBarShift è maggiore del numero barre allora chiude l'ordine.
https://docs.mql4.com/series/ibarshift
Infatti nella funzione OnTick l'ho usato per eseguire "checkForExit" solo una volta per barra in modo tale da renderlo meno pesante.
La struttura Strategy definisce il comportamento della tua strategia: isLong() controlla che le condizioni per il long siano valide, quindi apre un ordine long(lo devi aggiungere tu) e ritorna true se l'ordine viene aperto correttamente, altrimenti false. isShort è uguale. checkForExit itera su tutti gli ordini aperti di tipo OP_BUY o OP_SELL, quindi, se l'ordine è in profitto e iBarShift è maggiore del numero barre allora chiude l'ordine.
https://docs.mql4.com/series/ibarshift
Re: Tecnica Bailout
Mi servirebbe solo la funzione:
bool AbbastanzaBarrePAssate() che non riesco a creare.
bool AbbastanzaBarrePAssate() che non riesco a creare.
Chi c’è in linea
Visitano il forum: Nessuno e 1 ospite