Aide au codage - page 707

 

Chers pro-codeurs,

J'aimerais implémenter la fonction "quatre transactions par jour / arrêt du trading si l'objectif de profit est atteint" dans mon EA.

Si la limite maximale de transaction / profit est atteinte, l'EA devrait attendre le jour suivant pour continuer à trader.

Je me demande si quelqu'un pourrait revoir mon code, j'ai un peu le cerveau gelé, donc le code est en quelque sorte un pseudo code.

est une sorte de pseudo code... ;-)

Merci d'avance !

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:

Afin de vérifier à la fois l'historique (pour les ordres fermés à la date actuelle) et les ordres ouverts, essayez comme suit :

   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;  

Salut Mladen,

Merci beaucoup pour votre aide, maintenant c'est plus clair sur la façon de gérer cela.

Serait-il également possible de vérifier un "objectif de profit quotidien" ? disons que l'EA devrait aller chercher 50.- EUR par jour,

si l'objectif quotidien est atteint, il s'arrêtera de trader et continuera le jour suivant.....

Quelque chose comme ceci :

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:

Salut Mladen,

Merci beaucoup pour votre aide, maintenant c'est devenu plus clair sur la façon de gérer cela.

Serait-il également possible de vérifier un "objectif de profit quotidien" ? Disons que l'EA devrait aller pour 50,- EUR par jour,

si l'objectif journalier est atteint, il s'arrêtera de trader et continuera le jour suivant.....

Quelque chose comme ceci :

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());
                    }
}

Pourquoi ne pas ajouter une collecte de profits (sommation) dans la boucle qui vérifie le nombre d'ordres longs et courts actuellement ouverts ?

Quelque chose comme ceci :


      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(); }
         }        
      }

Et ensuite vous pouvez utiliser profitSoFarLong et profitSoFarShort pour un contrôle plus poussé.


PS : si vous voulez avoir le total (pour les ordres fermés et ouverts), un ajout de code similaire peut être ajouté aux ordres déjà fermés aussi)

 

Salut Mladen,

Vous avez réparé l'indicateur "AutoFiboAutoTrend" pour moi et il fonctionne bien. Serait-il possible d'ajouter une alerte audio avec notification lorsque la direction du fibo change de "haut" à "bas" ? Veuillez voir les images 1 + 2

Merci Lea

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

Pourquoi ne pas ajouter une collecte de profits (sommation) dans la boucle qui vérifie le nombre d'ordres longs et courts actuellement ouverts ?

Quelque chose comme ceci :


      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(); }
         }        
      }

Et ensuite vous pouvez utiliser profitSoFarLong et profitSoFarShort pour un contrôle supplémentaire.


PS : si vous voulez avoir le total (pour les ordres fermés et ouverts), un ajout de code similaire peut être ajouté aux ordres déjà fermés aussi)

Salut Mladen,

Merci beaucoup pour votre aide !

J'ai implémenté le code comme ceci :

// 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:
s'il vous plaît aidez-moi mladen. SLIPPAGE ne fonctionne pas dans l'EA ci-joint.

Rajiv

Le slippage est à sa place correcte dans les appels OrderSend() - essayez d'utiliser une valeur plus grande et testez-le ensuite, puisque l'utilisation du code est correcte.

 

S'il vous plaît, aidez-moi... Est-il possible d'écrire dans le fichier .csv chaque "Close" avec tous les moyens d'exportation
dans le code de cet indicateur
.

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); }

Je veux sauvegarder dans un fichier .csv chaque "close" sans survoler et mettre à jour le fichier à nouveau. Juste finir un fichier sur une ligne ... chaque minute, par exemple ))))))) S'IL VOUS PLAÎT, S'IL VOUS PLAÎT. Donnez-moi un instrument de travail pour l'interaction avec R.

 
kostumer27:

S'il vous plaît, aidez-moi... Il est possible d'écrire dans un fichier .csv chaque "Close" avec tous les moyens d'exportation.
dans le code de cet indicateur

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); }

Je veux enregistrer dans un fichier .csv chaque "fermeture" sans survol et la mise à jour du fichier à nouveau. Juste finir un fichier sur une ligne ... chaque minute, par exemple))))))) S'IL VOUS PLAÎT, S'IL VOUS PLAÎT. Donnez-moi un instrument de travail pour l'interaction avec R.

Vous voulez dire à chaque nouvelle barre ?
 
Oui. l'historique de ce qui est sur le planning + 1 barre (& mes indicateurs iCustom). il suffit de demander sans réécrire le fichier pour toujours.
Fichier stable + chaque barre )))) Tous =)
 
kostumer27:
Oui. l'historique de ce qui est sur le planning + 1 barre (& mes indicateurs iCustom). il suffit de demander sans réécrire le fichier pour toujours.
Fichier stable + chaque barre )))) Tous =)

Voici une version qui a une option - doit-elle réécrire l'ancien fichier de données ou doit-elle toujours créer un nouveau fichier pour chaque nouvelle barre.

#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);
}

C'est un indicateur, et tout ce que vous avez à faire est de définir le paramètre RewriteOldData et de le laisser fonctionner.

Dossiers :