Ajuda na codificação - página 707

 

Caros pró-codificadores,

Eu gostaria de implementar o recurso "quatro negociações por dia / parar de negociar se a Meta de Lucro for atingida" em minha EA.

Se o limite máximo de comércio / lucro for atingido, a EA deve esperar até o dia seguinte para continuar as negociações.

Será que alguém poderia rever meu código, eu tenho um pouco de "congelamento cerebral" aqui, então o código

é uma espécie de pseudo-estado de código... ;-)

Obrigado de antemão!

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:

Para verificar o histórico (para pedidos fechados no dia atual) e pedidos abertos, tente assim :

   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;  

Olá Mladen,

Muito obrigado por sua ajuda, agora ficou mais claro como lidar com isso.

Também seria possível verificar se há uma "meta de lucro diário"? Digamos que a EA deve ir por 50,- EUR por dia,

se a meta por dia for atingida, deverá cessar as negociações e continuar no dia seguinte....

Algo provavelmente parecido com isto:

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:

Olá, Mladen,

Muito obrigado por sua ajuda, agora ficou mais claro como lidar com isso.

Também seria possível verificar se há uma "meta de lucro diário"? Digamos que a EA deve ir por 50,- EUR por dia,

se a meta por dia for atingida, deverá cessar as negociações e continuar no dia seguinte....

Algo provavelmente parecido com isto:

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

Por que você não adiciona alguma coleta de lucro (soma) no laço que está verificando o número de pedidos longos e curtos atualmente abertos

Algo parecido com isto :


      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 então você pode usar profitSoFarLong e profitSoFarShort para maior controle


PS: se você quiser ter o total (para pedidos fechados e abertos), também pode ser adicionado um código semelhante aos pedidos já fechados)

 

Olá, Mladen,

Você fixou o indicador "AutoFiboAutoTrend" para mim e ele funciona bem. Seria possível adicionar um alerta de áudio com notificação quando a direção do fibo mudar de "para cima" para "para baixo"? Veja as imagens 1 + 2

Obrigado Lea

Arquivos anexados:
Fibo 1.jpg  19 kb
Fibo 2.jpg  45 kb
 
mladen:

Por que você não adiciona alguma coleta de lucro (soma) no laço que está verificando o número de pedidos longos e curtos atualmente abertos

Algo parecido com isto :


      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 então você pode usar profitSoFarLong e profitSoFarShort para maior controle


PS: se você quiser ter o total (para pedidos fechados e abertos), também pode ser adicionado um código semelhante aos pedidos já fechados)

Olá, Mladen,

muito obrigado por sua ajuda!

Eu implementei o código desta forma:

// 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:
por favor, me ajude a mladen. O SLIPPAGE não está funcionando em EA anexo

Rajiv

O Slippage está em seu lugar correto nas chamadas OrderSend() - tente usar um valor maior e testá-lo então, já que o uso do código está OK

 

Por favor, me ajude... É possível escrever no arquivo .csv cada "Fechar" com todos os meios de exportação
em código este indicador

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

Quero salvar no arquivo .csv a cada "fechamento" sem pairar e o arquivo de atualização novamente. Apenas terminando um arquivo em uma linha ... a cada minuto, por exemplo))))))) POR FAVOR, POR FAVOR, POR FAVOR. Dê-me um instrumento de trabalho para interação com o R.

 
kostumer27:

Por favor, me ajude... É possível escrever no arquivo .csv a cada "Fechar" com todos os meios de exportação
em código este indicador

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

Quero salvar no arquivo .csv a cada "fechamento" sem pairar e o arquivo de atualização novamente. Apenas terminando um arquivo em uma linha ... a cada minuto, por exemplo))))))) POR FAVOR, POR FAVOR, POR FAVOR. Dê-me um instrumento de trabalho para interação com o R.

Você quer dizer em cada novo bar?
 
Sim. o histórico do que está na programação + 1 barra (& meus indicadores iCustom). basta perguntar sem reescrever o arquivo para sempre.
Arquivo estável + cada barra )))) Todos =)
 
kostumer27:
Sim. o histórico do que está na agenda + 1 barra (& meus indicadores iCustom). basta perguntar sem reescrever o arquivo para sempre.
Arquivo estável + cada barra )))) Todos =)

Aqui está uma versão que tem uma opção - caso reescreva o arquivo de dados antigo ou caso crie sempre um novo arquivo para cada nova 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);
}

É um indicador, e tudo o que você precisa fazer é definir o parâmetro RewriteOldData e deixá-lo funcionar

Arquivos anexados:
Razão: