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

 
User_mt5:

Wladimir Karputow, und ich?)

Ich kann es nicht mit Sicherheit sagen, aber versuchen Sie es mit 0.0


Hinzugefügt: Es scheint, dass man 'INDICATOR_MINIMUM' und 'INDICATOR_MAXIMUM' mit MQL5 nicht abbrechen kann.

 
Vladimir Karputov:

Ich kann es nicht mit Sicherheit sagen, aber versuchen Sie es mit 0.0


Hinzugefügt: Es scheint, dass 'INDICATOR_MINIMUM' und 'INDICATOR_MAXIMUM' von MQL5 nicht gelöscht werden können.

Leider...

Ich danke Ihnen für Ihre Antwort.

(dasselbe Problem besteht auch bei den Ebenen, wird aber durch Festlegen der Anzahl der Ebenen gelöst)

 
User_mt5:

Leider...

Vielen Dank für die Antwort.

(Das Problem mit den Ebenen ist eigentlich dasselbe, wird aber durch die Festlegung der Anzahl der Ebenen gelöst)

Experimentieren Sie und alles wird gut werden.

 
User_mt5:


Ich habe die Eigenschaften verglichen, die das Diagramm speichert (am Beispiel des Indikators"Stochastic Oscillator")



<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=1
scale_fix_min_val=0.000000
scale_fix_max=1
scale_fix_max_val=100.000000
expertmode=0
fixed_height=-1


<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=0
scale_fix_min_val=-10.500000
scale_fix_max=0
scale_fix_max_val=110.500000
expertmode=0
fixed_height=-1


Dies ist eindeutig eine Eigenschaft vom Typ 'bool', aber es gibt keinen Zugriff auf diese Eigenschaft von der MQL5-Sprache aus.

 
Vladimir Karputov:

Ich habe die Eigenschaften verglichen, die das Diagramm speichert (am Beispiel des Indikators"Stochastic Oscillator")

Es handelt sich eindeutig um eine Eigenschaft vom Typ "bool", aber es gibt keinen Zugriff auf diese Eigenschaft innerhalb der MQL5-Sprache.

Ja, leider.

Nochmals vielen Dank)

 

Es gibt ein Problem. Mit der Funktion (siehe unten) können wir TakeProfit- und StopLoss-Werte nach Positions-ID aus der Historie erhalten (d.h. wenn die Position bereits geschlossen ist). Diese Funktion funktioniert in Echtzeit, aber im Strategietester kann sie TakeProfit und StopLoss nicht finden, weil sie keine historischen Aufträge sieht, die Stops setzen (wichtig ist, dass die Stops nach der Positionseröffnung gesetzt werden)

Frage: Wie kann ich mit dem Strategy Tester den TP/Loss für eine geschlossene Position auf Basis eines Tickets herausfinden?

#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>

CDealInfo deal;
CHistoryOrderInfo ord;


void GetPosStops(ulong ticket, int& tp, int& sl, double& lot){
   HistorySelectByPosition(ticket);
   tp=0;sl=0;
   double open=0, tp_=0, sl_=0;
   string symbol="";
   ENUM_DEAL_TYPE type=-1;
   for(int i=0; i<HistoryDealsTotal(); i++){
      if(!deal.SelectByIndex(i))continue;
      if(deal.Entry() ==DEAL_ENTRY_IN){
         open=deal.Price();
         symbol=deal.Symbol();
         type=deal.DealType();
         lot=deal.Volume();
         break;
      }
   }
   for(int i=0; i<HistoryOrdersTotal(); i++){
      if(!ord.SelectByIndex(i))continue;
      if(tp_==0)tp_=ord.TakeProfit();
      if(sl_==0)sl_=ord.StopLoss();
      if(tp_>0 && sl_>0)break;
   }
   if(symbol !=""){
      double coef=type==DEAL_TYPE_BUY ? 1:-1;
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      if(tp_>0 && coef*tp_>coef*open)
         tp=(int)(MathAbs(tp_-open)/point);
      if(sl_>0 && coef*sl_<coef*open)
         sl=(int)(MathAbs(sl_-open)/point);   
   }
}
 
Hallo an alle!
Ich versuche gerade, EAs zu programmieren, und ich möchte damit beginnen, einen statistischen Spread Collector zu schreiben.
Ich meine, was möchte ich damit machen? Im Tester startet ein EA und sammelt Daten zur Tick-Historie für einen bestimmten Zeitraum, z. B. zehn Tage.
Und dann generiert es die folgenden Daten in einer csv- oder xlsx-Datei:
Durchschnittlicher Spread für einen Zeitraum: 00:00 - 09:00 auf dem Server, 09:00 - 18:00, 18:00 - 00:00 (für alle zehn Tage), maximaler Spread für diesen Zeitraum, minimaler Spread und durchschnittlicher Spread des Währungspaares für den gesamten Zeitraum von zehn Tagen.
Ich bin es wirklich leid, diese Daten manuell zu sammeln.

Ich weiß, dass es Programme gibt, die das irgendwie selbst machen... Aber ich will mein eigenes, als Training.
Vielleicht können mir angesehene Kenner sagen, wo ich anfangen soll? Und ist es überhaupt möglich, ein solches Programm zu schreiben?

Vielen Dank im Voraus an alle, die geantwortet haben und einem Neuling gegenüber verständnisvoll waren.
 

Hallo zusammen. Vielleicht hat jemand ein fertiges Stück Code. Es gibt 2 Parameter, deposit=3000 und lot 0.01 d.h. mit deposit 3000 lot wird 0.01 sein, jetzt streng bei Verdoppelung d.h. wenn depo 6000 lot wird 0.02 bei 9000 wird 0.03 sein, wie es zu tun?

 
Pavel Komarovsky:

Hallo zusammen. Vielleicht hat jemand ein fertiges Stück Code. Es gibt 2 Parameter, deposit=3000 und lot 0.01 d.h. mit deposit 3000 lot wird 0.01 sein, jetzt streng bei Verdoppelung d.h. wenn depo 6000 lot wird 0.02 bei 9000 wird 0.03 sein, wie es zu tun?

Es ist ungefähr so:

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double start_deposit=3000;
   double start_lot=0.01;
   double deposit=start_deposit;
   for(int i=0; i<10; i++)
     {
      
      double d=MathFloor(deposit/start_deposit);
      Print(i,"#: ,deposit ",DoubleToString(deposit,2),", d ",DoubleToString(d*start_lot,2));
      //---
      deposit=deposit+start_deposit*0.55;
     }
  }
//+------------------------------------------------------------------+

Ergebnis:

2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    0#: ,deposit 3000.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    1#: ,deposit 4650.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    2#: ,deposit 6300.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    3#: ,deposit 7950.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    4#: ,deposit 9600.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    5#: ,deposit 11250.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    6#: ,deposit 12900.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    7#: ,deposit 14550.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    8#: ,deposit 16200.00, d 0.05
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    9#: ,deposit 17850.00, d 0.05
Dateien:
Script_1.mq5  3 kb
 

Gute Zeit,

Bitte helfen Sie mir, einen Fehler zu finden... Ich kopiere Balkenwerte (BarsCount) aus dem Indikatorpuffer in das Skript, dann mache ich eine Schleife um die Werte, erkenne ein Signal und drucke sie mit Print() aus; es scheint einfach zu sein, aber es ist nicht so einfach... Ich erhalte alle Signale wie gewünscht, außer dem Überschreiten der Nulllinie.

CROSSOVER_OR_REVERSE

Vielleicht sollte das Skript das nicht so machen? Ich habe den Code und einen Screenshot des Logs beigefügt... Vielen Dank!

//+------------------------------------------------------------------+
//|                                                B_O_P_Signals.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
  
input int       inpSmoothPeriod = 14;       // Result smoothing period
input enMaTypes inpSmoothMethod =  ma_sma;  // Result smoothing type
input double    inpLevelUp      =  0.2;     // Level up
input double    inpLevelDown    = -0.2;     // Level down
input int       BarsCount       = 100;

double Mid_line[1] = {0.0};
int handle=0;
double TREND_VAL[];

void OnStart()
  {
      handle = iCustom(_Symbol,PERIOD_CURRENT,"Balance of Market Power",inpSmoothPeriod,inpSmoothMethod,inpLevelUp,inpLevelDown);
      
      CopyBuffer(handle,2,0,BarsCount,TREND_VAL);
      
      ArraySetAsSeries(TREND_VAL,true);
      
      string Signal ="";
      
        for (int i=ArraySize(TREND_VAL)-1; i>=0; i--)
        {
           int k=1;
            if(TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] > inpLevelUp)
            
               Signal = "TREND_UP";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] < inpLevelUp)
            
               Signal = "TREND_UP_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] >= Mid_line[0] && TREND_VAL[i+k] <= Mid_line[0])
            
               Signal ="CROSSOVER_OR_REVERSE_UP";
            
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] < inpLevelDown)
            
               Signal = "TREND_DN";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] > inpLevelDown)
            
               Signal = "TREND_DN_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] < Mid_line[0] && TREND_VAL[i+k] > Mid_line[0])
            
               Signal = "CROSSOVER_OR_REVERSE_DN";
            else Signal = "UNKNOWN_SIGNAL";
            
            Print(string(i),"_", Signal);
        }
      
   
  }
//+------------------------------------------------------------------+
Dateien:
Question.png  150 kb
Grund der Beschwerde: