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

 
trader781:

я теоретически знаю почему это произошло, поэтому вопрос, можно кратко о применении массивов?

где нужно инициализировать, удалять и обрабатывать чтоб все после этого работало

 

 

P.S

когда забанили в гугле это выглядит примерно вот так:

А почему ты решил что это из-за массива???
 
Alexey Viktorov:
А почему ты решил что это из-за массива???
потому что до этого ни разу подобного не случалось, а если произошло где - то я допустил ошибку, поэтому и обращаюсь сюда. Можно разбираться и самому, только на это уходит намного больше времени.
 
trader781:

нужно

1) где - то создать (в глобальной области, как функцию, в онинит или в онтик?)

2) записывать в него каждый тикет при отправке ордера с присвоением ему номера по порядку

3) вытаскивать их оттуда по мере надобности через номер

4) при закрытии всей сетки обнулять параметры

Не нужно вам его постоянно в памяти держать. Когда нужно найти - вызываете функцию, внутри которой будет локальный массив, в который вы запишете в цикле все ордера/позиции, отсортируете массив как вам нужно, выберите из него нужные ордера, сделаете с ними всё, что нужно, и при выходе из функции забудете про этот локальный массив. При следующем вызове функции она вам посчитает уже те ордера/позиции, которые будут на данный момент вызова, и сделает с ними опять то же самое. И не нужен вам никакой глобальный массив, за которым постоянно следить и контролировать нужно - дешевле выйдет.
 
Artyom Trishkin:
Не нужно вам его постоянно в памяти держать. Когда нужно найти - вызываете функцию, внутри которой будет локальный массив, в который вы запишете в цикле все ордера/позиции, отсортируете массив как вам нужно, выберите из него нужные ордера, сделаете с ними всё, что нужно, и при выходе из функции забудете про этот локальный массив. При следующем вызове функции она вам посчитает уже те ордера/позиции, которые будут на данный момент вызова, и сделает с ними опять то же самое. И не нужен вам никакой глобальный массив, за которым постоянно следить и контролировать нужно - дешевле выйдет.

Ну не знаю на сколько дешевле. Для каждой ситуации своё решение. В MQL4 нет события OnTradeTransaction() но как-то надо следить за "своими" ордерами... тут и поможет массив глобального уровня переменных.

Только представь что на счёте работает несколько советников, один с тяжёлыми расчётами, а другой с бешеным количеством ордеров... Как будет работать с тяжёлыми расчётами??? Ему ещё и перебор огромного количества ордеров подсунуть? Вообще без перебора конечно не обойтись, но минимизировать эту процедуру желательно.

А определение закрылся-ли ордер??? Перебирать всю историю? Не слишком-ли затратно?

 
trader781:
потому что до этого ни разу подобного не случалось, а если произошло где - то я допустил ошибку, поэтому и обращаюсь сюда. Можно разбираться и самому, только на это уходит намного больше времени.

Как ты понял из предыдущего моего поста, я использую массивы достаточно часто и проблем из-за них никогда не испытывал. Однажды писал советник который открывал больше 2000 ордеров тикеты которых сохранялись в массив и ничего, никаких проблем. Что-то не могу я поверить что проблемы из-за массива. Да и где можно ошибку сделать чтобы вылезли такие проблемы???

Вспомнился фильм "Не может быть"... "Губит людей не пиво, губит людей вода"...

 
Alexey Viktorov:

Ну не знаю на сколько дешевле. Для каждой ситуации своё решение. В MQL4 нет события OnTradeTransaction() но как-то надо следить за "своими" ордерами... тут и поможет массив глобального уровня переменных.

Только представь что на счёте работает несколько советников, один с тяжёлыми расчётами, а другой с бешеным количеством ордеров... Как будет работать с тяжёлыми расчётами??? Ему ещё и перебор огромного количества ордеров подсунуть? Вообще без перебора конечно не обойтись, но минимизировать эту процедуру желательно.

А определение закрылся-ли ордер??? Перебирать всю историю? Не слишком-ли затратно?

Всё решаемо.

У меня, например, давно уже сделан класс, который и следит за всем этим. Можно создавать/удалять динамически объекты класса под каждый символ, магик, таймфрейм, или всё для одного счёта, или их комбинации - на выбор. Любой необходимый цикл поиска уже выполнен на новом тике один раз, и есть все нужные данные. Конечно, бывает так, что не обойтись без ещё одного цикла всё же, но это второй дополнительный цикл на тик. А не в каждой функции свой цикл - это ужасная растрата ресурсов.

 
Artyom Trishkin:

Всё решаемо.

У меня, например, давно уже сделан класс, который и следит за всем этим. Можно создавать/удалять динамически объекты класса под каждый символ, магик, таймфрейм, или всё для одного счёта, или их комбинации - на выбор. Любой необходимый цикл поиска уже выполнен на новом тике один раз, и есть все нужные данные. Конечно, бывает так, что не обойтись без ещё одного цикла всё же, но это второй дополнительный цикл на тик. А не в каждой функции свой цикл - это ужасная растрата ресурсов.

Так с этим-то никто не спорит. С появлением структур стало ещё удобней.
 
Artyom Trishkin:
Не нужно вам его постоянно в памяти держать. Когда нужно найти - вызываете функцию, внутри которой будет локальный массив, в который вы запишете в цикле все ордера/позиции, отсортируете массив как вам нужно, выберите из него нужные ордера, сделаете с ними всё, что нужно, и при выходе из функции забудете про этот локальный массив. При следующем вызове функции она вам посчитает уже те ордера/позиции, которые будут на данный момент вызова, и сделает с ними опять то же самое. И не нужен вам никакой глобальный массив, за которым постоянно следить и контролировать нужно - дешевле выйдет.

ок, вот упрощенный вид

Если массив локальный куда его пихать? явно не в онтик.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2ордера+лот4ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

 
trader781:

ок, вот упрощенный вид

Если массив локальный куда его пихать? явно не в онтик.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2ордера+лот4ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

Почитайте что такое функция, пожалуйста. Тогда поймёте, что массив, объявленный в теле функции будет локальным - вне видимости остальной программы.
 
bool WriteToFile(int FileHandle,string DataToWrite)
  {
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
   int BytesWritten[1]={0};

// Get the length of the string
   int szData=StringLen(DataToWrite);

// Do the write
   WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);

// Return true if the number of bytes written matches the expected number
   return (BytesWritten[0] == szData);
  }

хочу записать в файл строку с переводами на новую строку, но не выходит, этот код отсюда https://www.mql5.com/en/forum/118999

этот код вообще и пишет строку с пробелами после каждой буквы, мне нужно замену найти FileWrite() но рабочую 

Reading and writing files anywhere on disk using CreateFileA() etc.
Reading and writing files anywhere on disk using CreateFileA() etc.
  • www.mql5.com
There are frequent questions in this forum (e.g...