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

Раздел: Язык программирования MQL4
Автор темы: chocolate
Создана: 2011-11-07 10:37
Ответов: 9576 | Просмотров: 1111171
Страница 469 из 479
Источник: https://forexsystemru.com/threads/65289/page-469

---

## star603 — 2024-06-21 22:05

> Цитата (AlexeyVik):
> Вот тебе и ответ на вопрос

сделал как посоветовали выдает ошибку так же 

```
void OnTick()
  {
   if(f_IsNewBar()==true)
     {
      if(Open-Close>0 && Open-Close>0 && Open-Close>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);
  }
```

## ИванМН — 2024-06-22 00:45

Тихая жуть (стиль)...

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

## AlexeyVik — 2024-06-22 08:27

> Цитата (star603):
> сделал как посоветовали выдает ошибку так же

Прежде чем что-то делать надо понять предложенное.

## MakarFX — 2024-06-22 13:51

> Цитата (star603):
> сделал как посоветовали выдает ошибку так же
> 
```
void OnTick()
>   {
>    if(f_IsNewBar()==true)
>      {
>       if(Open-Close>0 && Open-Close>0 && Open-Close>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 — 2024-06-24 08:49

> Цитата (ИванМН):
> Тихая жуть (стиль)...
>
> 1. Старайтесь никогда не устанавливать тейки и стопы сразу при отправке приказа на открытие позиции с рынка. Сначала надо открыть одну позицию, удостовериться, что она открылась, затем выбрать её и уже затем при помощи OrderModify установить ТП и СЛ, также удостоверившись, что установка прошла успешно. Затем всё то же самое проделать со второй позицией.

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

## star603 — 2024-06-24 12:07

> Цитата (MakarFX):
> Где в моем коде switch(stop)???

Просто не сколько стопов  планируется. Ваш код выдавал ошибку. Когда сделал возврат sl ошибка пропала.

## star603 — 2024-06-24 12:12

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

Есть возможность наверное внутри кейса сделать проверку на минимальный стоп( больше минимального)

## star603 — 2024-06-24 13:05

> Цитата (MakarFX):
> 
```
//+------------------------------------------------------------------+
> if(f_IsNewBar()==true)
>   {
>    if(Open-Close>0 && Open-Close>0 && Open-Close>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 — 2024-06-24 14:40

MarketInfo(Symbol(),MODE_STOPLEVEL) 
Эта функция у многих брокеров вернёт 0.

## star603 — 2024-06-24 14:42

> Цитата (Ugar):
> MarketInfo(Symbol(),MODE_STOPLEVEL)
> Эта функция у многих брокеров вернёт 0.

а кейс 1 не вернет 0 но все равно не работает

## Ugar — 2024-06-24 14:49

> Цитата (star603):
> а кейс 1 не вернет 0 но все равно не работает

В тестере или не счёте?

## star603 — 2024-06-24 14:54

> Цитата (Ugar):
> В тестере или не счёте?

и там и там

## Ugar — 2024-06-24 14:58

> Цитата (star603):
> и там и там

Сколько TakeProfit? И сколько Digits?

## star603 — 2024-06-24 14:59

> Цитата (Ugar):
> Сколько TakeProfit? И сколько Digits?

tp 1400 digits 5

## Ugar — 2024-06-24 15:02

> Цитата (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 , то стоп будет ставиться на текущую цену. Не поставится, точно.

## star603 — 2024-06-24 15:18

> Цитата (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 , то стоп будет ставиться на текущую цену. Не поставится, точно.

(MarketInfo(Symbol(),MODE_STOPLEVEL)+1,0)*Point

тогда так

## ИванМН — 2024-06-24 15:57

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

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

## Ugar — 2024-06-25 06:55

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

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

## Ugar — 2024-06-25 07:06

> Цитата (star603):
> (MarketInfo(Symbol(),MODE_STOPLEVEL)+1,0)*Point
>
> тогда так

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

## ИванМН — 2024-06-25 14:31

Андрей, а кстати, в Справке к МетаЭдитору говорится в пояснении к макросу MODE_STOPLEVEL о том, что может иметь место

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

Не знаете, что это за "внешние механизмы" и встречали ли Вы что-то подобное?

---

Следующая страница: https://forexsystemru.com/threads/65289/page-470
