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

AlexeyVik

Программист mql4 mql5
прет,
хотел сделать чтоб робот работал после открытия ордера вручную и вел дальше...
какой меджик прописать чтоб он определял и вел их дальше правильно? 0?
Правильно, но хотя-бы проверку по символу сделай.
 

vetallic

Местный знаток
проверку прошел, я ему номер присвоил, терь просто убрать хочу... :)
 

vetallic

Местный знаток
состряпал робота прогнал все ок, просто надо чтоб 1й ордер ручной учитывал...
 

Алекc1234

Местный житель
Привет всем. Преобразовал сов из mql4 в mql5. И при компиляции пишет две ошибки
unexpected end of program - показывает на самую последнюю закрываемую скобку}
unbalanced parentheses - показывает на начало int OnInit() {
Может кто-нибудь подсказать, это возможно исправить?
 

Energetik777

Активный участник
Привет всем. Преобразовал сов из mql4 в mql5. И при компиляции пишет две ошибки
unexpected end of program - показывает на самую последнюю закрываемую скобку}
unbalanced parentheses - показывает на начало int OnInit() {
Может кто-нибудь подсказать, это возможно исправить?

Количество фигурных скобок вручную проверь, либо где-то лишняя, либо не хватает.
 

ale002

::: __,,,^._.^,,,__ :::
В MetaEditor 5 парные скобки и так подсвечиваются. Он вообще ощутимо удобней
 

hoz

Активный участник
Вот функции открытия ордеров байлимит и селлимит и сама торговая функция:

PHP:
Expand Collapse Copy
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
int OpenBuy()
{
  g_ticket = -1;
  string myNote = "сов баянул";
         
  g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  return(g_ticket);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
int OpenSell()
{
  g_ticket = -1;
  string myNote = "сов шортанул";

  g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  return(g_ticket);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY && FindOrders() == 0)
  {
    g_ticket = OpenBuy();
  }
  if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
    if(i_sl > 0)
      sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
    if(i_tp > 0)
      tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
  
  Print("slb = ", sl); Print("tpb = ", tp);
      
    if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
    {
      if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
      Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
      {
       OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
       return(true);
      }
    }
  }  
    
    
  if(signal == SIGNAL_SELL && FindOrders() == 0)
  {
    g_ticket = OpenSell();
  }
  
  if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
    if(i_sl > 0)
       sl = NormalizeDouble(OrderOpenPrice() + i_sl*Point,Digits);
    if(i_tp > 0)
       tp = NormalizeDouble(OrderOpenPrice() - i_tp*Point,Digits);

       Print("slb = ", sl); Print("tpb = ", tp);
       Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());

    if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
    {
      if((OrderOpenPrice() - tp >= g_stopLevel) && (sl - OrderOpenPrice() >= g_stopLevel))
      Print("sls_cor = ", sl); Print("tps_cor = ", tp);
      {
        OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
        return(true);
      }
    }
  }
return(true);
}


Суть такая. Чтоб советник то работает, но раз за разом вылазит ошибка 130
Согласно справке это неверные стопы. Но я прогоняю в визуале и принтовал, стопы вполне адекватные. Что тут может быть не так?
Функцию я написал вроде как правильно и логично всё.

Здесь g_stopLevel - это стоплевел есс-но.
i_sl и i_tp - это вводные СтопЛосс и ТейкПрофит.
 
Последнее редактирование модератором:

eevviill

Заблокирован
Вот функции открытия ордеров байлимит и селлимит и сама торговая функция:

...
Суть такая. Чтоб советник то работает, но раз за разом вылазит ошибка 130
Согласно справке это неверные стопы. Но я прогоняю в визуале и принтовал, стопы вполне адекватные. Что тут может быть не так?
Функцию я написал вроде как правильно и логично всё.

Здесь g_stopLevel - это стоплевел есс-но.
i_sl и i_tp - это вводные СтопЛосс и ТейкПрофит.
Стопы это не только стопы, но и цены отложек. Скорее всего ты выставляешь или слишком близко к цене или не в той стороне(байстоп ниже цены).
 

hoz

Активный участник
Стопы это не только стопы, но и цены отложек. Скорее всего ты выставляешь или слишком близко к цене или не в той стороне(байстоп ниже цены).

Слишком близко к цене не может быть, т.к. у меня условие же есть:

PHP:
Expand Collapse Copy
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
    {
      if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
      {
       OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
       return(true);
      }
    }

Вот тут сравниевается же ТП и СЛ с g_stopLevel т.е. со стоплевелом.

Я распринтовал ф-цию целиком, что ещё не принтовал, и, оказалось, что в проверке:

PHP:
Expand Collapse Copy
if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)

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

Код:
Expand Collapse Copy
2012.12.06 23:13:56	2008.12.09 10:23  Gann_2Days GBPUSD,H1: OrderStopLoss() = 1.5039
2012.12.06 23:13:56	2008.12.09 10:23  Gann_2Days GBPUSD,H1: OrderTakeProfit() = 1.4949

Это странно очень. Такое разве бывает, что значение какой-н. переменной всплывает какое-н., когда её не объявляли?
 

hoz

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

PHP:
Expand Collapse Copy
bool Trade (int signal)
{
  double OSL = OrderStopLoss();
  double OTP = OrderTakeProfit();
  double sl = 0, tp = 0;
  OSL = 0; OTP = 0;
  
  Print("OSL = ", OSL); Print("OTP = ", OTP);
  Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());


Далее начинается самое интересно! Я принтую как переменные так и полные названия соответствующих им ф-ций и вижу:

PHP:
Expand Collapse Copy
2012.12.07 00:27:54	2008.12.05 00:03  Gann_2Days GBPUSD,H1: open #1 buy limit 0.10 GBPUSD at 1.46425 ok
2012.12.07 00:27:54	2008.12.05 00:03  Gann_2Days GBPUSD,H1: OrderStopLoss() = 1.4639
2012.12.07 00:27:54	2008.12.05 00:03  Gann_2Days GBPUSD,H1: OrderTakeProfit() = 1.4729
2012.12.07 00:27:54	2008.12.05 00:03  Gann_2Days GBPUSD,H1: OTP = 0
2012.12.07 00:27:54	2008.12.05 00:03  Gann_2Days GBPUSD,H1: OSL = 0
2012.12.07 00:27:51	Gann_2Days inputs: i_sl=450; i_tp=450; i_momTF=60; i_momPeriod=18;


Что это такое? Глюки МТ4 ?

По логике должно распринтовать одинаковые значения для OrderStopLoss() и OSL, и, соответственно, для OrderTakeProfit() и OTP.
 
Последнее редактирование модератором:

Ugar

Гуру форума
В общем-то я покопался и понял, где косяк. Вот добавил в начале ф-ции специально переменные OSL и OSL, и обнулил эти значение.


double OSL = OrderStopLoss();
double OTP = OrderTakeProfit();
double sl = 0, tp = 0;
OSL = 0; OTP = 0;

Print("OSL = ", OSL); Print("OTP = ", OTP);
Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());


Далее начинается самое интересно! Я принтую как переменные так и полные названия соответствующих им ф-ций и вижу:

Что это такое? Глюки МТ4 ?

По логике должно распринтовать одинаковые значения для OrderStopLoss() и OSL, и, соответственно, для OrderTakeProfit() и OTP.
Глюки в голове. Чё написал то и принтуется. Сам же обнулил значения OSL и OTP, с чего они вдруг должны быть равны OrderStopLoss() и OrderTakeProfit() ?
Сам себя запутываешь, а потом ищешь глюки в МТ4.
 
Последнее редактирование:

hoz

Активный участник
Глюки в голове. Чё написал то и принтуется. Сам же обнулил значения OSL и OTP, с чего они вдруг должны быть равны OrderStopLoss() и OrderTakeProfit() ?
Сам себя запутываешь, а потом ищешь глюки в МТ4.

Поздно писал, ошибся. Но тут возникает момент. Вот так сделать нельзя:

PHP:
Expand Collapse Copy
bool Trade (int signal)
{
  double OSL = 0;
  double OTP = 0;
  OrderStopLoss() = OSL;
  //double OTP = OrderTakeProfit();
  double sl = 0, tp = 0;
  
  Print("OSL = ", OSL); Print("OTP = ", OTP);
  Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());


Т.е. присвоить значение переменной OrderStopLoss() значение переменной OSL. Так же нет возможности обнулить значение переменной, т.е.:

Код:
Expand Collapse Copy
OrderStopLoss()


Так написать неверно, т.к. не компилится в таком виде.
Но на входу у меня OrderStopLoss() и OrderTakeProfit() уже имею значения, которые им не давались по коду выше. Как мне их обнулить тогда?
 

Ugar

Гуру форума
Поздно писал, ошибся. Но тут возникает момент. Вот так сделать нельзя:

PHP:
Expand Collapse Copy
bool Trade (int signal)
{
  double OSL = 0;
  double OTP = 0;
  OrderStopLoss() = OSL;
  //double OTP = OrderTakeProfit();
  double sl = 0, tp = 0;
  
  Print("OSL = ", OSL); Print("OTP = ", OTP);
  Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());
Т.е. присвоить значение переменной OrderStopLoss() значение переменной OSL. Так же нет возможности обнулить значение переменной, т.е.:

Код:
Expand Collapse Copy
OrderStopLoss()
Так написать неверно, т.к. не компилится в таком виде.
Но на входу у меня OrderStopLoss() и OrderTakeProfit() уже имею значения, которые им не давались по коду выше. Как мне их обнулить тогда?
Никак нельзя обнулить переменные OrderStopLoss() и OrderTakeProfit(). Хотя бы потому что это не переменные, а функци. Они возвращают значения стоп лосс и тейк профит выбранного ордера. Что бы они возвращали 0, нужно предварительно выбрать ордер без стоп лосс и тейк профит уровней.
Может стоит сначала заглянуть в справочник, а лучше в учебник? Пожалуй для того кто путает функции с переменными, стоит начинать с учебника. А про пользовательские функции стоит вообще пока забыть. Вот когда будет написано куча программ и в них будут часто использоваться одинаковые куски кода, много кратно проверенные и отлаженные, стоит подумать о выделении их в функции и библиотеки.
 

hoz

Активный участник
Никак нельзя обнулить переменные OrderStopLoss() и OrderTakeProfit(). Хотя бы потому что это не переменные, а функци. Они возвращают значения стоп лосс и тейк профит выбранного ордера. Что бы они возвращали 0, нужно предварительно выбрать ордер без стоп лосс и тейк профит уровней.
Может стоит сначала заглянуть в справочник, а лучше в учебник? Пожалуй для того кто путает функции с переменными, стоит начинать с учебника. А про пользовательские функции стоит вообще пока забыть. Вот когда будет написано куча программ и в них будут часто использоваться одинаковые куски кода, много кратно проверенные и отлаженные, стоит подумать о выделении их в функции и библиотеки.


Учебник я уже перечитал несколько раз, то что там есть уже в курсе. То что это функция я понимаю, написал неверно просто поспешке. У меня выделены ордера канкретно без ТП и без СЛ. Но всё равно откуда-то появляются значения у OrderStopLoss() и OrderTakeProfit().

PHP:
Expand Collapse Copy
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  double sl = 0, tp = 0;
  
  Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());

  if(signal == SIGNAL_BUY && FindOrders() < 5)
  {
    g_ticket = OpenBuy();
  }
  if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
    if(i_sl > 0)
      sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
    if(i_tp > 0)
      tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
  
 // Print("slb = ", sl); Print("tpb = ", tp);
    
 //   Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());  
    if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
    {
      if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
      Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
      {
       OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
       return(true);
      }
    }
  }  
    
    
  if(signal == SIGNAL_SELL && FindOrders() < 5)
  {
    g_ticket = OpenSell();
  }
  
  if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
    if(i_sl > 0)
       sl = NormalizeDouble(OrderOpenPrice() + i_sl*Point,Digits);
    if(i_tp > 0)
       tp = NormalizeDouble(OrderOpenPrice() - i_tp*Point,Digits);

       Print("slb = ", sl); Print("tpb = ", tp);
     //  Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());

    if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
    {
      if((OrderOpenPrice() - tp >= g_stopLevel) && (sl - OrderOpenPrice() >= g_stopLevel))
      Print("sls_cor = ", sl); Print("tps_cor = ", tp);
      {
        OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
        return(true);
      }
    }
  }
return(true);
}
А Вот сами OpenBuy() и OpenSell():

PHP:
Expand Collapse Copy
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
int OpenBuy()
{
  g_ticket = -1;
  string myNote = "сов баянул";
         
  g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  return(g_ticket);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
int OpenSell()
{
  g_ticket = -1;
  string myNote = "сов шортанул";

  g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  return(g_ticket);
}
Всё написано чётко с пониманием. В коде видно. Тейк и Стоп по нулям при открытии... Тем не менее откуда не возьмись они появились.
 
Последнее редактирование модератором:

Ugar

Гуру форума
В справочнике написано:
double OrderStopLoss( )Возвращает значение цены закрытия позиции при достижении уровня убыточности (stop loss) для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
 

hoz

Активный участник
Странно. Я то логику понимаю. Но они же и так были выбраны, все условия были внутри ф-ции OrderSelect() у меня изначально. Вот первый вариант:

PHP:
Expand Collapse Copy
if(signal == SIGNAL_BUY && FindOrders() < 5)
  {
    g_ticket = OpenBuy();
  }
  if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
    if(i_sl > 0)
      sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
    if(i_tp > 0)
      tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
  
 // Print("slb = ", sl); Print("tpb = ", tp);
    
 //   Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());  
    if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
    {
      if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
      Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
      {
       OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
       return(true);
      }
    }
  }

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


PHP:
Expand Collapse Copy
if(signal == SIGNAL_BUY && FindOrders() < 5)
  {
    g_ticket = OpenBuy();
  }
  if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
    if(i_sl > 0)
      sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
    if(i_tp > 0)
      tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
  
 // Print("slb = ", sl); Print("tpb = ", tp);
    
 //   Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());  
    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderTakeProfit() == 0 && OrderStopLoss() == 0)
      {
        if((tp - OrderOpenPrice() >= g_stopLevel) && (OrderOpenPrice() - sl >= g_stopLevel))
        Print("slb_cor = ", sl); Print("tpb_cor = ", tp);
        {
          OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
          return(true);
        }
      }
    }
  `}
 
Последнее редактирование модератором:

Ugar

Гуру форума
А если 10 раз выбрать один и тот же ордер, может советник станет в 10 раз прибыльней? И пользовательских функций надо побольше наплодить, что бы каждая из другой вызывалась, тогда точно будет печатать баксы быстрее ФРС.
Сам себя запутываешь. Пиши максимально просто, что бы сам понимал что написал.
 
Последнее редактирование:

hoz

Активный участник
А если 10 раз выбрать один и тот же ордер, может советник станет в 10 раз прибыльней? И пользовательских функций надо побольше наплодить, что бы каждая из другой вызывалась, тогда точно будет печатать баксы быстрее ФРС.
Сам себя запутываешь. Пиши максимально просто, что бы сам понимал что написал.

Ugar, ты же меня сам запутал:oops: У меня же и до того были выбраны ордера, которые в последствии по коду модифицируются.
Вот я всё исправил в данной функции. Всё лишнее пока что убрал. Ошибка 130 всё-равно на месте. Может есть что посоветовать? Читать учебник одно, а практике это уже другое.
PHP:
Expand Collapse Copy
bool Trade (int signal)
{
  double sl = 0, tp = 0;
  
  Print("OrderTakeProfit() = ", OrderTakeProfit()); Print("OrderStopLoss() = ", OrderStopLoss());

  if(signal == SIGNAL_BUY && FindOrders() == 0)
  {
    g_ticket = OpenBuy();
  
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(i_sl != 0)
        sl = NormalizeDouble(OrderOpenPrice() - i_sl*Point,Digits);
      if(i_tp != 0)
        tp = NormalizeDouble(OrderOpenPrice() + i_tp*Point,Digits);
    }  
  }  
  else if(signal == SIGNAL_SELL && FindOrders() == 0)
  {
    g_ticket = OpenSell();
  
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(i_sl != 0)
         sl = NormalizeDouble(OrderOpenPrice() + i_sl*Point,Digits);
      if(i_tp != 0)
         tp = NormalizeDouble(OrderOpenPrice() - i_tp*Point,Digits);
    }
  }
  if(sl != 0 || tp != 0)
  {
    OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
    return(true);
  }
return(true);
}
 
Последнее редактирование модератором:
Верх