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

 

Уважаемые Знатоки!

Надеюсь я в правильной ветке задаю вопрос!

Вопрос такой: можно ли с помощью #define определить конструкцию, которая бы разворачивалась в следующий код:

if(a) printf("%s(%04d)", __FUNCTION__, __LINE__) +printf("%s", _Symbol);

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

А вот выделенная красным конструкция хотелось бы, чтобы заменялась на такую (подобную):

#define P(a)       if(переменная>=a) printf("%s(%04d)", __FUNCTION__, __LINE__)

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

P(3)+printf("%s(%s) Точность=%d", Символ, (Команда==0?"Buy":"Sell"), Точность);

но любая такая запись в коде приводит к ошибке 'Print' - expression of 'void' type is illegal    ...

 

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

Поясните пожалуйста разницу между

if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError());return;}

и

if(OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)==false){PrintFormat("OrderSelect error %d",GetLastError());return;}

спасибо!

 
ski1973:

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

Поясните пожалуйста разницу между

if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError());return;}

и

if(OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)==false){PrintFormat("OrderSelect error %d",GetLastError());return;}

спасибо!

Никакой логической разницы нет. Разница лишь в написании данного логического сравнения.

Знак "!" - это "NOT". Т.е., if(!Select()) то же самое, что и if(Select()==false). По-русски это так выглядит: если(НЕ Выбран()).

Можно быстро "перевернуть" значение булевой переменной:

bool var = true;
Print("1. var=",(string)var);
var=!var;
Print("2. var=",(string)var);
 

У меня еще вопрос. Далее пример программы.

double Lots=0.01;

int slippage=30;

int Subr1()

{

int result=-1;

int_result=OrderSend(_symbol,OP_BUY,Lots,slippage,0,0);

if(int_res<0){PrintFormat("OrderSend error = ",GetError());}

return int_result;

}

void OnTick()

{

int numer=-10;
if(OrdersTotal()==0)numer=Subr1();

if(OrdersTotal()>0)Subr2(numer);

return;

}

void Subr2(int order)

{

if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError());return;} else PrintFormat("Ok, OrderTicket = ",OrderTicket());

}

Ответ: OrderSelect error 4051. Если заменяю на SELECT_BY_POS, то OrderSelect error 1. Реакция одинакова для тестера стратегий и "прогона на реальных данных". Пробовал убрать MODE_TRADES для случая с SELECT_BY_TICKET: ни какой разницы.  В чем проблема и как исправить. Спасибо!

 
ski1973:

Ответ: OrderSelect error 4051. Если заменяю на SELECT_BY_POS, то OrderSelect error 1. Реакция одинакова для тестера стратегий и "прогона на реальных данных". Пробовал убрать MODE_TRADES для случая с SELECT_BY_TICKET: ни какой разницы.  В чем проблема и как исправить. Спасибо!

SELECT_BY_POS это выбор ордера "по очередности" в списке ордеров, и в Вашей конструкции:

void Subr2(int order)
{
if(!OrderSelect(order,SELECT_BY_TICKET,MODE_TRADES)){PrintFormat("OrderSelect error %d",GetLastError());return;} else PrintFormat("Ok, OrderTicket = ",OrderTicket());
}

Вы пытаетесь выбрать ордер который по очереди ордеров № ... а Вы тут № тикета используете, а у Вас всего 1 ордер, а тикет № 10023444... и что ?  тут Вам нужно число от 1 до 2,3.. ну сколько ордеров в рынке у Вас  ,.. подправил число от 0,1,2... - нумерация как в массиве с 0 начинается и до OrdersTotal()-1

SELECT_BY_TICKET должно работать, но до момента когда № тикета у Вас существует, т.е. ордер у Вас рыночный, и выше у Вас проверка на отправку ордера, а если ордер не отправлен то тикет то будет = -1 !!!, вот Вы наверное и пытаетесь иногда ордер с тикетом -1 выбрать

ну и в целом, не правильная у Вас конструкция по работе с ордерами, если решили MQL изучать, то вот уже готовые примеры для работы с ордерами https://www.mql5.com/ru/forum/131859

Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 
Vitaly Muzichenko:

Вам о массивах, а вы о форекс. Парадокс однако! 

И дураку понятно, что все базовые массивы в MT4/MT4 буферизованы.

Не такого уровня программисты в MT4/MT5, чтобы допустить пользователей к работе с базовыми массивами.

Более того, у базовых массивов в MT4/MT5 есть даже свое собственное расширение (.hts или .hss - я не помню точно, но что-то в этом роде).

То есть, на терминал они поступают не в текстовом формате (с расширением .txt), а в своем собственном формате.

И уже  в MT4/MT5 базовые массивы раскодируются и пересчитываются в массивы выделенных тайм-фреймов (минутки, пятиминутки, 15-минутки и т.д.), и лишь после этого они дублируются и буферизуются.

Для чего буферизуются?

Для сравнения. Чтобы не было потери данных. Один из этих массивов  постоянно пересчитывается (время от времени), а вторым (скопированным из первого) мы пользуемся при копировании в свои пользовательские данные.

То есть, процедура предоставления данных пользователям довольно сложная.

Это Вам о массивах, если Вам это интересно.

Кстати, и в Андроиде, и в Window's базовые массивы MT4/MT5 имеют одно и тоже расширение.

--------------------------------------------------------------------------------------------------------------------------------

Что касается импорта ДИНАМИЧЕСКИХ данных в MT4/MT5 из сторонних источников, то такой импорт, насколько я понял, не предусмотрен.

То есть, процедуры Клиент/Сервер - которая есть в С++Builder- в MT4/MT5 не наблюдается.

--------------------------------------------------------------------------------------------------------------------------------

Мне вот интересно, будет ли эта процедура в библиотеке

http://tol64.blogspot.com/2015/12/easy-and-fast-gui-mql.html

Вероятнее всего, конечно, тоже не будет.

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

Библиотека "Easy And Fast GUI" для создания графических интерфейсов на MQL
  • tol64.blogspot.com
С этой статьи я начинаю еще одну серию, относящуюся к разработке графических интерфейсов. На текущий момент нет ни одной библиотеки кода, которая позволяла бы легко и быстро создавать качественные графические интерфейсы в MQL-приложениях. Я имею в виду графические интерфейсы, к которым мы все привыкли в известных операционных системах. Цель проекта — дать конечному пользователю такую возможность и научить это делать с помощью моей библиотеки. Я постарался сделать ее максимально понятной в изучении, с возможностями дальнейшего развития.
 
neverness:

И дураку понятно, что все базовые массивы в MT4/MT4 буферизованы.

Не такого уровня программисты в MT4/MT5, чтобы допустить пользователей к работе с базовыми массивами.

Более того, у базовых массивов в MT4/MT5 есть даже свое собственное расширение (.hts или .hss - я не помню точно, но что-то в этом роде).

То есть, на терминал они поступают не в текстовом формате (с расширением .txt), а в своем собственном формате.

И уже  в MT4/MT5 базовые массивы раскодируются и пересчитываются в массивы выделенных тайм-фреймов (минутки, пятиминутки, 15-минутки и т.д.), и лишь после этого они дублируются и буферизуются.

Для чего буферизуются?

Для сравнения. Чтобы не было потери данных. Один из этих массивов  постоянно пересчитывается (время от времени), а вторым (скопированным из первого) мы пользуемся при копировании в свои пользовательские данные.

То есть, процедура предоставления данных пользователям довольно сложная.

Это Вам о массивах, если Вам это интересно.

Кстати, и в Андроиде, и в Window's базовые массивы MT4/MT5 имеют одно и тоже расширение.

у Вас такая каша в голове, что даже пройти мимо не смог

то, что Вы в одну кучу нагородили в MQL это массивы, файлы, работа с таймсериями и индикаторные буфера

если все таки сумеете переварить информацию, что я дал одной строчкой, то могу еще подкинуть пищу для размышлений: хранение исторических данных в МТ4 и в МТ5 организовано разными способами, в том же МТ4 у пользователя есть доступ к фалам .hst https://docs.mql4.com/ru/files/fileopenhistory

в МТ5 нет прямого доступа к файлам истории, но есть работа с кастомными символами https://www.mql5.com/ru/docs/customsymbols

FileOpenHistory - Файловые операции - Справочник MQL4
FileOpenHistory - Файловые операции - Справочник MQL4
  • docs.mql4.com
[in]  Режим открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE. Клиентский терминал может подключаться к серверам разных брокерских компаний. Исторические данные (файлы HST) каждой брокерской компании хранятся в соответствующей подпапке папки истории...
 
Igor Makanu:

у Вас такая каша в голове, что даже пройти мимо не смог

то, что Вы в одну кучу нагородили в MQL это массивы, файлы и индикаторные буфера

если все таки сумеете переварить информацию, что я дал одной строчкой, то могу еще подкинуть пищу для размышлений: хранение исторических данных в МТ4 и в МТ5 организовано разными способами, в том же МТ4 у пользователя есть доступ к фалам .hst https://docs.mql4.com/ru/files/fileopenhistory

в МТ5 нет прямого доступа к файлам истории, но есть работа с кастомными символами https://www.mql5.com/ru/docs/customsymbols

Я о файлах истории в своем сообщении вообще не сказал ни одного слова.

Вы что-то опять перепутали, и опять МИМО ТЕМЫ.

Я говорил о ДИНАМИЧЕСКИХ массивах данных. Это совсем другая тема. Почувствуйте разницу.

 
neverness:

Я о файлах истории в своем сообщении вообще не сказал ни одного слова.

Вы что-то опять перепутали, и опять МИМО ТЕМЫ.

Я говорил о динамических массивах данных. Это совсем другая тема.

Более того, у базовых массивов в MT4/MT5 есть даже свое собственное расширение (.hts или .hss - я не помню точно, но что-то в этом роде).

ладно, занимайтесь, не понятна цель Ваша пребывания в этом топике форума

neverness:

Я говорил о ДИНАМИЧЕСКИХ массивах данных. Это совсем другая тема. Почувствуйте разницу.

почувствовал, Вам бы тоже разобраться и понять, что во всех языках программирования динамические массивы  это просто динамические массивы, а таймсерии это таймсерии и часть работы (доступа) с таймсериями организованна как работа с массивами...
 
Igor Makanu:

ладно, занимайтесь, не понятна цель Ваша пребывания в этом топике форума

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

Вот здесь вопрос формирования данных в терминале рассматривается достаточно подробно:

http://profitraders.com/Python/hstRead.html

Хочу обратить внимание читателей на тот факт, что в указанной статье речь идет НЕ об исторических данных, которые находятся по адресу : MT4->Сервис->Архив котировок,

а непосредственно о ДИНАМИЧЕСКИХ данных терминала в формате .hst, которые непосредственно участвуют в процессе получения и обработки котировок рынка.

------------------------------------------------------------------------------------------

Может быть я недостаточно понятно все изложил. Почитайте других авторов. Надеюсь, станет понятнее.

Чтение файла HST истории котировок Metatrader 4 — ProfiTraders.com
  • profitraders.com
Файлы истории котировок Metatrader 4 имеют расширение и находятся в папке данных торгового терминала, в каталоге . Они сгруппированы в подкаталогах, имена которых совпадают с названиями серверов, например: или . Имена файлов начинаются с наименования торгового инструмента, далее указывается таймфрейм (количество минут), например, для часового...
Причина обращения: