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

От xbms, 13 апреля, 2013 в Уголок Программиста

#926

Что с запятой, что без запятой компилируется и выводится на экран.
OP_BUY==0; OP_SELL==1; здесь можно ставить Константу(OP_BUY или OP_SELL) или цифровое значение(0 или1)
для AUTO- значения нет, поэтому мы можем поставить любое==-1 ??

Про запятую - спасибо.
Можно-ли использовать константу в описании enum? - не знаю, я бы использовал - код становится читабельным, но если компилятор выдаст ошибку - тогда цифрой.
Про AUTO = -1. можно любое, какое назначите с тем и будем работать.
#927
Цитата

Цитата: 0ll от Мая 10, 2014, 01:01:05 pm
- В функции start() Выведешь Alert() где расскажешь что за скрипт, координаты - где его бросили на экран графика, под ценой или над (Справка Операции с графиками), текущую пару.



В (Справка Операции с графиками) есть две функции:
ChartTimePriceToXY(Преобразует координаты графика из представления время/цена в координаты по оси X и Y)
ChartXYToTimePrice (Преобразует координаты X и Y графика в значения время и цена)
#928


В (Справка Операции с графиками) есть две функции:
ChartTimePriceToXY(Преобразует координаты графика из представления время/цена в координаты по оси X и Y)
ChartXYToTimePrice (Преобразует координаты X и Y графика в значения время и цена)

Нам на выходе время и цена важны.
#929

OLL Не знаю, что наделал, вставил функцию: ChartXYToTimePrice(0,x,y,window,dt,price) и объявил переменные
компилировал, вроде не ругается.Если честно, что сделал, не понял

Спойлер

#property version "1.00"
#property description "Частичное закрытие Buy , Sell, Auto ордеров"
#property strict
extern int x =0;//(int)lparam;
extern int y =0;//(int)dparam;
extern datetime dt =0;
extern double price =0;
extern int window=0;


extern int Magic = 123;//Уникальный номер;
extern int Delta = -10;//мимнимальный процент профита от депозита;
//+------------------------------------------------------------------+
#property script_show_inputs
//--- с какими ордерами работаем
enum general_direction
{
ordersBUY = OP_BUY,
ordersSELL = OP_SELL,
AUTO = -1
};
//--- input parameters
input general_direction Direct = ordersSELL;

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- преобразуем координаты X и Y в терминах дата/время
if(ChartXYToTimePrice(0,x,y,window,dt,price))
{
Alert ("Window=%d X=%d Y=%d => Time=%s Price=%G",window,x,y,TimeToString(dt),price);
//--- сделаем обратное преобразование: (X,Y) => (Time,Price)
if(ChartTimePriceToXY(0,window,dt,price,x,y))
Alert ("Time=%s Price=%G => X=%d Y=%d",TimeToString(dt),price,x,y);
else
Alert("ChartTimePriceToXY return error code: ",GetLastError());
//--- зададим координату времени для вертикальной линии перекрестия
ObjectSetInteger(0,"V Line",OBJPROP_TIME,dt);
//--- зададим координату цены для горизонтальной линии перекрестия
ObjectSetDouble(0,"H Line",OBJPROP_PRICE,window,price);
ChartRedraw(0);
}
else
Alert("ChartXYToTimePrice return error code: ",GetLastError());
Alert("+--------------------------------------------------------------+");

Alert(" Магик =" + IntegerToString(Magic) + "\nСимвол =" + Symbol() + "\nПериод =" + IntegerToString(Period()));
return;
}
//+------------------------------------------------------------------+

#930


OLL Не знаю, что наделал, вставил функцию: ChartXYToTimePrice(0,x,y,window,dt,price) и объявил переменные
компилировал, вроде не ругается.Если честно, что сделал, не понял

Понятно, что не понятно... Вы дочитайте справку, там есть более понятные функции, напр. ChartPriceOnDropped().
Вы же взяли функцию преобразования координат XY в дату/цену, а ей координаты нужны - где-ж Вы их возьмете?
Не заморачивайтесь с координатами XY - они вообще не понадобятся.
#931

OLL
Тогда вроде так

Спойлер

#property version "1.00"
#property description "Частичное закрытие Buy , Sell, Auto ордеров"
#property strict

extern int Magic = 123;//Уникальный номер;
extern int Delta = -10;//мимнимальный процент профита от депозита;
//+------------------------------------------------------------------+
#property script_show_inputs
//--- с какими ордерами работаем
enum general_direction
{
ordersBUY = OP_BUY,
ordersSELL = OP_SELL,
AUTO = -1
};
//--- input parameters
input general_direction Direct = ordersSELL;

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double p=ChartPriceOnDropped();

Alert(" Магик =" + IntegerToString(Magic) + "\nСимвол =" + Symbol() + "\nПериод =" + IntegerToString(Period()) + "\nКоординаты = " ,p);
return;
}
//+------------------------------------------------------------------+

Изменено 11 мая, 2014 пользователем С_е_р_г_у_й

#932

С_е_р_г_у_й Всё так. Работает? Вы сразу запускайте в МТ после компиляции.
По поводу алгоритма AUTO что думаете?

#933


По поводу алгоритма AUTO что думаете?


Я думаю надо объявить переменную ТР, найти ордера с ТР+
В AUTO необходимо прописать OP_BUY и OP_SEL. ??
Посчитать все ордера , задать какие ордера будут закрываться ВАЙ, закрывать ВАЙ ордера
Для СЕЛЛ считаем все ордера , определяем какие закрываем СЕЛЛ, закрываем СЕЛЛ
Для АВТО считаем ордера , определяем какие закрываем, закрываем
Где то так???

Изменено 11 мая, 2014 пользователем С_е_р_г_у_й

#934

С_е_р_г_у_й. Когда пользователь выбирает Бай или Селл с этим всё понятно, но если Авто, то нам с Вами в скрипте надо вычислить какую корзину хочет закрыть пользователь. Я вам писал ранее возможные варианты - как это делать. От Вас нужно решение, а может оба варианта сделаем? - не будем искать лёгких путей.

#935

Конечно оба варианта.
Нам с Вами в скрипте надо вычислить какую корзину хочет закрыть пользователь, вот и давайте вычислим.
Для этого нам надо посчитать все ордера, определить какие ордера открыты???
for (int i = 0; i

Изменено 11 мая, 2014 пользователем С_е_р_г_у_й

#936

Ну, значит, поехали - этап 2.
Предисловие. Мне бы как трейдеру не понравилось то, что скрипт в автоматическом режиме творит чудеса на моём реальном счёте, а Вам? Поэтому план такой: нужно вывести окно подтверждения с кнопочками "Да"(или ОК) и "Отмена". В окно вывести максимум информации для принятия решения, а именно: на какой паре какие ордера будем работать, текущее количество ордеров по сове, по направлению, текущая просадка по сове и направлению, сколько пунктов до безубытка по рабочей корзине, сколько ордеров будем закрывать и сколько останется.
Все эти данные мы вычислим на 3 этапе, а пока окно подтверждения (может это: http://docs.mql4.com/ru/common/messagebox)
Что-то очень простое задание... Усложним: если пользователь выбрал ОК то Алерт "закрываем", если отмена Алерт "пока!"

#937

OLL Не теряйте меня, исчезаю на пару дней, приношу извинения.


Добавлено: 12-05-2014 13:52:10

OII День добрый,
Цитата

окно подтверждения Что-то очень простое задание... Усложним: если пользователь выбрал ОК то Алерт "закрываем", если отмена Алерт "пока!"


Спойлер

//+------------------------------------------------------------------+
//| Скрипт частичного закрытия ордеров.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property description "Частичное закрытие Buy , Sell, Auto ордеров"
#property strict

extern int Magic = 123;//Уникальный номер;
extern int Delta = -10;//мимнимальный процент профита от депозита;
//+------------------------------------------------------------------+
#property script_show_inputs
//--- с какими ордерами работаем
enum general_direction
{
ordersBUY = OP_BUY, //Ордера на покупку
ordersSELL = OP_SELL, //Ордера на продажу
AUTO = -1, //В автоматичуском режиме
};
//--- input parameters
input general_direction Direct = ordersSELL;

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{

int rat=MessageBox("закрытие ордеров ","Скрипт частичного закрытия ордеров", MB_OKCANCEL);
if(rat == IDOK)Alert ("закрываем ");
if(rat == IDCANCEL)Alert("пока");

double p=ChartPriceOnDropped();

Alert(" Магик =" + IntegerToString(Magic) + "\nСимвол =" + Symbol() + "\nПериод =" + IntegerToString(Period()) + "\nкоординаты = " ,p);
return;
}
//+------------------------------------------------------------------+

Изменено 12 мая, 2014 пользователем С_е_р_г_у_й

#938

С_е_р_г_у_й Добрый день.
MessageBox надо-бы после определения цены
После Алерта "пока" - завершение работы.
Но это мелочи, теперь 3 этап:
Вы как трейдер хотите совершить частичное закрытие - какая информация Вам нужна? - подумайте надосуге, я Вам уже писал примерный перечень, что-то можно выкинуть, что-то добавить.
Итак, пользователь запустил скрипт и МТ начал исполнять процедуру старт(). Нам же надо действовать в соответствии с пожеланиями пользователя. Здесь надо вставить "логическое дерево". В нашем случае видимо лучше использовать switch для выбора дальнейшего действия http://docs.mql4.com/ru/basis/operators/switch в зависимости от направления сделки.
Задание: в старт() сначала идет определение цены, потом switch, затем MessageBox
в свиче для например для case OP_BUY: направте в функцию пересчета ордеров с параметром Директ.
а для Авто - решим позже.

#939

OII День добрый, тяжело даются знания, без наводящих вопросов мне не справится, " определение цены"?,
Смотрю Скрипт закрытия ордеров CloseAllOrders_v5.mq4, сравниваю. Может не стоит смотреть на другие советники, а то из за этого каша в голове.

Изменено 13 мая, 2014 пользователем С_е_р_г_у_й

#940

OII День добрый, тяжело даются знания, без наводящих вопросов мне не справится,

Прости, может я плохо объяснил. Цену Вы уже определили по точке загрузки скрипта. Далее будут ещё более сложные вопросы и, чтобы улучшить взаимопонимание, я думаю перейти непосредственно в текст скрипта, т.е. там внутри давать задания и писать объяснения. Давайте Ваш последний текст (прикрепите в формате mq4) и попробуем.
#941

Хорошо, давайте, только я и этого не знаю как сделать (прикрепить в формате mq4).

#942

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

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

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

#943


Хорошо, давайте, только я и этого не знаю как сделать (прикрепить в формате mq4).

Когда пишите на форуме ответ внизу (под окошком) есть кнопка "Вложения и другие параметры". Там есть кнопка "выбрать файл". Находите наш скрипт в дебрях МТ (для этого в редакторе нажмите файл-сохранить как... он Вам покажет где находится папка с файлом (при этом сохранять не обязательно)) и всё он прикрепился к письму.

С_е_р_г_у_й в общем разделе "Уголок программиста" создайте "Новая тема" назовите как нибудь "Пишу скрипт с нуля", может быть Старик туда перенесёт нашу переписку, а может нет - неважно.
#944

И снова я за помощью к господам программистам. Хочу в своем советнике использовать индикатор HMA Arrows, который читает инфу с HMA Color. Но у меня не получается использовать iCustom. Искал причину и вот решил посмотреть какую же инфу мне выдает iCustom. ВТФ?!!! Как и почему? я в ступоре? подскажите в чем у меня проблема. Прикладываю скрин, индикаторы, советник, в котором я прописал тупо iCustom и Print. Помогите получить нормальные данные.


Добавлено: 13-05-2014 11:34:29

Форум не дает "сову" прикрепить, поэтому код сюда кину, извиняйте и не ругайтесь сильно...

extern double Lots = 0.01;
extern int TakeProfit = 10;
extern int StopLoss = 14; // Стоплосс, 0 - не используется
extern int Slippage = 0;
extern string Indicator_HMA = "Данные индикатора HMA_arrows";
extern int HMA_Period = 7;
extern int HMA_PriceType = 0;
extern int HMA_Method = 3;

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

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double arrow_down=iCustom(Symbol(), 0, "HMA Arrows", HMA_Period, HMA_PriceType, HMA_Method, 0,0);
Print("arrow_down"," ",arrow_down);
double arrow_up=iCustom(Symbol(), 0, "HMA Arrows", HMA_Period, HMA_PriceType, HMA_Method, 1,0);
Print("arrow_up"," ",arrow_up);

}
//+------------------------------------------------------------------+

icustom.JPG
HMA_Arrows.mq410 скач.
HMA_Arrows.ex46 скач.
HMA_Color.mq47 скач.
HMA_Color.ex46 скач.

Изменено 13 мая, 2014 пользователем SpyRF

#945


double arrow_down=iCustom(Symbol(), 0, "HMA Arrows", HMA_Period, HMA_PriceType, HMA_Method, 0,0);


Пробуй так:
double arrow_down=iCustom(Symbol(), 0, "HMA Arrows", HMA_Period, HMA_PriceType, HMA_Method, 0,1);
Поясню: индюк HMA Arrows не рассчитывает значения для 0-бара, только начиная с 1. А Вы его о 0-баре спрашиваете - вот он и отвечает...
#946



double arrow_down=iCustom(Symbol(), 0, "HMA Arrows", HMA_Period, HMA_PriceType, HMA_Method, 0,0);


Пробуй так:
double arrow_down=iCustom(Symbol(), 0, "HMA Arrows", HMA_Period, HMA_PriceType, HMA_Method, 0,1);
Поясню: индюк HMA Arrows не рассчитывает значения для 0-бара, только начиная с 1. А Вы его о 0-баре спрашиваете - вот он и отвечает...

Огромное спасибо.
#947

Народ, кто смотрел 2-й урок по MQL? _http://tradelikeapro.ru/izuchaem-mql-urok-n-2-tsiklyi-funktsii-i-ordera-v-sovetnike/

Все написал по видео. Но, сова открывает ордера только buylimit. Почему?

Автор#948


Народ, кто смотрел 2-й урок по MQL? _http://tradelikeapro.ru/izuchaem-mql-urok-n-2-tsiklyi-funktsii-i-ordera-v-sovetnike/

Все написал по видео. Но, сова открывает ордера только buylimit. Почему?



я смотрел, но ответить почему не смогу пока Вы свой вариант не предъявите :)
#949



Народ, кто смотрел 2-й урок по MQL? _http://tradelikeapro.ru/izuchaem-mql-urok-n-2-tsiklyi-funktsii-i-ordera-v-sovetnike/

Все написал по видео. Но, сова открывает ордера только buylimit. Почему?



я смотрел, но ответить почему не смогу пока Вы свой вариант не предъявите :)


Нет у меня своего варианта (пока что). Я просто хочу понять, почему открывает только buylimit? Если закрыть вызов buylimit, то никаких ордеров не открывает. Игнорит полностью вызов selllimit.


int start()
{
if(HourEnd == TimeHour(TimeCurrent()))
{
DeleteOrdes();
}
minprice = NormalizeDouble(GetMinPrice(),Digits);
maxprice = NormalizeDouble(GetMaxPrice(),Digits);

if (HourStart == TimeHour(TimeCurrent()) && CountBuyLimit() == 0 && CountSellLimit() == 0)
{
SL = NormalizeDouble(minprice - StopLoss*Point,Digits);
TP = NormalizeDouble(minprice + TakeProfit*Point,Digits);
OrderSend(Symbol(),OP_BUYLIMIT, Lots, minprice, Slippage, SL, TP, comment, Magic, 0, Blue);

SL = NormalizeDouble(maxprice + StopLoss*Point,Digits);
SL = NormalizeDouble(maxprice - TakeProfit*Point,Digits);
OrderSend(Symbol(),OP_SELLLIMIT, Lots, maxprice, Slippage, SL, TP, comment, Magic, 0, Red);
}
return(0);
}


UPDATE: нашел ошибку. В вызове OrderSend для selllimit два SL определено. Исправил нужный на ТР. ЗАРАБОТАЛО.

Изменено 18 мая, 2014 пользователем geugene

#950

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025