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

 
User_mt5:

Vladimir Karputov, e eu?)

Não posso dizer com certeza, mas tente 0,0


Acrescentado: Parece que não pode cancelar 'INDICATOR_MINIMUM' e 'INDICATOR_MAXIMUM' com MQL5.

 
Vladimir Karputov:

Não posso dizer com certeza, mas tente 0,0


Acrescentado: Parece que 'INDICATOR_MINIMUM' e 'INDICATOR_MAXIMUM' não podem ser cancelados pela MQL5.

Ai de mim...

Obrigado pela sua resposta.

(mesmo problema com os níveis, na verdade; mas resolvido através da definição do número de níveis)

 
User_mt5:

Ai de mim...

Obrigado pela resposta.

(O problema dos níveis é na realidade o mesmo; mas resolvido através da definição do número de níveis)

A experiência e tudo se resolverão.

 
User_mt5:


Comparei as propriedades que o gráfico guarda (usando o indicador'Stochastic Oscillator' como exemplo)



<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


Esta é claramente uma propriedade do tipo "bool", mas não há acesso a esta propriedade a partir da língua MQL5.

 
Vladimir Karputov:

Comparei as propriedades que o gráfico guarda (usando o indicador'Stochastic Oscillator' como exemplo)

É claramente uma propriedade do tipo "bool" mas não há acesso a esta propriedade a partir da língua da MQL5.

Sim, infelizmente.

Mais uma vez obrigado)

 

Há um problema. Usando a função (ver abaixo), podemos obter valores TakeProfit e StopLoss por ID de posição do histórico (ou seja, quando a posição já está fechada), esta função funciona em tempo real, mas no testador de estratégia, não consegue encontrar TakeProfit e StopLoss, porque não vê ordens históricas que definem paragens (importante, as paragens são definidas após a abertura da posição)

Pergunta: Como posso utilizar o Testador de Estratégia para descobrir o TP/Perda para uma posição fechada com base num bilhete?

#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);   
   }
}
 
Olá a todos!
Estou apenas a tentar programar EAs, e quero começar por escrever um colector de difusão estatística.
Quero dizer, o que gostaria que ele fizesse? No testador, uma EA começa e recolhe dados sobre o histórico de carrapatos durante um certo período de tempo, por exemplo, dez dias.
E depois gera os seguintes dados em ficheiro csv ou xlsx:
spread médio por um período de tempo: 00:00 - 09:00 no servidor, 09:00 - 18:00, 18:00 - 00:00 (para todos os dez dias), spread máximo para este tempo, spread mínimo e spread médio do par de moedas para todo o período de dez dias.
Estou realmente cansado de recolher estes dados manualmente.

Sei que há programas que o fazem eles próprios... Mas eu quero o meu, como treino.
Talvez os conhecedores respeitados me possam dizer por onde começar? E será mesmo possível escrever um programa deste tipo?

Obrigado antecipadamente a todos os que responderam e simpatizaram com um recém-chegado.
 

Olá a todos. Talvez alguém tenha um pedaço de código pronto. Há 2 parâmetros, depósito=3000 e lote 0,01, ou seja, com depósito 3000 lote será 0,01, agora estritamente a dobrar, ou seja, quando o depósito será 6000 lote será 0,02 a 9000 será 0,03 como fazê-lo?

 
Pavel Komarovsky:

Olá a todos. Talvez alguém tenha um pedaço de código pronto. Há 2 parâmetros, depósito=3000 e lote 0,01, ou seja, com depósito 3000 lote será 0,01, agora estritamente a dobrar, ou seja, quando o depósito será 6000 lote será 0,02 a 9000 será 0,03 como fazê-lo?

É mais ou menos assim:

//+------------------------------------------------------------------+
//|                                                     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;
     }
  }
//+------------------------------------------------------------------+

Resultado:

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
Arquivos anexados:
Script_1.mq5  3 kb
 

Boa altura,

Por favor, ajudem-me a encontrar um insecto... Copio valores de barras (BarsCount) do buffer do indicador no guião, depois faço um loop em torno dos valores, detecto um sinal e imprimo-os para Print(); parece ser simples, mas não é assim tão fácil... Recebo todos os sinais como eu queria, excepto o de atravessar a linha zero.

CROSSOVER_OR_REVERSE

Talvez o guião não o devesse fazer dessa forma? Anexei o código e uma imagem de ecrã do registo... Muito obrigado!

//+------------------------------------------------------------------+
//|                                                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);
        }
      
   
  }
//+------------------------------------------------------------------+
Arquivos anexados:
Question.png  150 kb
Razão: