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

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


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

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


подскажите за что в советнике отвечает данное условие?

if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + TakeProfit*DigitFactor*Point;
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - TakeProfit*DigitFactor*Point;
}

если исправить на следующее, правильно я понимаю, что закрытие должно произойти плюс четыре пункта к данному условию?


if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + TakeProfit*DigitFactor*Point+4;
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - TakeProfit*DigitFactor*Point+4;
}



Верно, с 2-мя поправками:
1) 4 для 4-х знаков, 40 для 5-ти знаков после запятой в цене;
2) if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + (TakeProfit*DigitFactor+4)*Point;
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - (TakeProfit*DigitFactor+4)*Point;
}
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


Спойлер


подскажите за что в советнике отвечает данное условие?

if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + TakeProfit*DigitFactor*Point;
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - TakeProfit*DigitFactor*Point;
}

если исправить на следующее, правильно я понимаю, что закрытие должно произойти плюс четыре пункта к данному условию?


if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + TakeProfit*DigitFactor*Point+4;
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - TakeProfit*DigitFactor*Point+4;
}


Спойлер


Верно, с 2-мя поправками:
1) 4 для 4-х знаков, 40 для 5-ти знаков после запятой в цене;
2) if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + (TakeProfit*DigitFactor+4)*Point;
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - (TakeProfit*DigitFactor+4)*Point;
}



Сделал так:


input int TPBUY = 4; // Тейкпрофит для серии BUY
extern string T8 = "---Тейкпрофит для серии SELL---";
input int TPSELL = 4; // Тейкпрофит для серии SELL



if(TypeOrder==OP_BUY)
{
OrderPrice = Ask;
TPPrice = OrderPrice + (TakeProfit*DigitFactor+TPBUY)*Point; //внес изменение ДОБАВИЛ TPBUY
}
if(TypeOrder==OP_SELL)
{
OrderPrice = Bid;
TPPrice = OrderPrice - (TakeProfit*DigitFactor+TPSELL)*Point; //внес изменение ДОБАВИЛ TPSELL
}
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо за помощь в решении предыдущей задачи. Но как сделать так чтоб советник начинал работать сам? А не запускался с кнопки трейдером.

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

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

Вторая домашка. Сова ищет экстремумы за CountBars баров, которые определяются при присоединении совы к графику и затем, при образовании новых баров, не изменяются вообще.
В тестере, при прогоне истории, значения изменяются только в сторону увеличения диапазона.

Видимо нужно поставить сброс значений на каждом тике или баре. Как это сделать?

Спойлер

extern int BarCount = 10;

double minprice = 999999, mp, maxprice = -999999;
---------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
void OnTick()
{
GetMinPrice();
GetMaxPrice();

Comment ("MaxPrice: " + DoubleToStr (maxprice, Digits) + "\n"+ // Коммент на график
"MinPrice: " + DoubleToStr (minprice, Digits));

}
//+------------------------------------------------------------------+
void GetMinPrice () // функция получения минимальной цены за BarCount свечек
{
for (int i=0; i {
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp minprice = mp;
}
return;
}
//+------------------------------------------------------------------+
void GetMaxPrice () // функция получения максимальной цены за BarCount свечек
{
for (int i=0; i {
mp = iHigh (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}

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

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

Когда давно проходил этот урок тоже озадачился этим вопросом, и сам нашел решение. В коментах я там расписал что поменял/изменил.

  // получилось зделать чтобы мин. и макс. цены изменялись в соответствий с заданным 
// параметром bars, мешали глобальные переменые mn_p и mx_p. но я ввел новые глобальные
// переменные а,и б, которым в функций присвоил значения переменных mn_p и mx_p. и поэтому
// в коментарий выводятся корректные значения максимальной и минимальной цены за заданое коли- mggxz
// -чество баров (bars).
extern int bars = 10;
double st, // за количество баров значения bars
m=99999,
x=-99999,
mn_p,
mx_p;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

mn_p2();
mx_p2();
Comment("максимальная цена за", bars,"баров",DoubleToString(mx_p,6),"\n"
"минимальная цена за", bars, "баров",DoubleToString(mn_p,6));
// в коментарий выводится коректные значения максимальной и минимальной цены
// за заданное количество баров.

}
//+------------------------------------------------------------------+
double mn_p2()
{
mn_p=m; // переменой ,а, присвоил значение глобальной переменной mn_p.

for(int i=0; i {
st = iLow(Symbol(), PERIOD_CURRENT, i);
if(st mn_p =st;
}
return(mn_p);
}
//---------------------------------------------------------------------+
double mx_p2()
{

mx_p=x; // переменой ,б, присвойл значение глобальной переменой mx_p
for(int i =0; i {
st= iHigh (Symbol(),PERIOD_CURRENT, i);
if(st>mx_p)
mx_p=st;
}
return(mx_p);
}
//----------------------------------------------------------------------+
Изменено пользователем vitek01
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Вторая домашка. Сова ищет экстремумы за CountBars баров, которые определяются при присоединении совы к графику и затем, при образовании новых баров, не изменяются вообще.
В тестере, при прогоне истории, значения изменяются только в сторону увеличения диапазона.

Видимо нужно поставить сброс значений на каждом тике или баре. Как это сделать?

Спойлер

extern int BarCount = 10;

double minprice = 999999, mp, maxprice = -999999;
---------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
void OnTick()
{
GetMinPrice();
GetMaxPrice();

Comment ("MaxPrice: " + DoubleToStr (maxprice, Digits) + "\n"+ // Коммент на график
"MinPrice: " + DoubleToStr (minprice, Digits));

}
//+------------------------------------------------------------------+
void GetMinPrice () // функция получения минимальной цены за BarCount свечек
{
for (int i=0; i {
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp minprice = mp;
}
return;
}
//+------------------------------------------------------------------+
void GetMaxPrice () // функция получения максимальной цены за BarCount свечек
{
for (int i=0; i {
mp = iHigh (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}




Добрый день!
Можно сделать так:
Спойлер

extern int BarCount = 10;

double minprice = 999999, mp, maxprice = -999999;
---------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
void OnTick()
{
GetMinPrice();
GetMaxPrice();

Comment ("MaxPrice: " + DoubleToStr (maxprice, Digits) + "\n"+ // Коммент на график
"MinPrice: " + DoubleToStr (minprice, Digits));

}
//+------------------------------------------------------------------+
void GetMinPrice () // функция получения минимальной цены за BarCount свечек
{
minprice = 999999;
for (int i=0; i {
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp minprice = mp;
}
return;
}
//+------------------------------------------------------------------+
void GetMaxPrice () // функция получения максимальной цены за BarCount свечек
{
maxprice = -999999;
for (int i=0; i {
mp = iHigh (Symbol(), PERIOD_CURRENT, i);
if (mp > maxprice)
maxprice = mp;
}
return;
}


Функция должна быть автономной и не зависеть от внешнего окружения, правильно сделать так:
Спойлер

extern int BarCount = 10;

double minprice, maxprice;
---------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
void OnTick()
{
minprice = GetMinPrice(BarCount);
maxprice = GetMaxPrice(BarCount);

Comment ("MaxPrice: " + DoubleToStr (maxprice, Digits) + "\n"+ // Коммент на график
"MinPrice: " + DoubleToStr (minprice, Digits));

}
//+------------------------------------------------------------------+
double GetMinPrice (int bar_count) // функция получения минимальной цены за BarCount свечек
{
double min = 999999;
for (int i=0; ibar_count; i++)
{
mp = iLow (Symbol(), PERIOD_CURRENT, i);
if (mp min)
min = mp;
}
return(min);
}
//+------------------------------------------------------------------+
double GetMaxPrice (int bar_count) // функция получения максимальной цены за BarCount свечек
{
double max = -999999;
for (int i=0; ibar_count; i++)
{
mp = iHigh (Symbol(), PERIOD_CURRENT, i);
if (mp > max)
max = mp;
}
return(max);
}

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

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

Добрый день!

У меня такая просьба к специалистам. Хотелось бы создать советник на основе антимартингейла (Парлай). То есть увеличение лота в случае движения цены в нужную сторону.

Условия:

1. Открытие сделок перед новостями (за секунду до новостей) по новостным индикаторам.

2. Настройка шага и экспонента для увеличения лота в случае движения в нужном направлении. К примеру, buy 0.01 по цене 1.3010, затем открытие вторго колена buy 0.02 по цене 1.3020, затем buy 0.04 по цене 1.3030 и так далее.

3. Настройка количества колен и общего тейк профита. К примеру, 4 сделки с шагом 10 пунктов (с общим тейком 40 пунктов).

4. Установка стоп-лосса и трейлинг стопа с возможностью вывода сетки в безубыток.

5. Возможность открытия сетки в противоположном направлении в случае срабатывания стоп-лосса на первой сделке.

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

Если имеются специалисты, готовые помочь с данной разработкой, буду благодарен помощи. Важно не сделать советник, а обсудить возможные варианты исполнения для достижения оптимальных настроек. Если система будет работать - она будет полезна всем.

Заранее благодарю.

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

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


..Если система будет работать..



а Вы потрудитесь сами проверить, в тестере, на истории, будет ли работать система, и тогда welcome!!! с результатами.. ;)
возможно, кого-то заинтересует и вам пойдут на встречу.. здесь люди работают на голом энтузиазме, если не считать того,
что система и им может быть полезна..

другой вариант - MQL фриланс, любая прихоть за ваши деньги <:-p>
Ссылка на сообщение
Поделиться на другие сайты

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

Я предложил вариант использования идеи. Быть может кто-то уже сталкивался с таким вопросом и принял решение, что система не работает - это тоже результат. В любом случае буду рад любым комментариям и пожеланиям.

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

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

Здравствуйте! Подскажите, как в переменную записать данные с url (например, взять значение GMT с какого-нибудь сайта). Насколько понимаю, необходимо использовать ф-цию WebRequest(), если есть возможность скинуть фрагмент кода, буду признателен. Спасибо.

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

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


Спойлер

Здравствуйте! Подскажите, как в переменную записать данные с url (например, взять значение GMT с какого-нибудь сайта). Насколько понимаю, необходимо использовать ф-цию WebRequest(), если есть возможность скинуть фрагмент кода, буду признателен. Спасибо.




Добрый день!

У меня получилось так:
Спойлер

//--------------------------------------------------------------------
// Функция определения времени по Гринвичу
// Возвращает строку: часы:минуты:секунды
//--------------------------------------------------------------------
string GetGmt()
{
string cookie = NULL,headers;
char post[], result[];
int res;
string str = "";

//--- для работы с сервером необходимо добавить URL "http://mydatetime.info/ru/time/203.aspx"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
string url="http://mydatetime.info/ru/time/203.aspx";

ResetLastError();

//--- загрузка html-страницы
int timeout = 5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета
res = WebRequest("GET", url, cookie, NULL, timeout, post, 0, result, headers);

//--- проверка ошибок
if(res==-1)
{
Print("Ошибка в WebRequest. Код ошибки =",GetLastError());
MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
}
else
{
str = CharArrayToString(result, 402, 8);
}
return(str);
}
//--------------------------------------------------------------------

Для примера, вывод в коммент.

Удачных торгов!

EURUSDM30777.png
GetGMT.mq4

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

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



Спойлер

Здравствуйте! Подскажите, как в переменную записать данные с url (например, взять значение GMT с какого-нибудь сайта). Насколько понимаю, необходимо использовать ф-цию WebRequest(), если есть возможность скинуть фрагмент кода, буду признателен. Спасибо.




Добрый день!

У меня получилось так:
Спойлер

//--------------------------------------------------------------------
// Функция определения времени по Гринвичу
// Возвращает строку: часы:минуты:секунды
//--------------------------------------------------------------------
string GetGmt()
{
string cookie = NULL,headers;
char post[], result[];
int res;
string str = "";

//--- для работы с сервером необходимо добавить URL "http://mydatetime.info/ru/time/203.aspx"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
string url="http://mydatetime.info/ru/time/203.aspx";

ResetLastError();

//--- загрузка html-страницы
int timeout = 5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета
res = WebRequest("GET", url, cookie, NULL, timeout, post, 0, result, headers);

//--- проверка ошибок
if(res==-1)
{
Print("Ошибка в WebRequest. Код ошибки =",GetLastError());
MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
}
else
{
str = CharArrayToString(result, 402, 8);
}
return(str);
}
//--------------------------------------------------------------------

Для примера, вывод в коммент.

Удачных торгов!


Спасибо большое! Подскажите, как Вы в ф-ции CharArrayToString() "str = CharArrayToString(result, 402, 8);" выбрали параметры, чтобы выцепить нужную строку с сайта?
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите пожалуйста, почему в списке extern-переменных, имена некоторых из них подсвечиваются не розовым цветом как обычно, а чёрным?

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

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


Подскажите пожалуйста,как найти цену открытия предпоследнего открытого ордера


создаешь двумерный массив(дабловый), в первое измерение пихаешь даты открытия(OrderOpenTime или типа того), во второе измерение - сами цены открытия.
далее ArraySort() - работает только для первого измерения.
далее обращайся ко второму измерению элемента массива с i = размермассива - 2 и будет тебе счастье.

ЗЫ: mql4 не позволяет создавать разнотипные многомерные массивы(поэтому он весь дабловый, несмотря на то что даты - это datetime или инт, но если будем брать весь интовый - мы потеряем цены =) ), вариант номер два - есть такое понятие как мапа(ассоциативный список, дерево с понятиями "уникальный ключ" - "значение", через него работать "быстрее, удобнее, сильнее"), но я хз как оно вобще работает на mql4(хотя как класс оно уже давно вроде поставляется, можно увидеть пошарившись в библиотеках в тереме)


Добавлено: 18-10-2016 20:58:28

в дебри зачем-то полез...
есть List(нумерованный список), пихаешь в него тикеты ордеров, из-за самой особенности класса - они всегда будут в порядке возрастания, ну и после того как соберешь все ордера, обращайся к предпоследнему. Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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


Подскажите пожалуйста,как найти цену открытия предпоследнего открытого ордера


Добрый день!
Еще можно сделать так:
Спойлер

//--------------------------------------------------------------------
// Функция определения цены предпоследнего открытого ордера
//--------------------------------------------------------------------
double PenultPriceOrder()
{
double Price = 0;
double PenPrice = 0;
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType() {
PenPrice = Price;
Price = OrderOpenPrice();
}
}
}
return(PenPrice);
}
//--------------------------------------------------------------------
Изменено пользователем SilverKZ
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

dermitay: если бы со своим уровнем программирования я не знал как найти предпоследний ордер то из вашего объяснения я бы вообще ничего не понял.
SilverKZ: Тоже по моему не верно. Вы ищите предпоследний не отложенный ордер как я понял а если последний ордер будет отложенный? То вы вернете последний не отложенный ордер. Надо все под ИФ засунуть.
По-моему вообще не стоит полагаться на то что последние ордера в конце и самому сделать все проверки

for (int i = 0; i 	if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) Print("Error in OrderSelect! Position:", i);
else
if (OrderSymbol() == _Symbol) {
if (OrderMagicNumber() == Magic) { //проверить что это ордер от этого советника если требуется
if (OrderType() == OP_BUY) { // если нужен конкретный ордер Бай Селл
if (BuyLastTime BuyLastTime2=BuyLastTime;
BuyLastTime=OrderOpenPrice();
}
}
}
}
}
BuyLastTime2 - то что нужно!


з.ы. Лучше подскажите как в советнике линию нарисовать не силен я в этом. Хочу вывести некую рассчитанную "машку" на экран для лучшего визуализирования работы.
Ссылка на сообщение
Поделиться на другие сайты

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

помогите прописать функцию которая не давала бы открывать больше чем одну сделку на свече и что бы онр обязательно учитывал закрытые сделки.
никто помочь не может :(

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

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


помогите прописать функцию которая не давала бы открывать больше чем одну сделку на свече и что бы онр обязательно учитывал закрытые сделки.
никто помочь не может :(



(глобальная прмн) datetime T;

if(iTime(Symbol(),Period(),1) > T)
{
T=iTime(Symbol(),Period(),1)
tiket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slip,SL,TP,"",Magic,0,Green);
}
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SNZHikari не прозрачный подход у тебя. а если предпредпоследний нужно??? а если 5й с конца в сетке из 100 ордеров?))

вобще самый корректный алгоритм я уже описал - двумерный массив, где в первом измерении обязательно должно стоять время открытия ордера, вторым - тикет. сортировка ArraySort возможна на mql4 только для первого измерения, поэтому вот так вот. не, можно придумать свой велосипед и самому ручками отсортировывать массив, но зачем, если есть ArraySort()???
еще раз, распишу подробнее.
задача: найти ордер по его времени закрытия с точки зрения порядка его открытия других ордеров
что нужно делать(логически): брать времена открытия ордеров, отсортировывать их и уже обращаться к нужному элементу.
как делать:
- топорным методом каждый тик перебирать ордера, прикручивать дополнительные временные переменные для сравнения времени открытия(плюсы - ... хз, минусы - нагрузка на код дополнительными циклами, так и явные ограничения по поводу выборки нужного ордера, так как в дополнительных временных перменных мы можем запутаться, и чем дальше в лес, тем больше дров - обслуживать такой код в дальнейшем будет очень трудно, а тем более давать почитать другому человеку)
- использовать сортировку времен ордеров(плюсы - вроде бы все становится логично, минус - опять дополнительные циклы, опять нагрузка на код, очень хорошо видна просадка по исполнению кода когда ты тестируешь временные рамки в несколько лет с сортировкой сетки ордеров в массиве или без нее, тестирование многократно сокращается по времени если избавляться от лишних циклов), я к чему веду - это серьёзная тема.
- использовать текущие современные подходы, а именно: сортировать времена не в ручную а более оптимизированными функциями самого языка, есть целая наука о методах сортировки, это довольно-таки серьезная тема для неокрепших умов, можно почитать педивикию о методах сортировки, люди по этой теме диссертации писали =))) как вариант - лучше юзать мапу, заполняемую оредрами в самый первый раз в ините, а в самом исполняемом коде просто проверять на наличие новых ордеров(добавляем в мапу), старые - удаляем из мапы. исполнение кода должно при таком подходе значительно выигрывать.
если ты сейчас на этапе новичка - это огромный плюс, ибо учится ты будешь с изначально верных установок, не бойся сложных тем. лучше учится сложно, но изначально правильно, чем ломать дрова а потом с трудом переучиваться.

про линию: создавай объект линию, изменяй ее параметры как тебе нужно.(функции ObjectCreate(), сеттеры ObjectSet() ну и так далее)
погугли документацию, там ничего сложного же. потренируйся на готовой кнопке(код лежит прям в документации), чтобы понять, пощупать что да как работает.
https://docs.mql4.com/ru/objects/objectcreate Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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

Ваши рассуждения верны, но есть 2 но.
1. Вы не объясняете как именно это сделать, а посылаете учить мат часть, на мой вопрос о линии в том числе.
SilverKZ дал идеальный вариант ответа для новичка, готовая функция выполняющая поставленную задачу.

2. Универсальные функции красивы, но в советниках как вы верно заметили важна производительность. Так что будем искать второй ордер без всякой сортировки, вот когда понадобится n-ный подумаем.
Цикл по ордерам как правило нужен, в одном этом цикле за один проход можно вытащить все нужные параметры, а не делать кучу функций с циклами. Более того, если анализ производится на новом баре то и цикл тоже можно не делать каждый тик.

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

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

иногда видя посты новичков на свои ответы пропадает всякое желание отвечать :d

SNZHikari даю первый урок бесплатно.
коли ты встал на тропу создания советников, да и вобще работы с каким-либо языком программирования, учись искать информацию а так же разбираться в официальной технической документации самостоятельно(она причем доступна на русском языке). никто не будет выкладывать полотна кода "работы с линией".
общий принцип объяснить, подсказать что-то легкое или нелегкое - да пожалуйста, но код за тебя писать вряд ли кто-то будет. причем пример есть в офдокументации, смысл тебе его выкладывать сюда??? копипаст со сменой пары-тройки аргументов у objectcreate()? я тогда могу вдогонку предъявить некорреткность вопроса, что значит "хочу вывести некую рассчитанную "машку" на экран", как ты себе в теории представляешь какими невербальными телепатическими способностями должен обладать человек, захотевший тебе помочь читая эту фразу? :)) :)) :)) )

1. создаешь кнопку-объект функцией ObjectCreate(). можно однократно в ините.
2. меняешь ее положение на графике функцией ObjectSetDouble(). многократно так как тебе надо в коде согласно твоему алгоритму.
3. в деинитие обязательно удаляй кнопку, либо если не хочешь удалять, перед п1. обязательно проверяй существование объекта функцией ObjectFind().

чтения официальной документации всего лишь по двум этим функциям на русском языке, ссылку на которую я тебе уже дал, ДОСТАТОЧНО для примитивных манипуляций, которые тебе необходимы. все остальное - это частности, разбираться в которых должен ты сам а так же как и в применении других функций, ибо никто кроме тебя самого знания тебе в голову не положит. ну не будешь же ты каждый раз при первой проблеме бежать на форум и спрашивать?

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

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

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

Спасибо конечно за бесплатный урок, но учитель из вас не важный, так и не понял зачем мне кнопка если мне нужна линия?
Неужели фраза о том что я хочу вывести на экран Машку настолько не понятна?
Мне уже помогли - "только ТрэндЛайн, только хардкор!", я и сам догадывался, но хотелось верить что есть способ проще... Мне как не полному нубу в программировании такой помощи достаточно, я умею читать мануал. Но есть большая разница в том что бы отправить читать Весь мануал и тем что бы подсказать что именно нужно.
Готов поделится этой не совсем тривиальной задачей опровергая утверждение что никто не будет :) Если уже написано выложить труда не составляет.


A[] - Значения нашей машки, можно и стандартную использовать.
Visual - количество баров которые хотим покрыть.
Конечно рекомендую не перерисовывать каждый тик, на новом баре будет достаточно.

LineReNew("Line", A, Visual, clrRed);

//Собственно сама функция
void LineReNew(string name, // имя линии
double &A[], // Массив Цен
int V, // Кол-во визуализируемых баров
color clr) // цвет
{
for (int i=0; i if(ObjectFind(name+"_"+IntegerToString(i))>-1){
ObjectMove(name+"_"+IntegerToString(i), 0, iTime(NULL,0,i+1),A[i+1]);
ObjectMove(name+"_"+IntegerToString(i), 1, iTime(NULL,0,i), A);
}
else{
if(!ObjectCreate(0, name+"_"+IntegerToString(i), OBJ_TREND, 0, iTime(NULL,0,i+1), A[i+1], iTime(NULL,0,i), A))
{
Print(__FUNCTION__,": не удалось создать линию тренда! Код ошибки = ", _LastError);
break;
}
ObjectSetInteger(0,name+"_"+IntegerToString(i),OBJPROP_COLOR, clr);
ObjectSetInteger(0,name+"_"+IntegerToString(i),OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0,name+"_"+IntegerToString(i),OBJPROP_WIDTH,1);
ObjectSetInteger(0,name+"_"+IntegerToString(i),OBJPROP_SELECTABLE, false);
ObjectSetInteger(0,name+"_"+IntegerToString(i),OBJPROP_RAY_RIGHT, false);
}
}
return;
}

Удалить потом так же в цикле в Деините конечно тоже нужно.

- Под универсальными функциями я подразумевал самописные функции типа функции нахождения цены N-ного ордера.
- Конечно встроенная сортировка должна работать быстро и если понадобится стоит её использовать. Изменено пользователем SNZHikari
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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