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

Ugar

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

star603

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

AlexeyVik

Программист mql4 mql5
Как определить время закрытия любой свечи?( кодом)
Вот кусок из индикатора
Код:
    MqlTick mqlTick[];
    CopyTicks(_Symbol, mqlTick, COPY_TICKS_ALL, 0, 2);
    tick_0 = (string)mqlTick[0].time+"."+string(mqlTick[0].time_msc%1000);// Время предпоследнего тика с миллисекундами
    tick_1 = (string)mqlTick[1].time+"."+string(mqlTick[1].time_msc%1000);// Время последнего тика с миллисекундами
На новом баре получаешь два последних тика, один получается первый на новом баре, а нулевой это последний тик закрытого бара.
 

star603

Новичок форума
PHP:
//+------------------------------------------------------------------+
//| 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
 

ИванМН

Местный знаток
PHP:
//+------------------------------------------------------------------+
//| 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! Даже завораживает, классы пошли...

C-подобный:
Comment(DoubleToStr(LOT.DanLot(0.56),2));
 

star603

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

C-подобный:
Comment(DoubleToStr(LOT.DanLot(0.56),2));
Спасибо. Теперь буду думать как обратно преобразовать в дабл. Потому что если его вставить в ордер сенд то выдаст ошибку.
 
Последнее редактирование:

mobidik

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

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
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[bar]-Close[bar];
      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);
  }
//+------------------------------------------------------------------+

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

ИванМН

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

блондинка

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

Вложения

mobidik

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

Вложения

блондинка

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

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)

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

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

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

Вложения

  • S2.mq4
    S2.mq4
    7,6 КБ · Просмотры: 10
Последнее редактирование:

AlexeyVik

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

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

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

PHP:
      Comment(candle.Pinbar(189));
         Print("№=",i,"Date=",Time[i]);
А ты уверен что у тебя на графике есть двести тысяч баров¿¿¿
 

ИванМН

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

star603

Новичок форума
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[bar]- Close[bar];
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
 

Отслеживают (499) Посмотреть

Верх