Ваши вопросы по языку MQL4

Ugar

Гуру форума
Уважаемые профи подскажите как вы решаете эту задачу отсутствия работающего терминала в выходные дни- Я понимаю что есть тестер, но он не полную картину рисует....
Я тестер использую. Если что то в коде не хватает, временно дописываю. Например для проверки советника трейлера. можно временно добавить открытие ордера. В тестере временный код открывает ордер, а дальше основной тралит. Достаточно для проверки. тем более есть режим визуала.
 

zis

Активный участник
Ну, так правильно. Он библиотеки снёс, а сейчас может, что не положил. Бывает:)

Библиотеки все в порядке, т.к. тестер на терминале установленном на компе - работает (не работает на ноутбуке). Сравнил все файлы с работающим - всё совпадает, но упорно не работает!
 

hoz

Активный участник
Вопрос вроде как простой, но меня загнал в тупик. То ли логика кривая у автора. В общем, код с мтшного форума:

PHP:
double CheckCrossMADist(string smb, int tf, int iB, double dist)
{
  double dMA=iMA(smb, tf, fPeriod, 0, fMode, fPrice, iB)-iMA(smb, tf, sPeriod, 0, sMode, sPrice, iB);
  if (MathAbs(dMA)<dist*Point) return(0); // если разница меньше порога, то пересечения нет
  
  int n=iBars(smb, tf)-MathMax(sPeriod, fPeriod)-1; // число баров для проверки (c учетом корректности расчета МА)
  for(int i=iB+1; i<n; i++) // проходим по барам
  {
    double dMA2=iMA(smb, tf, fPeriod, 0, fMode, fPrice, i)-iMA(smb, tf, sPeriod, 0, sMode, sPrice, i);
    if(MathAbs(dMA2)>=dist*Point) break; // если нашли расстояние больше порога, то обрываем поиск
  }
  if (dMA*dMA2>0) return(0); // проверяем знак разниц. если одинаковый, то пересечение не найдено
  return(dMA); // вернули знак пересечения
}


Если нам нужно найти расстояние между машками, достаточно просчитать расстояние между значениями один раз, на одном баре.., в частности, на последнем.
Т.е. вот эта строчка:

PHP:
double dMA=iMA(smb, tf, fPeriod, 0, fMode, fPrice, iB)-iMA(smb, tf, sPeriod, 0, sMode, sPrice, iB);


Зачем потом находится ещё значение double dMA2 ?
Ещё странная логике с циклом

PHP:
for(int i=iB+1; i<n; i++)


Здесь к значению iB прибавляется 1, т.е. рассчёт не от 0. Это что бы не учитывать последний бар, который ещё не закрылся?
 

ale002

::: __,,,^._.^,,,__ :::
Вообще-то функция ищет не расстояние. Пересечение на уч-ке, равном периоду самой медленной из пары MA. Сначала проверяет это самое расстояние на текущем баре, если оно больше контрольного, то пробегает по остальным барам и проверяет а) чтобы расстояние нигде не было больше контрольного, б) чтобы где-нибудь оно было с противоположным знаком (пересечение). Текущий бар из цикла исключён, бо проверен в 1й строке функции

В общем две МАшки должны пройти рядом (не дальше dist) и иногда пересекаясь какое-то расстояние (период sPeriod-1), а потом разойтись. Тада функция вернёт на сколь конкретно они развалились в финале. По терминологии одной оч продуманной системы это окончание фазы "спагетти"
 
Последнее редактирование:
  • Like
Реакции: hoz

hiys

Гуру форума
Последнее редактирование:
  • Like
Реакции: zis

hoz

Активный участник
Вообще-то функция ищет не расстояние. Пересечение на уч-ке, равном периоду самой медленной из пары MA. Сначала проверяет это самое расстояние на текущем баре, если оно больше контрольного, то пробегает по остальным барам и проверяет а) чтобы расстояние нигде не было больше контрольного, б) чтобы где-нибудь оно было с противоположным знаком (пересечение). Текущий бар из цикла исключён, бо проверен в 1й строке функции

В общем две МАшки должны пройти рядом (не дальше dist) и иногда пересекаясь какое-то расстояние (период sPeriod-1), а потом разойтись. Тада функция вернёт на сколь конкретно они развалились в финале. По терминологии одной оч продуманной системы это окончание фазы "спагетти"


Тока вот у меня ale002 возник сразу вопрос. Почему ты решил, что переменная iB это текущий бар? Странно тут, что не от нуля цикл, а от этого бара с индексов iB Получается что о нулевого или первого бара до бара с индексом iB мы в цикл не берём. А это уже не верно, как я вижу. Ведь это значения ближе в настоящему времени, ежели бары которые находятся дальше в истории.
я вот так имею ввиду:

PHP:
for(int i=iB+1; i<n; i++)


Там на мт4 написано про входные параметры:

Функция принимает:
- требуемый символ, таймфрейм и бар, с которого необходимо получить данные.
- и параметр dist - минимальное требуемое расстояние пересечение для его фиксации
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
Странно тут, что не от нуля цикл, а от этого бара с индексов iB Получается что о нулевого или первого бара до бара с индексом iB мы в цикл не берём. А это уже не верно, как я вижу. Ведь это значения ближе в настоящему времени, ежели бары которые находятся дальше в истории.
С кодом всё пучком - это ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ, которую основной цикл скрипта может вызывать скока надо раз. Напр индикатор при запуске может её пару сотен тысяч раз дёрнуть - для каждого бара истории персонально, включая нулевой. А эксперт может проверять по каждому тику только нулевой

Почему ты решил, что переменная iB это текущий бар?
Для функции он текущий, т.е. самый свежий из разрешённых к использованию в расчётах
 

hoz

Активный участник
С кодом всё пучком - это ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ, которую основной цикл скрипта может вызывать скока надо раз. Напр индикатор при запуске может её пару сотен тысяч раз дёрнуть - для каждого бара истории персонально, включая нулевой. А эксперт может проверять по каждому тику только нулевой


Для функции он текущий, т.е. самый свежий из разрешённых к использованию в расчётах


Ну а разве это не нулевой бар? Ведь последний бар из разрешённые к использованию обычно имеет индекс 0, или индекс 1, если важна цена закрытия. Как тогда его правильно будет объявить?
Я понимаю, что вопросы, возможно, очень простые, но я сколько чего не видел, и сам индикаторы писал, но вот с этим кодом столкнулся и стопорнулся. Уже понимаю суть, но не совсем.
 

aufx

Интересующийся
Глобальные переменные терминала

Уважаемые профи!
Скрипт формирует глоб. перемен. терминала. Ее видно из меню терминала.
Но индикатор не хочет ее видеть, так и выдает в ошибке.
Если эту переменную создать в ручную из меню терминала то индикатор ее видит. Как сделать что бы индикатор увидел перем. созданную скриптом.
 

Ugar

Гуру форума
Уважаемые профи!
Скрипт формирует глоб. перемен. терминала. Ее видно из меню терминала.
Но индикатор не хочет ее видеть, так и выдает в ошибке.
Если эту переменную создать в ручную из меню терминала то индикатор ее видит. Как сделать что бы индикатор увидел перем. созданную скриптом.
Скорее всего касяк в имени переменной. Перебей имя переменной в скрипте.
 

Алекc1234

Местный житель
Всем привет! Подскажите, как каждую свечу связать с функцией OrderProfit()? То есть, чтобы в коде можно было каждую свечу(всю свечу: и тело и тени) связать(как-то приравнять что-ли) с OrderProfit(). Чтобы было так - свеча открылась - смотрим какой профит, свеча длится - снова определяем профит и закрылась тоже смотрим на профит(OrderProfit()) . То есть связываем свечу с ордерпрофитом.
 

eevviill

Заблокирован
Всем привет! Подскажите, как каждую свечу связать с функцией OrderProfit()? То есть, чтобы в коде можно было каждую свечу(всю свечу: и тело и тени) связать(как-то приравнять что-ли) с OrderProfit(). Чтобы было так - свеча открылась - смотрим какой профит, свеча длится - снова определяем профит и закрылась тоже смотрим на профит(OrderProfit()) . То есть связываем свечу с ордерпрофитом.
Думаю таким образом не выйдет.
Надо приравнивать цену открытия(закрытия, хай, лоу) с ценой открытия ордера(OrderOpenPrice()).

PHP:
int prof8= (Close[8]-OrderOpenPrice())/Point;
 

yggfyn

Активный участник
Уважаемые программисты, мне нужна Ваша помощь.. Если поможете буду очень благодарен ! Сам я не силен в программировании и последняя надежда на Вас. Перерыл весь интернет, но ничего подобного не нашел.

Суть.. есть советник, который работает на временном интервале H1. Что необходимо прописать во внешних или внутренних параметрах советника, чтобы он закрывал все открытые ордера по цене открытия Каждого нового часового бара. К примеру, если советник открыл ордер (неважно бай или селл) во временном периоде с 15.00 до 15.59, то ордер должен быть закрыт точно в 16.00, если советник открыл ордер во временном периоде с 16.00 до 16.59, то ордер должен быть закрыт точно в 17.00 и так далее. Есть ли такая функция ? И вообще возможно ли это реализовать. Спасибо !
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
"По цене открытия" - это одно, "точно в 17.00" - другое. Оба реализуются добавлением в код советника дополнительной функции, но 2й вариант требует ещё и запуска секундного таймера при инициализации сова, добавления в код отлова события onTimer, синхронизации с серверным временем и проч мороки. В любом разе без знания MQL этого не сделать, одних изменений настроек недостаточно
 

yggfyn

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

Алекc1234

Местный житель
Думаю таким образом не выйдет.
Надо приравнивать цену открытия(закрытия, хай, лоу) с ценой открытия ордера(OrderOpenPrice()).

PHP:
int prof8= (Close[8]-OrderOpenPrice())/Point;

Спасибо большое. А не подскажете, как можно сделать, чтобы при Close учитывалось бы несколько свечей. То есть скажем i равнялось бы от первой свечи до седьмой.
 
Верх