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

 

Существует ли внутреннее ограничение на длину строки (тип string), или сколько свободной памяти есть, столько в строку и запихнётся?

// Вопрос возник в связи с написанием программ для OpenCL

Прошу также отразить правильный ответ в документации.  А то в хелпе ни намёка.

 
MetaDriver:

Существует ли внутреннее ограничение на длину строки (тип string), или сколько свободной памяти есть, столько в строку и запихнётся?

// Вопрос возник в связи с написанием программ для OpenCL

Прошу также отразить правильный ответ в документации.  А то в хелпе ни намёка.

Без символа перевода строки "\r\n" что то чуток меньше 32768, грубо говоря 32000 символов точно влазит,

а с переводом строки пока памяти хватит, я по крайней мере в стринг пихал по 2 000 000, дальше рука пихать устала :)

 
Urain:

Без символа перевода строки "\r\n" что то чуток меньше 32768, грубо говоря 32000 символов точно влазит,

а с переводом строки пока памяти хватит, я по крайней мере в стринг пихал по 2 000 000, дальше рука пихать устала :)

Ой спасибо, порадовал!  Два ляма мне на первое время хватит.

// Только озадачился: а причем  тут в попу перевод строки? Он ведь просто символ, не хуже/лучше других.

// Не, я тебе верю, просто я обычно понимаю чего как устроено, а тут как-то странно всё и удивительно..

// Ты чем измерял?  Не функцией записи в файл случаем?

:)

 
MetaDriver:

Ой спасибо, порадовал!  Два ляма мне на первое время хватит.

// Только озадачился: а причем  тут в попу перевод строки? Он ведь просто символ, не хуже/лучше других.

// Не, я тебе верю, просто я обычно понимаю чего как устроено, а тут как-то странно всё и удивительно..

// Ты чем измерял?  Не функцией записи в файл случаем?

:)

Скорее всего это внутреннее представление стригна, после \r\n наверняка идёт выделение нового (дополнительного) массива для хранения информации.

Точнее не знаю, поспрашай у MQ.

ЗЫ ну конечно для контроля сбрасывал в файл, но с начало строка формировалась, проверялась её длинна через Len, ну короче щас уже не вспомню, давно это было но всё было чин чином.

ЗЗЫ И считывание проверял по 10 символов из сохранённого стринга, без перевода больше ~32700 не пишет в переменную.

 
Urain:

Скорее всего это внутреннее представление стригна, после \r\n наверняка идёт выделение нового (дополнительного) массива для хранения информации.

Точнее не знаю, поспрашай у MQ.

ЗЫ ну конечно для контроля сбрасывал в файл, но с начало строка формировалась, проверялась её длинна через Len, ну короче щас уже не вспомню, давно это было но всё было чин чином.

ЗЗЫ И считывание проверял по 10 символов из сохранённого стринга, без перевода больше ~32700 не пишет в переменную.

Ладно, спасибо, Николай.  И, кстати, С Днём Варенья To You..!.  С Днём Варенья To You...!  



--

А что скажет товарищ stringo?

 
Максимальная длина строки 1073741816 символа, но под такое количество символов в x86 (32 бита) не хватит памяти.
 
Valmars:
Надо только вовремя синхронизировать время компьютера, иначе тоже можем потерять сделки.

Всё, дошло до меня. Неправильно Вас понял тогда. )) Чтобы всегда правильно получать всю историю, синхронизацию можно делать так:

//+------------------------------------------------------------------+
//| МАКСИМАЛЬНОЕ_ВРЕМЯ                                               |
//+------------------------------------------------------------------+
datetime ChoiceTimeFunction()
  {
   datetime synchro=NULL;
//---
   synchro=(datetime)fmax((double)TimeTradeServer(),(double)TimeLocal());
//---
   if(!MQL5InfoInteger(MQL5_TESTING) || !MQL5InfoInteger(MQL5_OPTIMIZATION) || !MQL5InfoInteger(MQL5_VISUAL_MODE))
     {
      Print("synchro_time: ",synchro,"; TimeTradeServer(): ",TimeTradeServer(),"; TimeLocal(): ",TimeLocal()); return(synchro);
     }
//---
   synchro=TimeCurrent()+Milliseconds_Ahead;
//---
   Print("synchro_time tm+ml_ahead: ",synchro,"; TimeCurrent(): ",TimeCurrent(),"; Milliseconds_Ahead: ",Milliseconds_Ahead); return(synchro);
  }
Для тестера пока только костыль остаётся и то не для всех случаев. Ждём пока исправят.
 
tol64:

Всё, дошло до меня. Неправильно Вас понял тогда. )) Чтобы всегда правильно получать всю историю, синхронизацию можно делать так:

Для тестера пока только костыль остаётся и то не для всех случаев. Ждём пока исправят.

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

По закрытию рынка (окончанию торгов) на данном сервере никакие срабатывания стопов не должны происходить до следующего открытия рынка на новой неделе. В вашем случае, похоже, это не так. Котировки уже перестали поступать в терминал, а на сервере они всё ещё обрабатываются, и срабатывают установленные стопы. В некоторых ДЦ стопы срабатывают не по рынку, а по установленной в стопе цене. Это не рыночный механизм, а "кухонный'.

А то, что я говорил о возможном пропуске сделок, ну, это, если Ваши часы отстали на 2 минуты, то сделки, совершённые в эти 2 последние минуты, не попадут в историю, так как серверное время раcчитывается исходя из локального и также будет отставать на те же 2 минуты.

Что касается тестера, то вообще непонятно что Вас там не устраивает, ведь там всё это моделируется и локальное равно серверному.

 
MetaDriver:

Ладно, спасибо, Николай.  И, кстати, С Днём Варенья To You..!.  С Днём Варенья To You...!  

Откопал таки,

Скайп и среди ночи тебе напомнит о день варенья знакомого (на правах рекламы :)

Спасибо за тортик, очень даже ничё, вот только свечки както туго перевариваются :о)

 
Valmars:

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

По закрытию рынка (окончанию торгов) на данном сервере никакие срабатывания стопов не должны происходить до следующего открытия рынка на новой неделе. В вашем случае, похоже, это не так. Котировки уже перестали поступать в терминал, а на сервере они всё ещё обрабатываются, и срабатывают установленные стопы. В некоторых ДЦ стопы срабатывают не по рынку, а по установленной в стопе цене. Это не рыночный механизм, а "кухонный'.

Да нет, там всё правильно отработалось на сервере (демо-счёт MQ). То есть, стопы сработали в момент моего отсутствия связи. Но, когда я подключился, рынок был уже закрыт. В окне Обзор Рынка было зафиксировано время последнего тика перед тем, как связь у меня была отключена. Запрашивая историю сделок указывая в качестве второго значения TimeCurrent(), я получал не всю историю. Хотя в Справке для TimeCurrent() сказано, что:

... Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя.

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

А то, что я говорил о возможном пропуске сделок, ну, это, если Ваши часы отстали на 2 минуты, то сделки, совершённые в эти 2 последние минуты, не попадут в историю, так как серверное время раcчитывается исходя из локального и также будет отставать на те же 2 минуты. 

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

  Что касается тестера, то вообще непонятно что Вас там не устраивает, ведь там всё это моделируется и локальное равно серверному.

А в тестере баг с функцией HistoryDealsTotal() и проявляется он в режиме Визуализации. Время там правильно моделируется. Просто в некоторых случаях помогает костыль.

Причина обращения: