Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 112

 
Николай Цепелев:

Salve. Ho scritto nel mio EA il calcolo del lotto in questo modo:

lot=NormalizeDouble(AccountBalance()*rischio/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2);

Lo scopo è quello di ottenere la dimensione corretta del lotto indipendentemente dalla valuta e dalla coppia del conto per il rischio e lo stop loss specificati. Ilrischio è impostato come una percentuale delle perdite quando viene attivato lo Stop Loss. Stop Loss SL in pips (dove pips è il più piccolo cambiamento possibile nel prezzo della coppia). Ho intenzione di avviare questo EA su un conto reale. Ma ho i miei dubbi. Se qualcuno dei programmatori più esperti potesse dirmi quali errori possono verificarsi, gliene sarei molto grato.
Prima il tester di strategia. Poi abbiamo un conto demo. E solo allora il vero conto. Per controllare la formula, scrivete uno script. O semplicemente calcolarlo su un pezzo di carta. Ho preso balance=100, risk=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 lot più del balance? Dobbiamo considerare la leva?
 
STARIJ:
Primo tester di strategia. Poi un conto demo. E solo allora un vero e proprio. Per controllare la formula, scrivete uno script. O semplicemente calcolarlo su un pezzo di carta. Ho preso balance=100, risk=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 lot più del balance? Dobbiamo considerare la leva?

MarketInfo(Symbol(),MODE_TICKVALUE)) non restituisce la dimensione minima del tick. È scritto nell'aiuto:

Dimensione del cambiamento minimo del prezzo dello strumento nella valuta di deposito.


Ma in realtà, restituisce il valore del cambiamento minimo del prezzo del simbolo nella valuta di deposito di 1 lotto del contratto.


Nel vostro esempio,MarketInfo(Symbol(),MODE_TICKVALUE)) restituirà 1. E quindi tutto è corretto. L'ho provato su conti in dollari e rubli reali e funziona. Ecco lo script che ho usato per controllarlo:

#property copyright "Copyright 2016, MetaQuotes Software Corp.

#proprietà link "https://www.mql5.com"

#proprietà versione "1.00"

#proprietà rigorosa

#proprietà show_inputs

extern double risk=0,10;

extern int sl=1000;

//+------------------------------------------------------------------+

//| funzione di avvio del programma script |

//+------------------------------------------------------------------+

void OnStart()

{

Alert(NormalizeDouble(AccountBalance()*rischio/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2))

}

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

Hai ragione. Il controllo con uno script è più veloce e affidabile

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
Il tuo script occupa 19 cm di altezza sullo schermo, il mio è di 8,1 cm - la metà. E il colore è diverso
 

Dobbiamo anche far dipendere la precisione della funzione NormaliseDouble dal lotto minimo consentito. Se si passa un lotto alla funzione OrderSend, per esempio, 0,11, e lo strumento è scambiato solo con lotti multipli di 0,1, ci sarà un errore.

 

Non riesco a capire perché i trade aperti non vengono cancellati tutti in una volta, cioè l'EA ne cancella alcuni, ma l'errore orderdelete 4108, ordine a mercato non può essere cancellato più volte, e solo allora li cancella.

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

Non riesco a capire perché i trade aperti non vengono cancellati tutti in una volta, cioè l'EA ne cancella alcuni, ma l'errore orderdelete 4108, ordine a mercato non può essere cancellato più volte, e solo allora li cancella.

Questa pagina spiega come cancellare. Hai 2 errori.

 
Buon pomeriggio. Sto chiedendo aiuto. Ho cercato in rete e nel forum. Sto testando l'Expert Advisor in modalità standard, tutto è OK... Nessun errore o avvertimento. Ho scaricato i dati del tick e ho aggiunto. (Ho fatto tutto come descritto qui - Come testare Expert Advisors con il 99% di qualità - facile, gratuito, legale) e qui - "Come ottenere il 99% di qualità della simulazione nel Metatrader 4 Strategy Tester") All'avvio costantemente errore 'array fuori portata in 'expert1.0.mq4' (69,25)... Ho capito che si tratta di un array. Non so cosa fare. Ma dato che tutto va bene in modalità standard... Per favore aiutatemi
 
qroner:
All'avvio c'è un errore costante array out of range in 'expert1.0.mq4' (69,25)... Ho capito che si tratta dell'array. Non so cosa fare.

Ho bisogno di vedere il codice, o un pezzo di esso, che gestisce questo array.

Telepati, riposatevi oggi.

 
Konstantin Nikitin:

Dovete guardare il codice o un pezzo di codice che gestisce l'array.

Telepati, riposatevi oggi.

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
ArrayInitialize(_Mas, 0);
int Ticket=-1;
for(int pos=OrdersTotal()-1; pos>=0; pos--){
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
Ticket=OrderTicket();
switch(OrderType()){
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

Ecco la funzione.

Ho solo pensato che il problema non fosse nel codice, dato che non ci sono errori in modalità standard.