Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте!!! Подскажите пожалуйста как написать функцию в советнике , что бы ордера открывались пересекая линию , которую я выставил заранее  руками в МТ4!!!

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Коллеги, здравствуйте.

Очень надеюсь, что найдется программист, который подскажет, как справиться с вроде бы готовым решением на странице http://tlap.com/indikator-atr/

В своего скальпера вставил самостоятельно код с функцией, запрещающей торговлю при высокой волатильности

extern bool          UseATRFilter = true;
extern int           ATRPer =       14;
extern int           EnvPer =       240;
input ENUM_MA_METHOD EnvMode =      MODE_EMA;
extern double        EnvDev =       10;

bool ATRFilter()
{
   if(!UseATRFilter) return(true);
   double ATR[500];
   for(int i=0;i<=499;i++)
   {
      ATR[i]=iATR(_Symbol,PERIOD_M5,ATRPer,i+1);
   }
   ArraySetAsSeries(ATR,true);
   double ATR1=iATR(_Symbol,PERIOD_M5,ATRPer,1);
   double EnvUp=iEnvelopesOnArray(ATR,0,EnvPer,
                EnvMode,0,EnvDev,MODE_UPPER,0);
   if(ATR1<EnvUp) return(true);
   return(false);
}

и получаю ошибку: 'ATRFilter' - function declarations are allowed on global, namespace or class scope only    

Я, к сожалению, не программист, а только трейдер, и мучаюсь от своего незнания.

Если можете подсказать, что надо добавить, исправить, буду очень признателен!

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@mischkus Вынесите функцию ATRFilter() за пределы OnTick() в глобальное пространство. Пример:

int OnInit()
  {
  }

OnTick(void)

{

}

bool ATRFilter()

{

}

  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
  • @molot_1 Выставив линию, должен залезть в ее свойство и переименовать ее значение "Имя" в "sell" или "buy". Если торгуешь сеткой то последующим линиям даешь другие имена "sell 2","sell 3","buy 2" и "buy 3". Имя нам нужно чтоб мы знали к какой линии мы будем обращаться.
  • Что бы получить цену на которой у нас линия, будь это трендовая или горизонтальная, у нас есть несколько вариантов на выбор:

ObjectGetDouble()

ObjectGet()

ObjectGetValueByShift()

Обращение к линиям идет через имена которые мы определили.

  • Осталось сравнить цену линии с текущей ценой бид или с текущими хаем и лоу текущего бара. По результатам открываем, закрываем ордера или ни чего не делаем.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MikR0ReR Подскажи, пожалуйста, хочу заменить в индикаторе Alert на MessageBox

 

Изменено пользователем MakarFX
Вопрос решен.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MakarFX MessageBox не стоит использовать. Пока ты не нажмешь кнопочку ОК в MessageBox программа MQL полностью останавливает работу.

В твоем случаю модификации тейка и лосса вообще будет действовать как УБИЙЦЕЙ твоего счета!!! Причем это будет выглядеть как СУИЦИД!

Изменено пользователем MikR0ReR
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MikR0ReR Вы можете взглянуть на этот код

Спойлер

//+----------------------------------------------------------------------------+
//|                                                       i-SignalOfTrade.mq4  |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  05.12.2007  Сигнализатор выполнения торговых операций.                    |
//|  13.05.2008  Сигнализация срабатывания отложенного ордера.                 |
//|  29.12.2008  Исправлена ошибка сигнализации удаления ордера.               |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"
#property indicator_chart_window

//------- Внешние параметры индикатора ----------------------------------------+
extern string _P_WhatOutput    = "---------- Что выводить";
extern bool   OutAccountNumber = False;      // Выводить номер счёта
extern bool   OutAccountServer = False;      // Выводить имя активного сервера
extern bool   OutNameExpert    = False;      // Выводить имя эксперта
extern bool   OutDateTime      = False;      // Выводить дату и время
extern bool   UseTimeLocal     = True;      // Использовать локальное время
extern bool   OutTicket        = False;     // Выводить тикет
extern bool   OutMagic         = False;      // Выводить магик
extern bool   OutComment       = False;      // Выводить комментарий
extern string _P_WhereOutput = "---------- Куда выводить";
extern bool   UseAlert    = True;           // Использовать диалоговое окно
extern bool   UseComment  = False;           // Выводить комментарий
extern bool   UsePrint    = False;          // Записывать в журнал
extern bool   UseSendMail = False;          // Посылать электронное письмо
extern bool   UseSendPush = False;          // Посылать Push-уведомление на мобильные терминалы
extern bool   UseSound    = False;           // Использовать звук
extern string sotFileName = "ok.wav";   // Наименование звукового файла

//------- Глобальные переменные индикатора ------------------------------------+
int    sotOTI[];             // тикет   OrderTicket()
int    sotOTY[];             // тип     OrderType()
double sotOOP[];             // цена    OrderOpenPrice()
double sotOSL[];             // стоп    OrderStopLoss()
double sotOTP[];             // тейк    OrderTakeProfit()
bool   sotFirstRun=True;     // Флаг первого прогона


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
void init() {
  sotFirstRun=True;     // Флаг первого прогона
  Comment("");
}

//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
void deinit() { Comment(""); }

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  double p;                  // Размер пункта в валюте котировки
  int    d;                  // Количество цифр после десятичной точки в цене
  int    i;                  // Счётчик операций
  int    in;                 // Индекс элемента массива операций
  int    k=OrdersTotal();    // Количество текущих операций
  int    ot;                 // Тип операции OrderType()
  int    oti[];              // Массив новых тикетов
  string sh="";              // Строка заголовка почтового сообщения
  string st;                 // Строка тела почтового сообщения

  if (sotFirstRun) { MemCurrOP(); sotFirstRun=False; }
  if (OutAccountNumber) sh=DoubleToStr(AccountNumber(), 0)+" ";
  if (OutAccountServer) sh=sh+AccountServer();
  if (StringLen(sh)>0) sh=sh+"\n";
  if (OutDateTime) {
    if (UseTimeLocal) sh=sh+TimeToStr(TimeLocal(), TIME_DATE|TIME_MINUTES)+" ";
    else sh=sh+TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS)+" ";
  }
  if (OutNameExpert) sh=sh+WindowExpertName()+" ";
  if (StringLen(sh)>0) sh=sh+"\n";
  
  // Открытие/Установка новых, модификация существующих
  ArrayResize(oti, k);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      oti[i]=OrderTicket();
      d=MarketInfo(OrderSymbol(), MODE_DIGITS);
      p=MarketInfo(OrderSymbol(), MODE_POINT);
      in=ArraySearchInt(sotOTI, oti[i]);

      // операция НЕ найдена, значит новая
      if (in<0) {
        ot=OrderType();
        if (ot==OP_BUY || ot==OP_SELL) st="Open ";
        if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP
        ||  ot==OP_SELLLIMIT || ot==OP_SELLSTOP) st="Set ";
        if (OutTicket) st=st+DoubleToStr(OrderTicket(), 0)+" ";
        st=st+GetNameOP(ot)+" "
             +DoubleToStr(OrderLots(), 2)+" "
             +OrderSymbol()
             +" PR="+DoubleToStr(OrderOpenPrice(), d)
             +" SL="+DoubleToStr(OrderStopLoss(), d)
             +" TP="+DoubleToStr(OrderTakeProfit(), d)
             +"\n"
             +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
             +IIFs(OutMagic && OutComment, " ", "")
             +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
             +IIFs(OutMagic || OutComment, "\n", "");
        if (ot==OP_BUY || ot==OP_SELL) {
          st=st+"Balance="+DoubleToStr(AccountBalance(), 2)
               +" FreeMargin="+DoubleToStr(AccountFreeMargin(), 2);
        }
        if (StringLen(sh)>0) st=sh+st;
        Signal(st);

      // операция найдена, значит существовала ранее и возможно изменена
      } else {
        // срабатывание отложенного ордера
        ot=OrderType();
        if (ot!=sotOTY[in] && (ot==OP_BUY || ot==OP_SELL)) {
          st="Open ";
          if (OutTicket) st=st+DoubleToStr(OrderTicket(), 0)+" ";
          st=st+GetNameOP(ot)+" by "+GetNameOP(sotOTY[in])+" "
               +DoubleToStr(OrderLots(), 2)+" "
               +OrderSymbol()
               +" PR="+DoubleToStr(OrderOpenPrice(), d)
               +" SL="+DoubleToStr(OrderStopLoss(), d)
               +" TP="+DoubleToStr(OrderTakeProfit(), d)
               +"\n"
               +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
               +IIFs(OutMagic && OutComment, " ", "")
               +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
               +IIFs(OutMagic || OutComment, "\n", "");
          if (ot==OP_BUY || ot==OP_SELL) {
            st=st+"Balance="+DoubleToStr(AccountBalance(), 2)
                 +" FreeMargin="+DoubleToStr(AccountFreeMargin(), 2);
          }
          if (StringLen(sh)>0) st=sh+st;
          Signal(st);
        }
        // модификация ордера или позиции
        if ((MathAbs(OrderOpenPrice()-sotOOP[in])>=p)
        ||  (MathAbs(OrderStopLoss()-sotOSL[in])>=p)
        ||  (MathAbs(OrderTakeProfit()-sotOTP[in])>=p)) {
          st="Modify ";
          if (OutTicket) st=st+DoubleToStr(OrderTicket(), 0)+" ";
          st=st+GetNameOP(OrderType())+" "
            +DoubleToStr(OrderLots(), 2)+" "
            +OrderSymbol();
          // изменилась цена открытия
          if (MathAbs(OrderOpenPrice()-sotOOP[in])>=p) {
            st=st+" PR="+DoubleToStr(sotOOP[in], d)+"->"+DoubleToStr(OrderOpenPrice(), d);
          }
          // изменился уровень стопа
          if (MathAbs(OrderStopLoss()-sotOSL[in])>=p) {
            st=st+" SL="+DoubleToStr(sotOSL[in], d)+"->"+DoubleToStr(OrderStopLoss(), d);
          }
          // изменился уровень тейка
          if (MathAbs(OrderTakeProfit()-sotOTP[in])>=p) {
            st=st+" TP="+DoubleToStr(sotOTP[in], d)+"->"+DoubleToStr(OrderTakeProfit(), d);
          }
          st=st+IIFs(OutMagic || OutComment, "\n", "")
               +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
               +IIFs(OutMagic && OutComment, " ", "")
               +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
               +IIFs(OutMagic || OutComment, "\n", "");
          if (StringLen(sh)>0) st=sh+st;
          Signal(st);
        }
      }
    }
  }

  // Закрытие позиций / Удаление ордеров
  k=ArraySize(sotOTI);
  for (i=0; i<k; i++) {
    if (ArraySearchInt(oti, sotOTI[i])<0) {
      ot=sotOTY[i];
      if (ot==OP_BUY || ot==OP_SELL) st="Close ";
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP
      ||  ot==OP_SELLLIMIT || ot==OP_SELLSTOP) st="Delete ";
      if (OutTicket) st=st+DoubleToStr(sotOTI[i], 0)+" ";
      if (OrderSelect(sotOTI[i], SELECT_BY_TICKET)) {
        d=MarketInfo(OrderSymbol(), MODE_DIGITS);
        st=st+GetNameOP(ot)+" "
             +DoubleToStr(OrderLots(), 2)+" "
             +OrderSymbol()
             +" PR="+DoubleToStr(OrderClosePrice(), d)
             ;
        if (ot==OP_BUY || ot==OP_SELL) {
          st=st+" Profit="+DoubleToStr(OrderProfit()+OrderSwap(), 2)
               +"\n"
               +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
               +IIFs(OutMagic && OutComment, " ", "")
               +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
               +IIFs(OutMagic || OutComment, "\n", "")
               +"Balance="+DoubleToStr(AccountBalance(), 2)
               +" FreeMargin="+DoubleToStr(AccountFreeMargin(), 2);
        }
        if (StringLen(sh)>0) st=sh+st;
        Signal(st);
      }
    }
  }

  MemCurrOP();
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Выполняет поиск элемента массива по значению                              |
//|  и возвращает индекс найденного элемента или -1                            |
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    e - значение элемента                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchInt(int& m[], int e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}

//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch (op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("BuyLimit");
		case OP_SELLLIMIT: return("SellLimit");
		case OP_BUYSTOP  : return("BuyStop");
		case OP_SELLSTOP : return("SellStop");
		default          : return("Unknown Operation");
	}
}

//+----------------------------------------------------------------------------+
//|  Возвращает одно из двух значений взависимости от условия.                 |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Запоминает текущие операции в массиве.                                    |
//+----------------------------------------------------------------------------+
void MemCurrOP() {
  int i, k=OrdersTotal();

  ArrayResize(sotOTI, k);
  ArrayResize(sotOTY, k);
  ArrayResize(sotOOP, k);
  ArrayResize(sotOSL, k);
  ArrayResize(sotOTP, k);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      sotOTI[i]=OrderTicket();
      sotOTY[i]=OrderType();
      sotOOP[i]=OrderOpenPrice();
      sotOSL[i]=OrderStopLoss();
      sotOTP[i]=OrderTakeProfit();
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Подача сигнала.                                                           |
//|  Параметры:                                                                |
//|    st - строка сообщения                                                   |
//+----------------------------------------------------------------------------+
void Signal(string st) {
  if (UseAlert) Alert(st);
  if (UseComment) Comment(st);
  if (UseSendMail) SendMail(WindowExpertName(), st);
  if (UseSendPush) SendNotification(st);
  if (UsePrint) Print(st);
  if (UseSound) PlaySound(sotFileName);
}
//+----------------------------------------------------------------------------+

 

Если я включаю UseAlert и UseSound, то звук Alert блокирует звук Sound

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MakarFX Если этот вывод после эксперимента, то значит у Alert() приоритет на воспроизведение звука. Выход, попробуй сделать задержку перед UseSound в 1 секунду.

Изменено пользователем MikR0ReR
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MikR0ReR Я так понял надо поставить Sleep

 

но где? Для меня это китайская грамота

//+----------------------------------------------------------------------------+
//|  Подача сигнала.                                                           |
//|  Параметры:                                                                |
//|    st - строка сообщения                                                   |
//+----------------------------------------------------------------------------+
void Signal(string st) {
  if (UseAlert) Alert(st);
  if (UseComment) Comment(st);
  if (UseSendMail) SendMail(WindowExpertName(), st);
  if (UseSendPush) SendNotification(st);
  if (UsePrint) Print(st);
  if (UseSound) PlaySound(sotFileName);
}
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MakarFX 

void Signal(string st) {
  if (UseAlert) Alert(st);
  if (UseComment) Comment(st);
  if (UseSendMail) SendMail(WindowExpertName(), st);
  if (UseSendPush) SendNotification(st);
  if (UsePrint) Print(st);
  if (UseSound) 
	{
		Sleep(1000);
		PlaySound(sotFileName);
	}
}

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MakarFX В смысле, даже 5 секунд не дают результата? Значит Это алерт следующего тика срабатывает.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

@MikR0ReR

Индикатор сообщает о всех действиях на счете, если открывается ордер, выскакивает Алерт. Наследующем тике Алерт уже не срабатывает.

Если Вам интересно, то посмотрите код, а если нет, но ничего страшного. Это я для своего удобства хотел изменить.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, MakarFX сказал:

Если я включаю UseAlert и UseSound, то звук Alert блокирует звук Sound

А если включить только UseSound, а алерт выключить, будет работать?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
51 минуту назад, MakarFX сказал:

UseSound будет работать, но не будет окна сообщения

Необъяснимая Ненормативная лексика..., попробуйте поставить if (UseSound) PlaySound(sotFileName);   первой строчкой

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 28.01.2020 в 20:19, MikR0ReR сказал:

@mischkus Вынесите функцию ATRFilter() за пределы OnTick() в глобальное пространство. Пример:

int OnInit()
  {
  }

OnTick(void)

{

}

bool ATRFilter()

{

}

Ошибки после компиляции нет. Прогоняю тесты, но результат нулевой, что есть этот фильтр, что его нет... То есть вижу, что при всплеске волатильности не убираются лишние трейды.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
5 часов назад, mischkus сказал:

Ошибки после компиляции нет. Прогоняю тесты, но результат нулевой,

@mischkus  Вы вставили функцию, теперь в основном коде программы нужно эту функцию вызвать и в зависимости от её значения true/false нужно запретить или разрешить торговлю.

Т.к. кода советника нет Вы должны сами определить каким образом её использовать.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Типа: если ATRFilter()=true, то делаем то-то, ну, к примеру, покупаем?

Потому что основное - это условия для открытия и закрытия позиции.

И то сейчас одно из условий дает сбой: то работает правильно, то...

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, mischkus сказал:

Типа: если ATRFilter()=true, то делаем то-то, ну, к примеру, покупаем?

Да, именно так - нужно опрашивать функцию, получать результат и выстраивать торговую логику.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем привет!

Помогите пристроить

Спойлер

extern   ENUM_BASE_CORNER  InpCorner      =  CORNER_LEFT_UPPER;   // Угол привязки индикатора

 


//--- Clicking on the fifth rectangle
   if(id==CHARTEVENT_OBJECT_CLICK) 
     {
      string clickedChartObject=sparam;
      if(clickedChartObject==obj_name[5]) 
        {
         string name="name_"+IntegerToString(MathRand()+100,0,' ');

         y=100;x=5;
         ChartXYToTimePrice(0,x,y,window,dt_1,price_1);
         ChartXYToTimePrice(0,x+250,y,window,dt_2,price_2);
         ChartXYToTimePrice(0,x,y+20,window,dt_3,price_3);

         ChannelCreate(0,name,0,dt_1,price_1,dt_2,price_2,dt_3,price_3,1,clrRed,STYLE_SOLID,1,InpBackRect,true,false,false,InpHidden_OBJ,0);
        }
     }

 


//+------------------------------------------------------------------+
//| Create an equidistant channel by the given coordinates           |
//+------------------------------------------------------------------+
bool ChannelCreate(const long             chart_ID=0,                   // chart's ID
                   const string           name="Channel",               // channel name
                   const int              sub_window=0,                 // subwindow index  
                   datetime               time1=0,                      // first point time
                   double                 price1=0,                     // first point price
                   datetime               time2=0,                      // second point time
                   double                 price2=0,                     // second point price
                   datetime               time3=0,                      // third point time
                   double                 price3=0,                     // third point price
                   const ENUM_BASE_CORNER corner = CORNER_RIGHT_UPPER,  // the angle of the graph for the binding
                   const color            clr=clrRed,                   // channel color
                   const ENUM_LINE_STYLE  style=STYLE_SOLID,            // style of channel lines
                   const int              width=1,                      // width of channel lines
                   const bool             back=false,                   // in the background
                   const bool             selection=true,               // highlight to move
                   const bool             ray_left = false,             // extend the line to the left
                   const bool             ray_right=false,              // channel's continuation to the right
                   const bool             hidden=true,                  // hidden in the object list
                   const long             z_order=0)                    // priority for mouse click
  {
//--- reset the error value
   ResetLastError();
//--- create a channel by the given coordinates
   if(!ObjectCreate(chart_ID,name,OBJ_CHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
     {
      Print(__FUNCTION__,
            ": failed to create an equidistant channel! Error code = ",GetLastError());
      return(false);
     }
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 
   return(true);
  }
//+------------------------------------------------------------------+
//| Delete the channel                                               |
//+------------------------------------------------------------------+
bool ChannelDelete(const long   chart_ID=0,     // chart's ID
                   const string name="Channel") // channel name
  {
//--- reset the error value
   ResetLastError();
//--- delete the channel
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": failed to delete the channel! Error code = ",GetLastError());
      return(false);
     }
//---
   return(true);
  }
//---

 

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Я так понял, что ChartXYToTimePrice расчитывает координаты и по умолчанию с левого верхнего углу.

Как бы ChartXYToTimePrice переубедить считать с указанного мной угла?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 часа назад, MakarFX сказал:

Как бы ChartXYToTimePrice переубедить считать с указанного мной угла?

ChartXYToTimePrice Нужно читать! Если не понятно, нужно еще раз прочесть!

 

Координата X. Начало координат находится в левом верхнем углу главного окна графика.

Координата Y. Начало координат находится в левом верхнем углу главного окна графика.

 

И ветка для MQ5 находится здесь Обучение языку MQL5 под MetaTrader 5

Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...