Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 828

 
Saudações. A questão é mais lógica.
O chamado sistema anti-martingale, com um limite para o número de aumentos. Se fechar com lucro, o próximo lote é aumentado por um factor. Se houver uma perda, ou se o número de posições rentáveis numa linha exceder o número especificado, o lote é igual ao lote inicial.
Uma vez ultrapassado o número especificado de posições rentáveis, como é que inicio novamente o ciclo de aumento?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
Saudações. A questão é mais lógica.
O chamado sistema anti-martingale, com um limite para o número de aumentos. Se fechar com lucro, o próximo lote é aumentado por um factor. Se houver uma perda, ou se o número de posições rentáveis numa linha exceder o número especificado, o lote é igual ao lote inicial.
Uma vez ultrapassado o número especificado de posições rentáveis, como é que inicio novamente o ciclo de aumento?


/

Exemplo no códigoStop Loss Take Profit: o tamanho do lote é armazenado (sobrescrito, aumentado e reposto ao mínimo) na variável "ExtLot", que é declarada ao nível do programa global (no cabeçalho). A OnTradeTransaction() captura transacções do tipo "Market Exit" e verifica como a transacção foi encerrada - em Take Profit ou Stop Loss:

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

Se em Stop Loss, duplicamos o lote, se em Take Profit, redefinimos o tamanho do lote para o seu valor mínimo.


Nota: no próprio Expert Advisor o cálculo do Stop Loss and Take Profit é um pouco incorrecto - mas o código será republicado em breve.

 
Vladimir Karputov:

Exemplo no códigoStop Loss Take Profit: o tamanho do lote é armazenado (sobrescrito, aumentado e redefinido para o mínimo) na variável "ExtLot" declarada ao nível do programa global (no cabeçalho). A OnTradeTransaction() captura transacções do tipo "Market Exit" e verifica como a transacção foi encerrada - em Take Profit ou Stop Loss:

Se em Stop Loss, duplicamos o lote, se em Take Profit, redefinimos o tamanho do lote para o seu valor mínimo.


Nota: no Expert Advisor o cálculo do Stop Loss e Take Profit é ligeiramente incorrecto - mas em breve o código foi republicado.

Calculo o número de transacções lucrativas sucessivas, se exceder 5, então volto ao lote inicial, a posição 6 abre com o lote inicial e a posição 7 deve abrir com volume = lote 6 multiplicado pelo coeficiente, etc. Quando houver 5 posições mais rentáveis, voltar ao lote inicial.

As posições rentáveis são 20 numa fila. Os seus lotes devem ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


 
lil_lil:

Calculo o número de negócios rentáveis numa linha, se exceder 5, então volto ao lote inicial, a posição 6 abre com o lote inicial e a posição 7 deve abrir com volume = lote 6 multiplicado pelo coeficiente, etc. Quando houver 5 posições mais rentáveis, voltar ao lote inicial.

As posições rentáveis são 20 numa fila. Os seus lotes devem ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


É necessário utilizar uma variável estática na função de contagem de lotes. Aqui está como funciona:

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

Resultado:

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
Arquivos anexados:
Test_1.mq5  2 kb
 
Vladimir Karputov:

É necessário utilizar uma variável estática na função de contagem de lotes. Aqui está como funciona:

Resultado:

Reiniciei de acordo com o seu exemplo, mas não funciona a ordem do aumento do lote

Existem 20 posições lucrativas, em fila. Osseus lotes devem ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 mas deve ser1, 2, 4, 8,16, 1, 1, 1, 1, 1, 1, ............

O que é que está errado?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

Estou a zerar de acordo com o vosso exemplo, mas não estou a receber a ordem do aumento do lote

Existem 20 posições rentáveis, em fila. Osseus lotes devem ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 e acontece assim1, 2, 4, 8,16, 1, 1, 1, 1, 1, 1, 1 ............

O que é que está errado?

Então ainda não quer utilizar a OnTradeTransaction de uma forma normal? Então, prefere pedir EXATAMENTE toda a história comercial (desde 1970)? Porquê?

 
Vladimir Karputov:

Então não quer trabalhar correctamente com a OnTradeTransaction? Então prefere solicitar ABSOLUTAMENTE TODOS os antecedentes comerciais (desde 1970)? Porquê???

Encontrei uma razão, entre parênteses.

O que quer dizer com "não quero", o que tem aOnTradeTransaction a vercom a minha pergunta ;)

 

Agora, vejo, dois posts antes da minha pergunta, um exemplo do cálculo.

Obrigado.

 
lil_lil:

Encontrei a razão, entre parênteses.

O que quer dizer com "não quero", o que tem aOnTradeTransaction a vercom a minha pergunta;)

Apenas a pedir o histórico comercial

HistorySelect(0,LONG_MAX)

significa pedir toda, toda, toda a história dessa conta de negociação desde 1970. Isto é muito abaixo do ideal:

  • e se houver milhares de transacções nessa conta?
  • E se (Deus nos livre) fizerem este pedido em cada carrapato?

 

Por favor partilhe as funções que funcionam com o histórico comercial.

Preciso de obter informações sobre a data da última abertura comercial, fecho, volume, resultado financeiro e o seu tipo (compra ou venda).

Se tiver alguma função semelhante, por favor partilhe-a.

Razão: