Chiudere automaticamente l'ordine dopo un determinato periodo e/o SL - pagina 3

 

Questo è molto sbagliato . . .

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) risulterà vero o falso . . . e in questo caso vero o falso sarà considerato come un 1 o 0 . . . non il tuo numero SellTicket o Buyticket . . .

Stoploss = 40 . . . . quando usi uno stoploss in OrderSend è un prezzo . . . non un numero di pip, lo slippage è un numero di pip . . . leggi la documentazione: OrderSend

stoploss - Livello di stop loss.
takeprofit - Livello di take profit.
 

Ok, so cosa intendi, quindi ho bisogno di un comando per selezionare l'ordine mentre uso OrderSelect... o OrderSelect in questo caso è generalmente sbagliato?

 

Leggete la documentazione... OrderSelect è necessario per selezionare l'ordine prima di poter utilizzare le funzioni OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Nota: L'ordine deve essere precedentemente selezionato dalla funzioneOrderSelect()".

Se non avete bisogno di utilizzare un'informazione relativa ad un ordine esistente, non avete bisogno di OrderSelect.

 
RaptorUK:

Leggete la documentazione... OrderSelect è necessario per selezionare l'ordine prima di poter utilizzare le funzioni OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Nota: L'ordine deve essere precedentemente selezionato dalla funzioneOrderSelect()".

Se non hai bisogno di utilizzare un'informazione relativa a un ordine esistente, non hai bisogno di OrderSelect.


Attualmente penso che avrei bisogno di questa informazione, perché se c'è una posizione a mercato ho bisogno di chiuderla e sostituirla con un'altra. Pensavo che OrderSelect mi avrebbe aiutato in questo modo. Ma se Orderselect è solo per gli ordini aperti e non per la posizione attiva a mercato non è utile. Ho ragione?

Ma se OrderSelect non aiuta come posso chiudere le posizioni attive?

saluti

Marc

 
Se non usate ordini pendenti e avete ordini aperti, allora saranno o un Acquisto o una Vendita... un ordine di mercato.
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

Questo sembra essere per lo più corretto, ma ora ho bisogno di sapere perché il programma esegue solo l'ordine di vendita @ 12 & 23...e non gli ordini di acquisto...?

Probabilmente lo fa . . e probabilmente genera un errore che non stai tracciando . . .

Prova . . .

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

Il tuo OrderClose è sbagliato . . . apri un Buy at Ask, per chiudere un Buy vendi . . . vendi al Bid, apri un Sell at Bid per chiudere un Sell you Buy . . . compri al Ask.

 
RaptorUK:
Il tuo OrderClose è sbagliato . . . tu apri un Buy at Ask, per chiudere un Buy vendi . . . tu Vendi at Bid, tu apri un Sell at Bid per chiudere un Sell che compri . . . tu compri at Ask.
Oppure, visto che hai già selezionato l'ordine, usa semplicemente
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
E non è necessario differenziare il tipo di ordine.
 

Grazie mille per avermi aiutato... Ho modificato il codice con i tuoi suggerimenti. Si presenta in questo modo:

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 ||
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#proprietà copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Variabili di prestigio
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber=1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=400;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| funzione di inizializzazione esperto |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| funzione di avvio esperto |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Permette di determinare la dimensione del lotto e il rischio ===================================
se ( Lotto<Minlot )
{
Lot=Minlot;
}
Comment("\n", "Il rischio accettabile è ",PercentOfFreeDepo,"% = ",Risk," del denaro libero ",FreeDepo," in lotti = ",Lot);
for(int i = OrdiniTotali() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
openbuy = 0;
opensell = 0;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
opensell = 0;
opensbuy = 0;
}
}
}
}
//BuyOrder
if ((TradeHour3==Ora())||(TradeHour4==Ora())||(TradeHour7==Ora())||(TradeHour10==Ora())||(TradeHour17==Ora())||(TradeHour18==Ora())||(TradeHour20==Ora()) && openbuy == 0) //Segnale Acquisto
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue);
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//VendereOrdine
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Segnale di vendita
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ",MagicNumber,0,Green);
if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Funzione
doppio PipPoint (stringa Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
ritorno (CalcPoint);
}

//Utilizzare la funzione di slittamento
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
ritorno (CalcSlippage);
}

Durante l'esecuzione del backtest c'è un messaggio di errore ERR_INVALID_TICKET (4108).

 

Non tutti gli ordini sono stati eseguiti

Potrebbe essere che l'errore appartenga al fatto che lo SL è stato attivato prima?

Motivazione: