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

_SERG_

Активный участник
PriceHigh = iCustom(Symbol() ,0, "100pipstodayscalper", BPERIOD , aTake_Profit , aStop_Loss , 0 , 0);
PriceLow = iCustom(Symbol() ,0, "100pipstodayscalper", BPERIOD , aTake_Profit , aStop_Loss , 2 , 1);
if (OrdersTotal()==0 && PriceHigh>PriceLow && CountBuy()==0 && CountSell() ==0);
{
SL = NormalizeDouble(PriceHigh- aStop_Loss * Point, Digits);
TP = NormalizeDouble(PriceHigh + aTake_Profit *Point,Digits);
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slipage,0,0,coment,Magic,0,Red);
Если уже открыты ордера, и находятся в рынке (OrdersTotal()==0), то не должен открывать, как минимум.
Где ещё есть места отвечающие за "СИГНАЛ" по открытию?
 

gold_traid

Новичок форума
так в том то и дело что на каждой свече открывает
total=OrdersTotal();
if(total<1);
m0=iCustom(Symbol() ,0, "100pipstodayscalper", BPERIOD , aTake_Profit , aStop_Loss , 0 , 0);
m1=iCustom(Symbol() ,0, "100pipstodayscalper", BPERIOD , aTake_Profit , aStop_Loss , 2 , 1);
if(m0>m1)
{

ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,Magic,0,Red);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice());
}
else Print("Error opening Sell order : ",GetLastError());
return;
}



if(m0<m1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask+StopLoss*Point,Ask-TakeProfit*Point,Magic,0,Blue);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return;
}
for (cnt=0;cnt;);

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol());
{
if(OrderType()==OP_BUY)
{

if(m0>m1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return; // exit
 

gold_traid

Новичок форума
Если уже открыты ордера, и находятся в рынке (OrdersTotal()==0), то не должен открывать, как минимум.
Где ещё есть места отвечающие за "СИГНАЛ" по открытию?
вот чего журнал пишет
2015.01.16 02:20:00.669 2013.02.04 00:30 100pipsScalper EURUSD,M5: open #7 buy 0.10 EURUSD at 1.3652 ok
2015.01.16 02:20:00.603 2013.02.04 00:25 100pipsScalper EURUSD,M5: open #6 buy 0.10 EURUSD at 1.3654 ok
2015.01.16 02:20:00.537 2013.02.04 00:20 100pipsScalper EURUSD,M5: open #5 buy 0.10 EURUSD at 1.3654 ok
2015.01.16 02:20:00.471 2013.02.04 00:15 100pipsScalper EURUSD,M5: open #4 buy 0.10 EURUSD at 1.3651 ok
2015.01.16 02:20:00.405 2013.02.04 00:10 100pipsScalper EURUSD,M5: open #3 buy 0.10 EURUSD at 1.3650 ok
2015.01.16 02:20:00.339 2013.02.04 00:05 100pipsScalper EURUSD,M5: open #2 buy 0.10 EURUSD at 1.3648 ok
 

gold_traid

Новичок форума
вот чего журнал пишет
2015.01.16 02:20:00.669 2013.02.04 00:30 100pipsScalper EURUSD,M5: open #7 buy 0.10 EURUSD at 1.3652 ok
2015.01.16 02:20:00.603 2013.02.04 00:25 100pipsScalper EURUSD,M5: open #6 buy 0.10 EURUSD at 1.3654 ok
2015.01.16 02:20:00.537 2013.02.04 00:20 100pipsScalper EURUSD,M5: open #5 buy 0.10 EURUSD at 1.3654 ok
2015.01.16 02:20:00.471 2013.02.04 00:15 100pipsScalper EURUSD,M5: open #4 buy 0.10 EURUSD at 1.3651 ok
2015.01.16 02:20:00.405 2013.02.04 00:10 100pipsScalper EURUSD,M5: open #3 buy 0.10 EURUSD at 1.3650 ok
2015.01.16 02:20:00.339 2013.02.04 00:05 100pipsScalper EURUSD,M5: open #2 buy 0.10 EURUSD at 1.3648 ok
получается что открывается на каждом тике
почему ни как не могу понять
 

_SERG_

Активный участник
так в том то и дело что на каждой свече открывает
Вывод: Условие не отрабатывает.
Способ решения: Запустить в отладчике, и посмотреть, что на самом деле происходит. (А не в собственном воображении.)
 

gold_traid

Новичок форума
Вывод: Условие не отрабатывает.
Способ решения: Запустить в отладчике, и посмотреть, что на самом деле происходит. (А не в собственном воображении.)
выяснилось в чем дело а дело в том что сигналом слкжит изменение цвета индикатора а не его значение на предидущих барах вот тока как описать это условие:question:
 

mobidik

-----
total=OrdersTotal();
if(total<1);
m0=iCustom(Symbol() ,0, "100pipstodayscalper", BPERIOD , aTake_Profit , aStop_Loss , 0 , 0);
m1=iCustom(Symbol() ,0, "100pipstodayscalper", BPERIOD , aTake_Profit , aStop_Loss , 2 , 1);
if(m0>m1)
{

ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,Magic,0,Red);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice());
}
else Print("Error opening Sell order : ",GetLastError());
return;
}



if(m0<m1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask+StopLoss*Point,Ask-TakeProfit*Point,Magic,0,Blue);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return;
}
for (cnt=0;cnt;);

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol());
{
if(OrderType()==OP_BUY)
{

if(m0>m1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return; // exit

У Вас не отрабатывает условие на весь код: if(total<1);
Во первых: после закрытой скобки - убрать точку с запятой.
Во вторых: это условие в таком виде повлияет только на первую строчку идущую после него, т.е. на m0=...., а все остальные строки его игнорируют. Откройте скобку после условия: if(total<1){ и соответственно, закрыть в конце кода, перед return(0);. Пробуйте.
 
Последнее редактирование:

_SERG_

Активный участник
выяснилось в чем дело а дело в том что сигналом слкжит изменение цвета индикатора а не его значение на предидущих барах вот тока как описать это условие:question:
Скрипнем мозгом, и посмотрим туда, где за цвет индикатор отвечает.
А может за численное значение, которое за смену цвет отвечает.
Ну короче, цифра какая была, а какая стала?
(....без твоего участия, там ни чего не происходит. )
 

_SERG_

Активный участник

У Вас не отрабатывает условие на весь код: if(total<1);
Во первых: после закрытой скобки - убрать точку с запятой.
Во вторых: это условие в таком виде повлияет только на первую строчку идущую после него, т.е. на m0=...., а все остальные строки его игнорируют. Откройте скобку после условия: if(total<1){ и соответственно, закрыть в конце кода, перед return(0);. Пробуйте.

Это начиналось с Этого:
if (OrdersTotal()==0 && PriceHigh>PriceLow && CountBuy()==0 && CountSell() ==0);
{
SL = NormalizeDouble(PriceHigh- aStop_Loss * Point, Digits);
TP = NormalizeDouble(PriceHigh + aTake_Profit *Point,Digits);
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slipage,0,0,com ent,Magic,0,Red);
....
а дальше как получилось. :D 3403 я пропустил. УВы.
 
Последнее редактирование:

matro3

Почетный гражданин
Всем доброго времени суток!У меня советник открывает ордер на каждом баре как это поправить?

PHP:
if(pos.exists &&
         ((iBarShift(_Symbol, PeriodTF, pos.last_deal_time, false) <= 0) ||
         (iBarShift(_Symbol, PeriodTF, pos.last_deal_time, false) <= barsToEnter && barsToEnter > 0))
      ) return(ENTER_NONE);

По человечи:
Если позиция открыта и
((последняя сделка была открыта на текущей свече периода PeriodTF)
или
(свеча с последней сделкой на периоде PeriodTF меньше чем кол-во баров для входа и это кол-во больше 0)),
то входа нет
 

Milord

Местный знаток
Помогите плиз - найти ошибку в коде???

уважаемые профи проггеры MQL4, помогите плиз найти ошибку в коде трала, не работает он у меня:facepalm:, цепляю как обычно к советнику, и он у мня не работает, гляньте свежим взглядом что в коде неверно, или лишнее может, брал его из готового советника... мне нужен код в старом билде, например 229, новый пока не освоил, извиняйте, разрабы слишком быстро все меняют, не успеваю гнаться за ними...
ЗАРАНЕЕ СПАСИБО!

PHP:
//-----------------------------------------------------------------
void Tral()
{
  for(int i=0; i<OrdersTotal(); i++) { 
    if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue; 
    if(OrderSymbol() != Symbol()) continue;        

    if(OrderType()==OP_BUY) { 
      if(Bid-OrderOpenPrice()>TrailingStop*Point&&Bid>=OrderOpenPrice()+TrailingStart*Point) { 
        if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) 
          OrderModify(OrderTicket(), OrderOpenPrice(),Bid-TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      } 
    } 

   if(OrderType()==OP_SELL) { 
     if(OrderOpenPrice()-Ask>TrailingStop*Point&& Ask<=OrderOpenPrice()-TrailingStart*Point) { 
        if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point) 
         OrderModify(OrderTicket(), OrderOpenPrice(),Ask+TrailingStop*Point, OrderTakeProfit(), 0, CLR_NONE); 
      }
    } 
  } 
  
}
//------------------------------------------------
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
уважаемые профи проггеры MQL4, помогите плиз найти ошибку в коде трала, не работает он у меня:facepalm:, цепляю как обычно к советнику, и он у мня не работает, гляньте свежим взглядом что в коде неверно, или лишнее может, брал его из готового советника... мне нужен код в старом билде, например 229, новый пока не освоил, извиняйте, разрабы слишком быстро все меняют, не успеваю гнаться за ними...
ЗАРАНЕЕ СПАСИБО!
Если это трейлинг, то проверка должна быть для Buy
if(Bid - OrderStopLoss() > чегото*_point ) а у тебя цена открытия ордера

ps. И отличие от старых принципов в том, что надо обязательно контролировать выполнение хотя-бы так
if(OrderModify(...........) == false) Alert();
А по хорошему, то надо приспособить обработку ошибок и в случае неудачного выполнения, повторить модификацию ордера...
 
Последнее редактирование:

SlavaR

Активный участник
Добрый день.
Требуется чтобы советник от начала своей работы и до выключения помнил состояние баланса и не менял его на всём протяжении работы .
Подскажите пожалуйста как написать эту часть кода? Ничего в голову не приходит. (пользуюсь ещё старым кодом)
 

AlexeyVik

Программист mql4 mql5
Добрый день.
Требуется чтобы советник от начала своей работы и до выключения помнил состояние баланса и не менял его на всём протяжении работы .
Подскажите пожалуйста как написать эту часть кода? Ничего в голову не приходит. (пользуюсь ещё старым кодом)
Ну так объяви переменную на глобальном уровне и присвой в init() ей значение AccountBalance()
 

ansol

Местный знаток
ps. И отличие от старых принципов в том, что надо обязательно контролировать выполнение хотя-бы так
if(OrderModify(...........) == false) Alert();

Да-да, конечно! :D
А еще надо так:
if(a>b==false) alert(); :laugh::laugh::laugh:

Не парь человеку мозги! Если функция возващает булево значение true/false, то ничего делать не надо:
if(OrDerModify(...)) alert();

Такая конструкция не выдает никаких предупреждений, даже если включена строгая проверка #property strict
что является логичным и грамотным :not-bad:
 

AlexeyVik

Программист mql4 mql5
Да-да, конечно! :D
А еще надо так:
if(a>b==false) alert(); :laugh::laugh::laugh:

Не парь человеку мозги! Если функция возващает булево значение true/false, то ничего делать не надо:
if(OrDerModify(...)) alert();

Такая конструкция не выдает никаких предупреждений, даже если включена строгая проверка #property strict
что является логичным и грамотным :not-bad:
Ну нет у меня желания ограничивать тебя в чём-либо. Делай как тебе нравится, но последуй своему совету: "Не парь людям мозги" и не выдирай из текста только то что удобно извратить. Если ты хочешь слышать оповещение об удачном выполнении команды, то ты всё правильно написал. Только не думаешь о том что если по какой-то причине команда не будет выполнена то, не находясь у монитора, ты никогда не услышишь предупреждения.
 

ansol

Местный знаток
Ну нет у меня желания ограничивать тебя в чём-либо. Делай как тебе нравится, но последуй своему совету: "Не парь людям мозги" и не выдирай из текста только то что удобно извратить. Если ты хочешь слышать оповещение об удачном выполнении команды, то ты всё правильно написал. Только не думаешь о том что если по какой-то причине команда не будет выполнена то, не находясь у монитора, ты никогда не услышишь предупреждения.

Я, возможно, неудачно выразился, тогда уточню/поправлюсь:
Данная конструкция будет работать безо вских "=="
Если интересует значение true, то пишем
if(OrderModify(...))
Если false, то
if(!OrderModify(...))
А идиотская конструкция if(OrderModify == true или false) не нужна.
Так понятней?
 

Milord

Местный знаток
Если это трейлинг, то проверка должна быть для Buy
if(Bid - OrderStopLoss() > чегото*_point ) а у тебя цена открытия ордера

ps. И отличие от старых принципов в том, что надо обязательно контролировать выполнение хотя-бы так
if(OrderModify(...........) == false) Alert();
А по хорошему, то надо приспособить обработку ошибок и в случае неудачного выполнения, повторить модификацию ордера...

давайте разберем ошибки кода хотя бы без проверок на ошибки, чтобы было понятнее, у мня вопрос - зачем сравнивать как вы пишете
if(Bid-OrderStopLoss>TrailigStart*Point)

ведь при открытии ордера я могу вапще убрать StopLoss=0
и второй момент, трал начинает работу когда цена идет в нашу сторону, то есть разница между текущей ценой Bid и ценой открытия ордера дает профит, я прав???? но где тогда ошибки в коде, и почему трал не работает..?:please:
 
Верх