Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1302

 
User_mt5:

Vladimir Karputov, e io?)

Non posso dirlo con certezza, ma prova 0.0


Aggiunto: Sembra che non si possa cancellare 'INDICATOR_MINIMUM' e 'INDICATOR_MAXIMUM' con MQL5.

 
Vladimir Karputov:

Non posso dirlo con certezza, ma prova 0.0


Aggiunto: Sembra che 'INDICATOR_MINIMUM' e 'INDICATOR_MAXIMUM' non possano essere cancellati da MQL5.

Ahimè...

Grazie per la vostra risposta.

(stesso problema con i livelli, in realtà; ma risolto impostando il numero di livelli)

 
User_mt5:

Ahimè...

Grazie per la risposta.

(Il problema con i livelli è in realtà lo stesso; ma si risolve impostando il numero di livelli)

Sperimentate e tutto si risolverà.

 
User_mt5:


Ho confrontato le proprietà che il grafico salva (usando l'indicatore'Stochastic Oscillator' come esempio)



<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


Questa è chiaramente una proprietà di tipo 'bool', ma non c'è accesso a questa proprietà dal linguaggio MQL5.

 
Vladimir Karputov:

Ho confrontato le proprietà che il grafico salva (usando l'indicatore'Stochastic Oscillator' come esempio)

È chiaramente una proprietà di tipo 'bool' ma non c'è accesso a questa proprietà da MQL5.

Sì, ahimè.

Grazie ancora)

 

C'è un problema. Usando la funzione (vedi sotto), possiamo ottenere i valori di TakeProfit e StopLoss per ID di posizione dallo storico (cioè quando la posizione è già chiusa), questa funzione funziona in tempo reale, ma nel tester della strategia, non può trovare TakeProfit e StopLoss, perché non vede gli ordini storici che impostano stop (importante, gli stop sono impostati dopo l'apertura della posizione)

Domanda: Come posso usare lo Strategy Tester per trovare il TP/Loss per una posizione chiusa basata su un ticket?

#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);   
   }
}
 
Ciao a tutti!
Sto cercando di programmare EAs, e voglio iniziare scrivendo uno spread collector statistico.
Voglio dire, cosa vorrei che facesse? Nel tester, un EA si avvia e raccoglie dati sulla storia dei tick per un certo periodo di tempo, ad esempio dieci giorni.
E poi genera i seguenti dati in file csv o xlsx:
Spread medio per un periodo di tempo: 00:00 - 09:00 sul server, 09:00 - 18:00, 18:00 - 00:00 (per tutti i dieci giorni), spread massimo per questo tempo, spread minimo e spread medio della coppia di valute per l'intero periodo di dieci giorni.
Sono davvero stanco di raccogliere questi dati manualmente.

So che ci sono programmi che lo fanno da soli... Ma voglio il mio, come allenamento.
Forse gli intenditori rispettati possono dirmi da dove cominciare? Ed è possibile scrivere un programma del genere?

Grazie in anticipo a tutti coloro che hanno risposto e sono stati comprensivi con un nuovo arrivato.
 

Ciao a tutti. Forse qualcuno ha un pezzo di codice pronto. Ci sono 2 parametri, deposito=3000 e lotto 0.01 cioè con deposito 3000 il lotto sarà 0.01, ora rigorosamente al raddoppio cioè quando depo sarà 6000 il lotto sarà 0.02 a 9000 sarà 0.03 come fare?

 
Pavel Komarovsky:

Ciao a tutti. Forse qualcuno ha un pezzo di codice pronto. Ci sono 2 parametri, deposito=3000 e lotto 0.01 cioè con deposito 3000 il lotto sarà 0.01, ora rigorosamente al raddoppio cioè quando depo sarà 6000 il lotto sarà 0.02 a 9000 sarà 0.03 come fare?

È più o meno così:

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

Risultato:

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

Buon pomeriggio,

Per favore aiutatemi a trovare un bug... Copio i valori delle barre (BarsCount) dal buffer dell'indicatore nello script, poi faccio un loop dei valori, rilevo un segnale e li stampo a Print(); sembra semplice, ma non è così facile... Ricevo tutti i segnali come volevo, tranne che per l'attraversamento della linea dello zero.

CROSSOVER_OR_REVERSE

Forse lo script non dovrebbe fare così? Ho allegato il codice e uno screenshot del log... Grazie mille!

//+------------------------------------------------------------------+
//|                                                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);
        }
      
   
  }
//+------------------------------------------------------------------+
File:
Question.png  150 kb
Motivazione: