Fehler, Irrtümer, Fragen - Seite 1863

 
fxsaber:

ACCOUNT_PROFIT im Testgerät zeigt Unsinn.


Ich möchte hinzufügen:

1. für Tauschmittel

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

2) Außerdem funktioniert die Logik des Expert Advisors nicht korrekt, wenn er sich auf den Gesamtgewinn/-verlust von Positionen konzentriert.

Wir konzentrieren uns beim Abschluss auf die ACCOUNT_PROFIT-Werte.

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

Beim Abschluss berechnet das Terminal den Gewinn neu, so dass Sie am Ende Folgendes erhalten

bei Verlust schließen

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

Als Ergebnis haben wir

#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:

Ich füge hinzu:

In der SD haben wir es mit...
 
Slawa:
Offensichtlich verstehe ich etwas an HFT nicht. Soweit ich weiß, ist es beim "sehr schnellen" Handel egal, welche Geschäfte man vorher gemacht hat.

HFT gab ein Beispiel für einen TS, der einfach eine Menge Geschäfte macht.

Sie können einen Lauf über einen langen Zeitraum von einigen Scalper laufen. Die Hauptsache ist, dass man viele Geschäfte hat (Zehntausende). Dann werden die Nachteile der derzeitigen Umsetzung der Arbeit mit der Geschichte deutlich.


Die derzeitige Situation stellt sich wie folgt dar. Wenn es viele Angebote gibt, verwenden Sie nicht den Verlauf.

 
fxsaber:
In der SD...


Das ist großartig.

es genügt, die Verwendung des LAST-Preises zu streichen, um angemessene Ergebnisse zu erzielen

 

Bitte helfen Sie mir, den Mindestabstand in Punkten zwischen dem Eröffnungskurs der Position und den Stop-Loss- und Take-Profit-Levels zu finden, damit diese nicht zu nahe am Eröffnungskurs liegen und der Fehler 10016 (TRADE_RETCODE_INVALID_STOPS) nicht auftritt. Ich habe versucht, SymbolInfoInteger (siehe Code unten) zu verwenden, aber diese Berechnung gibt 0. Wenn jemand kann mir eine Idee, wie man es richtig zu berechnen.

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

Bitte helfen Sie mir, den Mindestabstand in Punkten zwischen dem Eröffnungskurs der Position und den Stop-Loss- und Take-Profit-Levels zu finden, damit diese nicht zu nahe am Eröffnungskurs liegen und der Fehler 10016 (TRADE_RETCODE_INVALID_STOPS) nicht auftritt. Ich habe versucht, SymbolInfoInteger (siehe Code unten) zu verwenden, aber diese Berechnung gibt 0. Wenn jemand kann mir eine Idee, wie man es richtig zu berechnen.


0 - keine Begrenzung. Es gibt aber auch SYMBOL_SESSION_PRICE_LIMIT_MIN und SYMBOL_SESSION_PRICE_LIMIT_MAX.
 
fxsaber:

0 - es gibt keine Begrenzung. Es gibt aber auch SYMBOL_SESSION_PRICE_LIMIT_MIN und SYMBOL_SESSION_PRICE_LIMIT_MAX.
Hmm, in diesem Fall wünschte ich, SYMBOL_TRADE_STOPS_LEVEL würde irgendwie anders funktionieren. Wenn 0 unbegrenzt ist, dann könnten wir theoretisch beim Senden von .PositionOpen(...) an den Server Stops bei 1 Punkt (um 5 Ziffern) vom Eröffnungskurs setzen, aber der TRADE_RETCODE_INVALID_STOPS-Fehler würde zu 100% erscheinen. Ich bin bis jetzt ratlos.
 
Maxim Khrolenko:
Hmm, in diesem Fall wünschte ich, SYMBOL_TRADE_STOPS_LEVEL würde irgendwie anders funktionieren. Wenn 0 unbegrenzt ist, dann könnte man theoretisch beim Senden von .PositionOpen(...) an den Server Stops bei 1 Pip (um 5 Stellen) vom Eröffnungskurs platzieren, aber der TRADE_RETCODE_INVALID_STOPS-Fehler würde hier zu 100% auftauchen. Ich bin bis jetzt ratlos.

Wie wäre es damit?

 if(stoplevel==0) stoplevel=SymbolInfoInteger(symb,SYMBOL_SPREAD);
 
Mit dem Tester ist wieder etwas passiert - 1586. Expert Advisor für 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;
  }    
}

Bei jedem Tick wird entweder ein Limit auf den aktuellen Preis gesetzt (zur sofortigen Ausführung) oder die Position geschlossen. Das heißt, es sollte eine Vielzahl von Positionen geben. Dies ist jedoch nicht der Fall, da die Begrenzer nicht mehr funktionieren. Hier ist das Ende des Protokolls zu sehen

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 war auf Bid gesetzt, wurde aber nie ausgeführt.

Im Jahr 1585 war damit alles in Ordnung.

 
fxsaber:
Es wurde wieder etwas mit dem Prüfgerät gemacht - 1586.

Und ich verstehe, dass ich falsch liege, aber ich habe trotzdem den Eindruck, dass es einen falschen Ansatz für die Veröffentlichung von Builds gibt. Früher gab es keine so große Anzahl von Fehlerberichten nach der Veröffentlichung von Builds.