Come codificare? - pagina 299

 

Inserimento tempo personalizzato in MQL4

È possibile scrivere un codice con MQL4 che possa disegnare una linea orizzontale a partire da una barra definita dall'utente fino alla fine del grafico

Ecco lo stesso codice con Metastock

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

Ed ecco il risultato

Spero di fare la stessa cosa con MQL4

 

Prova così:

#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}

Basta copiarlo e incollarlo in qualche indicatore (è un indicatore già funzionante) e attaccarlo al grafico.

kappari:
E' possibile scrivere un codice con MQL4 che possa disegnare una linea orizzontale a partire da una barra definita dall'utente fino alla fine del grafico

Ecco lo stesso codice con Metastock

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

Ed ecco il risultato

Spero di fare la stessa cosa con MQL4
 
mladen:
Prova così:
#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}
Basta copiarlo e incollarlo in qualche indicatore (è un indicatore già funzionante) e attaccarlo al grafico.

Sei il migliore grazie mille mladen

 

Ciao Mladen,

Puoi dirmi di più sulla logica delle funzioni qui? Non ho ancora capito bene. Grazie

Terrance

mladen:
Prova questa funzione:
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
e poi puoi controllare
:if openedBuys==0 open buy

if openedSells==0 open sell

 

tkuan77

Volevi limitare gli ordini a 1 acquisto e 1 vendita alla volta.

Quindi, se chiami il contatore degli ordini aperti prima di aprire qualsiasi posizione, puoi controllare quanti acquisti o vendite aperti hai.

un esempio :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

se openBuys è diverso da 0 non si apre un nuovo ordine di acquisto. La stessa logica si applica alla vendita (questo è il secondo esempio in quel post)

tkuan77:
Ciao Mladen,

Puoi dirmi di più sulla logica delle funzioni qui? Non ho ancora capito bene. Grazie

Terrance
 

Ciao Mladen,

Forse mi sono spiegato male. Quello che sto cercando di realizzare è che quando il mio criterio di acquisto è soddisfatto, si attiverà un acquisto e se un altro criterio di acquisto è soddisfatto di nuovo, si attiverà un altro acquisto O vendere se il criterio di vendita è soddisfatto. Tuttavia, il commercio massimo che avrò in qualsiasi momento sarà 2.

Ho provato il tuo metodo in precedenza e sto ancora incontrando il sistema che apre 2 trade allo stesso tempo, ecco perché ho provato a limitarlo con la funzione Bars con lo stesso problema di avere l'EA che apre 2 trade allo stesso tempo.

Quale potrebbe essere la possibile causa? È qualcosa che ha a che fare con la mia logica?

Saluti

Terrance

mladen:
tkuan77

Volevi limitare gli ordini a 1 acquisto e 1 vendita alla volta.

Quindi, se chiami il contatore degli ordini aperti prima di aprire qualsiasi posizione, puoi controllare quanti acquisti o vendite aperti hai.

un esempio :

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
se openBuys uis qualsiasi cosa ma non 0 non si apre un nuovo ordine di acquisto. La stessa logica si applica alla vendita (questo è il secondo esempio in quel post)
 

Puoi aggiungere il controllo se un ordine di qualche tipo è già stato aperto in una barra corrente e in questo modo eviterai l'apertura di un nuovo ordine al prossimo tick. Se sì (c'era un ordine aperto su una barra corrente), allora non si apre un nuovo ordine. Se no, puoi aprire un nuovo ordine. Ecco una funzione che può contare gli ordini di tipo rewuired aperti in una barra corrente

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
Ciao Mladen,

Forse mi sono spiegato male. Quello che sto cercando di realizzare è che quando il mio criterio di acquisto è soddisfatto, si attiverà un acquisto e se un altro criterio di acquisto è soddisfatto di nuovo, si attiverà un altro acquisto O vendere se il criterio di vendita è soddisfatto. Tuttavia, il commercio massimo che avrò in qualsiasi momento sarà 2.

Ho provato il tuo metodo in precedenza e sto ancora incontrando il sistema che apre 2 trade allo stesso tempo, ecco perché ho provato a limitarlo con la funzione Bars con lo stesso problema di avere l'EA che apre 2 trade allo stesso tempo.

Quale potrebbe essere la possibile causa? Ha a che fare con la mia logica?

Saluti

Terrance
 
tkuan77:
Ciao Mladen,

Forse mi sono spiegato male. Quello che sto cercando di realizzare è che quando il mio criterio di acquisto è soddisfatto, si attiverà un acquisto e se un altro criterio di acquisto è soddisfatto di nuovo, si attiverà un altro acquisto O vendere se il criterio di vendita è soddisfatto. Tuttavia, il commercio massimo che avrò in qualsiasi momento sarà 2.

Ho provato il tuo metodo in precedenza e sto ancora incontrando il sistema che apre 2 trade allo stesso tempo, ecco perché ho provato a limitarlo con la funzione Bars con lo stesso problema di avere l'EA che apre 2 trade allo stesso tempo.

Quale potrebbe essere la possibile causa? Ha a che fare con la mia logica?

Saluti

Terrance

Questo perché non hai specificato come vuoi che il secondo trade sia diverso dal primo. La differenziazione potrebbe essere sotto forma di x numero di barre o di prezzo lontano dal FirstBuyPrice.

 

Grazie Mladen per l'aiuto, tuttavia voglio solo controllare con te, devo mettere il codice prima della mia funzione long/short, in mezzo o da qualche altra parte? Perché sembra che continui a spuntare un errore e non riesco a trovarne la fonte. E MagicNumber dovrebbe essere un numero intero?

Terrance

totale = OrdiniTotali();

if(totale < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continua;

if(OrderSymbol() != Symbol()) continua;

se(OrderType() != tipo) continua;

se(OrderOpenTime()=endTime) continua;

openedAtBar++;

break;

}

return(openedAtBar);

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Il mio EA",12345,0,Verde);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Il mio EA",12345,0,Rosso);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

mladen:
Puoi aggiungere il controllo se un ordine di qualche tipo è già stato aperto in una barra corrente e in questo modo eviterai l'apertura di un nuovo ordine al prossimo tick. Se sì (c'era un ordine aperto su una barra corrente), allora non si apre un nuovo ordine. Se no, puoi aprire un nuovo ordine. Ecco una funzione che può contare gli ordini di tipo rewuired aperti in una barra corrente
int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

 

...

Terrance

Questa è una funzione. Mettila alla fine del tuo EA e inserisci le chiamate ad essa dove ritieni opportuno per controllare se un ordine è già aperto in una barra corrente

tkuan77:
Grazie Mladen per l'aiuto, tuttavia voglio solo controllare con te, devo mettere il codice prima della mia funzione long/short, in mezzo o da qualche altra parte? Perché sembra che continui a spuntare un errore e non riesco a trovarne la fonte. E MagicNumber dovrebbe essere un numero intero?

Terrance

totale = OrdiniTotali();

if(totale < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continua;

if(OrderSymbol() != Symbol()) continua;

se(OrderType() != tipo) continua;

se(OrderOpenTime()=endTime) continua;

openedAtBar++;

break;

}

return(openedAtBar);

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Il mio EA",12345,0,Verde);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Il mio EA",12345,0,Rosso);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}