Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1441

 

Buongiorno e buon umore!

Tenendo conto delle critiche costruttive, ho modificato il codice della funzione Check:

bool Check_Trading()
  {
//--- проверка разрешения автоматической торговли на терминале
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения автоматической торговли на терминале! ",GetLastError());
      return(false);
     }
//--- проверка разрешения автоматической торговли на стороне сервера
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения автоматической торговли на стороне сервера! ",GetLastError());
      return(false);
     }
//--- проверка синхронизированности данных по текущему символу между терминалом и сервером
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизированности данных по текущему символу! ",GetLastError());
      return(false);
     }
//--- проверка достаточности средств для торговли
   if(!CheckMoneyForTrade(_Symbol,GetLot(),ORDER_TYPE_SELL))
     {
      Print("Ошибка проверки достаточности средств для торговли! ",GetLastError());
      return(false);
     }
//--- проверки корректности объёма сделки
   string descript;
   if(!CheckVolumeValue(GetLot(),descript))
     {
      Print("Ошибка проверки корректности объёма сделки! ",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Le funzioni CheckMoneyForTrade() e CheckVolumeValue() non sono state postate, in quanto liberamente disponibili e prese da qui.

Questo minimo sarà sufficiente per evitare il problema con l'Expert Advisor che ho avuto l'altro ieri?

Saluti, Vladimir.

 
MrBrooklin #:

Buongiorno e buon umore a tutti!

Tenendo conto delle critiche costruttive, ho modificato il codice della funzione di controllo:

Le funzioni CheckMoneyForTrade() e CheckVolumeValue() non sono state pubblicate, in quanto liberamente disponibili e prese da qui.

Sarà sufficiente questo minimo per evitare il problema con l'Expert Advisor che ho avuto l'altro ieri?

Saluti, Vladimir.

Sì, sembra normale, ma è meglio controllare il volume e la sufficienza in un'unica funzione e cambiare la logica sulla sufficienza. Controlliamo se il lotto di margine è più grande o più piccolo, ma non lo riduciamo, se il lotto richiesto è più piccolo, calcolo anche il lotto in relazione al margine disponibile, quale lotto può essere impostato, e lo confronto con il lotto minimo, e se è più piccolo, allora l'operazione è definitivamente conclusa.

 

Buona giornata a tutti! Ho un indicatore Stocastico RSI. Il problema è che funziona molto lentamente. Per quanto ho capito il "freno" principale crea questa sezione a causa del grande periodo, che viene utilizzato per cercare il minimo e il massimo negli array:

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

Idealmente, la soluzione potrebbe essere quella di far passare l'indicatore attraverso tutte le barre della storia durante la prima esecuzione, e di aggiornare solo l'ultima barra durante le successive. Ma non capisco come fare. È possibile farlo? Se sì, vi sarò grato se condividerete un link o un consiglio su come farlo.

Ecco il codice completo dell'indicatore:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
 
Valeriy Yastremskiy #:

Penso che vada bene, ma è meglio mettere il controllo del volume e della sufficienza in un'unica funzione e cambiare anche la logica per la sufficienza. Controlliamo se il lotto di margine è maggiore o minore, ma non lo riduciamo, se il lotto richiesto è minore, calcolo anche il lotto relativo al margine disponibile, quale lotto può essere impostato, e lo confronto con il lotto minimo, e se è minore, allora l'operazione è definitivamente conclusa.

Grazie, Valery!

Saluti, Vladimir.

 

Ed ecco i primi risultati della funzione:

2023.02.02 14:41:05.466 Experts automated trading is disabled because the account has been changed
2023.02.02 14:41:09.990 Experts automated trading is enabled
2023.02.02 14:42:43.410 Experts automated trading is disabled because the account has been changed
2023.02.02 14:42:52.690 Experts automated trading is enabled
2023.02.02 14:43:33.882 Experts automated trading is disabled because the account has been changed
2023.02.02 14:43:44.869 Experts automated trading is enabled

Sarebbe interessante sapere di cosa si tratta? Non nel senso della traduzione in russo, perché l'ho già tradotta:

2023.02.02 14:41:05.466 Автоматическая торговля экспертов отключена, так как аккаунт был изменен

ma nel senso di come si può cambiare un account? Qualcuno può dirmi cosa diavolo sta succedendo al mio account e cosa fare in questi casi?

Forse è in qualche modo collegato al fatto che sono passato temporaneamente dal conto reale a quello demo?

Saluti, Vladimir.

 
Salve, è possibile implementare o esiste una soluzione pronta per allungare i grafici in verticale senza limiti come in tradingview?
 
MrBrooklin #:

Forse è in qualche modo collegato al fatto che sono passato temporaneamente dal conto reale a quello demo?

 
Sergey Gridnev #:

Grazie, Sergey, ora lo saprò.

Saluti, Vladimir.

 
L'Expert Advisor utilizza un indicatore sul TF specificato, come posso scoprire il TF dall'handle dell'indicatore?
 
Aleksey Vyazmikin #:
L'Expert Advisor utilizza un indicatore sul TF specificato, come posso scoprire il TF dall'handle dell'indicatore?

Non capisco, il TF specificato dovrebbe essere noto. È necessario spiegare meglio la situazione.