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

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

#3001


Sany2912 я-ж не знаю что Вы используете и как это рассчитывается у Вас в сове.
например для восстановления параметров открытых ордеров из ОнИнит запускается ф-ция пересчета, которая ищет свои ордера и восстанавливает внутренние значения СЛ/ТП/БУ, если сетка, то сортирует ордера, восстанавливает лотность, цену открытия последнего колена и т.д.



Как, примерно, должен быть написан код чтоб сохранить в ОнИнит последние Бид и Аск известные на момент выключения?
#3002

Господа, осваиваю Forex EA Generator, несколько советников несложных уже составил, и теперь не могу понять как составить другого, на основе Боллинджера. Задача, чтобы сделки не открывались одновременно в одну сторону и не открывались одновременно в противоположные стороны. Не пойму, как выставить блоки, чтобы открывался лонг скажем на условии Close(1)>SMA20, а закрывался либо на верхней полосе Боллинджера либо на нижней. Например лонг открылся, и закрылся в профите по верхней линии Боллиджера, и тут нужно ждать, не открывать еще раз лонг на откате, а входить только в шорт по сигналу, как только сработает Close(1)Ну и в дополнение, киньте пожалуйста ссылкой на понятный русскоязычный учебник по MQL4 с примерами по созданию таких роботов. Или может начинать надо лучше с 5 версии?)

#3003


Как, примерно, должен быть написан код чтоб сохранить в ОнИнит последние Бид и Аск известные на момент выключения?

есть индюк, который в реал-тайме пишет тиковые котировки в файл. можно из него читать последнюю известную котировку. Но зачем Вам это (знать последнюю котировку)?
#3004
otten пробуй пересечение! пример: if (Close(1)>SMA20 && Close(2)тогда срабатывать будет только при пересечении и следовательно бай и сел будут чередоваться.
#3005

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

Спойлер



Добавлено: 15-01-2016 21:07:35

Не нашел как вставить маленькую превьюшку.

Добавлено: 15-01-2016 21:34:34

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

Изменено 16 января, 2016 пользователем otten

#3006

Доброй ночи. Подскажите пожалуйста, написал советник по 2-ум индикаторам TMA и МА, когда средняя ТМА пересекает МА снизу вверх - покупаем. Закрытие происходит когда средняя ТМА пересекает сверху вниз МА. Сделки на продажу наоборот.
Сделки открываются не так как надо и, соответственно, закрываются не так. В чем причина.

extern double Lots = 0.1;
extern int Slippage = 5;
extern int Magic = 123;
extern int TakeProfit = 40;
extern int StopLoss = 20;

extern string comment = "Custom Moving Averages";
extern string Indi = "Данные индикатора!";
input int InpMAPeriod = 20; // Period
input int InpMAShift = 0; // Shift
input ENUM_MA_METHOD InpMAMethod = MODE_EMA; // Method

extern string commentTMA = "TMAnew";
extern string IndiTMA = "Данные индикатора!";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double MA, MA1, TMA, TMA1, Close1, Close2, Close3, Open1, TP, SL;
int ticket, ticketclose;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==3 || Digits==5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
MA = iCustom(Symbol(), 0, "Custom Moving Averages", InpMAPeriod, InpMAShift, InpMAMethod, 0, 0);
MA1 = iCustom(Symbol(), 0, "Custom Moving Averages", InpMAPeriod, InpMAShift, InpMAMethod, 0, 1);
TMA = iCustom (Symbol(), 0, "TMAnew", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 0);
TMA1 = iCustom (Symbol(), 0, "TMAnew", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 1);

Close1 = iClose (Symbol(), 0, 1);
Close2 = iClose (Symbol(), 0, 2);
Close3 = iClose (Symbol(), 0, 3);
Open1 = iOpen (Symbol(), 0, 1);

if(TMA1 MA && CountBuy()==0)
{
SL = NormalizeDouble(Ask - StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,comment,Magic,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
if(OrderModify(ticket,OrderOpenPrice(),SL,0,0) == true)
Print("Ордер успешно изменился");
}
}
}

if(TMA1 > MA1 && TMA {
SL = NormalizeDouble(Bid + StopLoss*Point,Digits);
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,comment,Magic,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
if(OrderModify(ticket,OrderOpenPrice(),SL,0,0) == true)
Print("Ордер успешно изменился");
}
}
}

if(TMA1MA && CountSell() > 0)
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black) == true)
Print("Ордер успешно закрылся!");
}
}
}
if(TMA1>MA1 && TMA 0)
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
if (OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black) == true)
Print("Ордер успешно закрылся!");
}
}
}

}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for(int i = OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() && OrderType() == OP_SELL)
count++;
}
return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for(int i = OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() && OrderType() == OP_BUY)
count++;
}
return(count);
}
//+------------------------------------------------------------------+

#3007
htp87 тма перерисовывает не только 0-бар, но и ещё HalfLength-баров. Поэтому сделки на истории будут не там. Пробуйте в режиме визуализации (придётся ручками индюки ставить)
#3008

Добрый день. Спасибо за такой курс. Научился программированию по нему недели за две. Строчу этих роботов теперь по пять штук в неделю ))) Столкнулся с небольшой трудностью. Сделал робота открывающего сделки в начале каждой свечи. Но например при открытии рынка, когда уже тики идут или при экспирации рынок закрыт. Соответственно робот отрабатывает свои сигналы (10 прописал), а сделки нет. Когда уже рынок открывается робот молчит до следующей свечи. Подскажите пожалуйста функцию открытого рынка? Не могу сообразить...

#3009


Добрый день. Спасибо за такой курс. Научился программированию по нему недели за две. Строчу этих роботов теперь по пять штук в неделю ))) Столкнулся с небольшой трудностью. Сделал робота открывающего сделки в начале каждой свечи. Но например при открытии рынка, когда уже тики идут или при экспирации рынок закрыт. Соответственно робот отрабатывает свои сигналы (10 прописал), а сделки нет. Когда уже рынок открывается робот молчит до следующей свечи. Подскажите пожалуйста функцию открытого рынка? Не могу сообразить...



да пожалуйста:
http://docs.mql4.com/ru/check/istradeallowed
http://docs.mql4.com/ru/check/istradecontextbusy

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

Изменено 16 января, 2016 пользователем dermitay

#3010

А так можно?
if (IsTradeAllowed() && !IsTradeContextBusy())
Вроде в тестере пока хорошо показывает. Гляну на открытии сегодня, в смысле завтра...
И спасибо. Я видел эти функции, но по описанию мой мозг отказывался доверять им ))).

#3011


А так можно?
if (IsTradeAllowed() && !IsTradeContextBusy())
Вроде в тестере пока хорошо показывает. Гляну на открытии сегодня, в смысле завтра...
И спасибо. Я видел эти функции, но по описанию мой мозг отказывался доверять им ))).



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

так что тут только тесты на реале нужны >:d
#3012

Здравствуйте! Подскажите пожалуйста, есть ли функции типа: вкл/выкл советников, или разрешать/запрещать торговлю, ну на крайняк отключиться/подключиться к счёту. Хочу написать сова, который бы ограничивал бы работу других работающих советников на счету по времени.

#3013

Обновили урок по написанию советника на мартингейле
http://tradelikeapro.ru/pishem-sovetnik-po-martingeylu/

#3014

Здравствуйте! Подскажите, может быть у кого-нибудь есть пример работы с GlobalVariable или видео-урок по работе с глобальными переменными, например с GlobalVariableSet()?

Изменено 18 января, 2016 пользователем Sany2912

#3015


Здравствуйте! Подскажите, может быть у кого-нибудь есть пример работы с GlobalVariable или видео-урок по работе с глобальными переменными, например с GlobalVariableSet()?



ну как бы есть же официальная документация, в которой всё популярно разжевано. работа точно такая же как и с кучей ордеров или одномерным массивом элементов. вместо OrdersTotal() берется GlobalVariablesTotal(), вместо OrderSelect() в цикле перебора нужно создавать стринговую перменную и в нее пихать GlobalVariableName(#i-тый элемент#) и далее все манипуляции проводить через это стринговое имя.

нюансы. имя переменной(GlobalVariableName()) - только String, а значение GlobalVariableGet() существует в двух вариациях, тащить можно с проверкой через два параметра(возврат будет булевый) а можно и через один и тут возврат только double. GlobalVariableSet не только меняет значение уже существующей переменной но еще и создает новую, если перменной с запрашиваемым именем не существует.

Все изменения с глобальными переменными можно "вживую" отслеживать нажатием клавиши F3 в терминале.

http://docs.mql4.com/ru/globals

Изменено 18 января, 2016 пользователем dermitay

#3016

Помогите пожалуйста. Захотел написать советник на основе magic dots. Скачал пример советника и в нем внес изменения. Цель, чтобы при появлении синий точки покупал, а при красной точке продавал(закрывая предыдущую сделку). Пытаюсь взять из буфера сигнал, вроде ошибок нет, но сделки советник не открывает к сожалению.

int IndicatorSignal()
{
int Sig=0;

double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",ma_method,period,2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",ma_method,period,3,0);


if ((mg_1 if ((mg_1>mg_2)) Sig=2;


return(Sig); }

Super.mq414 скач.
Magic_dots_2_mtf_alerts.mq412 скач.

#3017

Oll, как вы сделали "VaBank" так, чтоб он работал на одном счете одновременно на разных парах?? Дело лишь в разных магиках или, всетаки, есть еще какие то особенности, например каждому сов.выделить определенный размер депозита?

#3018





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

2. вывод

if ((mg_1 if ((mg_1>mg_2)) Sig=2;

немного некорректен, не думали что одно из значений может(и будет) равно нулю? сделки на бай уже пролетают лесом как минимум. а если вытаскиваемое значение таки не равно нулю а например нерисуемое на графике значение буфера будет равно +100500 или -100500?
не проще просто сравнивать с нулем чем между собой?

Изменено 19 января, 2016 пользователем dermitay

#3019


Oll, как вы сделали "VaBank" так, чтоб он работал на одном счете одновременно на разных парах?? Дело лишь в разных магиках или, всетаки, есть еще какие то особенности, например каждому сов.выделить определенный размер депозита?

Сова проверяет магик и пару. Какой депо выделить - задача пользователя. Совы установленные на разные пары ничего о друг-друге не знают.
#3020






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

2. вывод

if ((mg_1 if ((mg_1>mg_2)) Sig=2;

немного некорректен, не думали что одно из значений может(и будет) равно нулю? сделки на бай уже пролетают лесом как минимум. а если вытаскиваемое значение таки не равно нулю а например нерисуемое на графике значение буфера будет равно +100500 или -100500?
не проще просто сравнивать с нулем чем между собой?


Поправил
int IndicatorSignal()
{
int Sig=0;

double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",3,0);


if ((mg_1 >= 0)) Sig=1;
if ((mg_2 >= 0)) Sig=2;



return(Sig);
}

вот так. Теперь он открывает, только одну сделку на sell, не закрывая ее.

#3021



Oll, как вы сделали "VaBank" так, чтоб он работал на одном счете одновременно на разных парах?? Дело лишь в разных магиках или, всетаки, есть еще какие то особенности, например каждому сов.выделить определенный размер депозита?

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


Понял, спасибо!
#3022


Поправил
int IndicatorSignal()
{
int Sig=0;
double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",3,0);
if ((mg_1 >= 0)) Sig=1;
if ((mg_2 >= 0)) Sig=2;
return(Sig);
}
вот так. Теперь он открывает, только одну сделку на sell, не закрывая ее.



включите логику. если сигнала нет вобще - то он может быть и равен нулю, что является судя по функции сигналом и на бай и на селл. сигнал должен быть строго больше нуля.
судя по вашему коду в итоге у вас всегда будет возвращен Sig = 2.
плюс я хз какой код в основном блоке. может вы с условиями открытия/закрытия ордера налажали >:d

Изменено 19 января, 2016 пользователем dermitay

#3023



Поправил
int IndicatorSignal()
{
int Sig=0;
double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2,0);
double mg_2=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",3,0);
if ((mg_1 >= 0)) Sig=1;
if ((mg_2 >= 0)) Sig=2;
return(Sig);
}
вот так. Теперь он открывает, только одну сделку на sell, не закрывая ее.



включите логику. если сигнала нет вобще - то он может быть и равен нулю, что является судя по функции сигналом и на бай и на селл. сигнал должен быть строго больше нуля.
судя по вашему коду в итоге у вас всегда будет возвращен Sig = 2.
плюс я хз какой код в основном блоке. может вы с условиями открытия/закрытия ордера налажали >:d


Спасибо, сделал так.
if ((mg_1 > 0)) Sig=1; else
if ((mg_2 > 0)) Sig=2;
Начал выдавать сигнал на покупку вместо продажи
Подскажите здесь нужен, какой-то цикл типа for, чтобы он считал и sig=1 и sig=2?
#3024
mops0000 буфер индикатора выглядит так:
0,0,0,0,0,0,0,0,1.1254,0,0,0,0,0,0,1.2687,0,0,0,0,0,
значения отличные от "0" - координаты цены отрисовки точки (красной или зелёной - разницы нет)
нужно брать значения не с 0 бара - там они точно появляются и исчезают несколько раз, а с 1 бара, т.е.
double mg_1=iCustom(Symbol(),0,"Magic dots 2 mtf alerts",2, 1 );
кстати вот вызов Вашего индюка (попробуйте):
iCustom(NULL, 0, "Magic dots 2 mtf alerts", 0, MODE_EMA, 6, 0, PRICE_CLOSE, false, false, false, false, false, false, 2, 1)
чтоб прога лучше читалась используйте стандартные константы (совет), типа:
if ((mg_1 > 0)) Sig=OP_SELL; ( или OP_BUY для 3 буфера )
реверс сигнала тогда пишется просто: Sig = 1- Sig;
#3025

Спасибо. Я попробовал изменить как Вы написали iCustom(NULL, 0, "Magic dots 2 mtf alerts", 0, MODE_EMA, 6, 0, PRICE_CLOSE, false, false, false, false, false, false, 2, 1), теперь при тестировании начали появляться точки сигнала, но цену все равно только один раз открывает на бай и все потом не закрывает. Я посмотрел здесь Урок №3 — пишем советник на внешнем индикаторе и переписал советник, но проблема теперь в том, что он открывает в начале по точкам сначала бай и селл, многократно и только потом переходит к следующей точке? И как указать, что если точка после открытия ордера появляется следующая точка того же цвета, чтобы он не открывал ещё один ордер, а продолжал пока не появится точка другого цвета?

Untitled_1.jpg

Изменено 19 января, 2016 пользователем mops0000

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

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