Errori, bug, domande - pagina 1863

 
fxsaber:

ACCOUNT_PROFIT nel tester mostra un'assurdità.


Aggiungo:

1. per gli strumenti di scambio

Как следствие, неправильно оцениваются эквити, просадка и т.д.

2. Inoltre, la logica dell'Expert Advisor non funziona correttamente quando si concentra sul profitto/perdita totale delle posizioni.

Ci concentriamo sui valori ACCOUNT_PROFIT alla chiusura.

2017.04.20 11:30:26.318 Core 1  2017.04.17 18:02:46   Профит = 333.01

Alla chiusura, il terminale ricalcola il profitto, quindi vi ritrovate con

chiudere in perdita

2017.04.20 11:30:26.318 Core 1  2017.04.17 22:02:08   Профит = -338.66

come risultato abbiamo

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
input     string symb="GOLD-6.17";
input     string symb1="GOLD-9.17";
input     double  ТП  =333;
datetime date1;
double i1,ask1,ask2,bid1,bid2,last1,last2,profit;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  double price1=SymbolInfoDouble(symb,SYMBOL_BID);
  double price2=SymbolInfoDouble(symb1,SYMBOL_BID);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
Comment("");
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {
//---
      profit=AccountInfoDouble(ACCOUNT_PROFIT);
      Comment("ПРофит = ",profit);
     if(PositionsTotal()==0 )
     {
      m_trade.Buy(1.00,symb);
      m_trade.Buy(1.00,symb1);    
     }

   if( MathAbs(profit)>=ТП )
     {
      Print("Профит = ",profit);
     CloseAll();
     }

  }  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

 
kaus_bonus:

Aggiungo:

Nella SD, abbiamo a che fare con...
 
Slawa:
A quanto pare non capisco qualcosa di HFT. Per quanto ne so, quando si fa trading "molto veloce", non ci si preoccupa dei trade precedenti.

HFT ha dato un esempio di un TS che fa solo un sacco di scambi.

È possibile eseguire una corsa su un lungo periodo di qualche scalper. La cosa principale è avere molti scambi (decine di migliaia). Poi appariranno gli svantaggi dell'attuale implementazione del lavoro con la storia.


La situazione attuale è la seguente. Se ci sono molte offerte, non usare la cronologia.

 
fxsaber:
Nella SD...


è fantastico.

è sufficiente rimuovere l'uso di LAST price per ottenere risultati adeguati

 

Per favore, aiutatemi a trovare l'indentazione minima in punti dal prezzo di apertura della posizione ai livelli di stop-loss e take-profit, per non metterli troppo vicini al prezzo di apertura e non incorrere nell'errore 10016 (TRADE_RETCODE_INVALID_STOPS). Ho provato a usare SymbolInfoInteger (vedi codice sotto), ma questo calcolo restituisce 0. Se qualcuno può darmi un'idea su come calcolarlo correttamente.

void OnStart()
  {
   long stopLevel;
   if(SymbolInfoInteger("EURUSD",SYMBOL_TRADE_STOPS_LEVEL,stopLevel))
      Print("stopLevel = ",stopLevel);
  }
 
Maxim Khrolenko:

Per favore, aiutatemi a trovare l'indentazione minima in punti dal prezzo di apertura della posizione ai livelli di stop-loss e take-profit, per non metterli troppo vicini al prezzo di apertura e non incorrere nell'errore 10016 (TRADE_RETCODE_INVALID_STOPS). Ho provato a usare SymbolInfoInteger (vedi codice sotto), ma questo calcolo restituisce 0. Se qualcuno può darmi un'idea su come calcolarlo correttamente.


0 - nessun limite. Ma ci sono anche SYMBOL_SESSION_PRICE_LIMIT_MIN e SYMBOL_SESSION_PRICE_LIMIT_MAX.
 
fxsaber:

0 - non c'è limite. Ma ci sono anche SYMBOL_SESSION_PRICE_LIMIT_MIN e SYMBOL_SESSION_PRICE_LIMIT_MAX.
Hmm, in questo caso vorrei che SYMBOL_TRADE_STOPS_LEVEL funzionasse in qualche modo diversamente. Se 0 è illimitato, allora teoricamente, quando si invia .PositionOpen(...) al server, potremmo impostare gli stop a 1 pip (di 5 cifre) dal prezzo aperto ma l'errore TRADE_RETCODE_INVALID_STOPS si presenterebbe al 100%. Per ora non ho trovato nulla.
 
Maxim Khrolenko:
Hmm, in questo caso vorrei che SYMBOL_TRADE_STOPS_LEVEL funzionasse diversamente in qualche modo. Se 0 è illimitato, allora teoricamente, quando si invia .PositionOpen(...) al server, si potrebbero piazzare degli stop a 1 pip (di 5 cifre) dal prezzo aperto, ma l'errore TRADE_RETCODE_INVALID_STOPS verrebbe fuori al 100%. Per ora non ho trovato nulla.

Che ne dite di questo?

 if(stoplevel==0) stoplevel=SymbolInfoInteger(symb,SYMBOL_SPREAD);
 
È successo di nuovo qualcosa al tester - 1586. Consulente esperto per il playback
#include <MT4Orders.mqh>

// Metaquotes-Demo, RTS-6.17, 2017.04.07 - 2017.04.08, на основе реальных тиков, начальный баланс 100000
void OnTick()
{  
  static int Type = OP_BUY;

  MqlTick Tick;    
  
  if (OrderSelect(0, SELECT_BY_POS) && (OrderType() <= OP_SELL))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);    
  else if ((OrdersTotal() == 0) && SymbolInfoTick(_Symbol, Tick) && (Tick.bid != 0) && (Tick.ask != 0))
  {
    OrderSend(_Symbol, Type + OP_BUYLIMIT, 1, (Type == OP_BUY) ? Tick.ask : Tick.bid, 0, 0, 0);
    
    Type = OP_SELL - Type;
  }    
}

Ad ogni tick mette un limite al prezzo corrente (da eseguire immediatamente) o chiude la posizione. Cioè, ci dovrebbero essere molte posizioni. Ma questo non è il caso, perché i limitatori hanno smesso di funzionare. Ecco la fine del registro che mostra

2017.04.20 12:47:41.885 2017.04.07 10:00:00   sell limit 1.00 RTS-6.17 at 114060 (114060 / 114180 / 113770)
2017.04.20 12:47:41.885 2017.04.07 23:44:59   order canceled due end of test [#140  sell limit 1.00 RTS-6.17 at 114060]
2017.04.20 12:47:41.885 final balance 91195.12 RUR
2017.04.20 12:47:41.885 RTS-6.17,M1: 327182 ticks, 788 bars generated. Test passed in 0:00:00.218.

SellLimit è stato impostato a Bid, ma non è mai stato eseguito.

Nel 1585 tutto era a posto.

 
fxsaber:
È stato fatto di nuovo qualcosa al tester - 1586.

E capisco che mi sbaglio, ma ho ancora l'impressione di un approccio sbagliato al rilascio delle builds. Una volta non c'era un numero così grande di segnalazioni di bug dopo il rilascio delle build.