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

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

---

## Ugar — 2024-06-26 07:34

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

В МТ4 не предусмотрена возможность плавающего стоплевела. По этому ДЦ часто привязывают его к плавающему спреду. Например Альпари, счёт стандарт. Минимальный стоп =спреду. Разница между покупкой и продажей, это ещё спред. Получается что запрещено ставить стоп лосс на расстояние 2 спреда от цены открытия. Итого можно поставить на расстоянии от цены открытия 2 спреда + 1 пункт или дальше.
На Альпари ECN можно ставить даже внутри спреда.  Итого можно поставить на расстоянии от цены открытия спред + 1 пункт или дальше. Можно даже поставить внутри спреда, то есть на расстоянии 1 пункт от цены открытия, но это закроет позицию. 
У других ДЦ может быть по другому. Надо читать торговые условия.

## star603 — 2024-07-03 20:30

Как определить время закрытия любой свечи?( кодом)

## AlexeyVik — 2024-07-03 21:51

> Цитата (star603):
> Как определить время закрытия любой свечи?( кодом)

Вот кусок из индикатора

```
    MqlTick mqlTick[];
    CopyTicks(_Symbol, mqlTick, COPY_TICKS_ALL, 0, 2);
    tick_0 = (string)mqlTick.time+"."+string(mqlTick.time_msc%1000);// Время предпоследнего тика с миллисекундами
    tick_1 = (string)mqlTick.time+"."+string(mqlTick.time_msc%1000);// Время последнего тика с миллисекундами

```

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

## star603 — 2024-07-10 05:59

```
//+------------------------------------------------------------------+
//| S2.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class Lot
{
private:
double lot;
public:
double DanLot(double dlot)
{
lot = NormalizeDouble(dlot,2);
return(lot);
}
} LOT;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
Comment(LOT.DanLot(0.56));
}
//+------------------------------------------------------------------+
Почему то не выдает нормализованное значение лота.

Выдает 0,5600000000000001
```

## ИванМН — 2024-07-10 15:41

> Цитата (star603):
> 
```
//+------------------------------------------------------------------+
> //| S2.mq4 |
> //| Copyright 2021, MetaQuotes Software Corp. |
> //| https://www.mql5.com |
> //+------------------------------------------------------------------+
> #property copyright "Copyright 2021, MetaQuotes Software Corp."
> #property link "https://www.mql5.com"
> #property version "1.00"
> #property strict
> //+------------------------------------------------------------------+
> //| |
> //+------------------------------------------------------------------+
> class Lot
> {
> private:
> double lot;
> public:
> double DanLot(double dlot)
> {
> lot = NormalizeDouble(dlot,2);
> return(lot);
> }
> } LOT;
> //+------------------------------------------------------------------+
> //| Expert initialization function |
> //+------------------------------------------------------------------+
> int OnInit()
> {
> //---
> //---
> return(INIT_SUCCEEDED);
> }
> //+------------------------------------------------------------------+
> //| Expert deinitialization function |
> //+------------------------------------------------------------------+
> void OnDeinit(const int reason)
> {
> //---
> }
> //+------------------------------------------------------------------+
> //| Expert tick function |
> //+------------------------------------------------------------------+
> void OnTick()
> {
> Comment(LOT.DanLot(0.56));
> }
> //+------------------------------------------------------------------+
> Почему то не выдает нормализованное значение лота.
>
> Выдает 0,5600000000000001
```

Оооо, да Вы в ООП подались, wow! Даже завораживает, классы пошли...

```
Comment(DoubleToStr(LOT.DanLot(0.56),2));
```

## star603 — 2024-07-10 21:44

> Цитата (ИванМН):
> Оооо, да Вы в ООП подались, wow! Даже завораживает, классы пошли...
>
> 
```
Comment(DoubleToStr(LOT.DanLot(0.56),2));
```

Спасибо. Теперь буду думать как обратно преобразовать в дабл. Потому что если его вставить в ордер сенд то выдаст ошибку.

## mobidik — 2024-07-10 22:35

> Цитата (star603):
> Спасибо. Теперь буду думать как обратно преобразовать в дабл. Потому что если его вставить в ордер сенд то выдаст ошибку.

Быть может, прежде чем лесть в ООП, следует сперва изучить элементарные вещи и поработать над логикой кода..?

## star603 — 2024-07-10 23:05

```
//+------------------------------------------------------------------+
//|                                                           S2.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern string lt = "0.56";
class Candle
  {
private:
   double            open;                  // цена открытия
   double            close;                 // цена закрытия
   double            high;                  // максимум
   double            low;                   // минимум
   long              volume;                // тиковый объём
   datetime          time_op;               // время открытия
   uchar             type;                  // тип свечи (1-бычья, 2-медвежья)
   int               height_full;           // общая высота свечи
   int               height_body;           // размер тела свечи
   int               height_top_shadow;     // размер верхней тени
   int               height_bottom_shadow;  // размер нижней тени
public:
   double              Kind_Candle(int bar)//Вид свечи
     {
      double body = Open-Close;
      if(body<0.0)
         type = 2;//бычья
      if(body>0.0)
         type = 1;//медвежья
      return(type);
     };
  } candle;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Lot
  {
private:
   double            lot;
public:
   double            DanLot(string dlot)
     {
      lot = StrToDouble(dlot);
      return(lot);
     }
  } LOT;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- получим минимальное значение Stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- вычисленные значения цен SL и TP должны быть нормализованы
   double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
   double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- размещаем рыночный ордер на покупку 1 лота
   int ticket=OrderSend(Symbol(),OP_BUY,LOT.DanLot(lt),price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
 получилось
```

## star603 — 2024-07-10 23:06

> Цитата (mobidik):
> Быть может, прежде чем лесть в ООП, следует сперва изучить элементарные вещи и поработать над логикой кода..?

Подскажи что не так пожалуйста.

## ИванМН — 2024-07-11 01:48

> Цитата (star603):
> Теперь буду думать как обратно преобразовать в дабл.

Не надо ничего преобразовывать. Приведение к строковому типу выполняется только для функции Comment только в этом её вызове - мы же не производим присвоения результата приведения какой-либо переменной, и он не сохраняется в памяти. В OrderSend вставляете без DoubleToStr.

## блондинка — 2024-07-12 15:21

граждане)
что то не как не могу прицепится к стрелкам этого индикатор через iCustom
даже непонятны номера буферов-хотя открытый код, заковыристый
прошу намекните)

## mobidik — 2024-07-12 16:17

> Цитата (блондинка):
> граждане)
> что то не как не могу прицепится к стрелкам этого индикатор через iCustom
> даже непонятны номера буферов-хотя открытый код, заковыристый
> прошу намекните)

В тестере, при вызове все работает как есть, а вот на реальном графике, при вызове, работать не будет. Ему нужно пользовательское событие, которое возможно только при работе индикатора на самом графике. Малость подшаманил, забирай:

## блондинка — 2024-07-12 17:28

> Цитата (mobidik):
> В тестере, при вызове все работает как есть, а вот на реальном графике, при вызове, работать не будет. Ему нужно пользовательское событие, которое возможно только при работе индикатора на самом графике. Малость подшаманил, забирай:

всегда выручаете )
благодарю!

## star603 — 2024-08-03 11:58

При такой записи в OnTick() выдает критическу ошибку:
2024.08.03 12:03:42.393    2008.01.02 09:01:00  S2 EURUSD,Daily: zero divide in 'S2.mq4' (77,16)

   for(int i=0; i<200000; i++)
     {
      if(candle.Pinbar(i)==true)
         Print("№=",i,"Date=",Time);
     }

а при такой работает как надо выдает тру или фолс

      Comment(candle.Pinbar(189));
         Print("№=",i,"Date=",Time);

## AlexeyVik — 2024-08-03 12:18

> Цитата (star603):
> При такой записи в OnTick() выдает критическу ошибку:
> 2024.08.03 12:03:42.393    2008.01.02 09:01:00  S2 EURUSD,Daily: zero divide in 'S2.mq4' (77,16)
>
> 
>    for(int i=0; i<200000; i++)
>      {
>       if(candle.Pinbar(i)==true)
>          Print("№=",i,"Date=",Time);
>      }
> 
>
> а при такой работает как надо выдает тру или фолс
>
> 
>       Comment(candle.Pinbar(189));
>          Print("№=",i,"Date=",Time);
> 

А ты уверен что у тебя на графике есть двести тысяч баров¿¿¿

## star603 — 2024-08-03 12:56

> Цитата (AlexeyVik):
> А ты уверен что у тебя на графике есть двести тысяч баров¿¿¿

даже при 100 тоже

## ИванМН — 2024-08-03 14:09

На пинбарах функция Candle_body возвращает ноль. А в 77-й строке Вы производите деление на результат, возвращённый этой функцией. Стоит ли удивляться возникновению ошибки?

## MakarFX — 2024-08-03 14:17

> Цитата (star603):
> даже при 100 тоже

## star603 — 2024-08-03 14:51

> Цитата (ИванМН):
> На пинбарах функция Candle_body возвращает ноль. А в 77-й строке Вы производите деление на результат, возвращённый этой функцией. Стоит ли удивляться возникновению ошибки?

спасибо

## star603 — 2024-08-07 19:34

class Candle
  {
private:
   double            open;                  // цена открытия
   double            close;                 // цена закрытия
   double            high;                  // максимум
   double            low;                   // минимум
   long              volume;                // тиковый объём
   datetime          time_op;               // время открытия
   uchar             type;                  // тип свечи (1-бычья, 2-медвежья)
   int               height_full;           // общая высота свечи
   int               height_body;           // размер тела свечи
   int               height_top_shadow;     // размер верхней тени
   int               height_bottom_shadow;  // размер нижней тени
public:
   uchar             Candle_type(int bar)
     {
      double body_type = Open- Close;
      if(body_type<0)
         type = 1;
      else
         type =0;
      return(type);
     }

void OnTick()
  {
   for(int i=1; i<Bars; i++)
     {
      int p = 0;
      if(candle.Candle_type(i)==0)
        {
         p++;
         Print("i=",i, "type=", candle.Candle_type(i),"p=",p++);
        }
     }
  }

Почему так выдает:

2024.08.07 19:32:14.255    2008.01.02 09:31:40  S2 EURUSD,Daily: i=997type=0p=1
2024.08.07 19:32:14.255    2008.01.02 09:31:40  S2 EURUSD,Daily: i=996type=0p=1
2024.08.07 19:32:14.255    2008.01.02 09:31:40  S2 EURUSD,Daily: i=993type=0p=1
2024.08.07 19:32:14.255    2008.01.02 09:31:40  S2 EURUSD,Daily: i=992type=0p=1
2024.08.07 19:32:14.255    2008.01.02 09:31:40  S2 EURUSD,Daily: i=990type=0p=1
2024.08.07 19:32:14.255    2008.01.02 09:31:40  S2 EURUSD,Daily: i=987type=0p=1

---

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