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

 

Wie ist das möglich? Gab es da nicht ein Problem mit der Mathematik?

input double    T_P  =0.81;
input double    S_L  =0.35;

b_ep=price-atrH1200;
b_sl=b_ep-(b_ep*S_L)/100;
b_tp=b_ep+(b_ep*T_P)/100;

Es sieht aus wie 1,05 *0,81/100 =0,008505

Sie erhalten 35% Stop und 81% Tekprofit statt 0,81% und 0,35%.

SellLimit(LOT_FOR_TRADE,s_ep,symb,s_sl,s_tp,ORDER_TIME_DAY,0,"SellLimit");

BuyLimit(LOT_FOR_TRADE,b_ep,symb,b_sl,b_tp,ORDER_TIME_DAY,0,"BuyLimit");

Die Methode aus der StandardbibliothekSellLimit&BuyLimit


Print(s_ep,"s_ep");
Print(s_sl,"s_sl");
Print(s_tp,"s_tp");

Drucken zeigt:

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.04236745s_ep

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.25084094s_sl

2017.12.24 07:55:27.559 2017.01.03 16:54:17 0.521183725s_tp


 
SILVERPRINT:

Wie ist das möglich? Gab es da nicht ein Problem mit der Mathematik?

Es sieht aus wie 1,05 *0,81/100 =0,008505

Sie erhalten 35% Stop und 81% Tekprofit statt 0,81% und 0,35%.

Die Methode aus der StandardbibliothekSellLimit&BuyLimit


Drucken zeigt:

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.04236745s_ep

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.25084094s_sl

2017.12.24 07:55:27.559 2017.01.03 16:54:17 0.521183725s_tp



Schreiben Sie denselben Code neu, aber so, dass ALLE Variablen deklariert sind. Ich werde sehen, welche Arten von Variablen Sie deklarieren. Dann ist die richtige Lösung zum Greifen nah.

 
Vladimir Karputov:

Schreiben Sie denselben Code neu, aber so, dass ALLE Variablen deklariert sind. Ich werde sehen, welche Arten von Variablen Sie deklarieren. Und schon sind Sie auf dem Weg zur richtigen Lösung.


//+------------------------------------------------------------------+
//|                                                       |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Indicators\Trend.mqh>
#include <Indicators\Oscilators.mqh>
#include <Indicators\TimeSeries.mqh>
#include <Trade\Trade.mqh>
input double    T_P  =0.81;
input double    S_L  =0.35;
static int hour;
int h;
input int TIME_FOR_ACTION=16;
input int slowma=200;
input int fastwma=20;
input int mahours=20;
input double LOT_FOR_TRADE=0.1;
string symb;
MqlTick infotick;
MqlDateTime currentTime;
CiMA ValueofMA200;
CiMA ValueofMA20;
CiMA ValueofMAHour;
CiATR atr;
CTrade T_M;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   symb=_Symbol;
   ValueofMA200.Create(symb,PERIOD_D1,slowma,0,MODE_SMA,PRICE_CLOSE);
   ValueofMA20.Create(symb,PERIOD_D1,fastwma,0,MODE_SMA,PRICE_CLOSE);
   ValueofMAHour.Create(symb,PERIOD_H1,mahours,0,MODE_SMA,PRICE_CLOSE);
   atr.Create(symb,PERIOD_H1,200);


   atr.BufferResize(40);
   ValueofMA200.BufferResize(250);
   ValueofMA20.BufferResize(250);
   ValueofMAHour.BufferResize(250);

   T_M.LogLevel(LOG_LEVEL_ALL);

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   RefCustom();
   SymbolInfoTick(symb,infotick);
   TimeToStruct(infotick.time,currentTime);

   if(1==1)
     {
      if(1==1)
        {
         double maD1200,maD120,maH120,atrH1200,price;

         maD1200=ValueofMA200.Main(0);
         maD120=ValueofMA20.Main(0);
         maH120=ValueofMAHour.Main(0);
         atrH1200=atr.Main(0);
         price=infotick.bid;
         double s_ep,s_sl,s_tp;
         double b_ep,b_sl,b_tp;


         if(1==1)
           {
            b_ep=price-atrH1200;
            b_sl=b_ep-(b_ep*S_L)/100;
            b_tp=b_ep+(b_ep*T_P)/100;
            T_M.BuyLimit(LOT_FOR_TRADE,b_ep,symb,b_sl,b_tp,ORDER_TIME_DAY,0,"BuyLimit");
           }
         if(1==1)
           {
            s_ep=price+atrH1200;
            s_sl=s_ep+(s_ep*S_L)/100;
            s_tp=s_ep-(s_ep*T_P)/100;

            T_M.SellLimit(LOT_FOR_TRADE,s_ep,symb,s_sl,s_tp,ORDER_TIME_DAY,0,"SellLimit");
           }
}

     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+
void RefCustom()
  {
   ValueofMA200.Refresh();
   ValueofMA20.Refresh();
   ValueofMAHour.Refresh();
   atr.Refresh();
  }
//+------------------------------------------------------------------+

 
SILVERPRINT:


Irrtümer. Nicht kompilieren.

 
Vladimir Karputov:

Irrtümer. Es lässt sich nicht kompilieren.


Entschuldigung, versuchen Sie es jetzt.

 
SILVERPRINT:

Entschuldigung, versuchen Sie es jetzt.


Wahrscheinlich über Nacht - ich verstehe also überhaupt nicht, was Sie da versuchen.

Ein Ratschlag:

  • INITIALIZE-Variablen bei der Deklaration
  • beim Dividieren durch double dividieren, nicht durch int (z. B. Zahl 100.0 -> double, Zahl 100 -> int)
  • Was ist dieser Stil if(1==1) - ? Das ist ungeheuerlich, schreiben Sie das niemals so.
  • Und schließlich, was am wichtigsten ist, lassen Sie nur drei Zeilen in Ihrem Code,

            b_ep=price-atrH1200;
            b_sl=b_ep-(b_ep*S_L)/100;
            b_tp=b_ep+(b_ep*T_P)/100;

  • und deklarieren und initialisieren Sie Variablen explizit. Zum Beispiel so:

   double price=1.05848;
   double atrH1200=1.05168;
   double T_P=0.81;
   double S_L=0.35;

   double b_ep=price-atrH1200;
   double b_sl=b_ep-(b_ep*S_L)/100.0;
   double b_tp=b_ep+(b_ep*T_P)/100.0;
   DebugBreak();
 
Vladimir Karputov:

Wahrscheinlich über Nacht - ich verstehe also gar nichts von dem, was Sie vorhaben.

Ein Ratschlag:

  • bei der Deklaration von INITIALIZE-Variablen
  • beim Dividieren durch double dividieren, nicht durch int (z. B. Zahl 100.0 -> double, Zahl 100 -> int)
  • Was ist dieser Stil if(1==1) - ? Das ist ungeheuerlich, schreiben Sie das niemals so.
  • Und schließlich, was am wichtigsten ist, lassen Sie nur drei Zeilen in Ihrem Code,

  • und deklarieren und initialisieren Sie Variablen explizit. Zum Beispiel so:


Vielen Dank, unglaublich hilfreich.

 
Seltsamerweise funktioniert die Funktion auch, wenn es mehr Aufträge als Null gibt.
if(OrdersTotal()==0)

Es macht keinen großenUnterschied, aber wenn die Funktion nicht funktioniert, kann es sein, dass das gesamte Depot geöffnet wird.

 
SILVERPRINT:
Seltsam, aber die Funktion funktioniert auch, wenn es mehr Aufträge als Null gibt.

Es macht zwar keinen großenUnterschied, aber wenn die Funktion nicht funktioniert, kann das die gesamte Einzahlung aufdecken.

Öffnen Sie die MT5-Hilfe für die Funktion und vergewissern Sie sich, dass Sie richtig verstanden haben, was ein Auftrag in MT5 ist

 
Drückte und drückte F1, konnte nicht finden...

Können Sie mir bitte sagen, wie ich _Digits für ein anderes Zeichen bestimmen kann?