Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1128

 

Hallo, ich habe ein merkwürdiges Verhalten der Systemfunktion OrderCalcProfit, ich habe das Gefühl, dass der Volumenparameter bei der Berechnung ignoriert wird, d.h. die Gewinngröße wird immer für das Volumen 1,0 berechnet

Ich versuche, es im Tester für verschiedene Währungspaare auf verschiedenen Demokonten zu überprüfen.

1. Die Berechnung ist korrekt für 1.0, siehe calc_profi101.png.

2. Der zweite und alle folgenden Aufrufe der Funktion liefern ein Gewinnergebnis auf der Grundlage eines Volumens von 1,0, der Wert des Volumens wird ignoriert, siehe einen Screenshot (calc_profit02.png) - übergebenes Volumen 0,5, aber das Ergebnis ist immer noch dasselbe wie für 1,0

Können Sie mir sagen, was das Problem sein könnte? Danke

Dateien:
 
aveshoff:

Hallo, ich habe ein merkwürdiges Verhalten der Systemfunktion OrderCalcProfit, ich habe das Gefühl, dass der Volumenparameter bei der Berechnung ignoriert wird, d.h. die Gewinngröße wird immer für das Volumen 1,0 berechnet

Ich versuche, es im Tester für verschiedene Währungspaare auf verschiedenen Demokonten zu überprüfen.

1. Die Berechnung ist korrekt für 1.0, siehe calc_profi101.png.

2. Der zweite und alle folgenden Aufrufe der Funktion liefern ein Gewinnergebnis auf der Grundlage eines Volumens von 1,0, der Wert des Volumens wird ignoriert, siehe einen Screenshot (calc_profit02.png) - übergebenes Volumen 0,5, aber das Ergebnis ist immer noch dasselbe wie für 1,0

Können Sie mir sagen, was das Problem sein könnte? Danke

Ich denke, die Antwort liegt in der Hilfe:

"... Gewinn

[out] Variable, die den berechneten Gewinnwert enthält, wenn die Funktion erfolgreich ist. Der Wert der Gewinnschätzung hängt von vielen Faktoren ab und kann sich ändern, wenn sich das Marktumfeld ändert. ... "


Hinzugefügt: Dies ist allerdings nur eine Vermutung.

 
aveshoff:

Hallo, ich habe ein merkwürdiges Verhalten der Systemfunktion OrderCalcProfit, ich habe das Gefühl, dass der Volumenparameter bei der Berechnung ignoriert wird, d.h. die Gewinngröße wird immer für das Volumen 1,0 berechnet

Ich versuche, es im Tester für verschiedene Währungspaare auf verschiedenen Demokonten zu überprüfen.

1. Die Berechnung ist korrekt für 1.0, siehe calc_profi101.png.

2. Der zweite und alle folgenden Aufrufe der Funktion liefern ein Gewinnergebnis auf der Grundlage eines Volumens von 1,0, der Wert des Volumens wird ignoriert, siehe einen Screenshot (calc_profit02.png) - übergebenes Volumen 0,5, aber das Ergebnis ist immer noch dasselbe wie für 1,0

Können Sie mir sagen, was das Problem sein könnte? Danke

Hier ist der Testprüfer - alles funktioniert einwandfrei:

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

und das Ergebnis:

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
Dateien:
 
Können Sie mir das sagen? Ist es möglich und wie kann die Sprache des verwendeten Terminals programmatisch ermittelt werden?
 
Uladzimir Izerski:
Können Sie mir einen Tipp geben? Ist es möglich und wie kann ich die Sprache des verwendeten Terminals programmatisch herausfinden?

Ich bestimme damit entweder die russische Terminalsprache oder - wenn eine andere - die Ausgabe in Englisch.

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


Hinzugefügt: Ich dachte, ich hätte alle Sprachen aus der TERMINAL_LANGUAGE Aufzählung gespeichert - aber ich kann sie nicht finden. Muss verloren haben ...

 
Guten Tag an alle, kann jemand helfen, hier hinzuzufügen, dass bei SL würde es nicht nur umdrehen, sondern auch viel oder mehr hinzufügen. Und wenn TP ausgelöst wird, würde er um ein Lot zurückgehen.
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
Guten Tag an alle, kann jemand helfen, hier hinzuzufügen, dass es bei SL nicht nur ein Rollover wäre, sondern auch eine Menge oder mehr hinzufügen. Und wenn der TP ausgelöst wird, würde er ein Lot zurückgeben.

1. Ich rate kategorisch davon ab, Funktionen zu verwenden, die eine Position anhand eines Zeichens auswählen. Verwenden Sie eine Funktion, die eine Position anhand eines Indexes in einer Liste auswählt.

2. Um zu erfahren, wie eine Position geschlossen wurde, muss die AufzählungENUM_DEAL_REASON in OnTradeTransaction eingesehen werden.

Beispiel mit ENUM_DEAL_REASON:

Stop Loss Take Profit

Bei Schließung durch Stop-Loss - verdoppeln Sie das Volumen, bei Take-Profit - setzen Sie das Mindestvolumen. Um zu erkennen, dass der Handel durch das Auslösen von Stop Loss oder Take Profit ausgelöst wurde, verwenden wir OnTradeTransaction. Ab Build 1625 gibt es eine schöne Aufzählung ENUM_DEAL_REASON: ENUM_DEAL_REASON Beschreibung DEAL_REASON_SL Operation, die infolge einer Stop-Loss-Auslösung durchgeführt wurde DEAL_REASON_TP Operation, die infolge einer Take-Profit-Auslösung durchgeführt wurde... die in OnTradeTransaction nachverfolgt werden kann. Mit anderen Worten: Sie können jetzt einfach und vor allem zuverlässig feststellen, ob dieser Handel das Ergebnis der Auslösung von Take Profit oder Stop Loss war. Im Moment (Build 1626) kann dieser EA nur live getestet werden - entweder auf einem Chart oder im Debug-Modus mit echten Daten (F5 im MetaEditor). Ich habe auch einen Workaround für jetzt: Bestimmen Sie, was ausgelöst: Take Profit oder Stop Loss in der OnTradeTransaction Prozedur: if (deal_symbol==m_symbol...

CodeBase | 2017.07.13 07:42 |Vladimir Karputov| EAs | MetaTrader 5

 

Ist es möglich, die Anmeldedaten für das Konto in ein Programm eines Drittanbieters einzugeben und das Konto zu verwalten und, Sie wissen schon, Positionen zu eröffnen und zu schließen?

Oder ist dies nur über einen Roboter möglich, der auf dem Konto installiert ist?

 

Ich übertrage Indikatoren von MQL4 auf MQL5, Frage zu Puffern und "Plots". Der Indikator hat 2 Puffer und 1 Plot:

#Eigenschaft indicator_buffers 2
#property indicator_plots 1

SetIndexPuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Wenn der erste Puffer für Berechnungen usw. verwendet wird und der zweite aufgezeichnet werden soll, dann

Ist es zunächst notwendig, DRAW_NONE für den ersten Puffer zu setzen, wenn er bereits in der Funktion SetIndexBuffer() auf INDICATOR_CALCULATIONS gesetzt ist?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

zweitens, welchen Index sollte ich in PlotIndexSetInteger() anstelle von Fragezeichen (?) setzen, wenn nur der zweite Puffer gezeichnet werden soll?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


Drittens, wenn ich zwei Stile des Typs DRAW_HISTOGRAM verwende, kann ich für jeden von ihnen eine Farbe einstellen und erhalte ein Histogramm wie beim Volumenindikator, bei dem sich grüne und rote Balken abwechseln, aber wenn ich DRAW_HISTOGRAM2 verwende, kann ich dann auch zwei Farben für einen Balken einstellen, oder wird nur eine Farbe für diesen Stil eingestellt?

 
The_Sheikh:

Ich übertrage Indikatoren von MQL4 auf MQL5, Frage zu Puffern und "Plots". Der Indikator hat 2 Puffer und 1 Plot:

#Eigenschaft indicator_buffers 2
#property indicator_plots 1

SetIndexPuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexPuffer(1,Array2,INDICATOR_DATA);


Wenn der erste Puffer für Berechnungen usw. verwendet wird und der zweite aufgezeichnet werden soll, dann

Ist es zunächst notwendig, DRAW_NONE für den ersten Puffer zu setzen, wenn er bereits in der Funktion SetIndexBuffer() auf INDICATOR_CALCULATIONS gesetzt ist?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

zweitens, welchen Index sollte ich in PlotIndexSetInteger() anstelle von Fragezeichen (?) setzen, wenn nur der zweite Puffer gezeichnet werden soll?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


Drittens, wenn ich zwei Stile des Typs DRAW_HISTOGRAM verwende, kann ich für jeden von ihnen eine Farbe einstellen und erhalte ein Histogramm wie beim Volumenindikator, bei dem sich grüne und rote Balken abwechseln, aber wenn ich DRAW_HISTOGRAM 2 verwende, kann ich dann auch zwei Farben für einen Balken einstellen, oder wird nur eine Farbe für diesen Stil eingestellt?

Warum sind Sie so hart zu sich selbst? Wo liegt das Problem, wenn zuerst die Anzeigepuffer und dann die Hilfspuffer zugewiesen werden?

Für DRAW_HISTOGRAМ2 sind 3 Puffer definiert, und die Reihenfolge ist zwingend vorgeschrieben: zuerst 2 Wertepuffer, dann ein Farbpuffer. Der Unterschied zwischen DRAW_HISTOGRAM und DRAW_HISTOGRAM2 besteht jedoch darin, dass DRAW_HISTOGRAM von Null bis zum Wert im Puffer gezeichnet wird, während DRAW_HISTOGRAM2 vom Wert eines Puffers bis zum Wert eines anderen Puffers gezeichnet wird.

Grund der Beschwerde: