新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1154

 

MT4

这个项目是什么,它有什么作用,我在任何地方都找不到描述?

我如何在默认情况下禁用它?


 
void OnStart()
  {
string text="Hello man";
   string keystr="ABCDEFG";
   uchar src[],dst[],key[];
//--- подготовка ключа шифрования
   StringToCharArray(keystr,key);
//--- подготовка исходного массива src[]
   StringToCharArray(text,src);
//--- вывод исходных данных
   PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
//--- шифрование массива src[] методом DES с 56-битным ключом key[]
   int res=CryptEncode(CRYPT_AES256,src,key,dst);
//--- проверка результата шифрования
   if(res>0)
     {
      //--- вывод шифрованных данных
      PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
      //--- расшифровка данных массива dst[] методом DES с 56-битным ключом key[]
      res=CryptDecode(CRYPT_AES256,dst,key,src);
      //--- проверка результата
      if(res>0)
        {
         //--- вывод дешифрованных данных
         PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
        }
      else
         Print("Ошибка в CryptDecode. Код ошибки=",GetLastError());
     }
   else
      Print("Ошибка в CryptEncode. Код ошибки=",GetLastError());
  }
//+------------------------------------------------------------------+
string ArrayToHex(uchar &arr[],int count=-1)
  {
   string res="";
//--- проверка размера
   if(count<0 || count>ArraySize(arr))
      count=ArraySize(arr);
//--- преобразование в шестнадцатиричную строку
   for(int i=0; i<count; i++)
      res+=StringFormat("%.2X",arr[i]);
//---
   return(res);
  }

我试图运行手册中的加密例子,但我用 CRYPT_AES256 而不是CRYPT_DES 方法。结果在CryptEncode 方法后出现了错误4029

 
Dmitri Custurov:

我试图运行手册中的加密例子,但我用 CRYPT_AES256 而不是CRYPT_DES 方法。结果,在CryptEncode 方法之后出现了错误4029

弄明白了。他需要更小心的钥匙))。

 

你好!

我很笨,自己想不出来,请告知问题可能是什么,或者至少给我指出正确的方向。

不同的指标开始同步显示不同的历史片段。这种情况有时会发生,不是每天都有。

我以为原因是指标没有正确处理动态加载的历史。我尝试了所有与更新历史上的指标正确更新有关的方法,我不知道还应该做什么来防止这种情况。

Alpari经纪人。MT5 build 2363 from 13.03.2020.

截图首先显示的是 "失败 "的版本。

然后是手动更新后的正确版本。

//+------------------------------------------------------------------+
bool IsReadyForCalculate(const int rates_total,const int prev_calculated,const datetime &time[])
  {
   //--- подключение терминала и синхронизация данных
   if(TerminalInfoInteger(TERMINAL_CONNECTED))  
      if(!SymbolIsSynchronized(_Symbol) || 
         !SeriesInfoInteger(_Symbol,_Period,SERIES_SYNCHRONIZED))   return(false);
   //--- некорректное значение prev_calculated
   if(prev_calculated<0)                  return(false);
   //---
   if(prev_calculated==0)     prev_time = time[rates_total-1];
   //--- произошли изменения в данных, но prev_calculated не сброшен в 0
   //--- или изменение времени не соответствует одному бару
   if(  (rates_total!=prev_calculated+1 &&
         rates_total!=prev_calculated &&
         prev_calculated!=0) ||
        (time[rates_total-1]>prev_time &&
         time[rates_total-2]!=prev_time))
     {
      loc_prev_calculated = 0;    // чтобы индикатор не висел "голым" до следующей котировки, вычисляю индикатор из того, что есть
      return(true);
     }
   //--- корректный сценарий
   if(  (rates_total==prev_calculated   || rates_total==prev_calculated+1 || prev_calculated==0) &&
        (time[rates_total-1]==prev_time || time[rates_total-2]==prev_time))
     {
      loc_prev_calculated = prev_calculated;
      return(true);
     }
   //--- 
   return(false);       // верну false, пока не знаю, какие варианты ещё могут быть
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   if(!IsReadyForCalculate(rates_total,prev_calculated,time))     return(0);
//---
        // вызов функции зигзага
   
//--- return value of prev_calculated for next call
   prev_time = time[rates_total-1];
   return(rates_total);
  }
//+------------------------------------------------------------------+
附加的文件:
 

你好。

我在MQL5中遇到这个问题。我怎样才能强制OnChartEvent()函数 启动?是否有任何标准的方法来做?

为此,我使用ChartNavigate()函数并从OnChartEvent()中运行它。但它的工作不稳定--当有很多刻度线进来时,往往在调用ChartNavigate()后,OnChartEvent()由于某种原因而不能重新启动。我不明白它是如何连接的--ChartNavigate()和tick arrival rate,但它还是发生了。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
inwinterborn:

你好!

我很笨,自己想不出来,请告知问题可能是什么,或者至少给我指出正确的方向。


      loc_prev_calculated = 0;    // чтобы индикатор не висел "голым" до следующей котировки, вычисляю индикатор из того, что есть
      return(true);

也许我最近白加了这个......。

已删除
loc_prev_calculated 

取而代之的是...

      return(false);

观察。


请告诉我关于MT5附带的标准指标,它们是如何工作的?它们是否像我在上面的截图中那样翻转?

 

大家好!
我正在掌握双OnTester()函数和TesterStatistics( )函数。我在MT4中为我的测试器写了一个简单的代码,每天在10:00、16:00、20:00和01:00开一个订单。在测试结束时,TesterStatistics( )函数 返回最小的余额值(即相对缩水)。

问题

TesterStatistics( )返回所有未结订单的最小余额值。

问题

我如何使用语言结构使TesterStatistics() 返回在某个特定时间开仓的订单 的最小余额值,例如在16:00。在这一点上,代码中指定的所有订单应同时进行测试。这意味着,TesterStatistics应该只跟踪16:00开出的一个订单的余额动态,在测试结束时,只显示16:00开出的订单的最低余额值。

如果你能在我的代码中插入所需的语言结构,我将非常感激。这将使我能够迅速了解我的问题的解决算法。
以下是我的代码。

int H;
double  TesterStatistics( );
void OnTick()
{
if (H!=Hour( ))
if (Hour( )==10||Hour( )==16||Hour( )==20||Hour( )==1)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+400*Point,Ask-200*Point,"C2",123 );
H=Hour( );
}
}
double OnTester()
{
TesterStatistics( STAT_BALANCEMIN  );
Print("-----------TesterStatistics( STAT_BALANCEMIN  )--------------",TesterStatistics( STAT_BALANCEMIN  )); 
}
 
ANDREY:

大家好!
我已经掌握了双OnTester()和TesterStatistics()。我为我的MT4测试器写了一个简单的代码,每天在10:00、16:00、20:00和01:00开一个订单。在测试结束时,函数TesterStatistics返回最小的余额值(即相对缩减)。

问题

TesterStatistics( )返回所有未结订单的最低余额值。

问题

可以用什么语言结构使TesterStatistics() 返回在某个特定时间开仓的订单 的最小余额值,例如在16:00。在这一点上,代码中指定的所有订单应同时进行测试。也就是说,TesterStatistics( )应该只跟踪16:00开的一个订单的余额动态,在测试结束时,只返回16:00开的订单的余额最小值。

如果你能在我的代码中插入所需语言,我将非常感激。这将使我能够非常迅速地了解解决我的问题的算法。
以下是我的代码。

int H;
double  TesterStatistics( );
void OnTick()

它是什么?

 
 Сергей Таболин
:

这就是它吗?

谢谢你的反馈。谢谢你,我意识到,指定TesterStatistics(); 函数与全局变量 H的声明一起...。是我的错误。我把它修好了。

int H;
//double  TesterStatistics( );
void OnTick()
{
if (H!=Hour( ))
if (Hour( )==10||Hour( )==16||Hour( )==20||Hour( )==1)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+400*Point,Ask-200*Point,"C2",123 );
H=Hour( );
}
}
double OnTester()
{
TesterStatistics( STAT_BALANCEMIN  );
Print("-----------TesterStatistics( STAT_BALANCEMIN  )--------------",TesterStatistics( STAT_BALANCEMIN  )); 
}
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
早晨好!如何实现在图表上显示高低杠数据?并且要突出相同的颜色。
原因: