初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1441

 

早上好,心情不错!

考虑到建设性的批评意见,我修改了检查函数的代码:

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

CheckMoneyForTrade()和CheckVolumeValue()函数没有发布,因为它们可以从这里 免费获取。

这个最小值是否足以避免我前天遇到的 Expert Advisor 问题

敬上,弗拉基米尔。

 
MrBrooklin #:

大家早上好,心情不错!

考虑到建设性的批评意见,我修改了检查功能的代码:

CheckMoneyForTrade() 和 CheckVolumeValue() 函数没有发布,因为它们可以从这里 免费获取。

这个最小值是否足以避免我前天遇到的 Expert Advisor 问题

敬上,弗拉基米尔。

是的,这似乎是正常的,但最好在一个函数中检查交易量和充足性,并更改充足性逻辑。如果要求的手数较小,我也会根据可用保证金计算手数,即可以设置多少手数,然后与最小手数进行比较,如果较小,则交易肯定结束。

 

大家好!我有一个指标 Stochastic 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;   

理想的解决方案是,指标在第一次运行时浏览历史上的所有柱状图,在下一次运行时只更新最后一个柱状图。但我不知道该怎么做。有可能做到吗?如果可以,请提供相关链接或建议。

以下是该指标的全部代码:

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

我认为这样很好,但最好将交易量和充足性检查放在一个函数中,并改变充足性的逻辑。我们会检查保证金手数是多是少,但不会减少,如果要求的手数较少,我也会计算相对于可用保证金的手数,即可以设置多少手数,并与最小手数进行比较,如果少于最小手数,则交易肯定结束。

谢谢您,瓦列里!

弗拉基米尔

 

这是函数的第一批结果:

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

您有兴趣知道它是什么吗?不是翻译成俄语,因为我已经翻译过了:

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

而是如何更改账户?有谁能告诉我,我的账户到底出了什么问题,在这种情况下该怎么办?

也许这与我临时从真实账户转到模拟账户有关?

敬上,弗拉基米尔。

 
您好,是否有可能或有现成的解决方案可以像 tradingview 一样无限制地垂直拉伸图表?
 
MrBrooklin #:

也许这与我临时从真实账户转到模拟账户有关?

是的
 
Sergey Gridnev #:
是的

谢谢你,谢尔盖,现在我知道了。

再见,弗拉基米尔。

 
Expert Advisor 在指定的 TF 上使用一个指标,我如何从指标句柄中找出 TF?
 
Aleksey Vyazmikin #:
Expert Advisor 在指定的 TF 上使用一个指标,我怎样才能从指标句柄中找出 TF?

我不明白,指定的 TF 应该是已知的。您需要详细说明情况。