Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 674
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Уважаемые Знатоки!
Надеюсь я в правильной ветке задаю вопрос!
Вопрос такой: можно ли с помощью #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;}
спасибо!
Здравствуйте!
Поясните пожалуйста разницу между
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). По-русски это так выглядит: если(НЕ Выбран()).
Можно быстро "перевернуть" значение булевой переменной:
У меня еще вопрос. Далее пример программы.
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: ни какой разницы. В чем проблема и как исправить. Спасибо!
Ответ: OrderSelect error 4051. Если заменяю на SELECT_BY_POS, то OrderSelect error 1. Реакция одинакова для тестера стратегий и "прогона на реальных данных". Пробовал убрать MODE_TRADES для случая с SELECT_BY_TICKET: ни какой разницы. В чем проблема и как исправить. Спасибо!
SELECT_BY_POS это выбор ордера "по очередности" в списке ордеров, и в Вашей конструкции:
Вы пытаетесь выбрать ордер который по очереди ордеров № ... а Вы тут № тикета используете, а у Вас всего 1 ордер, а тикет № 10023444... и что ? тут Вам нужно число от 1 до 2,3.. ну сколько ордеров в рынке у Вас ,.. подправил число от 0,1,2... - нумерация как в массиве с 0 начинается и до OrdersTotal()-1
SELECT_BY_TICKET должно работать, но до момента когда № тикета у Вас существует, т.е. ордер у Вас рыночный, и выше у Вас проверка на отправку ордера, а если ордер не отправлен то тикет то будет = -1 !!!, вот Вы наверное и пытаетесь иногда ордер с тикетом -1 выбрать
ну и в целом, не правильная у Вас конструкция по работе с ордерами, если решили MQL изучать, то вот уже готовые примеры для работы с ордерами https://www.mql5.com/ru/forum/131859
Вам о массивах, а вы о форекс. Парадокс однако!
И дураку понятно, что все базовые массивы в 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 только в базовом формате, где они автоматически пройдут стандартную обработку данных .
И дураку понятно, что все базовые массивы в 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
у Вас такая каша в голове, что даже пройти мимо не смог
то, что Вы в одну кучу нагородили в MQL это массивы, файлы и индикаторные буфера
если все таки сумеете переварить информацию, что я дал одной строчкой, то могу еще подкинуть пищу для размышлений: хранение исторических данных в МТ4 и в МТ5 организовано разными способами, в том же МТ4 у пользователя есть доступ к фалам .hst https://docs.mql4.com/ru/files/fileopenhistory
в МТ5 нет прямого доступа к файлам истории, но есть работа с кастомными символами https://www.mql5.com/ru/docs/customsymbols
Я о файлах истории в своем сообщении вообще не сказал ни одного слова.
Вы что-то опять перепутали, и опять МИМО ТЕМЫ.
Я говорил о ДИНАМИЧЕСКИХ массивах данных. Это совсем другая тема. Почувствуйте разницу.
Я о файлах истории в своем сообщении вообще не сказал ни одного слова.
Вы что-то опять перепутали, и опять МИМО ТЕМЫ.
Я говорил о динамических массивах данных. Это совсем другая тема.
Более того, у базовых массивов в MT4/MT5 есть даже свое собственное расширение (.hts или .hss - я не помню точно, но что-то в этом роде).
ладно, занимайтесь, не понятна цель Ваша пребывания в этом топике форума
Я говорил о ДИНАМИЧЕСКИХ массивах данных. Это совсем другая тема. Почувствуйте разницу.
ладно, занимайтесь, не понятна цель Ваша пребывания в этом топике форума
почувствовал, Вам бы тоже разобраться и понять, что во всех языках программирования динамические массивы это просто динамические массивы, а таймсерии это таймсерии и часть работы (доступа) с таймсериями организованна как работа с массивами...Вот здесь вопрос формирования данных в терминале рассматривается достаточно подробно:
http://profitraders.com/Python/hstRead.html
Хочу обратить внимание читателей на тот факт, что в указанной статье речь идет НЕ об исторических данных, которые находятся по адресу : MT4->Сервис->Архив котировок,
а непосредственно о ДИНАМИЧЕСКИХ данных терминала в формате .hst, которые непосредственно участвуют в процессе получения и обработки котировок рынка.
------------------------------------------------------------------------------------------
Может быть я недостаточно понятно все изложил. Почитайте других авторов. Надеюсь, станет понятнее.