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

 
MrBrooklin:

Guten Tag zusammen!

Hier ist ein Teil des Skriptcodes für Metatrader5:


Sie haben Fragen:

1. Das Skript soll entweder schwebende Limit-Aufträge in einem bestimmten Abstand zum Geld- und Briefkurs oder Stop-Aufträge setzen. Die schwebenden Limit-Aufträge werden ohne Probleme gesetzt, die Stop-Aufträge jedoch nicht. Bitte helfen Sie mir herauszufinden, warum die ausstehenden Buy Stop- und Sell Stop-Aufträge nicht gesetzt werden.

2. Gibt es eine Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?

Mit freundlichen Grüßen, Vladimir.

Referenz:Allgemeine Grundsätze - Handelsgeschäfte

Arten von schwebenden Aufträgen

Aktuelle Marktlage

- aktuelle Marktlage

Vorhersage

- Prognose

Aktueller Preis

- aktueller Preis

Preis bestellen

- Bestellpreis

Preis, zu dem der schwebende Auftrag erteilt werden soll

- Preis, zu dem der schwebende Auftrag erteilt werden soll

Erwartetes Wachstum

- erwartetes Wachstum

Erwarteter Rückgang

- erwarteter Rückgang


Ihr Fehler liegt in der Bildung des Startpreises:

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

Ich empfehle, einen separaten Startpreis für Stop- und Limit-Aufträge festzulegen.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.08.31 08:16


Und Ihr Fehler liegt in der Startpreisbildung:

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

Ich empfehle, den Startpreis separat für Stop und Limit Pending Orders zu machen.

Danke, Vladimir, für den Hinweis.

Was halten Sie von der Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?

Mit freundlichen Grüßen, Vladimir.

 

Was halten Sie von der Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?



Die Frage wird entfernt, da die Antwort anscheinend in einem anderen Thema gegeben wurde.

Hochachtungsvoll, Vladimir.

 
MrBrooklin:

Frage zurückgezogen, da die Antwort anscheinend in einem anderen Thread gegeben wurde.

Hochachtungsvoll, Vladimir.

Sie haben also eine Frage über das ganze Forum verteilt... Sie sind derjenige, der verwirrt ist.

 
MrBrooklin:

Danke, Vladimir, für den Hinweis.

Was halten Sie von der Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?

Hochachtungsvoll, Vladimir.

Sie können das Handelsskript nicht an Wochenenden ausführen, aber wenn Sie das Skript in einen Expert Advisor umwandeln, können Sie es testen.

Setzen Sie OnTick anstelle von OnStart , und setzen Sie die Handelsfunktionen in OnInit. Das ist nicht sehr schön, aber es ermöglicht Ihnen, das Skript an Wochenenden zu testen.
 
MrBrooklin:

Danke, Vladimir, für den Hinweis.

Was halten Sie von der Möglichkeit, das Skript zu testen, wenn der Markt geschlossen ist (z. B. an Wochenenden)?

Hochachtungsvoll, Vladimir.

So wird der Expert Advisor aussehen:

//+------------------------------------------------------------------+
//|                                               Stop and Limit.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\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop=0,     // Buy stop and Sell stop
   limit=1     // Buy limit and Sell limit
  };
//--- input parameters
input ushort               InpUpGap          = 15;    // Gap for pending orders UP from the current price (in points)
input ushort               InpUpStep         = 30;    // Step between orders UP (in points)
input ushort               InpDownGap        = 15;    // Gap for pending orders DOWN from the current price (in points)
input ushort               InpDownStep       = 30;    // Step between orders DOWN (in points)
input ENUM_STOP_OR_LIMIT   InpPending        = stop;  // Type of pending orders
input uchar                InpUpQuantity     = 1;     // UP quantity orders
input uchar                InpDownQuantity   = 1;     // DOWN quantity orders
input double               InpLots           = 0.01;  // Lots
input ushort               InpStopLoss       = 50;    // Stop Loss (in points)
input ushort               InpTakeProfit     = 50;    // Take Profit (in points)
//---
ulong       m_slippage     = 30;    // slippage

double      ExtUpGap       = 0.0;
double      ExtUpStep      = 0.0;
double      ExtDownGap     = 0.0;
double      ExtDownStep    = 0.0;
double      ExtStopLoss    = 0.0;
double      ExtTakeProfit  = 0.0;
double      m_adjusted_point;       // point value adjusted for 3 or 5 points
bool        m_first_start  = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
   RefreshRates();
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtUpGap       =  InpUpGap       * m_adjusted_point;
   ExtUpStep      =  InpUpStep      * m_adjusted_point;
   ExtDownGap     =  InpDownGap     * m_adjusted_point;
   ExtDownStep    =  InpDownStep    * m_adjusted_point;
   ExtStopLoss    =  InpStopLoss    * m_adjusted_point;
   ExtTakeProfit  =  InpTakeProfit  * m_adjusted_point;
//--- check the input parameter "Lots"
   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      //--- 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);
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(m_first_start)
      return;
//---
   if(!RefreshRates())
      return;
//--- start work
   double start_price_ask=0.0;
   double start_price_bid=0.0;
   if(InpPending==stop)
     {
      start_price_ask=m_symbol.Ask()+ExtUpGap;
      start_price_bid=m_symbol.Bid()-ExtDownGap;
     }
   else
      if(InpPending==limit)
        {
         start_price_ask=m_symbol.Ask()-ExtUpGap;
         start_price_bid=m_symbol.Bid()+ExtDownGap;
        }
//--- set pending orders
   for(int i=0; i<InpUpQuantity; i++)
     {
      double price_ask = start_price_ask+i*ExtUpStep;
      double price_bid = start_price_bid+i*ExtUpStep;
      if(InpPending==stop)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                         m_symbol.NormalizePrice(sl),
                         m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                           m_symbol.NormalizePrice(sl),
                           m_symbol.NormalizePrice(tp));
        }
     }

//--- set pending orders
   for(int i=0; i<InpDownQuantity; i++)
     {
      double price_ask = start_price_ask-i*ExtDownStep;
      double price_bid = start_price_bid-i*ExtDownStep;
      if(InpPending==limit)
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
//---
   m_first_start=true;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","RefreshRates error");
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","Ask == 0.0 OR Bid == 0.0");
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Check the correctness of the position volume                     |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- minimal allowed volume for trade operations
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
         error_description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      else
         error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }
//--- maximal allowed volume of trade operations
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
         error_description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      else
         error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }
//--- get minimal step of volume changing
   double volume_step=m_symbol.LotsStep();
   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")
         error_description=StringFormat("Объем не кратен минимальному шагу SYMBOL_VOLUME_STEP=%.2f, ближайший правильный объем %.2f",
                                        volume_step,ratio*volume_step);
      else
         error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",
                                        volume_step,ratio*volume_step);
      return(false);
     }
   error_description="Correct volume value";
   return(true);
  }
//+------------------------------------------------------------------+
Dateien:
 

Vladimir Karputov, 2019.08.31 13:20

So würde ein Experte aussehen:



Großartig!

Danke, Vladimir, du hast mir geholfen, sonst hätte ich bis Montag leiden müssen.

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin:

Großartig!

Danke, Vladimir, du hast mir geholfen, sonst hätte ich mich bis Montag gedulden müssen.

Mit freundlichen Grüßen, Vladimir.

Sie sind herzlich willkommen.

Beachten Sie die Variable m_first_start, die auf der globalen Programmebene deklariert ist

bool        m_first_start  = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()

am Ende von OnTick wird dieser Variablen der Wert "true" zugewiesen

//---
   m_first_start=true;
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {

und der EA wird bis zu seinem nächsten Neustart keine ausstehenden Aufträge mehr platzieren

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(m_first_start)
      return;
 

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.08.31 14:38

Ich bitte Sie.

Beachten Sie die auf globaler Programmebene deklarierte Variable m_first_start

Ja, Vladimir, ich habe sofort bemerkt, dass der EA beim Testen wie ein Skript funktioniert. Nochmals vielen Dank!

Mit freundlichen Grüßen, Vladimir.

 

Warum funktioniert der Kerzenausgang nicht?


#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1

#property indicator_label1  "SecondInstrument"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrBlack, clrGreen, clrRed
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 

double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

string symbol = "GBPJPY.m";
int barsToBuid = 100;
int deviation = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close"); 
   IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_CANDLES("+symbol+")");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
                
   for(int i=0;i<barsToBuid;i++){
      OBuffer[i] = iOpen(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      HBuffer[i] = iHigh(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      LBuffer[i] = iLow(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      CBuffer[i] = iClose(symbol, PERIOD_CURRENT, i) + deviation*_Point;
      
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: