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

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

C-подобный:
Comment(DoubleToStr(LOT.DanLot(0.56),2));
Спасибо. Теперь буду думать как обратно преобразовать в дабл. Потому что если его вставить в ордер сенд то выдаст ошибку.
 
Последнее редактирование:
Спасибо. Теперь буду думать как обратно преобразовать в дабл. Потому что если его вставить в ордер сенд то выдаст ошибку.
Быть может, прежде чем лесть в ООП, следует сперва изучить элементарные вещи и поработать над логикой кода..?
 
Код:
//+------------------------------------------------------------------+
//|                                                           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
даже непонятны номера буферов-хотя открытый код, заковыристый
прошу намекните)
 

Вложения

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

Вложения

В тестере, при вызове все работает как есть, а вот на реальном графике, при вызове, работать не будет. Ему нужно пользовательское событие, которое возможно только при работе индикатора на самом графике. Малость подшаманил, забирай:
всегда выручаете )
благодарю!
 
При такой записи в 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 КБ · Просмотры: 16
Последнее редактирование:
При такой записи в 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-й строке Вы производите деление на результат, возвращённый этой функцией. Стоит ли удивляться возникновению ошибки?
 
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
 

Посмотрели (401) Посмотреть

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

Назад
Верх