Ошибки, баги, вопросы - страница 2101

 
damirqa:

Здравствуйте! Начал изучать MQL5 с https://www.mql5.com/ru/articles/100. Запустил код, получил ошибку 4756, посмотрел в документации - легче не стало. Ладно, подумал, что начну с простого (Alert/Print...). Одна из важнейших функций это OrderSend. Начал искать по форуму\документации как использовать OrderSend. Наткнулся на эту статью https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions, там увидел код на открытие позиции Buy. Получил ошибку 4756 и retcode 10030. 10030 - понял, что это свойство OrderSend, но не понял как нужно использовать это свойство (смотрел чужой код), а самое главное для чего нужно. Тогда открыл https://www.mql5.com/ru/docs/trading/ordersend, скопировал код, запустил, все отлично, заработало.
Но так и не понял, почему появляется ошибка 4756 и как от нее нужно избавляться, а также 10030. 

Посмотрел код между 

и этим

Они по-моему практически идентичны, не вижу тех мест, в которых появляются эти ошибки (4756 и 10030). Ткните пальцем и объясните пожалуйста

Не заполнено одно поле структуры. И deviation маловато будет, но это не такая-уж и ошибка.

Instant Execution

Торговый ордер на открытие позиции в режиме Instant Execution (режим торговли по потоковым ценам). Требуется указание 9 полей:

  • action
  • symbol
  • volume
  • price
  • sl
  • tp
  • deviation
  • type
  • type_filling

Можно также задать значения полей magic и comment.

Market Execution

Торговый ордер на открытие позиции в режиме Market Execution (режим исполнения торговых приказов по рынку). Требуется указание 5 полей:

  • action
  • symbol
  • volume
  • type
  • type_filling

Можно также задать значения полей magic и comment.


 

что за обновление прилетело, 1736, что в нем есть, где почитать?

 

Предлагаю дать возможность определять программно какой буфер индикатора рисует на графике.

Предположим трейдер запустил свои индикаторы, мы не знаем сколько используется буферов для расчета а сколько для отрисовки индикатора на графике

Обратившись к пользовательским индикаторам через 

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );


Мы так же могли бы запросить массив рисующих буферов 

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора

   int & IndicatorVisualBuffer[] // номера рисующих буферов...   );


Это расширит возможность по работе с неизвестными индикаторами установленными на графике..

 
Vladimir Pastushak:

Предлагаю дать возможность определять программно какой буфер индикатора рисует на графике.

Предположим трейдер запустил свои индикаторы, мы не знаем сколько используется буферов для расчета а сколько для отрисовки индикатора на графике

Обратившись к индикатору через 

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );


Мы так же могли бы запросить масси рисующих буферов 

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора

   int & IndicatorVisualBuffer[] // номера рисующих буферов...   );


Это расширит возможность по работе с неизвестными индикаторами установленными на графике..

А что возвращает

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

и какой прок будет от добавления? Вы предлагаете добавить входящий параметр и получить в ответ тот-же самый хендл индикатора...

И если не затруднит, для каких целей появилась такая необходимость? Вопрос без иронии. Ведь если что-то предлагается, то надо, на мой взгляд, привести убедительные доводы в необходимости предложенного.

 
Alexey Viktorov:

А что возвращает

и какой прок будет от добавления? Вы предлагаете добавить входящий параметр и получить в ответ тот-же самый хендл индикатора...

И если не затруднит, для каких целей появилась такая необходимость? Вопрос без иронии. Ведь если что-то предлагается, то надо, на мой взгляд, привести убедительные доводы в необходимости предложенного.


Пользователь ставит любой индикатор.

Советник автоматически его находит и для получения сигнала берет данные буферов.


Что бы сейчас такое реализовать надо брать iCustom  и если список параметров мы еще как то можем прописать то вот с буферами проблема....

Можно программно серез Copy посчитать количество буферов, но вот понять какой из них рисует программно не возможно ...

 
Vladimir Pastushak:

Пользователь ставит любой индикатор.

Советник автоматически его находит и для получения сигнала берет данные буферов.


Что бы сейчас такое реализовать надо брать iCustom  и если список параметров мы еще как то можем прописать то вот с буферами проблема....

Можно программно серез Copy посчитать количество буферов, но вот понять какой из них рисует программно не возможно ...

Почему невозможно? Разве буфер INDICATOR_CALCULATIONS можно достать через iCustom()?

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

 
Alexey Viktorov:

Почему невозможно? Разве буфер INDICATOR_CALCULATIONS можно достать через iCustom()?

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


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

 

Вот с такой проблемой столкнулся:

Решил использовать в качестве magic остаток от деления идентификатора чарта на 1000 или 10000, в общем-то не важно.

Но почему-то при разных ChartID() остаток от деления вдруг получается одинаковый. Вопрос: почему?

Проверочный скрипт

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

Результат

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

Ожидалось увидеть 74907 и 74908 соответственно, ведь остаток от деления именно такой должен быть.


И ещё хотелось-бы услышать ответ на этот вопрос

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alexey Viktorov, 2018.01.09 14:21

В тестере МТ5 объект "Поле ввода" OBJ_EDIT не позволяет редактировать значение в нём находящееся. Это так задумано или это баг?

В терминалах и тестере МТ4 редактируется, а вот в тестере МТ5 не хочет, вообще пропадает значение введённое в него программно при создании объекта.


 
Alexey Viktorov:

Но почему-то при разных ChartID() остаток от деления вдруг получается одинаковый. Вопрос: почему?

Потому что входные fmod - double. double не может хранить огромное количество целых чисел. Например, Ваш случай:

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

Делайте так

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


На примере float можно быстро понять особенность double

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


Результат

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


ЗЫ double не теряет инфу всего int-диапазона, с long уже не так.

 
fxsaber:

Потому что входные fmod - double. double не может хранить огромное количество целых чисел. Например, Ваш случай:

Делайте так

Конечно сейчас проверю предложенный вариант, но у меня был и такой проверочный код

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

результат

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

Это говорит о том, что усечения значения не должно происходить.


Но вот проверил такой вариант, чуток изменив предложенный

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

и получил ожидаемый вариант

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

Появляется другой вопрос,

Если MathMod равно как и fmod возвращает вещественный остаток от деления двух чисел. И % согласно документации

Остаток от деления                      minutes = time % 60;


то почему разница?