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

 

Bom dia e bom humor!

Levando em conta as críticas construtivas, alterei o código da função de verificação:

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);
  }

As funções CheckMoneyForTrade() e CheckVolumeValue() não foram postadas, pois estão disponíveis gratuitamente e foram retiradas daqui.

Esse mínimo será suficiente para evitar o problema com o Expert Advisor que tive anteontem?

Atenciosamente, Vladimir.

 
MrBrooklin #:

Bom dia e bom humor a todos!

Levando em conta as críticas construtivas, alterei o código da função de verificação:

As funções CheckMoneyForTrade() e CheckVolumeValue() não foram publicadas, pois estão disponíveis gratuitamente e foram retiradas daqui.

Esse mínimo será suficiente para evitar o problema com o Expert Advisor que tive anteontem?

Atenciosamente, Vladimir.

Sim, parece ser normal, mas é melhor verificar o volume e a suficiência em uma função e alterar a lógica da suficiência. Verificamos se o lote de margem é maior ou menor, mas não o reduzimos; se o lote solicitado for menor, eu também calculo o lote em relação à margem disponível, qual lote pode ser definido e o comparo com o lote mínimo e, se for menor, a negociação está definitivamente encerrada.

 

Bom dia a todos! Tenho um indicador RSI estocástico. O problema é que ele funciona muito lentamente. Pelo que entendi, o principal "freio" cria essa seção por causa do período grande, que é usado para pesquisar o mínimo e o máximo nas matrizes:

   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, a solução poderia ser se o indicador percorresse todas as barras do histórico durante a primeira execução e atualizasse apenas a última barra durante as próximas. Mas não entendo como fazer isso. É possível fazer isso? Em caso afirmativo, ficarei grato se você compartilhar um link ou uma orientação sobre como fazer isso.

Aqui está o código completo do indicador:

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 #:

Acho que está bom, mas é melhor colocar a verificação de volume e suficiência em uma função e alterar a lógica para suficiência também. Verificamos se o lote de margem é maior ou menor, mas não o reduzimos; se o lote solicitado for menor, eu também calculo o lote em relação à margem disponível, qual lote pode ser definido, e o comparo com o lote mínimo e, se for menor, então a negociação está definitivamente encerrada.

Obrigado, Valery!

Saudações, Vladimir.

 

E aqui estão os primeiros resultados da função:

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

Seria interessante saber o que é isso? Não no sentido de tradução para o russo, pois eu já a traduzi:

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

mas no sentido de como uma conta pode ser alterada? Alguém pode me dizer o que diabos está acontecendo com minha conta e o que fazer nesses casos?

Talvez isso esteja de alguma forma relacionado ao fato de eu ter mudado temporariamente da conta real para a conta de demonstração?

Atenciosamente, Vladimir.

 
Saudações, é possível implementar ou existe uma solução pronta para esticar os gráficos verticalmente sem limites, como no tradingview?
 
MrBrooklin #:

Talvez isso esteja de alguma forma relacionado ao fato de eu ter mudado temporariamente da conta real para a conta de demonstração?

Sim
 
Sergey Gridnev #:
Sim

Obrigado, Sergey, agora eu sei.

Saudações, Vladimir.

 
O Expert Advisor usa um indicador no TF especificado. Como posso descobrir o TF a partir do identificador do indicador?
 
Aleksey Vyazmikin #:
O Expert Advisor usa um indicador no TF especificado, como posso descobrir o TF a partir do identificador do indicador?

Não estou entendendo, o TF especificado deve ser conhecido. Você precisa explicar melhor a situação.

Razão: