Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1478

 
MrBrooklin #:

Cosa non capisci esattamente? Come creare una funzione di inizializzazione di un EA? Allora provate a studiare questo articolo per principianti.

Saluti, Vladimir.

e cosa significa inizializzare))))) non è chiaro per una persona)))))

 
Valeriy Yastremskiy #:

e cosa si intende per inizializzazione))))) è poco chiaro per la persona)))))

Buona sera, Valery! Apriamo l'articolo proposto alla persona e vi troviamo prima una breve descrizione:

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

e poi una più dettagliata:

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

In generale, dovrebbe almeno leggere prima questo articolo. ))

Saluti, Vladimir.

 

Buongiorno a tutti!

Sto continuando il mio autoapprendimento e ho riscontrato ancora una volta una confusione. Ecco il codice dello script:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

Lo script doveva disegnare una linea di tendenza come segmento. Per farlo, ho impostato il punto iniziale e il secondo punto per disegnare questo segmento. La documentazione dice anche che sono necessari due punti di ancoraggio per creare una linea di tendenza. Credo di aver fatto tutto come si deve. A mio avviso, anche il secondo punto è un punto estremo, ma per qualche motivo non viene disegnato un segmento, bensì una semiretta.


Potreste dirmi dove mi sbaglio?

Saluti, Vladimir.

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

Grazie, Artyom! Non avevo abbastanza intelligenza per capire una cosa così semplice e ovvia. Dio ti benedica!

Saluti, Vladimir.

 

Buongiorno e buon umore a tutti!

Ecco! "Sto arrivando, il tuo tetto!". Questo sono io. Eseguo il copione:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

e ottengo questo:

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

e dovrebbero esserci due posizioni corte. Potreste dirmi dove ho commesso un errore?

Saluti, Vladimir.

 
MrBrooklin #:

Buongiorno e buon umore a tutti!

Ecco! "Sto arrivando, il tuo tetto!". Sono io. Sto eseguendo il copione:

e ottengo questo:

e dovrebbero esserci due posizioni corte. Potreste dirmi dove ho commesso un errore?

Saluti, Vladimir.

Le ultime due stampe

riportano il valore delle variabili

uint count_buy=0, count_sell=0;

che sono inizializzate, ma a cui non è stato assegnato nulla.
Cioè tutto funziona come scritto - nessun miracolo.

 
Alexander Sevastyanov #:

Le ultime due stampe

forniscono il valore delle variabili

che sono inizializzate, ma a cui non è stato assegnato nulla.
Cioè tutto funziona come scritto, senza miracoli.

Ciao, Alexander. È proprio qui che sono rimasto perplesso. Cosa dovrebbe essere assegnato? Penso che la funzione Calc_Pos(count_buy, countsell) dovrebbe funzionare, o ho capito male?

Saluti, Vladimir.

 
MrBrooklin #:

Ciao, Alexander. È qui che sono rimasto perplesso. Cosa dovrebbe essere assegnato? Credo che la funzione Calc_Pos(count_buy, countsell) dovrebbe funzionare, o ho capito male?

Saluti, Vladimir.

1. Si dichiarano e si inizializzano due variabili.

uint count_buy=0, count_sell=0;

2. Si passano i loro valori alla funzione.

Calc_Pos(count_buy,count_sell);

Non è del tutto chiaro il motivo di questa operazione.
Poi si stampano i valori di queste variabili. Ma non sono stati modificati da nessuna parte,
rispettivamente, e vengono stampati degli zeri. Tutto funziona come scritto.

P.S. Cercando di capire il vostro piano: potete dichiarare queste due variabili globali.
Per esempio, in questo modo:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1. Si dichiarano e si inizializzano due variabili.

2. Si passano i loro valori alla funzione.

Non è del tutto chiaro il motivo di questa operazione.
Quindi vengono stampati i valori di queste variabili. Ma non sono stati modificati da nessuna parte,
rispettivamente e vengono stampati con degli zeri. Tutto funziona come scritto.

P.S. Cercando di capire il vostro piano: potete dichiarare queste due variabili globali.
Per esempio, in questo modo:

Grazie mille, Alexander. La tua correzione ha fatto funzionare il codice. Ad essere onesti, mi sono reso conto che anch'io ero confuso in tre pini. Devo studiare di nuovo il passaggio di argomenti a una funzione. A quanto pare, ho frainteso completamente.

Saluti, Vladimir.