Questions des débutants MQL5 MT5 MetaTrader 5 - page 812

 

Comment est-ce possible ? Il n'y avait pas un problème avec les maths ?

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;

Il semble que 1,05 *0,81/100 =0,008505

Il vous donne 35% de stop et 81% de tekprofit au lieu de 0,81% et 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");

La méthode de la bibliothèque standardSellLimit&BuyLimit


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

L'impression montre :

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:

Comment est-ce possible ? Il n'y avait pas un problème avec les maths ?

Il semble que 1,05 *0,81/100 =0,008505

Il vous donne 35% de stop et 81% de tekprofit au lieu de 0,81% et 0,35%.

La méthode de la bibliothèque standardSellLimit&BuyLimit


L'impression montre :

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



Réécrivez le même code, mais de façon à ce que TOUTES les variables soient déclarées. Je vais voir quels types de variables vous déclarez. La bonne solution est alors à portée de main.

 
Vladimir Karputov:

Réécrivez le même code, mais de façon à ce que TOUTES les variables soient déclarées. Je vais voir quels types de variables vous déclarez. Et vous serez alors sur la voie de la bonne solution.


//+------------------------------------------------------------------+
//|                                                       |
//|                        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:


Erreurs. Pas de compilation.

 
Vladimir Karputov:

Erreurs. Il ne compile pas.


Désolé, essayez maintenant.

 
SILVERPRINT:

Désolé, essayez maintenant.


Probablement du jour au lendemain - donc je ne comprends pas du tout ce que vous essayez de faire.

Un conseil :

  • INITIALISER les variables lors de la déclaration
  • lors d'une division, divisez par un double, pas par un int (par exemple, le nombre 100,0 -> double, le nombre 100 -> int).
  • qu'est-ce que ce style if(1==1) - ? C'est monstrueux, ne l'écrivez jamais comme ça.
  • Enfin, le plus important, ne laissez que trois lignes dans votre code,

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

  • et déclarer et initialiser les variables de manière explicite. Par exemple, comme ceci :

   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:

Probablement du jour au lendemain - donc je ne comprends rien à ce que vous essayez de faire.

Un conseil :

  • lors de la déclaration des variables INITIALIZE
  • lors d'une division, divisez par un double, pas par un int (par exemple, le nombre 100,0 -> double, le nombre 100 -> int).
  • qu'est-ce que ce style if(1==1) - ? C'est monstrueux, ne l'écrivez jamais comme ça.
  • Enfin, le plus important, ne laissez que trois lignes dans votre code,

  • et déclarer et initialiser les variables de manière explicite. Par exemple, comme ceci :


Merci, c'est incroyablement utile.

 
Bizarrement, la fonction fonctionne même s'il y a plus d'ordres que zéro.
if(OrdersTotal()==0)

Cela ne fait pas une grandedifférence, mais lorsque la fonction ne fonctionne pas, elle peut ouvrir l'ensemble du dépôt.

 
SILVERPRINT:
Étrange mais la fonction, fonctionne même s'il y a plus de commandes que zéro.

Cela ne fait pas une grandedifférence, mais lorsque la fonction ne fonctionne pas, cela peut ouvrir tout le dépôt.

Ouvrez l'aide MT5 pour la fonction et assurez-vous que vous comprenez bien ce qu'est un ordre dans MT5.

 
J'ai appuyé et appuyé sur F1, je n'ai pas pu trouver...

Pouvez-vous me dire comment déterminer les _Digits pour un autre caractère ?