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

Ugar

Гуру форума
предпосылка и/или цель - непонятны.
т.е. NormalizeDouble не подходит по каким-то причинам, и нужно сделать тоже самое, но через отнять/прибавить?
Значение цены дели на шаг. То что получилось округли до целого и умнож на шаг цены.
MathRound((Bid+X)/PriceStep)*PriceStep;
 

_SERG_

Активный участник
сигнал мастерю, на примере селл:
PHP:
   if(signal=="SELL")   {      bool set2=OrderSend(Symbol(),OP_SELL, Lots,Bid,slippage,sl_sell,tp_sell,Order_Comment,MagicNumber,0,NULL);        } //end if(signal=="SELL")
как его оформить, чтобы внизу с текущих на целом уровне продавать...
а вверху покупать..
PHP:
if(signal=="BUY")   {      bool set1=OrderSend(Symbol(),OP_BUY, Lots,Ask,slippage,sl_buy,tp_buy,Order_Comment,MagicNumber,0,NULL);   } //end if(signal=="BUY")


Ну, если ты посмотришь на график внимательно, то цена всё таки колеблется относительно "круглого " уровня, поэтому анализируй некий интервал цены,за некий интервал времени, а не её абсолютное в один момент времени. Тут надо помнить, что, то что ты видишь на графике, не совсем, то что на самом деле происходило. Наблюдай за ценой, иначе не понять. Лучше, начать с анализа истории, и в коде, с ведением журнала состояния цены, в твоём случае, возле круглых уровней. Сразу, однозначно не прохаваешь, надо мозгом понять.
Совет по сути, не обессудь.:laugh:
 
  • Like
Реакции: gush

gush

бродяга
Значение цены дели на шаг. То что получилось округли до целого и умнож на шаг цены.
MathRound((Bid+X)/PriceStep)*PriceStep;

расчет сигнала у меня раньше был так..
если цена прошла настраиваемое количество пунктов через - Points_Open вниз/вверх, то:
PHP:
//+--------------------------------------------------------+
//+                    расчёт сигнала                      +
    string signal="NONE";
    if(!pos)
    {
     if((Open[0]-Bid)>Points_Open*Point) signal = "SELL";
     if((Bid-Open[0])>Points_Open*Point) signal = "BUY";
    }
//+                    расчёт сигнала                      +   
//+--------------------------------------------------------+

а сейчас хочу эту формулу переделать:
если например цена сейчас плавает от 1.0501 до 1.0599.. то ничего не предпринимаем..
а если пошли вверх и зацепили ЦЕЛЫЙ уровень 1.0600 - сразу покупаем..
а если пошли вниз и зацепили ЦЕЛЫЙ уровень 1.0500 - сразу продаем!!!
Как это сделать? Подскажите! Расчет!
 

Ugar

Гуру форума
расчет сигнала у меня раньше был так..
если цена прошла настраиваемое количество пунктов через - Points_Open вниз/вверх, то:
а сейчас хочу эту формулу переделать:
если например цена сейчас плавает от 1.0501 до 1.0599.. то ничего не предпринимаем..
а если пошли вверх и зацепили ЦЕЛЫЙ уровень 1.0600 - сразу покупаем..
а если пошли вниз и зацепили ЦЕЛЫЙ уровень 1.0500 - сразу продаем!!!
Как это сделать? Подскажите! Расчет!

double Level, PriceStep;
static double LastBid;
if(LastBid<_Point)LastBid=Bid;//Инициализация прошлой цены
PriceStep=100*_Point;//Шаг цены 100 пунктов.
Level=MathRound(Bid/PriceStep)*PriceStep;//Круглый уровень
//Если цена коснулась или пробила уровень снизу вверх
if(Bid-Level> -0.5*_Point && Level-LastBid>0.5*_Point)
{

}

//Если цена коснулась или пробила уровень сверху вниз
if(Level-Bid> -0.5*_Point && LastBid-Level>0.5*_Point)
{

}
 
Последнее редактирование:

Ugar

Гуру форума
double Level, PriceStep;
static double LastBid;
if(LastBid<_Point)LastBid=Bid;//Инициализация прошлой цены
PriceStep=100*_Point;//Шаг цены 100 пунктов.
Level=MathRound(Bid/PriceStep)*PriceStep;//Круглый уровень
//Если цена коснулась или пробила уровень снизу вверх
if(Bid-Level> -0.5*_Point && Level-LastBid>0.5*_Point)
{

}

//Если цена коснулась или пробила уровень сверху вниз
if(Level-Bid> -0.5*_Point && LastBid-Level>0.5*_Point)
{

}
Забыл добавить в конце
LastBid=Bid;
 

gush

бродяга
double Level, PriceStep;
static double LastBid;
if(LastBid<_Point)LastBid=Bid;//Инициализация прошлой цены
PriceStep=100*_Point;//Шаг цены 100 пунктов.
Level=MathRound(Bid/PriceStep)*PriceStep;//Круглый уровень
//Если цена коснулась или пробила уровень снизу вверх
if(Bid-Level> -0.5*_Point && Level-LastBid>0.5*_Point)
{

}

//Если цена коснулась или пробила уровень сверху вниз
if(Level-Bid> -0.5*_Point && LastBid-Level>0.5*_Point)
{

}

Забыл добавить в конце
LastBid=Bid;

супер! Так как и хотелось!!! Спасибо!!! ;)
 

djasper

Интересующийся
Здарова ребята, подскажите пожалуйста функцию нахождения фракталов на текущем таймфрейме и на старших.
Например: сов торгует на тф М5 - мне нужно найти первый и второй верхние и нижние фракталы
eurusd-m30-fxopen-investments-inc.png
 

AlexeyVik

Программист mql4 mql5
Здарова ребята, подскажите пожалуйста функцию нахождения фракталов на текущем таймфрейме и на старших.
Например: сов торгует на тф М5 - мне нужно найти первый и второй верхние и нижние фракталы
Посмотреть вложение 226625
А документацию почитать? -http://docs.mql4.com/ru/indicators/ifractals
 

rezaika

Активный участник
Привет Всем! Уважаемые программисты , я пока только начинаю немного программировать свои советники и столкнулся с такой проблемой, когда советник после закрытия ордера продолжает работать по своему коду и естественно не всегда это нужно тк условия входа в сделку уже не выгодны , подскажите функцию или строку кода для остановки работы советника или переключения его в паузу.Буду очень признателен за Вашу помощь.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Привет Всем! Уважаемые программисты , я пока только начинаю немного программировать свои советники и столкнулся с такой проблемой, когда советник после закрытия ордера продолжает работать по своему коду и естественно не всегда это нужно тк условия входа в сделку уже не выгодно , подскажите функцию или строку кода для предотвращения, остановки работы советника или переключения его в паузу.Буду очень признателен за Вашу помощь.
Ну можно использовать ExpertRemove();
Или покруче TerminalClose();

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

rezaika

Активный участник
Спасибо! попробую разобраться с помощью функции ExpertRemove();-встроить ее в свой эксперт.
 

rezaika

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

CastEt

Активный участник
:laugh: какие паузы, у тя явные проблемы с постановкой задачи...
...ты говоришь о невыгодных условиях, значит у тебя есть нечто что определяет выгодные условия!
Так что-же мешает тебе проверять оные условия всякий раз перед открытием?

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

AlexeyVik

Программист mql4 mql5
AlexeyVik,снова решил обратиться к Вам за помощью, не получилось у меня с помощью ExpertRemove() решить проблему паузы между сделками, поэтому возник вопрос, а нельзя ли использовать функцию PauseBeforeTrade() для решения этой проблемы? Мне нужно что бы советник не входил в сделку после полученного профита или стоп лосса сразу же, а через некоторую паузу которую можно прописать в коде советника.Если можно подскажите вариант решения или может укажете ссылку на кусок кода или какой либо пример.Заранее благодарю за участие в моем вопросе.
ExpertRemove() и TerminalClose() это была ... шутка. А подсказка была дальше. Всё зависит от условий открытия сделки. Поэтому вариантов немыслимое количество.
Например вход по индикатору MACD... если выше нуля - открываем ордер Buy а если ниже нуля то открываем Sell... что получится если ордер закрылся а условие осталось верным??? Следовательно, чтобы избавиться от этого поможет проверка состояния индикатора на предыдущем(первом) баре. О чём я и говорил, на первом ниже на нулевом выше, то-есть произошло пересечение уровня вверх... Об остальных тонкостях я говорить пока не буду. Столкнёшься со следующими трудностями тогда и разберёмся.
 

rezaika

Активный участник
Всем привет! Я понял что мне надо сделать, попробую технически выполнить, то что Вы мне подсказали, шутки тоже могут быть полезны , я вчера нашел коды реально работающие с этими функциями и это было полезной информацией для меня.
 

derzerack

Интересующийся
Ошибка 130, хотя SL и TP == 0

Уважаемые знатоки, прошу подсказать. Есть мой кривой (судя по всему) код.

if (PositionsTotal()==2 && TypeFirstOrder()==1 && OrdersTotal()==2)
{ ticket=OrderSend(Symbol(),OP_SELLSTOP,LotsOptimized()*2,CenaOtkritiya(),Slippage,0,0,comment,Magik,0,Red);
}
//--------------------------------конец после 2 го ордера----------------------------------------

//--------------------------------После срабатывания 3 ордера------------------------------------
if (PositionsTotal()==3 && TypeFirstOrder()==1 && OrdersTotal()==3)
{
Cena=NormalizeDouble(CenaOtkritiya()+50*Point,Digits);
ticket=OrderSend(Symbol(),OP_BUYSTOP,LotsOptimized()*2,Cena,Slippage,0,0,comment,Magik,0,Blue);
}

Всё это повторяется несколько раз с приростом количества открытых сделок. Беда в том что на 8 повторе после установки отложки она (отложка) сразу же удаляется и в журнал выдаёт ошибку 130 Неправильные стопы.
Никак не могу разобраться почему возникает ошибка, и почему ордер удаляется, ведь код абсолютно одинаков за исключением количества открытых ордеров.
Заранее благодарен за помощь.
 

Ugar

Гуру форума
Уважаемые знатоки, прошу подсказать. Есть мой кривой (судя по всему) код.

if (PositionsTotal()==2 && TypeFirstOrder()==1 && OrdersTotal()==2)
{ ticket=OrderSend(Symbol(),OP_SELLSTOP,LotsOptimized()*2,CenaOtkritiya(),Slippage,0,0,comment,Magik,0,Red);
}
//--------------------------------конец после 2 го ордера----------------------------------------

//--------------------------------После срабатывания 3 ордера------------------------------------
if (PositionsTotal()==3 && TypeFirstOrder()==1 && OrdersTotal()==3)
{
Cena=NormalizeDouble(CenaOtkritiya()+50*Point,Digits);
ticket=OrderSend(Symbol(),OP_BUYSTOP,LotsOptimized()*2,Cena,Slippage,0,0,comment,Magik,0,Blue);
}

Всё это повторяется несколько раз с приростом количества открытых сделок. Беда в том что на 8 повторе после установки отложки она (отложка) сразу же удаляется и в журнал выдаёт ошибку 130 Неправильные стопы.
Никак не могу разобраться почему возникает ошибка, и почему ордер удаляется, ведь код абсолютно одинаков за исключением количества открытых ордеров.
Заранее благодарен за помощь.
Отложенный ордер сам является стопом. По этому, при неправильной цене открытия будет ругаться на неправильные стопы. По этому он не ставится. А вот почему его удаляют смотри журнал терминала. Обычно ордер удаляет брокер при срабатывании, если открываемая позиция имеет некорректные параметры. Например если не хватает денег.
 

derzerack

Интересующийся
Большое спасибо! Разобрался, очередной граль в мусорку)
 

Vik940

Почетный гражданин
Привет всем!
Уважаемые можно-ли закрепить уровень 0. Допустим на примере Масд что-бы закреплялся не минимум и максимум, а 0.
 

AlexeyVik

Программист mql4 mql5
Привет всем!
Уважаемые можно-ли закрепить уровень 0. Допустим на примере Масд что-бы закреплялся не минимум и максимум, а 0.
Можно.
#property indicator_minimum 0
или
#property indicator_maximum 0
тогда уровень 0 будет закреплён внизу или вверху...

а если надо в середине окна, то минимум и максимум должны быть на одном расстоянии в - и в + но это ты не хочешь... а другого не дано.
 
Верх