Aiuto per la codifica - pagina 707

 

Cari pro-codificatori,

Vorrei implementare nel mio EA la funzione "quattro trade al giorno / stop trading se viene raggiunto il Profit Target".

Se il limite massimo di trade / profitto viene raggiunto l'EA dovrebbe aspettare fino al giorno successivo per continuare il trading.

Mi chiedo se qualcuno potrebbe rivedere il mio codice, ho un po 'di un "blocco del cervello" qui, quindi il codice

è una sorta di pseudo codice di stato... ;-)

Grazie in anticipo!

extern int    MaxShortTrades   = 2;
extern int    MaxLongTrades    = 2;
extern double profitTarget     = 300; // Target in Money

// Count Trades per Day.

   int y;
   int totalOrders = 4;
   datetime toT; // Time of Trade
   datetime doT; // Day of Trade
   datetime now = TimeCurrent();
   datetime boD=now-now%86400; // Beginning of day

 

if (AccountProfit()>= profitTarget)

{

 

for(y=0;y<totalOrders; y++)
     {

      if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
        {
         toT=OrderOpenTime(); // Time of Trade
         doT=toT-toT%86400; // Day of Trade.
         if(doT==boD)
           { // Time of Trade within Current Day.

            for(j=OrdersTotal()-1;j>=0; j--)
              {
               if(OrderType()==OP_BUY)  totalOrders++;  // Check # of long trades.
               if(OrderType()==OP_SELL) totalOrders++; // Check # of short trades
              }

           }
        }
     }


   if(totalOrders<MaxLongTrades  &&  Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrders<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
 
mladen:

Per controllare sia la cronologia (per gli ordini chiusi al giorno corrente) che gli ordini aperti, prova così:

   datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
      for(int y=OrdersHistoryTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }

   if(totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  

Ciao Mladen,

grazie mille per il tuo aiuto, ora è diventato più chiaro come gestire la cosa.

Sarebbe anche possibile controllare un "obiettivo di profitto giornaliero"? Diciamo che l'EA dovrebbe andare a 50.- EUR al giorno,

se il target giornaliero viene raggiunto, deve fermare il trading e continuare il giorno successivo....

Qualcosa probabilmente come questo:

extern double profitTarget=50; // Profit Target in money

if (AccountProfit()<= profitTarget)

{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
      for(int y=OrdersHistoryTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }

   if(totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  
}

// Check if Profit Targer for the day is reached, so close all open Opsitions

if (AccountProfit()>= profitTarget)

{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
                     Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
                 }
               else

              if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
                 {
                  if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
                     Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
}
 
tfi_markets:

Ciao Mladen,

grazie mille per il tuo aiuto, ora è diventato più chiaro come gestire la cosa.

Sarebbe anche possibile controllare un "obiettivo di profitto giornaliero"? Diciamo che l'EA dovrebbe andare a 50.- EUR al giorno,

se il target giornaliero viene raggiunto, deve fermare il trading e continuare il giorno successivo....

Qualcosa probabilmente come questo:

extern double profitTarget=50; // Profit Target in money

if (AccountProfit()<= profitTarget)

{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
      for(int y=OrdersHistoryTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }

   if(totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  
}

// Check if Profit Targer for the day is reached, so close all open Opsitions

if (AccountProfit()>= profitTarget)

{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
                     Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
                 }
               else

              if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
                 {
                  if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
                     Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
}

Perché non aggiungi una raccolta di profitti (sommatoria) nel ciclo che controlla il numero di ordini long e short attualmente aperti?

Qualcosa del genere:


      double profitSoFarLong=0,profitSoFarShort=0;  
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   { totalOrdersLong++;  profitSoFarLong  += OrderProfit()+OrderCommission()+OrderSwap(); }
            if (OrderType()==OP_SELL)  { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
         }        
      }

E poi puoi usare profitSoFarLong e profitSoFarShort per un ulteriore controllo


PS: se volete avere il totale (per gli ordini chiusi e aperti), un'aggiunta di codice simile può essere aggiunta anche agli ordini già chiusi)

 

Ciao Mladen,

Hai sistemato l'indicatore "AutoFiboAutoTrend" per me e funziona bene. Sarebbe possibile aggiungere un allarme audio con notifica quando la direzione del fibo cambia da "su" a "giù"? Pls vedere le immagini 1 + 2

Grazie Lea

File:
Fibo 1.jpg  19 kb
Fibo 2.jpg  45 kb
 
mladen:

Perché non aggiungi un po' di raccolta dei profitti (sommatoria) nel ciclo che controlla il numero di ordini long e short attualmente aperti?

Qualcosa del genere:


      double profitSoFarLong=0,profitSoFarShort=0;  
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   { totalOrdersLong++;  profitSoFarLong  += OrderProfit()+OrderCommission()+OrderSwap(); }
            if (OrderType()==OP_SELL)  { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
         }        
      }

E poi puoi usare profitSoFarLong e profitSoFarShort per un ulteriore controllo


PS: se vuoi avere il totale (per gli ordini chiusi e aperti), un'aggiunta di codice simile può essere aggiunta anche agli ordini già chiusi)

Ciao Mladen,

grazie mille per il tuo aiuto!

Ho implementato il codice in questo modo:

// Trades per Day and Profit Target

   datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
   int x;
      for(x=OrdersHistoryTotal()-1;x>=0; x--)
      {
         if (OrderSelect(x,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(x=OrdersTotal()-1;x>=0; x--)
      {
         if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }            
      
      }
      
   double profitSoFarLong=0,profitSoFarShort=0;  
      for(x=OrdersTotal()-1;x>=0; x--)
      {
         if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   { totalOrdersLong++;  profitSoFarLong  += OrderProfit()+OrderCommission()+OrderSwap(); }
            if (OrderType()==OP_SELL)  { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
         }        
      }
  
// EA STOP if Profit is Reached.

if (profitSoFarLong>50 || profitSoFarLong>50)
{
            if(OrderType()==OP_BUY)  { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_ASK),0,CLR_NONE); }
            if(OrderType()==OP_SELL) { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_BID),0,CLR_NONE); }

      Print ("Account Profit Reached. All Open Trades Have Been Closed");
      return(0);
  
   Sleep(3600); // one hour

}
 
Rajiv:
per favore aiutami mladen. Lo SLIPPAGE non funziona nell'EA allegato

Rajiv

Lo slittamento è al suo posto corretto nelle chiamate OrderSend() - prova a usare un valore più grande e testalo allora, dato che l'uso del codice è OK

 

Per favore aiutatemi... È possibile scrivere in un file .csv ogni "Close" con tutti i mezzi di esportazione
nel codice di questo indicatore

void RSI_output(string SymbolName,int PeriodMinutes)

{

   int size=iBars(SymbolName,PeriodMinutes);                                      if(size==0)  return;

   int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");

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

      {

        FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))

,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)

,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));

      }

   FileClose(handle);      

   return;

}

int start() { RSI_output(_Symbol,_Period); return(0); }

Voglio salvare in un file .csv ogni "chiusura" senza passare dal mouse e aggiornare nuovamente il file. Solo finire un file su una linea... ogni minuto, per esempio))))))) PER FAVORE, PER FAVORE, PER FAVORE. Datemi uno strumento funzionante per l'interazione con R.

 
kostumer27:

Per favore aiutatemi... È possibile scrivere in un file .csv ogni "Close" con tutti i mezzi di esportazione
nel codice di questo indicatore

void RSI_output(string SymbolName,int PeriodMinutes)

{

   int size=iBars(SymbolName,PeriodMinutes);                                      if(size==0)  return;

   int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");

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

      {

        FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))

,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)

,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));

      }

   FileClose(handle);      

   return;

}

int start() { RSI_output(_Symbol,_Period); return(0); }

Voglio salvare in un file .csv ogni "chiusura" senza passare il mouse e il file di aggiornamento di nuovo. Solo finire un file su una linea .. ogni minuto, per esempio))))))) PER FAVORE, PER FAVORE, PER FAVORE. Datemi uno strumento di lavoro per interagire con R.

Intendi su ogni nuova barra?
 
Sì. la storia di ciò che è sul programma + 1 barra (& i miei indicatori iCustom). basta chiedere senza riscrivere il file per sempre.
File stabile + ogni barra ))) Tutto =)
 
kostumer27:
Sì. la storia di ciò che è sul programma + 1 barra (& i miei indicatori iCustom). basta chiedere senza riscrivere il file per sempre.
File stabile + ogni barra ))) Tutto =)

Ecco una versione che ha un'opzione - deve riscrivere il vecchio file di dati o deve sempre creare un nuovo file per ogni nuova barra

#property indicator_chart_window
#property indicator_buffers 0

extern bool RewriteOldData=true;
void RSI_output(string symbolName,int PeriodMinutes, datetime time)
{
   string name = (RewriteOldData) ? symbolName+PeriodMinutes : symbolName+PeriodMinutes+(string)(time/60);
   int size  =iBars(symbolName,PeriodMinutes);                if(size==0)  return;
   int handle=FileOpen(name+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
   for (int i=size-1;i>=0;i--)
        FileWrite(handle,iTime(symbolName,PeriodMinutes,i),TimeToStr(iTime(symbolName,PeriodMinutes,i))
               ,iOpen(symbolName,PeriodMinutes,i),iLow(symbolName,PeriodMinutes,i),iHigh(symbolName,PeriodMinutes,i)
               ,iClose(symbolName,PeriodMinutes,i),iVolume(symbolName,PeriodMinutes,i),iCustom(symbolName,PeriodMinutes,"RSI",0,i));
   FileFlush(handle);              
   FileClose(handle);      
   return;

}
int start()
{
   static datetime lastTime=0;
               if (lastTime!=Time[0])  RSI_output(_Symbol,_Period,Time[0]);
                   lastTime= Time[0];
   return(0);
}

È un indicatore, e tutto quello che dovete fare è impostare il parametro RewriteOldData e lasciarlo lavorare

File:
Motivazione: