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

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


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

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


Проверь ещё раз глазом я сразу увидел ошибку в функции ModifyOrders(int otype)

double avgprice = 0,


Логику не смотрел!!!


Сразу - не обязательно правильно.

Renjeni

В фукции CountTrades, эта строчка:
for(int i=OrdersTotal()-1; 1>=0; i--)

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

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

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

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

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

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

Перейти

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

Перейти

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

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



Проверь ещё раз глазом я сразу увидел ошибку в функции ModifyOrders(int otype)

double avgprice = 0,


Логику не смотрел!!!


Сразу - не обязательно правильно.

Renjeni

В фукции CountTrades, эта строчка:
for(int i=OrdersTotal()-1; 1>=0; i--)

И историю котировок в тестер нужно подгрузить.




for(int i=OrdersTotal()-1; i>=0; i--)
;)

Добавлено: 18-10-2013 21:02:59



Проверь ещё раз глазом я сразу увидел ошибку в функции ModifyOrders(int otype)

double avgprice = 0,


Логику не смотрел!!!


Сразу - не обязательно правильно.

Renjeni

В фукции CountTrades, эта строчка:
for(int i=OrdersTotal()-1; 1>=0; i--)

И историю котировок в тестер нужно подгрузить.



Цитата

Сразу - не обязательно правильно.

:-? :-? :-?
не понял!!! :d
Ссылка на сообщение
Поделиться на другие сайты

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

спасибо большое, а то я все проверяю скобки, запятые,логику..
только другая проблема выявилась - открывает только один ордер , то есть при уходе цены в обратную сторону не открывает 2 ордер и т.д. - это ведь martin

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

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

Уважаемый Vorchunozavr,в том то все и дело что в памяти остается виртуалка, в данный момент по коду,вот я хочу сделать так что бы виртуальные ордера удолялись из памяти вместе с отложенными ордерами вечером,если же отложники сработали,то все равно виртуалки обнулялись.Господин xbms мне посоветовал вчера написать функции типа CountTrade().Я написал не помогло пока, пишет при компиляции что функции не используются.Пока не знаю как их обнулить.если интересно посмотри код на 26 строничке test21 что б не загружать по сотню раз одно и тоже.

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

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


Уважаемый Vorchunozavr,в том то все и дело что в памяти остается виртуалка, в данный момент по коду,вот я хочу сделать так что бы виртуальные ордера удолялись из памяти вместе с отложенными ордерами вечером,если же отложники сработали,то все равно виртуалки обнулялись.Господин xbms мне посоветовал вчера написать функции типа CountTrade().Я написал не помогло пока, пишет при компиляции что функции не используются.Пока не знаю как их обнулить.если интересно посмотри код на 26 строничке test21 что б не загружать по сотню раз одно и тоже.



Денис, CountTrades() - это функция, которую нужно добавить в код... и которую ты должен был написать:

int CountTrades() 
{
int count = 0;
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_SELL || OrderType() == OP_BUY)
count++;
}
}
return (count);
}


разбери и прокомментируй каждую строчку этого кода!
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


спасибо большое, а то я все проверяю скобки, запятые,логику..
только другая проблема выявилась - открывает только один ордер , то есть при уходе цены в обратную сторону не открывает 2 ордер и т.д. - это ведь martin



Для BUY должно тянуть сетку. А вот для SELL, две ошибки есть:
     else if (order_type ==OP_SELL)
{
price=FindLastPrice(OP_BUY);
if( Bid {
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot*Multiplier,2);
ticket = OrderSend(Symbol(),OP_SELL,lastlot,Bid,Slippage,0,0,"",Magic,0,Red);
if ( ticket > 0)
ModifyOrders( OP_SELL);
}
}



:-? :-? :-?
не понял!!! :d



Я просто посоветовал не спешить с неверным ответом. Ведь здесь ошибок нет:
  double avgprice = 0,
order_lots = 0;
Ссылка на сообщение
Поделиться на другие сайты

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

Извините Vorchunozavr!!! l-)

Цитата

Я просто посоветовал не спешить с неверным ответом. Ведь здесь ошибок нет:
Код: [Выделить]

double avgprice = 0,

order_lots = 0;



Для меня это ошибка а для Вас нет или как объясните :-?? я думал так:

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

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

double avgprice = 0, order_lots = 0; 


Объявлены две локальные переменные типа double, сразу присвоены значения. Так, чрез запятую и пишется.
Ссылка на сообщение
Поделиться на другие сайты

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


А как в коде обозначить предыдущий бар?


рискну предположить, что Open[1] это и есть предыдущий бар. А всё что точнее из вопроса не понятно.
Ссылка на сообщение
Поделиться на другие сайты

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

А всё что точнее из вопроса не понятно.


Например:
if(предыдущий бар == BuyPinBar) OrderSend(.......);(текст не в коде потому что у меня высвечивается ошибка)
Ссылка на сообщение
Поделиться на другие сайты

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


Цитата

А всё что точнее из вопроса не понятно.


Например:
if(предыдущий бар == BuyPinBar) OrderSend(.......);(текст не в коде потому что у меня высвечивается ошибка)

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

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

а пинбар ты как определяешь


Из индикатора определения пин-баров. Их в интернете полно. Так как определить предыдущий бар, кто знает?
Ссылка на сообщение
Поделиться на другие сайты

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


Цитата

а пинбар ты как определяешь


Из индикатора определения пин-баров. Их в интернете полно. Так как определить предыдущий бар, кто знает?

Дык, это всем известно :)
Пишете функцию, используя Open[1], Close[1], High[1], Low[1]. В ней проверяете, процентное отношение, размеров хвостов свечи и тела (т.е., является-ли она, пинбаром вообще и пин-бай это, или пин-селл). Именно единичка в скобочках обозначает предыдущий бар, что mzk_3om6u и написал.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Дык, это всем известно :)
Пишете функцию, используя Open[1], Close[1], High[1], Low[1]. В ней проверяете, процентное отношение, размеров хвостов свечи и тела (т.е., является-ли она, пинбаром вообще и пин-бай это, или пин-селл). Именно единичка в скобочках обозначает предыдущий бар, что mzk_3om6u и написал.

Вот у меня такая функция пин-бара:
bool IsBuyPinbar(double& dayRange, int pos)
{
double actOp,actCl,actHi,actLo,preHi,preLo,preCl,preOp,actRange,preRange,actHigherPart,actHigherPart1;
actOp=Open[pos+1];
actCl=Close[pos+1];
actHi=High[pos+1];
actLo=Low[pos+1];
preOp=Open[pos+2];
preCl=Close[pos+2];
preHi=High[pos+2];
preLo=Low[pos+2];
actRange=actHi-actLo;
preRange=preHi-preLo;
actHigherPart=actHi-actRange*0.4;
actHigherPart1=actHi-actRange*0.4;


dayRange=AveRange4(pos);
if((actCl>actHigherPart1&&actOp>actHigherPart)&&
(actRange>dayRange*0.5)&&
(actLo+actRange*0.25 {

if(Low[ArrayMinimum(Low,3,pos+3)]>Low[pos+1])
return (true);
}
return(false);

}
Для медвежьего почти так само.
Если я пишу что-то типа:

if(IsBuyPinbar(dayRange,pos)) OrderSend(.........)

То проверяя в тестере стратегий советник ордера не открываются.
Я поняла как обозначить предыдущий бар.
double dlow = Low [1]; // Минимум предыдущего бара
double dhigh = High [1]; // Максимум предыдущего бара
double dopen = Open [1]; // Открытие предыдущего бара
double dclose = Close[1]; // Закрытие предыдущего бара
double UpBar = dclose >= dopen, DownBar = dclose Теперь у меня написано:

if(UpBar || DownBar == IsBuyPinbar(dayRange,pos)) OrderSend(.........)

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

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


elruso

double avgprice = 0, order_lots = 0; 


Объявлены две локальные переменные типа double, сразу присвоены значения. Так, чрез запятую и пишется.


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

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

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

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

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

Народ я смотрю Вы про прайс акшен заговорили это интересно! Я вот сидел, сидел и высидел!
Код смотрит на все бары в чарте у меня на М5, и выбирает только "Пейролы"!! Замеряет их и выводит на экран потентиальные профиты и лосы для медведей и отдельно для быков! по истории на М5 получается за последний год! 12"Пейролов"! Я вывел внешние параметры где можно менять условия, то есть поставить допустим день 4-четверг и кол-во дней в месяц Как распечатать массив на экран нашёл способ через стринг, я думаю наверно другого и нету :-? Только вот сейчас пытаюсь соответственно вывести среднии значения, но не могу додуматься как сложить профиты а потом их разделить ни их общее колличество и тоже вывести на экран??? Если у когото есть идеи подтолкните плиз!!!


int init()
{
//----

string array[],str;

for(int i=0; i
if (TimeHour(Time) == 15 && TimeMinute(Time) == 30 && TimeDayOfWeek(Time) == HistoryNewsDay && TimeDay(Time)

if (Close>Open) {

int BullProfit = MathAbs(High-Open)/Point;
int BullStopLoss = MathAbs(Open-Low)/Point;

array=TimeToStr(Time) + "\n" + "Bull " + BullProfit + "pips " + BullStopLoss + " Stop " + "\n" ;
str=StringConcatenate(array,str) ;
Comment(str);



}

if (Close) {

int BearProfit = MathAbs(Open-Low)/Point;
int BearStopLoss = MathAbs(High-Open)/Point;

array=TimeToStr(Time) + "\n" + "Sell " + BearProfit + "pips " + BearStopLoss + " Stop " + "\n";
str=StringConcatenate(array,str) ;
Comment(str);


}

}


}

//----
return(0);
}

Screen_Shot_2013-10-19_at_11.57.01_AM.png

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

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


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



Сегодня я велосипед не напишу..., попробуем покататься на чужом :d

Есть индикатор PinBar ND, используем его и функцию iCustom (shift ставим 1 - нам нужен предыдущий бар).

bool pinbuy, pinsell;
pinbuy = iCustom(Symbol(), 0, "PinBar ND", 0, 1);
pinsell = iCustom(Symbol(), 0, "PinBar ND", 1, 1);


Дальше: if (pinbuy == true) - делаем одно, if (pinsell == true) - другое. Потом, обкладываем всё условиями...
Да, кстати, Ваше условие (if(UpBar || DownBar == IsBuyPinbar(dayRange,pos)), некорректно.

(индикатор должен быть в папке indicators)

PinBar_ND.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Vorchunozavr, так это же тот же индикатор по которому я писала советник. Теперь я поняла свои ошибки, сейчас исправлю.

Добавлено: 20-10-2013 06:32:03

Ура! Заработало!
Только есть одна проблемка. :d
У меня стоит if (pinbuy == true && CountBuy() == 0) то ...., так же само и с пин-баром на селл if (pinsell == true && CountSell() == 0).
Так вот в чем проблемка. Со временем могут появляться и другие пин-бары, а если же будет постоянно выполнятся этот код, то по другому пин-бару я просто не войду. Можно ли написать if (pinbuy == true && CountSell() == 0 до появления нового пин-бара) то .....
Или как-то подругому нужно решить эту проблемку?
Изменено пользователем TANZA
Ссылка на сообщение
Поделиться на другие сайты

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


Vorchunozavr, так это же тот же индикатор по которому я писала советник. Теперь я поняла свои ошибки, сейчас исправлю.


Добавлено: 20-10-2013 06:32:03

Ура! Заработало!
Только есть одна проблемка. :d
У меня стоит if (pinbuy == true && CountBuy() == 0) то ...., так же само и с пин-баром на селл if (pinsell == true && CountSell() == 0).
Так вот в чем проблемка. Со временем могут появляться и другие пин-бары, а если же будет постоянно выполнятся этот код, то по другому пин-бару я просто не войду. Можно ли написать if (pinbuy == true && CountSell() == 0 до появления нового пин-бара) то .....
Или как-то подругому нужно решить эту проблемку?



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

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


Наверное надо закрыть открытую сделку при появлении нового пинбара!


Неа, мне нужно на каждом пин-баре входить в позицию. А кто-то вообще видел в интернете бесплатный советник пин-баров?
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет!


Vorchunozavr, так это же тот же индикатор по которому я писала советник. Теперь я поняла свои ошибки, сейчас исправлю.


Добавлено: 20-10-2013 06:32:03

Ура! Заработало!
Только есть одна проблемка. :d
У меня стоит if (pinbuy == true && CountBuy() == 0) то ...., так же само и с пин-баром на селл if (pinsell == true && CountSell() == 0).
Так вот в чем проблемка. Со временем могут появляться и другие пин-бары, а если же будет постоянно выполнятся этот код, то по другому пин-бару я просто не войду. Можно ли написать if (pinbuy == true && CountSell() == 0 до появления нового пин-бара) то .....
Или как-то подругому нужно решить эту проблемку?


Если не заморачиваться, можно отправить советник спать, после открытия ордера. Измерять будем свечками:
ticket = OrderSend(.................)
if (ticket > 0)
{
if (OrderModify(.............))
{
int sleep = timefr*60*1000;
Sleep(sleep);
}
}


timefr - во внешние переменные. Это период графика в минутах (если H1, пишем 60, если H4 - 240).
Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;
Теперь, можно ограничить общее количество ордеров: if (CountSell() (например)

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

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

Добрый день ув. Трейдеры,

Помогите пожалуста создать советник по следущим параметрам.

Индикаторы:

MA с периодом 85, low, linear weight
MA с периодом 75, low, linear weight
MA с периодом 5, close, exponential
MACD с параметрами 15, 26, 1

Сделки:
когда МА(5) пересекает сверху вниз МА(85) и МА(75) и у МАCD
1 бар закрылся ниже нуля то продаем.
Для покупок все наобарот.

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

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

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

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

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

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

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

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

Войти

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

Войти

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


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

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