Come codificare? - pagina 344

 
mladen:

tkuan77

Devi trovare l'ultima barra chiusa e vedere se il giorno dell'ultima barra chiusa è lo stesso del giorno corrente.

Puoi usare qualcosa come questa funzione per ottenere il tempo dell'ultimo ordine chiuso:

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

E poi puoi controllare se la data è la stessa

Ciao mladen,

Ma dove inserisco questa parte di codice? Scusa se te lo chiedo perché sono ancora abbastanza nuovo nel campo della codifica e non riesco ancora a capire come funziona il ciclo For.

Saluti

Ryan

 
tkuan77:

Ciao mladen,

Ma dove inserisco questa parte di codice? Scusa se te lo chiedo perché sono ancora abbastanza nuovo nella codifica e non riesco ancora a capire come funziona il ciclo For.

Saluti

Ryan

Ryan

Qualcosa di simile a questo:

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()) // nessuna negoziazione

 
mladen:

Ryan

Qualcosa del genere:

se (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()) // nessuna negoziazione

Ciao mladen, ho aggiunto il codice ma sembra che dia qualche forma di errore di variabile globale. Inoltre, ho notato che hai una variabile MagicNumber che non è definita, posso chiederti a cosa serve? L'ho aggiunta sotto int ma non sono sicuro di quale sia l'uso di questa variabile.

Consigliatemi. Grazie ancora per la vostra pazienza.

//---- parametri di input

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di avvio esperto |

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

int start()

{

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

//-- Commercio di innesco

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

int biglietto, totale, MagicNumber;

doppio TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

total = OrdersTotal(); // controlla il numero totale di operazioni attualmente aperte

if(totale < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (Basso[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Apertura[1] - Chiusura[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (Alto[1] - Basso[1]);

SL_Value = (Basso[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (Alto[1] - Basso[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

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

 
tkuan77:

Ciao mladen, ho aggiunto il codice ma sembra che dia qualche forma di errore di variabile globale. Inoltre, ho notato che hai una variabile MagicNumber che non è definita, posso chiederti a cosa serve? L'ho aggiunta sotto int ma non sono sicuro di quale sia l'uso di questa variabile.

Consigliatemi. Grazie ancora per la vostra pazienza.

//---- parametri di input

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di avvio esperto |

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

int start()

{

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

//-- Commercio di innesco

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

int biglietto, totale, MagicNumber;

doppio TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

total = OrdersTotal(); // controlla il numero totale di operazioni attualmente aperte

if(totale < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (Basso[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Apertura[1] - Chiusura[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]);

SL_Value = (Low[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (Alto[1] - Basso[1]);

SL_Value = (Basso[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (Alto[1] - Basso[1]);

SL_Value = (High[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

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

Questa è una funzione

Spostatela fuori dal corpo della funzione start()

 

mladen:

Questa è una funzione

Spostarlo fuori dal corpo della funzione start()

Ciao mladen, ho provato a spostare la funzione fuori dalla funzione Start, tuttavia, il mio EA sta ancora innescando più di 1 trade al giorno invece di limitarsi ad innescare solo 1 trade al giorno.

Apprezzo il chiarimento.

Saluti

//---- parametri di input

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di inizio esperto |

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

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

int start()

{

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

//-- Scambio di trigger

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

int biglietto, totale

doppio TP_Valore, SL_Valore;

total = OrdersTotal(); // controlla il numero totale di trade attualmente aperti

se(totale < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]); // valore del corpo lungo

SL_Value = (Low[1] - 0.0010); // sempre lo stesso per i long

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Apertura[1] - Chiusura[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]); // valore del corpo short

SL_Value = (Low[1] - 0.0010); // sempre lo stesso per long

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (High[1] - Low[1]); // valore dell'intera candela incluso testa e coda

SL_Value = (Low[1] - 0.0010); // sempre lo stesso per long

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]); // valore del corpo lungo

SL_Value = (High[1] + 0.0010); // sempre lo stesso per short

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]); // valore del corpo short

SL_Value = (High[1] + 0.0010); // sempre lo stesso per lo short

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (High[1] - Low[1]); // valore dell'intera candela incluso testa e coda

SL_Value = (High[1] + 0.0010); // sempre lo stesso per lo short

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

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

 
tkuan77:

Ciao mladen, ho provato a spostare la funzione fuori dalla funzione Start, tuttavia, il mio EA sta ancora innescando più di 1 trade al giorno invece di limitarsi ad innescare solo 1 trade al giorno.

Apprezzo l'illuminazione.

Saluti

//---- parametri di input

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di avvio esperto |

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

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

int start()

{

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

//-- Scambio di trigger

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

int biglietto, totale

doppio TP_Valore, SL_Valore;

total = OrdersTotal(); // controlla il numero totale di trade attualmente aperti

se(totale < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]); // valore del corpo lungo

SL_Value = (Low[1] - 0.0010); // sempre lo stesso per i long

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Apertura[1] - Chiusura[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]); // valore del corpo short

SL_Value = (Low[1] - 0.0010); // sempre lo stesso per long

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (High[1] - Low[1]); // valore dell'intera candela incluso testa e coda

SL_Value = (Low[1] - 0.0010); // sempre lo stesso per long

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime())

{

se ((Close[1] - Open[1]) > 0,00100)

{

TP_Value = (Close[1] - Open[1]); // valore del corpo lungo

SL_Value = (High[1] + 0.0010); // sempre lo stesso per short

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) > 0,00100)

{

TP_Value = (Apertura[1] - Chiusura[1]); // valore del corpo short

SL_Value = (High[1] + 0.0010); // sempre lo stesso per lo short

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Open[1] - Close[1]) <= 0,00100)

{

TP_Value = (High[1] - Low[1]); // valore dell'intera candela incluso testa e coda

SL_Value = (High[1] + 0.0010); // sempre lo stesso per lo short

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0);

}

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

tkuan77

Sostituisci questo :

if(totale < 1)

con questo :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent());

E non dovrebbe più farlo

 
mladen:

tkuan77

Sostituisci questo :

if(totale < 1)

con questo :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent()));

E non dovrebbe più farlo

Ciao mladen, dopo aver inserito il codice, invece di innescare 1 trade al giorno, ha innescato più trade in una volta fino allo scoppio del conto. Potrebbe essere dovuto a qualche meccanismo di attivazione che causa questo?

Saluti

 

Ciao mladen, ho questo codice particolare che chiuderà tutti i trade in sospeso che ho dopo che ho un trade in esecuzione. come faccio a impostare per cancellare solo il mio attuale commercio in sospeso esistente dopo che ho attivato un commercio invece di tutti i futuri trade in sospeso?

grazie.....

int new_del()

{

int i,a;

int totale = OrdiniTotali();

stringa comentario,par;

for (i=totale-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=totale-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6);

if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket());

Print("Eliminazione di SELL_STOP"," Ordertype:",OrderType());

return(1);

}

if(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket());

Print("Cancellare BUY_STOP"," Ordertype:",OrderType());

return(1);

}

}

}

}

}

 
tkuan77:
Ciao mladen, ho questo particolare codice che chiuderà tutti i trade pendenti che ho dopo che ho un trade in esecuzione. come faccio a impostare per cancellare solo il mio attuale trade pendente esistente dopo che ho attivato un trade invece di tutti i futuri trade pendenti?

grazie.....

int new_del()

{

int i,a;

int totale = OrdiniTotali();

stringa comentario,par;

for (i=totale-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=totale-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6);

if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket());

Print("Eliminazione di SELL_STOP"," Ordertype:",OrderType());

return(1);

}

if(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket());

Print("Cancellare BUY_STOP"," Ordertype:",OrderType());

return(1);

}

}

}

}

}

tkuan77

Cosa significa "current pending trade" e cosa significa "future pending trade"?

 
mladen:

tkuan77

Cosa significa "current pending trade" e cosa significa "future pending trade"?

Ciao mladen,

Current pending trade significa: una volta che una condizione è stata soddisfatta, l'ea imposterà 2 trade in sospeso (1 lungo e 1 corto). Quindi se diciamo che il trade lungo è stato attivato, l'ea cancellerà automaticamente il trade corto in sospeso.

Future pending trade significa: dopo che l'ea ha cancellato le precedenti operazioni in sospeso e diciamo che la condizione è soddisfatta di nuovo, l'ea per diritto dovrebbe impostare altre 2 operazioni in sospeso (1 lunga e 1 corta). tuttavia, se l'ea ha attualmente un'operazione in corso, l'ea cancellerà automaticamente qualsiasi ordine in sospeso che l'ea sta cercando di impostare.

Quello che sto cercando di fare è lasciare che il sistema cancelli solo l'attuale trade in sospeso dopo che un trade è stato attivato. apprezzo l'aiuto

saluti