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

star603

Новичок форума
Вот тебе и ответ на вопрос
сделал как посоветовали выдает ошибку так же
Код:
void OnTick()
  {
   if(f_IsNewBar()==true)
     {
      if(Open[1]-Close[1]>0 && Open[2]-Close[2]>0 && Open[3]-Close[3]>0)
        {
         ticket2 = OrderSend(_Symbol,OP_BUY,UstLot(),Ask,Slippage,Stop1(0),0.0,NULL,Magic,clrAqua);
         ticket1 = OrderSend(_Symbol,OP_SELL,UstLot(),Bid,Slippage,Stop1(1),0.0,NULL,Magic,clrAqua);
        }
     }
  }
 
double Stop1(int order_type=-1)
  {
   double sl =0.0;
   switch(stop)//Выбор стопов
     {
      case 1:
         if(order_type==0)
            sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
         if(order_type==1)
            sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
         break;
      case 2:
         if(order_type==0)       
            sl = NormalizeDouble(Bid-StopLoss*Point,Digits);
         if(order_type==1)
            sl = NormalizeDouble(Ask+(MarketInfo(Symbol(),MODE_SPREAD)*Point+StopLoss)*Point,Digits);
         break;
     }
   return(order_type);
  }
 

ИванМН

Местный знаток
Тихая жуть (стиль)...

1. Старайтесь никогда не устанавливать тейки и стопы сразу при отправке приказа на открытие позиции с рынка. Сначала надо открыть одну позицию, удостовериться, что она открылась, затем выбрать её и уже затем при помощи OrderModify установить ТП и СЛ, также удостоверившись, что установка прошла успешно. Затем всё то же самое проделать со второй позицией.
2. Зачем в функции Stop1 умолчательное значение аргумента -1, если по факту в функции оно нигде не обрабатывается?
3. Где должны стоять ТП и СЛ в случае case 1? STOPLEVEL может принимать нулевое значение, в таком случае у Вас функция будет пытаться установить то и другое на цену открытия позиций, что, естественно, приведёт к ошибке. Да даже если STOPLEVEL и не будет нулевым, а просто небольшим, то цена, например, на активном рынке, пока сов будет вычислять уровни, может резко уйти за этот уровень и Вы также получите ошибку. STOPLEVEL здесь вообще ни к чему, с ним нужно ещё до вызова OrderModify сопоставить желаемые цены, и, если они выше него, начинать установку.
4. Из 28-й строки вторую открывающую и третью закрывающую скобки убрать.
5. Зачем функция возвращает аргумент order_type? Она же ведь должна вернуть sl? Она возвращает 0 или 1, оттого Вы и получаете ошибки.
 

MakarFX

Элитный участник
сделал как посоветовали выдает ошибку так же
Код:
void OnTick()
  {
   if(f_IsNewBar()==true)
     {
      if(Open[1]-Close[1]>0 && Open[2]-Close[2]>0 && Open[3]-Close[3]>0)
        {
         ticket2 = OrderSend(_Symbol,OP_BUY,UstLot(),Ask,Slippage,Stop1(0),0.0,NULL,Magic,clrAqua);
         ticket1 = OrderSend(_Symbol,OP_SELL,UstLot(),Bid,Slippage,Stop1(1),0.0,NULL,Magic,clrAqua);
        }
     }
  }
 
double Stop1(int order_type=-1)
  {
   double sl =0.0;
   switch(stop)//Выбор стопов
     {
      case 1:
         if(order_type==0)
            sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
         if(order_type==1)
            sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
         break;
      case 2:
         if(order_type==0)      
            sl = NormalizeDouble(Bid-StopLoss*Point,Digits);
         if(order_type==1)
            sl = NormalizeDouble(Ask+(MarketInfo(Symbol(),MODE_SPREAD)*Point+StopLoss)*Point,Digits);
         break;
     }
   return(order_type);
  }
Где в моем коде switch(stop)???
 

Ugar

Гуру форума
Тихая жуть (стиль)...

1. Старайтесь никогда не устанавливать тейки и стопы сразу при отправке приказа на открытие позиции с рынка. Сначала надо открыть одну позицию, удостовериться, что она открылась, затем выбрать её и уже затем при помощи OrderModify установить ТП и СЛ, также удостоверившись, что установка прошла успешно. Затем всё то же самое проделать со второй позицией.
Чего это? При исполнении по Instant даже лучше сразу со стопом и тейком открывать. Только сначала надо убедиться что исполнение именно по Instant. Лучше что бы ордер не открылся с кривым стопом или тейком, чем открылся без них а потом упорно пытаться к нему присобачить кривой стоп или тейк.
Конечно, лучше сначала проверить все параметры ордера на корректность, прежде чем отправлять, особенно с минимальным стопом привязанным к плавающему спреду.
 

star603

Новичок форума
Чего это? При исполнении по Instant даже лучше сразу со стопом и тейком открывать. Только сначала надо убедиться что исполнение именно по Instant. Лучше что бы ордер не открылся с кривым стопом или тейком, чем открылся без них а потом упорно пытаться к нему присобачить кривой стоп или тейк.
Конечно, лучше сначала проверить все параметры ордера на корректность, прежде чем отправлять, особенно с минимальным стопом привязанным к плавающему спреду.
Есть возможность наверное внутри кейса сделать проверку на минимальный стоп( больше минимального)
 

star603

Новичок форума
C-подобный:
//+------------------------------------------------------------------+
if(f_IsNewBar()==true)
  {
   if(Open[1]-Close[1]>0 && Open[2]-Close[2]>0 && Open[3]-Close[3]>0)
     {
      ticket1 = OrderSend(_Symbol,OP_BUY,UstLot(),Ask,Slippage,Stop(0),Prof(0),NULL,Magic,clrAqua);
      ticket2 = OrderSend(_Symbol,OP_SELL,UstLot(),Bid,Slippage,Stop(1),Prof(1),NULL,Magic,clrAqua);
     }
  }
//+------------------------------------------------------------------+
double Stop(int order_type=-1)
  {
   double sl =0.0;
   if(order_type==0) sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
   if(order_type==1) sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
   return(sl);
  }
//+------------------------------------------------------------------+
Аналогично сделайте для Prof(
Код:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Prof1(int order_type=-1)
  {
   double tp=0.0;
   switch(profi)
     {
      case 0:
         if(order_type==0)
            tp = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
         if(order_type==1)
            tp = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
         break;
      case 1:
         if(order_type==0)
            tp = NormalizeDouble(Ask+TakeProfit*Point,Digits);
         if(order_type==1)
            tp = NormalizeDouble(Bid-TakeProfit*Point,Digits);
         break;
     }
   return(tp);
  }
 

Ugar

Гуру форума
double Stop(int order_type=-1)
{
double sl =0.0;
if(order_type==0) sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
if(order_type==1) sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
return(sl);
}
Это что за прикол?
Если MarketInfo(Symbol(),MODE_STOPLEVEL) = 0 , то стоп будет ставиться на текущую цену. Не поставится, точно.
 

star603

Новичок форума
double Stop(int order_type=-1)
{
double sl =0.0;
if(order_type==0) sl = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
if(order_type==1) sl = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
return(sl);
}
Это что за прикол?
Если MarketInfo(Symbol(),MODE_STOPLEVEL) = 0 , то стоп будет ставиться на текущую цену. Не поставится, точно.
(MarketInfo(Symbol(),MODE_STOPLEVEL)+1,0)*Point

тогда так
 

ИванМН

Местный знаток
Чего это? При исполнении по Instant даже лучше сразу со стопом и тейком открывать. Только сначала надо убедиться что исполнение именно по Instant. Лучше что бы ордер не открылся с кривым стопом или тейком, чем открылся без них а потом упорно пытаться к нему присобачить кривой стоп или тейк.
Конечно, лучше сначала проверить все параметры ордера на корректность, прежде чем отправлять, особенно с минимальным стопом привязанным к плавающему спреду.
Ну, если Инстант, то соглашусь. Хотя... сейчас даже вон Альпы прислали рассылку, что их стандартные (инстантные) счета теперь открываются по рынку, и возникает вопрос: а в чём тогда будет разница, брат, между ними и ECN? Но мне лень у них это выяснять, т.к. сам всегда работал только с ECN.
 

Ugar

Гуру форума
Ну, если Инстант, то соглашусь. Хотя... сейчас даже вон Альпы прислали рассылку, что их стандартные (инстантные) счета теперь открываются по рынку, и возникает вопрос: а в чём тогда будет разница, брат, между ними и ECN? Но мне лень у них это выяснять, т.к. сам всегда работал только с ECN.
Может быть, я давно на Альпари не торговал. Но раньше они сделали наоборот. На ECN позволили открывать сразу со стопами и тейками. Тогда у меня возник вопрос, какой же это Market. Значит какой то синтетический, внутри Альпари. Какой то не настоящий ECN получается.
Сейчас попробовал на счёте Alpari-ECN-Demo без проблем открыл Buy со стопом и тейком. Так что, по крайней мере пока, их Market позволяет открывать со стопом и тейком.
 
Последнее редактирование:

Ugar

Гуру форума
(MarketInfo(Symbol(),MODE_STOPLEVEL)+1,0)*Point

тогда так
Стоплевел + 1 пункт прокатит, если стоплевел >0. И то, если не проскользит. Нужно смотреть спецификацию конкретного брокера и счёта. Где то позволяют ставить на стоплевел+спред+1 пункт, где то внутри спреда, а где то минимум 2 спреда + 1 пункт.
В любом случае, ставить стоп на минимум, значит закрыться по стопу, почти гарантированно.
 

ИванМН

Местный знаток
Андрей, а кстати, в Справке к МетаЭдитору говорится в пояснении к макросу MODE_STOPLEVEL о том, что может иметь место
факт использования торговым сервером внешних механизмов динамического контроля уровней, которые не могут быть транслированы в терминал. Во втором случае GetLastError() может возвращать ошибку 130, так как уровень MODE_STOPLEVEL фактически является "плавающим".
Не знаете, что это за "внешние механизмы" и встречали ли Вы что-то подобное?
 
Верх