Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 812

 

Como é que isso é possível? Não houve um problema com a matemática?

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;

Parece 1,05 *0,81/100 =0,008505

Dá-lhe 35% de paragem e 81% de lucro em vez de 0,81% e 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");

O método da biblioteca padrãoSellLimit&BuyLimit


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

Mostras de impressão:

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:

Como é que isto é possível? Não houve um problema com a matemática?

Parece 1,05 *0,81/100 =0,008505

Dá-lhe 35% de paragem e 81% de lucro em vez de 0,81% e 0,35%

O método da biblioteca padrãoSellLimit&BuyLimit


Mostras de impressão:

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



Reescrever o mesmo código, mas de modo a que TODAS as variáveis sejam declaradas. Vou ver que tipos de variáveis declara. E então a solução certa está perto.

 
Vladimir Karputov:

Reescrever o mesmo código, mas de modo a que TODAS as variáveis sejam declaradas. Vou ver que tipos de variáveis declara. E então estará a caminho da solução certa.


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


Erros. Não compilar.

 
Vladimir Karputov:

Erros. Não se compila.


Desculpe, experimente agora.

 
SILVERPRINT:

Desculpe, experimente agora.


Provavelmente da noite para o dia - por isso não compreendo de todo O QUE está a tentar fazer.

Uma palavra de conselho:

  • INICIALIZAR variáveis ao declarar
  • ao dividir, dividir pelo dobro, não por int (ex. número 100.0 -> duplo, número 100 -> int)
  • qual é este estilo se(1===1) - ? Isto é monstruoso, nunca o escreva desta forma.
  • Por último, o mais importante, deixe apenas três linhas no seu código,

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

  • e declarar e inicializar explicitamente as variáveis. Por exemplo, como este:

   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:

Provavelmente da noite para o dia - por isso não compreendo NADA o que está a tentar fazer.

Uma palavra de conselho:

  • ao declarar as variáveis INITIALIZE
  • ao dividir, dividir pelo dobro, não por int (ex. número 100.0 -> duplo, número 100 -> int)
  • qual é este estilo se(1===1) - ? Isto é monstruoso, nunca o escreva desta forma.
  • Por último, o mais importante, deixe apenas três linhas no seu código,

  • e declarar e inicializar explicitamente as variáveis. Por exemplo, como este:


Obrigado incrivelmente útil.

 
Estranhamente, a função funciona mesmo que haja mais encomendas do que zero.
if(OrdersTotal()==0)

Não faz muitadiferença, mas onde a função não funciona, pode abrir todo o depósito.

 
SILVERPRINT:
Estranho mas a função, funciona mesmo que haja mais encomendas do que zero.

Não faz muitadiferença, mas onde a função não funciona, pode abrir todo o depósito.

Abra a ajuda do MT5 para a função e certifique-se de que compreende correctamente o que é uma ordem no MT5

 
Pressionado e pressionado F1, não conseguiu encontrar...

Pode por favor dizer-me como determinar _Dígitos para outro personagem?