Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 828

 
Saluti. La domanda è più che altro logica.
Il cosiddetto sistema anti-martingala, con un limite al numero di aumenti. Se si chiude in profitto, il lotto successivo viene aumentato di un fattore. Se c'è una perdita, o se il numero di posizioni redditizie in una fila supera il numero specificato, il lotto è uguale al lotto di partenza.
Una volta superato il numero specificato di posizioni redditizie, come faccio a ricominciare il ciclo di 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:
Saluti. La domanda è più che altro logica.
Il cosiddetto sistema anti-martingala, con un limite al numero di aumenti. Se si chiude in profitto, il lotto successivo viene aumentato di un fattore. Se c'è una perdita, o se il numero di posizioni redditizie in una fila supera il numero specificato, il lotto è uguale al lotto di partenza.
Una volta superato il numero specificato di posizioni redditizie, come faccio a ricominciare il ciclo di aumento?


/

Esempio nel codiceStop Loss Take Profit: la dimensione del lotto è memorizzata (sovrascritta, aumentata e riportata al minimo) nella variabile "ExtLot", dichiarata a livello globale del programma (nell'intestazione). OnTradeTransaction() cattura i trade del tipo "Market Exit" e controlla come è stato chiuso il trade - al Take Profit o allo 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 allo Stop Loss, raddoppiamo il lotto, se al Take Profit, riportiamo la dimensione del lotto al suo valore minimo.


Nota: nell'Expert Advisor stesso il calcolo di Stop Loss e Take Profit è un po' errato - ma il codice sarà ripubblicato presto.

 
Vladimir Karputov:

Esempio nel codiceStop Loss Take Profit: la dimensione del lotto è memorizzata (sovrascritta, aumentata e riportata al minimo) nella variabile "ExtLot" dichiarata a livello globale del programma (nell'intestazione). OnTradeTransaction() cattura i trade del tipo "Market Exit" e controlla come è stato chiuso il trade - al Take Profit o allo Stop Loss:

Se allo Stop Loss, raddoppiamo il lotto, se al Take Profit, riportiamo la dimensione del lotto al suo valore minimo.


Nota: nell'Expert Advisor è leggermente errato il calcolo di Stop Loss e Take Profit - ma presto ripubblicato il codice.

Calcolo il numero di trade redditizi che vanno in fila, se supera 5, allora ritorno al lotto iniziale, la posizione 6 si apre con il lotto iniziale e la posizione 7 dovrebbe aprirsi con volume = lotto 6 moltiplicato per il coefficiente, ecc. Quando ci sono 5 posizioni più redditizie, torna al lotto iniziale.

Le posizioni redditizie sono 20 di fila. I loro lotti dovrebbero essere 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


 
lil_lil:

Conto il numero di trade redditizi di fila, se supera i 5, allora ritorno al lotto iniziale, la posizione 6 si apre con il lotto iniziale e la posizione 7 dovrebbe aprirsi con un volume = lotto 6 moltiplicato per il coefficiente, ecc. Quando ci sono 5 posizioni più redditizie, torna al lotto iniziale.

Le posizioni redditizie sono 20 di fila. I loro lotti dovrebbero essere 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


È necessario utilizzare una variabile statica nella funzione di conteggio dei lotti. Ecco come funziona:

//+------------------------------------------------------------------+
//|                                                       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;
     }
  }
//+------------------------------------------------------------------+

Risultato:

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

È necessario utilizzare una variabile statica nella funzione di conteggio dei lotti. Ecco come funziona:

Risultato:

Ho resettato secondo il tuo esempio, ma non riesco a ottenere l'ordine di aumento del lotto

Ci sono 20 posizioni redditizie, in fila. I loro lotti dovrebbero essere 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 ma dovrebbe essere1, 2, 4, 8,16, 1, 1, 1, 1, 1,............

Cosa c'è che non va?

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:

Sto azzerando secondo il vostro esempio, ma non sto ottenendo l'ordine di aumento del lotto

Ci sono 20 posizioni redditizie, in fila. I loro lotti dovrebbero essere 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 e risulta così1, 2, 4, 8,16, 1, 1, 1, 1, 1 ............

Cosa c'è che non va?

Quindi non volete ancora usare OnTradeTransaction in modo normale? Quindi preferisci chiedere ESATTAMENTE l'intera storia del trading (dal 1970)? Perché?

 
Vladimir Karputov:

Quindi non volete lavorare correttamente con OnTradeTransaction? Quindi preferisci richiedere ASSOLUTAMENTE TUTTA la storia del trading (dal 1970)? Perché?

Trovato un motivo, parentesi.

Cosa vuol dire che non voglio, cosa c'entraOnTradeTransaction con la mia domanda ;)

 

Ora, vedo, due post prima della mia domanda, un esempio di calcolo.

Grazie.

 
lil_lil:

Trovato il motivo, parentesi.

Cosa vuol dire che non voglio, cosa c'entraOnTradeTransaction con la mia domanda;)

Chiedo solo la storia del trading

HistorySelect(0,LONG_MAX)

significa richiedere tutta, tutta, tutta la storia di quel conto di trading dal 1970. Questo è molto sub-ottimale:

  • e se ci sono migliaia di transazioni in quel conto?
  • E se (Dio non voglia) facesse questa richiesta ad ogni spunta?

 

Si prega di condividere le funzioni che lavorano con la storia del trading.

Ho bisogno di ottenere informazioni sulla data dell'ultima apertura, chiusura, volume, risultato finanziario e il suo tipo (acquisto o vendita).

Se avete funzioni simili, per favore condividetele.

Motivazione: