![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я новичок в mq4 и пытаюсь создать отображение на экране, когда происходит пересечение MACD. Ниже приведен мой код, но оповещения продолжают появляться каждые несколько минут.
Как я могу закодировать его для отображения предупреждений только один раз в час? Или по одному алерту на бар?
int start()
{
string MACD1="";
цвет colt9;
double MACDM_S10 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_MAIN, 0);
double MACDS_S10 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_SIGNAL,0);
double MACDM_S11 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_MAIN, 1);
double MACDS_S11 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_SIGNAL,1);
if ((MACDM_S11 < MACDS_S11 && MACDM_S10 < MACDS_S10)) { MACD1="IN UPTREND"; colt9=LimeGreen; }
if ((MACDM_S11 > MACDS_S11 && MACDM_S10 > MACDS_S10)) { MACD1="IN DOWNTREND"; colt9=Red; }
if ((MACDM_S11 > MACDS_S11 && MACDM_S10 < MACDS_S10)) { MACD1="NEW UP CROSSING"; colt9=LimeGreen; }
if ((MACDM_S11 MACDS_S10)) { MACD1="NEW DOWN CROSSING"; colt9=Red; }
string MACD2="";
цвет colt14;
double MACDM_L10 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_MAIN, 0);
double MACDS_L10 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_SIGNAL,0);
double MACDM_L11 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_MAIN, 1);
double MACDS_L11 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_SIGNAL,1);
if ((MACDM_L11 < MACDS_L11 && MACDM_L10 < MACDS_L10)) { MACD2="IN UPTREND"; colt14=LimeGreen; }
if ((MACDM_L11 > MACDS_L11 && MACDM_L10 > MACDS_L10)) { MACD2="IN DOWNTREND"; colt14=Red; }
if ((MACDM_L11 > MACDS_L11 && MACDM_L10 < MACDS_L10)) { MACD2="NEW UP CROSSING"; colt14=LimeGreen; }
if ((MACDM_L11 MACDS_L10)) { MACD2="NEW DOWN CROSSING"; colt14=Red; }
if(MACD1=="NEW UP CROSSING"&&MACD2=="IN UPTREND")
Alert(Symbol()," - ", "H1:"," MACD MAIN UPTREND MOVEMENT"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD1=="NEW DOWN CROSSING"&&MACD2=="IN DOWNTREND")
Alert(Symbol()," - ", "H1:"," MACD MAIN DOWNTREND MOVEMENT"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD2=="NEW UP CROSSING"&&MACD1=="IN UPTREND")
Alert(Symbol()," - ", "H1:"," MACD, MAIN TREND CHANGE TO UPTREND"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD2=="NEW DOWN CROSSING"&&MACD1=="IN DOWNTREND")
Alert(Symbol()," - ", "H1:"," MACD, MAIN TREND CHANGE TO DOWNTREND"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
return(0);
}Попробуйте использовать Minute()==1; в условии
Тренд Alexcud для модификации
если (MaH11v < MaH1pr1v){H11v = " V "; co11v = Red; u1x5v = 0; d1x5v = 1;}
если (MaH11v > MaH1pr1v){H11v = " /\\\ "; co11v = Синий; u1x5v = 1; d1x5v = 0;}
if (MaH11v == MaH1pr1v){H11v = " 0 "; co11v = Green; u1x5v = 0; d1x5v = 0;}
привет всем, я пытаюсь модифицировать тренд alexcud (прилагается).
Я хочу только 2 сигнала вверх и вниз вместо 3 с "0"...
чтобы расчеты были более точными...
Есть идеи?
Может ли кто-нибудь помочь мне понять эти строки программы? На простом английском языке![](https://c.mql5.com/forextsd/smiles/biggrin.png)
Речь идет о том, что советник запускает что-то после завершения бара.
Код выглядит следующим образом:
datetime timeprev=0;
// Запуск только один раз на каждый завершенный бар
if(timeprev==Time[0]) return(0);
timeprev = Time[0];
Как я посмотрел в руководстве MQ4, Time[0] предназначен для извлечения времени открытия бара [0]. Оно указывается в секундах от 1 января 1970 года.
Я не понимаю, как это работает. Сначала у нас есть "timeprev=0".
Затем следующая строка "if (timeprev==Time[0]) return(0)".
Каково значение Time[0] в это время? Как получилось, что оно может стать равным 0 (значение "timeprev")?
Следующая строка - "timeprev=Time[0]".
Почему вся эта строка заставляет советника ничего не делать, пока не закончится бар?
Попробуйте использовать Minute()==1; в условии
Это по-прежнему будет срабатывать каждый тик в первую минуту каждого бара. Это может значительно сократить количество, но все равно оповещение будет происходить несколько раз.
Лучше всего установить глобальную переменную (или объект) и установить ее в Time[] последнего бара.
if (Time[0]!=lastTime) {
... alert, whatever...
lastTime=Time[0];
}
Привет,
Я не могу избежать ошибки OrderModify error 1 : всегда появляется, даже если пытаться контролировать, что данные перед модификацией другие! Я пробовал и doublelenormalize... не помогает...
Вот код:
if (Bid-OrderOpenPrice() >= VPoint*BreakEvenAtProfit)
{
if (OrderStopLoss() != OrderOpenPrice() + BreakEvenShift*VPoint)
{
Vresult = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+ BreakEvenShift*VPoint,OrderTakeProfit(),0,Green);
Есть предложения?
Спасибо.Быстрая проверка... убедитесь, что вы не устанавливаете расстояние безубытка слишком коротким. Сверьте его с MarketInfo(Symbol(),MODE_STOPLEVEL), чтобы убедиться, что оно достаточно велико.
Какова цель VPoint? Если это число неверно, оно все испортит. Само по себе "Point" всегда будет правильным. Если это число неверно, это определенно может быть причиной проблемы. Например, оно случайно равно 0 или меньше, чем POINT на самом деле.
Вопрос по простому кодированию
OrderSelect(5555, SELECT_BY_TICKET);
RefreshRates();
if (Ask >= (OrderOpenPrice()+ (5 * Point)) && OrderLots() == 2 && (OrderType() == OP_BUY)) {
OrderClose(5555,1,Ask,10,Red); }
if (Bid <= (OrderOpenPrice()- (5 * Point)) && OrderLots() == 2 && (OrderType() == OP_SELL))) {
OrderClose(5555,1,Bid,10,Blue); }
Все еще пытаюсь научиться...
будет ли это работать для закрытия половины (2 лота до 1) позиции, когда цена удаляется на 5 пунктов от цены открытия?
СПАСИБО!!!!!!
Выглядит примерно так. Хотя это немного грязно. Вы также можете использовать OrderProfit, в зависимости от того, чего вы хотите добиться.
Lux
PS: Забыл упомянуть, что нужно остерегаться брокеров с 5 знаками после запятой. Все нужно умножать на 10, так что в вашем примере 5 будет 50. Удачи!
Выглядит примерно так. Хотя это немного грязно. Вы также можете использовать OrderProfit, в зависимости от того, чего вы хотите добиться.
Люкс
PS: Забыл упомянуть, что нужно остерегаться брокеров с 5 знаками после запятой. Все нужно умножать на 10, так что в вашем примере 5 будет 50. Удачи!Спасибо LUX
Проблема в том, что я запустил его только для отладки на 1-минутном графике GBP/USD с Windsor direct, и он не закрывает 1 лот, когда достигает 5 пунктов, так что я не знаю, в чем дело.
А ТАКЖЕ,
Я пытаюсь закрыть покупку и сразу же открыть продажу, и это тоже не получается.
То получается, то нет...
Я ХОТЕЛ БЫ, ЧТОБЫ ЭТО БЫЛО НАМНОГО проще запрограммировать.
if (*******************) {
RefreshRates();
OrderSelect(5555,SELECT_BY_TICKET);
if (OrdersTotal() > 0 && OrderType()==OP_BUY) {OrderClose(5555, OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");}
Sleep(1500);
RefreshRates();
if (OrdersTotal() ==0) Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 10, 0, 0, 0, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket<0)Print("OrderSend failed with error #",GetLastError());
}
Отладка индикаторов
Я новичок в этом языке и пытаюсь написать индикатор. У меня возникают проблемы, так как нет отладчика. Я пытался использовать Print(), но ничего не выводится. Используя Alert(), я получаю НОЛЬ в качестве вывода для буфера[1]. Кто-нибудь может объяснить мне это, пожалуйста. Как я могу использовать Print() и Alert() для отладки, не получая все нули. Если у кого-нибудь есть идеи, пожалуйста, дайте мне знать. Большое спасибо.
tigger.longtail@gmail.com
ExtMapBuffer1 = iMA(NULL,0,ExtParam1,0,MODE_EMA,PRICE_CLOSE,i);
ExtMapBuffer2 = iMA(NULL,0,ExtParam2,0,MODE_EMA,PRICE_CLOSE,i);
CurrentBar = Time;
if( ExtMapBuffer1 >= ExtMapBuffer2 && CurrentBar == Time && Flag == 0)
{
Alert("ExtMapBuffer1 =", ExtMapBuffer1," Short is Above. ",Hour()," Minute ",Minute());
Alert("ExtMapBuffer2 =", ExtMapBuffer2," Short is Above. ",Hour()," Minute ",Minute());
Print("ExtMapBuffer1 = ", ExtMapBuffer1);
Print("ExtMapBuffer2 = ", ExtMapBuffer2);
все равно не получится