Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1154

 

МТ4

Что это за пункт и что он делает, нигде не нашёл описание?

Как его отключить по-умолчанию?


 
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_DES использую  CRYPT_AES256. В итоге ошибка 4029 после метода CryptEncode

 
Dmitri Custurov:

Пытаюсь запустить пример из мануала с криптованием, только вместо метода CRYPT_DES использую  CRYPT_AES256. В итоге ошибка 4029 после метода CryptEncode

Разобрался. Ключ ему нужен позабористее ))

 

Здравствуйте!

Я туплю и не могу сам разобраться, пожалуйста подскажите в чём может быть проблема или хотя бы направление укажите.

 

Разные индикаторы синхронно начинают показывать другой кусок истории. Происходит это эпизодически, не каждый день.

Думал причина в том, что индикаторы некорректно обрабатывают динамически подгружаемую историю. Вроде, всё перепробовал, что касается корректного обновления индикатора на обновляющейся истории, уже больше не знаю, что ещё надо сделать, чтобы такого не было.

Брокер Альпари. MT5 билд 2363 от 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(). Но это работает нестабильно - когда поступает очень много тиков, часто OnChartEvent() почему-то повторно не запускается после вызова ChartNavigate(). Я не могу понять как это взаимосвязано - работа ChartNavigate() и частота поступления тиков, но тем не менее это происходит.

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

Здравствуйте!

Я туплю и не могу сам разобраться, пожалуйста подскажите в чём может быть проблема или хотя бы направление укажите.


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

Может я зря это недавно добавил...

Убрал
loc_prev_calculated 

Заменил на

      return(false);

Понаблюдаю.


А про стандартные индикаторы, которые идут с MT5 скажите пож-та, как у вас работают. Слетают ли как у меня в скриншотах выше?

 

Всем доброго времени суток!
Я осваиваю функцию  double OnTester() и функцию  TesterStatistics(   ). Написал простой код для Тестера в МТ4 , который каждый день открывает по одному ордеру в 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:

Всем доброго времени суток!
Я осваиваю функцию  double OnTester() и функцию  TesterStatistics(   ). Написал простой код для Тестера в МТ4 , который каждый день открывает по одному ордеру в 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( ); вместе с объявлением глобальной переменной  Н ... было моей ошибкой. Ошибку исправил.

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
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Доброго времени! Каким образом можно реализовать на графике отображение данных хай и Лоу бара. И выделение цветом одинаковых.???
Причина обращения: