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

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


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

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

Я пробую к примеру int Total = OrderCount(-1, 0, "USDCHF"); только по паре.
но у меня не определяется OrderCount, пишет ошибку


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

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

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

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

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

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

Перейти

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

Перейти

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

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

OrderCount,



Я пробую к примеру int Total = OrderCount(-1, 0, "USDCHF"); только по паре.
но у меня не определяется OrderCount, пишет ошибку


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

я про OrderCount, а не OrdersTotal()

Добавлено: 11-04-2017 22:35:10

8 часов шуршания на различных форумах и вот что собрал:

Перед открытием позиций бай и селл :


{
// Buy
//-----------------------------------------------------------------------------------
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType() return(0);
{
}
}
}
//------------------------------------------------------------------------------------
И аналогично в селл только с переменной "i1".

total убрал, если символ и магик совпадает, то всё открывается как нужно, так же при тесте менял в коде пару и магик, и бот начинает открывать тысячи ордеров, значит всё должно быть в порядке.

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

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

То что тормозит, то тут нет ничего удивительного. Тормозить может, и скорее всего, из-за тяжелых алгоритмов самих индикаторов. Не факт, что индикаторы какие-то кривые, просто Вы используете 4 индикатора (8 буферов). При этом Вы на каждом тике проверяете все 8 буферов. При каждом обращении к буферу производятся вычисления в индикаторах. Вот и представьте себе объем этих вычислений. Если ТС не требует проверки показателей индикаторов на каждом тике, то можно тут оптимизировать (например, проверять с интервалом от нескольких секунд, а может и раз в минуту). Возможно не нужно следить за индикаторами, когда позиция в рынке... Ну и т.д. Все зависит от стратегии.
В конце тестирования в режиме визуализации на графике рисуются все индикаторы, которые используются - это норма.



Здравствуйте!
Разобрался со своим вопросиком. Мой косяк был в том, что я брал данные из комплексного индикатора, который, в свою очередь, брал данные из исходных индикаторов.
Когда взял исходные индикаторы, все получилось. Если кому будет интересно, выкладываю советник и индикаторы. Советник простенький, делал только для проверки стратегии.
Стратегия отличается от классической Genesis Matrix, в ней используются только сигналы матрицы Genesis на таймфреймах М5 и Н1. Если все 8 сигналов на покупку - покупаем, если на М5 все сигналы на продажу - выходим из покупки. Для продажи - аналогично.

Добавлено: 13-04-2017 06:42:58

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

Genesis_Generic.mq4
GannHiLo-Histo.mq4
T3_2ColorHisto.mq4
TVI.mq4

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

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

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



Здравствуйте! Примерно так можно.

datetime TimeClose=D'2017.02.01 00:00';//время, когда необходимо закрыть
int orderTicket=12345;//тикет закрываемого ордера
if(TimeCurrent()>=TimeClose)
{
if(OrderSelect(orderTicket,SELECT_BY_TICKET))
{
OrderClose(OrderTicket(),OrderLots(),Bid,100,clrNONE);
}
}

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

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

Помогите плз с кодом пина для дашборда.

Есть условие:

int pin( int i ) {
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer) // это условие нужно записать в зависимости от symbols[]
return(2);
if (ExtRedBuffer) //и это условие нужно записать в зависимости от symbols[]
return(1);

return( 0 );
}

string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"};

Так вот - каким макаром возвращять условие по каждой паре из symbols[] в pin() + return 1 или 2 от пары и выполненных условий??

Заранее спасибо.................

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

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

Можно сделать так:


int pin( int i ) {
double ExtRedBuffer = iCustom(symbols,0,"SampleInd",13,0,1);
double ExtLimeBuffer = iCustom(symbols,0,"SampleInd",13,1,1);
double ExtBlueBuffer = iCustom(symbols,0,"SampleInd",13,2,1);
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer)
return(2);
if (ExtRedBuffer return(1);
return(0);
}

string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"};
Ссылка на сообщение
Поделиться на другие сайты

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


Можно сделать так:


int pin( int i ) {
double ExtRedBuffer = iCustom(symbols,0,"SampleInd",13,0,1);
double ExtLimeBuffer = iCustom(symbols,0,"SampleInd",13,1,1);
double ExtBlueBuffer = iCustom(symbols,0,"SampleInd",13,2,1);
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer)
return(2);
if (ExtRedBuffer return(1);
return(0);
}

string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"};




Пасиб)
когда пишу так -


ExtBlueBuffer=iMA(symbols,timeframe,InpJawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,InpLipsShift);
ExtRedBuffer=iMA(symbols,timeframe,InpTeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,InpLipsShift);
ExtLimeBuffer=iMA(symbols,timeframe,InpLipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,InpLipsShift);
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer)
return(2);
if (ExtRedBuffer)
return(1);


получаю 100% вылет из массива, т.к symbols[] ессессенно за ним((
и еще: c iCustom понятно, но вписываю код в сам индикатор, поэтому не понятно как возвращать return именно для конкретной symbols[]
Ссылка на сообщение
Поделиться на другие сайты

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

Всю ветку еще не прочел. Подскажите как закрыть ордер по профиту учитывая накопившийся своп?

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

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

Всю ветку еще не прочел. Подскажите как закрыть ордер по профиту учитывая накопившийся своп?


Если совсем кратко, то рассчитать профит с учетом свопа так:
double profit = (OrderProfit()+OrderSwap());
а если еще и с учетом комиссии, то так:
double profit = (OrderProfit()+OrderSwap()+OrderCommission());

А если подробно, то надо сначала выбрать нужный ордер, а потом уже его закрыть. Примерно так:

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic
&& (OrderType() == OP_BUY || OrderType() == OP_SELL))//какой тип выбирайте сами
{
double profit=(OrderProfit()+OrderSwap()+OrderCommission());
if(profit > 0)// или больше какого-то порога
{
//закрываете с помощью функции OrderClose()
}
}
}
}
Изменено пользователем Sergey Forex
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Всем здравствуйте! Я тут как-то скачивал видео-уроки(у меня очень плохая память на имена существительные, так что имя автора уроков я не помню), и уже, где-то недели три занимаюсь и стараюсь научиться языку программирования MQL4. Сложновато. Но учиться надо однозначно. Скопировал из уроков себе советника на основе Мартингейла(на мой взгляд это самый, что ни на есть, прибыльный ход развивающихся событий). И в данный момент нахожусь в состоянии познания. Только что прочитал статью, о графике ADX. Статья понравилась и я подумал:"А не прицепить мне к своему Мартингейлу график ADX. Подумал и прицепил. И что получилось?! А получилось следующее, раньше по валютной паре EUR/USD, с начальным депозитом 1000 долларов, лотом 0.1 и удвоением ставки на 1.5, он давал прибыль за прошедший год 6000 тысяч долларов с небольшим перевесом в плюс. И только что проверил его с графиком ADX, прибыль уменьшилась до 5500 долларов. Но увеличилось количество правильных сделок, то есть, в сторону тренда. И заметно уменшилось волнение за слив депозита, так как советник открывал правильные сделки. Значит можно увеличить лот(скорей всего). Программирование - штука хорошая, интересная. А еще интересна она тем, что тут(в программировании), еще нет женщин - им пока это не интересно, то есть, их эмоциональное мышление плохо подчиняется логическому мышлению. Так что программирование - это своего рода рыбалка будущего. Повар - мужского рода, но за плитой на кухне, обычно руководят женщины.

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

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

Или хоть в этом---
есть:
какие-то параметры
string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"}
int aa;
int bb;

у каждой валютной пары аа и bb разные

и я хочу написать условие от Symbols() т.е к примеру


int blabla( int i ) {

if (aa>bb) //Как проверять это условие в зависимости от Symbols()??
return(1);
else
return(4);
return(0);
}


вот так:

if (aa>bb && Symbols()==symbols)

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

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

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

Здравствуйте! Примерно так можно.


Код: [Выделить]
datetime TimeClose=D'2017.02.01 00:00';//время, когда необходимо закрыть
int orderTicket=12345;//тикет закрываемого ордера
if(TimeCurrent()>=TimeClose)
{
if(OrderSelect(orderTicket,SELECT_BY_TICKET))
{
OrderClose(OrderTicket(),OrderLots(),Bid,100,clrNONE);
}
}


Спасибо за ответ!
Не догнал, что можно было бы просто "TimeCurrent()>=TimeClose", еще никак не привыкну к машинной логике :-)
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день, коллега!
Если у каждой валютной пары aa и bb разные, то так:

string symbols[] = {"AUDCAD","AUDCHF","AUDJPY"};
int aa[] = {3, 5, 6};
int bb[] = {4, 9, 8};

и далее сама функция:
int blabla(int i)  // где, i - индекс валютной пары в массиве
{
if (aa > bb && Symbols() == symbols)
return(1);
else
return(4);
return(0);
}
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте все!

Подскажите, пожалуйста, как решить вот такую засаду:

вставил в советник рисование стрелок вот так

ArrowUpCreate(0,"ArrowUp"+(string)TimeCurrent(),0,0,0,ANCHOR_TOP,clrTeal,STYLE_SOLID,3,false,false,true,0);

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

Вопрос: как сделать отображение моих стрелок на графике безусловно?
Ссылка на сообщение
Поделиться на другие сайты

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

Чет не совсем понимаю. Вы хотите, чтобы после прогона советника в тестере у вас появлялись стрелки на реальном графике инструмента?

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

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

Вы хотите, чтобы после прогона советника в тестере у вас появлялись стрелки на реальном графике инструмента?


Ну, да. Как после прогона в тестере появляется отображение сделок.
Ссылка на сообщение
Поделиться на другие сайты

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

Ну, да. Как после прогона в тестере появляется отображение сделок.



Когда вы прогоняете в тестере в режиме визуализации, то естественно стрелки рисуются на графике, где этот тест визуализируется. Тест никак не связан с реальным текущим открытым графиком (-ми) инструмента. Поэтому стрелки, которые были нарисованы в режиме визуализации не отображаются на реальном графике. Чтобы перенести стрелки, нарисованные в тестере, на реальный график нужны танцы с бубном. Можно, например, данные этих стрелок ( время, цена и т.п.) во время тестирования сохранять в файл. А уже после теста из файла переносить скриптом на нужный график.
Ссылка на сообщение
Поделиться на другие сайты

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

Чтобы перенести стрелки, нарисованные в тестере, на реальный график нужны танцы с бубном


Спасибо, DreamWorks!
Я уж тоже понял, что так просто не получится :(
Ссылка на сообщение
Поделиться на другие сайты

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

Привет, коллеги!
Как и многие здесь, тоже начал изучать язык по урокам с сайта.
В домашке к третьему уроку столкнулся с задачей: не открывает отложку с ошибкой 130 (неверный стоп). Даже при стопе = 0. Уже и MarketInfo() подключил - все равно пишет ошибку в тестере. При компиляции все нормально.
Вот код:
case 2: // работаем отложками

//--- получим минимальное значение Stop level
minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");

MSL = NormalizeDouble (minstoplevel*Point, Digits);
BuyStop = NormalizeDouble(PriceHigh + PipStop*Point, Digits) + MSL;
SellStop = NormalizeDouble(PriceLow - PipStop*Point, Digits) - MSL;


if (CountBuy() == 0 && Bid >= PriceHigh)
{
SL = NormalizeDouble(TMACentr - minstoplevel*Point - indent*Point, Digits);
TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow)*Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lot, BuyStop, Slippage, SL, TP, "TMA Fair", Magic, 0, Blue);

if (ticket Print ("Не удалось открыть отложенный ордер на покупку");
}
if (CountSell() == 0 && Ask {
SL = NormalizeDouble(TMACentr + minstoplevel*Point + indent*Point, Digits);
TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow)*Point, Digits);

ticket = OrderSend(Symbol(), OP_SELLSTOP, Lot, SellStop, Slippage, SL, TP, "TMA Fair", Magic, 0, Red);

if (ticket Print ("Не удалось открыть отложенный ордер на продажу");
} break;
Подскажите, что не так?

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

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

На Sell тейкпрофит меньше цены открытия, т. е. нужно отнимать. И не от хая, а от лоу. По моему так.

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

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


На Sell тейкпрофит меньше цены открытия, т. е. нужно отнимать. И не от хая, а от лоу. По моему так.


Спасибо за указанную ошибку - глаз замылился, наверное) Исправил. Но все равно дает 130 ошибку...
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
well72, Вы задаете ТП TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow)*Point, Digits);
насколько я понимаю PriceHigh, PriceHigh, PriceLow это все цена. Не надо умножать ее на пункты:
TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow), Digits);

а здесь:
MSL      = NormalizeDouble (minstoplevel*Point, Digits);
BuyStop = NormalizeDouble(PriceHigh + PipStop*Point, Digits) + MSL;
SellStop = NormalizeDouble(PriceLow - PipStop*Point, Digits) - MSL;

я бы сделал так:
MSL      = NormalizeDouble (minstoplevel*Point, Digits);
BuyStop = NormalizeDouble(PriceHigh + PipStop*Point + MSL, Digits);
SellStop = NormalizeDouble(PriceLow - PipStop*Point - MSL, Digits);


или, чтобы советник не ругался на счет неправильных стопов из-за стоплевела, то так лучше сделать так:
if(PipStop if(indent 



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

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

Спасибо, Сергей! Все заработало.
Надо будет в case 3 еще сделать так, чтобы бот удалял не отработавшую страховочную отложку, если сработал маркет. Или сделать выбор во внешних - удалять или нет.
А лучше, думаю, буде удалять отложку при закрытии маркета тейком.
Кстати, вопрос: в уроках ведущий то использует скобки в операторе if, то не использует. Так и не могу определиться: нужны они или нет?

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

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

Добрый день, начал обучение Mql4, прошел уроки и дом. зд., начал писать советник на индикаторе Slope Direction Line!Идея в том, чтобы сова открывала ордер на 2й свече после перекрашивания индикатора. С моими знаниями написал это (во вложение), объясните пожалуйста в чем ошибка?

slope2.ex4
slope2.mq4

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

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

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

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

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

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

Войти

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

Войти

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


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

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