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

 
Artyom Trishkin:

Я вам уже отвечал:

Вы берёте последний в списке ордер:

А вам нужно сначала узнать на сколько изменилось состояние в списке ордеров. Было 12, стало 8 - изменилось на 4 ордера. Соответственно - вам нужно все четыре ордера распечатать. А вы всегда распечатываете только самый последний в списке.

Как узнать на сколько изменилось? Нужно при запуске советника записать количество ордеров в переменную, например int last_total. Затем на каждом тике сравнивать OrdersTotal() с last_total. Если они НЕ равны - произошло изменение. Записать разницу между OrdersTotal() и last_total в переменную, например num_changes и сохранить в last_total новое состояние OrdersTotal().
Тут могут быть нюансы, например, при срабатывании отложенных ордеров. Но пока вам бы сделать то, что нужно для начала.
Зная количество пропавших ордеров, вы можете их посмотреть в истории. Впрочем, можно ограничиться только контролем ордеров в историческом списке - сделать всё вышеописанное не для списка рыночных, а для списка исторических ордеров. Разница между тем, что было, и тем что стало - это и есть то количество ордеров, которые нужно проанализировать. Вы же всегда анализируете только самый последний в списке.

При этом никто не гарантирует, что последний в историческом списке ордер будет последним закрытым. Это тоже нюансы, которые нужно учитывать. Но потом.

Спасибо большое. Так намного понятнее. Ключевые слова  - нужно распечатывать не один а сразу 4 ордера. Если бы Вы мне их сказали в первом посте я бы Вас не "мучил".

 
ANDREY:

Спасибо большое. Так намного понятнее. Ключевые слова  - нужно распечатывать не один а сразу 4 ордера. Если бы Вы мне их сказали в первом посте я бы Вас не "мучил".

Не за что. Пока вы не научитесь для себя составлять логику того или иного действия, вы так и не сдвинетесь с мёртвой точки - будете спрашивать на форуме. А логику составить проще некуда - она составляется простыми словами. При этом не обязательно привязываться к ордерам/спискам/тикетам и проч..

Думаю, что на яблоках вы бы легко составили алгоритм отслеживания их количества - тут всё как в жизни: запомнил сколько яблок лежит на столе, ушёл курить, пришёл - яблок стало меньше...
Как вы про это узнали? Легко - было 5, стало 3. Два пропали. Кот наверное... Или было 5, стало 6. Одно появилось. От сырости наверное... В любом из случаев вы в уме посчитали разницу.

Так а чем такие же действия отличаются от подсчёта ордеров? Те же яблоки... Вместо "в уме" пишите "в функции"

 

подскажите пожалуйста как вынести функцию из кода (декомпозиция), если получилось уже больше 200 строк кода и неудобно все это листать. Интересует "механика": как "выносится" функция, куда записывается, чтоб потом вызывать ее в основном коде.

Если есть пример с описанием - буду признателен за ссылку
 
Alexey Kolybelnikov:

подскажите пожалуйста как вынести функцию из кода (декомпозиция), если получилось уже больше 200 строк кода и неудобно все это листать. Интересует "механика": как "выносится" функция, куда записывается, чтоб потом вызывать ее в основном коде.

Если есть пример с описанием - буду признателен за ссылку

Было:

double a = (b + c) / (d - e);


Стало:

double a = Add(b,c) / Sub(d,e);

//---------

Add(const double v1,const double v2) { return v1 + v2; }

Sub(const double v1,const double v2) { return v1 - v2; }
 
Artyom Trishkin:

Не за что. Пока вы не научитесь для себя составлять логику того или иного действия, вы так и не сдвинетесь с мёртвой точки - будете спрашивать на форуме. А логику составить проще некуда - она составляется простыми словами. При этом не обязательно привязываться к ордерам/спискам/тикетам и проч..

Думаю, что на яблоках вы бы легко составили алгоритм отслеживания их количества - тут всё как в жизни: запомнил сколько яблок лежит на столе, ушёл курить, пришёл - яблок стало меньше...
Как вы про это узнали? Легко - было 5, стало 3. Два пропали. Кот наверное... Или было 5, стало 6. Одно появилось. От сырости наверное... В любом из случаев вы в уме посчитали разницу.

Так а чем такие же действия отличаются от подсчёта ордеров? Те же яблоки... Вместо "в уме" пишите "в функции"

Понял.Спасибо за пояснение. Давно так же в голове крутиться такой вопрос.... В моем коде предполагается что  в журнале будет часто печататься функция Print(). Автоматически в журнале печатается каждый открытый ордер и каждое закрытие каждого ордера. У меня ордеров много. Соответственно будет много и записей об ордерах. Эти записи часто мешают мне воспринимать данные из функций Print(), которых так же может быть много.

ВОПРОС

Как сделать так, что бы, когда мне нужно, информация об открытых и закрытых ордерах в журнал не выводилась, но выводилась только функция Print()

Это можно сделать при помощи какой то функции языка MQL4 , или для этого нужно вносить изменения в код терминала МТ4 ?

Спасибо.
 
ANDREY:

Понял.Спасибо за пояснение. Давно так же в голове крутиться такой вопрос.... В моем коде предполагается что  в журнале будет часто печататься функция Print(). Автоматически в журнале печатается каждый открытый ордер и каждое закрытие каждого ордера. У меня ордеров много. Соответственно будет много и записей об ордерах. Эти записи часто мешают мне воспринимать данные из функций Print(), которых так же может быть много.

ВОПРОС

Как сделать так, что бы, когда мне нужно, информация об открытых и закрытых ордерах в журнал не выводилась, но выводилась только функция Print()

Это можно сделать при помощи какой то функции языка MQL4 , или для этого нужно вносить изменения в код терминала МТ4 ?

Спасибо.

Если Вы делаете исследование то писать лучше в файл. Запрет отображения действий с ордерами в журнале не знаю как делать и думаю его нет, это уровень записей начала и конца работы советника. Это записи логфайла. В файле будет только то что вы хотите, в журнале кроме ваших записей будут и терминальные. Внести изменение можно в терминал, можно написать даже свой))) только сколько это будет стоить???

 
Alexey Kolybelnikov:

подскажите пожалуйста как вынести функцию из кода (декомпозиция), если получилось уже больше 200 строк кода и неудобно все это листать. Интересует "механика": как "выносится" функция, куда записывается, чтоб потом вызывать ее в основном коде.

Если есть пример с описанием - буду признателен за ссылку

https://www.mql5.com/ru/docs/runtime/imports

https://www.mql5.com/ru/docs/basis/preprosessor/include

 а дальше по ссылкам... в общих чертах: все "лишнее" в библиотеку *.mqh, в начале основного кода подключаете. компилятор сам "склеит"

но вообще, 200 строк - это не много - используя кнопки    можно и в более тысячи строк спокойно себя чувствовать.

 
Valeriy Yastremskiy:

Если Вы делаете исследование то писать лучше в файл. Запрет отображения действий с ордерами в журнале не знаю как делать и думаю его нет, это уровень записей начала и конца работы советника. Это записи логфайла. В файле будет только то что вы хотите, в журнале кроме ваших записей будут и терминальные. Внести изменение можно в терминал, можно написать даже свой))) только сколько это будет стоить???

Спасибо за подсказку. Но , как мне кажется, я ни разу не писал советника в файл. Я всегда писал советника в редакторе Метаэдитор 4. Что бы посмотреть что вывела функция Рrint() за весь период тестирования я выбираю вкладку  Журнал - Открыть . И открывается в блокноте файл с тем же содержанием , что и во вкладке Журнал. Как мне кажется это лог файл.
Но убрать все открытые ордера и их закрытие из этого  блокнотовского файла , как мне кажется у меня нет возможности. А точнее есть. Но это очень нудная и трудоемкая работа.
Буду Вам очень признателен если откроете мне секрет как сделать так что бы мой код ордера открывал и закрывал, но в файле информации об открытии и закрытии всех ордеров не было, а были только записи функции Рrint().
Спасибо за помощь.

 
ANDREY:


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

https://www.mql5.com/ru/forum/160683/page1109#comment_15711102

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2020.03.31
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
ANDREY:

Спасибо за подсказку. Но , как мне кажется, я ни разу не писал советника в файл. Я всегда писал советника в редакторе Метаэдитор 4. Что бы посмотреть что вывела функция Рrint() за весь период тестирования я выбираю вкладку  Журнал - Открыть . И открывается в блокноте файл с тем же содержанием , что и во вкладке Журнал. Как мне кажется это лог файл.
Но убрать все открытые ордера и их закрытие из этого  блокнотовского файла , как мне кажется у меня нет возможности. А точнее есть. Но это очень нудная и трудоемкая работа.
Буду Вам очень признателен если откроете мне секрет как сделать так что бы мой код ордера открывал и закрывал, но в файле информации об открытии и закрытии всех ордеров не было, а были только записи функции Рrint().
Спасибо за помощь.

int OnInit()
  {   
//----------
   FileTest() // функция открытия файла записи данных
   point = 1/Point; // чтобы не делить на пойнт
   tx=TimeCurrent();// задание времени начала работы советника
//--- create timer
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {

   FileClose( Handle );                // Закрываем файл
   Alert("Файл ",File_Name," закрыт.");// Сообщение
     
//--- destroy timer
   EventKillTimer();

  }

void OnTick()    // Функция start() раньше называлась
  {
.................
 Qnt_Symb=FileWrite(Handle,Symbol()," ТФ ",Period(),"Открыт ордер Buy по цене ",Ask,
            "Ticket = ",Ticket," ProfB=",ProfB," MxProfB=",MxProfB, " ProfS=",ProfS," MxProfS=",MxProfS);//Запись в файл
            if(Qnt_Symb<=0) // Если не получилось
              {
               Alert("Ошибка записи в файл ",GetLastError());// Сообщение
              };
.................
}
//-------------------------------------------------------------- 12 --

int FileTest()
  {
   Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,";");//Открытие файла
   if(Handle==-1) // Неудача при открытии файла
     {
      Alert("Ошибка при открытии файла. ",// Сообщение об ошибке
            "Возможно, файл занят другим приложением");

     }

   return(Handle);
  }
//+------------------------------------------------------------------+

делаю так, в тестере файл будет в папке \tester\files, если на окно кинуть то в папке \MQL4\Files . И у Ковалева это есть подробно.

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