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

fsfs

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

AlexeyVik

Программист mql4 mql5
Привет.Подскажите пожалуйста!Есть индикатор стрелочник,ставиш индикатор на график,стрелки есть но при первом тике тике удаляет стрелки.В чем может быть проблема?
Может какой-то другой индикатор стоит на графике и удаляет все объекты. Может так код написан и ещё ХХХ вариантов.
 
  • Like
Реакции: fsfs

HUDSON

Новичок форума
MT4 ( тестер стратегий )

Тестирую на демо счете советников . После каждого теста в отчете указывается спред . Проблема в том что судя по моему опыту он кое где округляется до пунктов . Хотя спреды и в долях пунктов есть много у кого .

MarketInfo(Symbol(),MODE_SPREAD) вот этим высчитываю текущий спред на данный момент . эта функция выводит тот же результат округляя до целых . Но если посмотреть на график и найти сделки которые закрылись по той же котировке что и открылись , то если посчитать спред то он кое где больше чем заявленный на десятые доли пункта . ВОПРОС ТАКОЙ : я чего то не понимаю ? или у разрабов библиотеки кривоваты ? Либо тестер кривоват ? Мне очень важно высчитывать текущий спред с максимальной точностью . Просветите кто нибудь пожалуйста...
 

ansol

Местный знаток
HUDSON
За время прохождения команды на открытие ордера спред легко может поменяться, да вообще, у них введено понятие "проскальзывание" - т.е. сделка откроется вовсе не по тому, что вы видите в терминале, так что, высокая точность просто недостижима в принципе, условия такие ловкие :)
 

HUDSON

Новичок форума
Согласен что спред может поменяться за время открытия ордера но поголовно все сделки закрываются с одним и тем же минусом . открытие по одной цене и закрытие по той же . все поголовно . И такое возможно только на реальном счете где спред плавающий . Да и к тому же ордер на сервер пролетает за милисекунды какие то . там вероятность проскальзывания ничтожно мала . Тут проблема в чем то другом . Не спрашивал бы иначе .

ВСЯ СОЛЬ В ТОМ ЧТО ПЕРЕСЧИТАННЫЙ СПРЕД ВРУЧНУЮ НЕ СОВПАДАЕТ С ЗАЯВЛЕННЫМ В ОТЧЕТЕ ПОСЛЕ ТЕСТА СОВЕТНИКА . Разница в десятые доли пункта . Это вроде бы мало . Но для меня важно . ПОВТОРЮ ЕЩЕ РАЗ ! А Считать я умею .
 
Последнее редактирование:

ansol

Местный знаток
А комиссии нет? Комиссия бывает как раз в пунктах. Ну, т.е. если что-то фиксированное набрасывается, то явно комиссия, ИМХО.
А своп не влияет, т.е. сделки быстрые?
 

HUDSON

Новичок форума
Своп ? Не знаком с понятием . Да сделки очень коротие , сверхкороткие позиции в 2-4 свечи . Стратегия такая . Матожидание мизер зато сделок туча . Вот поэтому и нужно спред считать очень точно до десятых долей . Чем больше сделок тем меньше матожидание в любом случае . Но вот например по евро доллару тестирую там нет этой накидки . спред верно выдает и в пересчете все верно . а вот пара AUDCAD к примеру вот с этой накидкой выходит .. возможно она действительно не от спреда ... раз на евродолларе все верно .
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Тестирую на демо счете советников . После каждого теста в отчете указывается спред . Проблема в том что судя по моему опыту он кое где округляется до пунктов . Хотя спреды и в долях пунктов есть много у кого .

MarketInfo(Symbol(),MODE_SPREAD) вот этим высчитываю текущий спред на данный момент . эта функция выводит тот же результат округляя до целых . Но если посмотреть на график и найти сделки которые закрылись по той же котировке что и открылись , то если посчитать спред то он кое где больше чем заявленный на десятые доли пункта . ВОПРОС ТАКОЙ : я чего то не понимаю ? или у разрабов библиотеки кривоваты ? Либо тестер кривоват ? Мне очень важно высчитывать текущий спред с максимальной точностью . Просветите кто нибудь пожалуйста...
Так вопрос о тестере или демке? Ты говоришь о пунктах 4х значных или 5-ти?
 

HUDSON

Новичок форума
Вопрос был в том что спред в отчете не всегда совпадает с реальным текущим . В ручную пересчитывал . на некоторых парах еще накидка к спреду какая то идет . которая не спред скорее всего а комиссия скорее всего, как правильно заметил "Ansol" . только тогда где она в отчете отображается я не вижу . как называется тоже не знаю .. Отдельный вопрос как нулевой спред сделать в тестере, вопрос тоже очень актуален . Ставишь ноль он текущий все равно )))) . И насчет пунктов . Они четырехзначные вроде везде ) пятый знак это доля пункта вроде везде )
 
Последнее редактирование:

vlad_123

Местный знаток
Вопрос был в том что спред в отчете не всегда совпадает с реальным текущим . В ручную пересчитывал . на некоторых парах еще накидка к спреду какая то идет . которая не спред скорее всего а комиссия скорее всего, как правильно заметил "Ansol" . только тогда где она в отчете отображается я не вижу . как называется тоже не знаю .. Отдельный вопрос как нулевой спред сделать в тестере, вопрос тоже очень актуален . Ставишь ноль он текущий все равно )))) . И насчет пунктов . Они четырехзначные вроде везде ) пятый знак это доля пункта вроде везде )
Текущий спред в тестере берется на момент начала теста. Если потом спред по паре меняется - это ведь никак не отражается в результатах теста. И при тестировании значение спреда остается неизменным и равно либо явно заданному в тестере значению, либо текущему (на момент начала теста) спреду.
Нулевой спред вряд ли выставишь - попробуй поставить 1.
4х/5ти-значность пункта зависит от свойств текущего аккаунта - если цена по тестируемому символу 4 знака, то и пункт - 4хзнак.
Вот если тестировать на 5тизнаке, а потом вручную пересчитывать для 4хзнака - тут и полезут дробные пункты.
 

vlad_123

Местный знаток
Паходу - я тут раздумывал, как можно побольше пипсов насобирать, закрывая одни и те же позиции...
Сподвигло меня на это изменение требований MyFxBook'а к AutoTrade провайдерам, а именно - если раньше они требовали >10пипов на профитную сделку, то теперь Avg пипов на трейд - не менее 3. И если раньше мой сов подходил, то теперь нет.
Ну, в общем-то, и решение - закрывать убыточные сделки по возможности меньшим количеством операция (я раньше закрывал по 0.01 лота), а вот профитные - наоборот, закрывать по возможности наименьшими лотами.
Ну, и как результат - сегодня +6400 пипов :D
А функционал-то работает :)
Редко, но метко - сегодня тремя советниками (портфель из 3х счетов с разными рисками) собрал 14700+ пипсов :D
 

monopolie

Интересующийся
Что нужно прописать в индикаторе что чтобы при соприкосновении с ценой этого индикатора был бы звуковой сигнал?
Что в конце что в начале, что в середине писать в коде?
Я на мку4 не писал. Писал программки на с++, но давно.
 

ansol

Местный знаток
Что нужно прописать в индикаторе что чтобы при соприкосновении с ценой этого индикатора был бы звуковой сигнал?
Что в конце что в начале, что в середине писать в коде?
Я на мку4 не писал. Писал программки на с++, но давно.

Есть встроенная команда PlaySound("имя звука") - посмотри в хелпе описание.
 

monopolie

Интересующийся
Ок. Спасибо. А как тогда прописать эту ситуацию соприкосновения цены с индикатором при которой должен быть звук?
 

ansol

Местный знаток
Ок. Спасибо. А как тогда прописать эту ситуацию соприкосновения цены с индикатором при которой должен быть звук?

Э-э... Сравнить Bid и значение индикатора, видимо.
Только вот точного равенства может не получиться, лучше, наверное, сравнить close[1], close[0] и значение индикатора - типа, пересечение сверху вниз или снизу вверх, или наоборот, взять значение индикатора текущее и предыдущее и сравнить с Bid(ценой). Это же зависит от типа индикатора - как лучше, кто кого пересекает и т.п.
 

monopolie

Интересующийся
close[] Я посмотрел это цена закрытия бара. Это может быть уже поздно. Хотелось бы именно первое соприкосновение с индикатором цены. Это Мувинг Аверэйдж.
Соприкосновение может быть или сверху вниз или наоборот. Неважно, в обе стороны.
 
Последнее редактирование:

ansol

Местный знаток
close[] Я посмотрел это цена закрытия бара. Это может быть уже поздно. Хотелось бы именно первое соприкосновение с индикатором цены. Это Мувинг Аверэйдж.

Close[0] = Bid - это текущая цена.
Например, предыдущий бар close[1] закрылся ниже МА, ждем когда close[0] станет выше или равно
if(close[0] >= iMA(...)) действие;
Либо наоборот, close[1] выше МА
if(close[0] <= iMA(...)) действие;
Т.е. с первым же тиком факт достижения или пересечения МА будет зафиксирован.
Я просто обратил ваше внимание на то, что точного равенства может не быть хотя бы потому, что цена может перепрыгнуть несколько пипсов легко,
скажем была 1.08196, следующим тиком стала 1.08199, а МА у вас(к примеру!) 1.08198 - вот и облом.
Поэтому небольшой огородик полезно сделать, чтоб потом не удивляться.
 

fsfs

Новичок форума
Привет всем)есть индюк,даёт сигналы на приведущем баре но иногда ставит сигнал на приведущем баре вовремя формирования нулевого бара.вопрос,как зделать чтоб давал сигналы только на открытие бара и не давал сигналы посреди формирования?
 

monopolie

Интересующийся
Что нужно сделать чтобы был сигнал если расстояние между двумя МА меньше определённого количества пунктов? Нашёл в инете код с основными командами для работы алерта, но условия нужно задавать самому.

В начало эксперта перед функцией start() вставьте следующий код:
/+======================================================================================+
//+====================================================+
//+======================================================================================+
extern string Alerts="Алерты и стрелки от www.expforex.com";
extern bool AlerT=true; // Выдавать алерт на экран
extern bool Mail=true; // Посылать сообщение
extern bool Push=true; // Посылать ПУШ на телефон
extern bool Arrow=true; // Ставить стрелки на сигналах
extern int shift=1; // На каком баре считать сигнал 0 - на текущем 1 - на закрытом
int timeee; // Внутренняя переменная
string nameInd;

void SetArrow(int cd, color cl,
string nm="", datetime t1=0, double p1=0, int sz=3) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[0];
if (p1<=0) p1=Bid;
nameInd=WindowExpertName( );
int wind=WindowFind(nameInd);
wind=0;
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, wind, 0,0);
ObjectSet(nm, OBJPROP_TIME1 , t1);
ObjectSet(nm, OBJPROP_PRICE1 , p1);
ObjectSet(nm, OBJPROP_ARROWCODE, cd);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_WIDTH , sz);
}


void Expforex_AlertArrow(string text="",int arrowdir=0,bool history=false,int i=0)
{
nameInd=WindowExpertName();
int wind=WindowFind(nameInd);
if(wind==-1)wind=0;
ObjectCreate("Originalalert",OBJ_LABEL,wind,0,0);
ObjectSetText("Originalalert","Модификация AlertArrow www.expforex.com",10,"Arial Bold",Red);
ObjectSet("Originalalert",OBJPROP_CORNER,2);
ObjectSet("Originalalert",OBJPROP_XDISTANCE,200);
ObjectSet("Originalalert",OBJPROP_YDISTANCE,10);
if(!history)
{
if(AlerT) Alert(text);
if(Arrow) if(arrowdir==1) SetArrow(241,Blue,nameInd+DoubleToStr(Time[shift],0),Time[shift],Low[shift]);
if(Arrow) if(arrowdir==2) SetArrow(242,Red,nameInd+DoubleToStr(Time[shift],0),Time[shift],High[shift]);
if(!IsTesting())if(Mail) SendMail(text,text);
if(!IsTesting())if(Push) SendNotification(text);
}
if(history)
{
if(Arrow) if(arrowdir==1) SetArrow(241,Blue,nameInd+DoubleToStr(Time[shift+i],0),Time[shift+i],Low[shift+i]);
if(Arrow) if(arrowdir==2) SetArrow(242,Red,nameInd+DoubleToStr(Time[shift+i],0),Time[shift+i],High[shift+i]);

}

}

//+======================================================================================+
//+================================ ====================+
//+======================================================================================+
Дальше нужно вставить условие до команды return()
Индикатор приложил. Можете написать и объяснить условие?
Сделайте плиз чтобы было два файла индикаторов МА. Не всё в одном файле.
 

Вложения

  • moving_averages.mq4
    5,3 КБ · Просмотры: 18
Последнее редактирование:
Верх