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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Для открытие только одного ордера в день использую эту функцию:
Цитата

bool One_Order_Per_Day()
{
for(int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol() == Symbol())
{
if(TimeDay (OrderOpenTime()) == Day() &&
TimeMonth(OrderOpenTime()) == Month() &&
TimeYear (OrderOpenTime()) == Year())

return(1);
}
}
return(0);
}



Но из за неё в тестере советник катастрофически медленно прогоняется... ~x(
Вплоть до нескольких часов при прогоне за 5-6 лет.

Подскажите пожалуйста, может есть какой-то более целесообразный способ выставление только одного ордера в день?


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

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

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

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

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

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

Перейти

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

Перейти

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

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

Привет, коллеги!
Подскажите, как реализовать в коде mql4 следующее:

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

Если непонятно разъяснил, попробую на примере: сова работает на четырех парах: EURUSD USDJPY USDCAD AUDUSD. Например результат последнего закрытого ордера по EURUSD (-10), по USDJPY +15, по USDCAD (-5), по AUDUSD (-3).
Как мне получить сумму: -10-5-3=-18?

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

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

либо использовать внешний файлик, либо использовать мультиторговлю внутри советника, либо использовать анализ истории сделок (предпочтительно)

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

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

Здравствуйте! :-H

Помогите разобраться с расчётом лота из видео-урока "12 MQL программирование функции расчета торгового лота". Делал всё по уроку, но результат в расчёте лота больше в 100 раз, показанного в самом видео. Сам не совсем понимаю методику расчёта лота как функции от двух параметрах: риска и стоп-лосса.

В представленном советнике реализован код, показанный в видео-уроке. Проблему можно решить делением на 100, но это не даст ощущения законченности и разбора проблемы (в видео ведь не делили на 100). Необходимо немного глубже.

Проблема решена: на центовых счетах расчёт лота другой чем на обычных, поэтому результат был в 100 раз больше (1 доллар = 100 центам). Извините за оффтоп.

InfoExpert.mq4

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

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

попробуй так(возвращает фалс если уже есть ордер открытый сегодня, тру если нет такого ордера)
bool One_Order_Per_Day()
{
int ord = OrdersTotal();
for (int i=ord-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS)) continue;
if (OrderSymbol()!= Symbol() || OrderMagicNumber()!=magic) continue;
if (OrderOpenTime()>=iTime(Symbol(),PERIOD_D1,0))
return false;
}
return true;
}


но тут как бе надо понимать всю суть вопроса. а что если ордер сегодня открывался и уже закрылся? тогда вышеописанная мной функция будет возвращать тру, ведь идет перебор текущих выставленных ордеров(и открытых, и отложенных). чтобы перебирать историю уже закрытых ордеров нужно в ord пихать OrdersHistoryTotal() а селект писать как
"if (!OrderSelect(i,SELECT_BY_POS, MODE_HISTORY)) continue;"


Спойлер

Для открытие только одного ордера в день использую эту функцию:

Цитата

bool One_Order_Per_Day()
{
for(int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol() == Symbol())
{
if(TimeDay (OrderOpenTime()) == Day() &&
TimeMonth(OrderOpenTime()) == Month() &&
TimeYear (OrderOpenTime()) == Year())

return(1);
}
}
return(0);
}



Но из за неё в тестере советник катастрофически медленно прогоняется... ~x(
Вплоть до нескольких часов при прогоне за 5-6 лет.

Подскажите пожалуйста, может есть какой-то более целесообразный способ выставление только одного ордера в день?

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

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

Здравствуйте уважаемые трейдеры. У меня вопрос касательно написания сеточного советника, суть заключается в следующем. Данный советник должен открывать сетку отложенных ордеров в направлении вручную открытого ордера. Т.е. если я вручную открыл ордер OP_SELL то ниже должны открываться OP_SELLLIMIT с уже установленным шагом (Step), TP,SL, так же в данном советнике, я бы хотел определить количество отложек. Скажем 10 ордеров OP_SELLLIMIT. Я пробовал создать нечто подобное однако моих познаний в области MQL явно хватает для выполнения данной задачи. Я буду благодарен за любую оказанную мне помощь! P.S. свои "наброски" советника прикрепляю к этому письму.

3.mq4
3.ex4

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

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

Господа, по ходу использования ночников и других скальперских сов обнаружилась необходимость дополнительного контроля за роботами. В связи с этим вопрос-предложение ко всем. Вопрос - существует ли уже такое и где найти, или если нет, то предложение - сделать нечто подобное на MQL4. Я думаю эта вещь полезная и пригодится всем без исключения. Особенно тем, кто торгует несколькими советниками одновременно.

Нужен скрипт, советник или вроде того mql штука, которая работает на весь терминал одновременно и ограничивает торговлю - запрещает делать вход в рынок если подходят определенные условия:

1 Суммарный лот открытых позиций превышает заданный
2 Суммарное количество позиций в рынке превышает заданное
3 Уже открыта позиция с этим инструментом. От создания дубликатов позиций и приумножения лота. Но с такой формулировкой не получился сделать усредненение или лок. Чтобы получилось сделать лок нужно чтобы было "уже открыта позиция по этому инструменту в том же направлении".

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

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

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

Такое можно сделать только внедрившись в код терминала, по аналогии с тикстори или tds и анализируя запросы в перехваченной функции OrderSend
p.s. создать такое на MQL принципиально невозможно, для этого надо исследовать код билдов терминала от 920 и выше, что не под силу среднему программисту на mql

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

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

Ну вот у советника Wall street Asia есть такая штука - количество позиций на терминал. То есть один советник ограничивает позиции всего терминала. Правда разумеется позиции только этого советника хоть и не суть важно с какого инструмента. Поэтому я и подумал, что может есть вариант сделать ограничение на другие советники.

Кто еще что думает? Есть шансы сделать нечто подобное на MQL?

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

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

Здравствуйте. Подскажите, пожалуйста, верная ли функция для расчета лота?


double FixProc(int risk, int stoploss) // risk = 2%, stoploss = 100п
{
double RiskMoney= AccountBalance() * risk / 100;
double Lot = RiskMoney / stoploss * 0.1;

return(Lot);
}


Если нет, то:
[list type=decimal]
  • В чём ошибка?

  • Какие ещё существуют методики для расчета лота?



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

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


    [list type=decimal]

  • Какие ещё существуют методики для расчета лота?









  • Вариантов масса. ;)
    К примеру я вот такой функцией пользуюсь:

    Цитата


    extern bool Auto_Lot = True ;
    extern double Fix_Lot = 0 ;
    --------------------------------------------------------
    double Lot() // 0.01 to 1000$
    {
    double lot;

    if (Auto_Lot == 0) lot = Fix_Lot;
    if (Auto_Lot == 1) lot = AccountEquity()/100000;

    if (lot
    return(lot);
    }

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

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

    Вариантов масса. ;)
    К примеру я вот такой функцией пользуюсь:

    Цитата


    extern bool Auto_Lot = True ;
    extern double Fix_Lot = 0 ;
    --------------------------------------------------------
    double Lot() // 0.01 to 1000$
    {
    double lot;

    if (Auto_Lot == 0) lot = Fix_Lot;
    if (Auto_Lot == 1) lot = AccountEquity()/100000;

    if (lot
    return(lot);
    }



    Спасибо, + на 1 методику больше)

    Добавлено: 08-11-2016 23:10:06

    Вот функция, представленная в видео-уроке (немного упрощенная).

    double LotsByRisk(int risk, int stoploss)
    {
    double lot = AccountBalance() * risk / 100;
    double UsdPerPip = lot / stoploss;

    lot = UsdPerPip / MarketInfo(Symbol(), MODE_TICKVALUE);

    return(lot);
    }

    Товарищи, скажите, почему используется данная строчка. Зачем мы делим на величину "Размер минимального изменения цены инструмента в валюте депозита", то есть на MarketInfo(Symbol(), MODE_TICKVALUE)?

    lot = UsdPerPip / MarketInfo(Symbol(), MODE_TICKVALUE);

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

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


    Здравствуйте уважаемые трейдеры. У меня вопрос касательно написания сеточного советника, суть заключается в следующем. Данный советник должен открывать сетку отложенных ордеров в направлении вручную открытого ордера. Т.е. если я вручную открыл ордер OP_SELL то ниже должны открываться OP_SELLLIMIT с уже установленным шагом (Step), TP,SL, так же в данном советнике, я бы хотел определить количество отложек. Скажем 10 ордеров OP_SELLLIMIT. Я пробовал создать нечто подобное однако моих познаний в области MQL явно хватает для выполнения данной задачи. Я буду благодарен за любую оказанную мне помощь! P.S. свои "наброски" советника прикрепляю к этому письму.



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

    неточность-
    SellLimit - отложенный ордер на продажу активов по финансовому инструменту по цене, превышающей текущую цену.

    если вам нужно ниже, то тогда нужен -

    SellStop - отложенный ордер на продажу активов по финансовому инструменту по цене ниже текущей.

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

    3.ex4
    3.mq4
    mql4bookrussian.rar

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

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








    Вариантов масса. ;)
    К примеру я вот такой функцией пользуюсь:

    Цитата


    extern bool Auto_Lot = True ;
    extern double Fix_Lot = 0 ;
    --------------------------------------------------------
    double Lot() // 0.01 to 1000$
    {
    double lot;

    if (Auto_Lot == 0) lot = Fix_Lot;
    if (Auto_Lot == 1) lot = AccountEquity()/100000;

    if (lot
    return(lot);
    }




    необходимо лот нормализовать, иначе ошибка ERR_INVALID_TRADE_VOLUME 131 Неправильный объем
    if (Auto_Lot == 1) lot = NormalizeDouble(AccountEquity()/100000,2);

    Вот почему при депо в 100/10000 лот 0.01, а если 156/10000 лот уже 0.02, округляет до ближайшего целого,
    даже нормализация с 2 после запятой не помогает? Изменено пользователем vitek01
    Ссылка на сообщение
    Поделиться на другие сайты

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


    Вот почему при депо в 100/10000 лот 0.01,
    а если 156/10000 лот уже 0.02, округляет до ближайшего целого,
    даже нормализация с 2 после запятой не помогает?



    Ну... Всё правильно. :)
    Алгебраически округляется в бОльшую сторону, если десятые больше пяти.
    Или я не правильно понял суть вопроса...
    • Лайк 1
    Ссылка на сообщение
    Поделиться на другие сайты

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

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

    Небезызвестный индикатор J_TPO.
    Мне попались две его разновидности: J_TPO_Clean.mq4 и J_TPO_II.mq4

    Оба индикатора не работали - новые билды, новые требования к языку. Я исправил ошибки. Но судя по профилированию скорость расчета оставляет желать лучшего.

    Прошу форумчан-программистов, при наличии времени и желания, оптимизировать код индикаторов.

    Спасибо-

    J_TPO_Clean.mq4
    J_TPO_II.mq4
    Профилирование_J_TPO_Clean__J_TPO_II.xlsx

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

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

    Подскажите пожалуйста, как сделать так чтоб значение переменной (значение цены) не обнулялось при перезапуске советника?

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

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

    Уважаемые xbms и знатоки!
    Прошу помочь. Не пойму, почему идет зацикливание. Бот сырой не законченный, но на данном этапе застрял. Все лишнее пока убрал.
    При запуске бота сразу же устанавливаются два отложенных бота на равном расстоянии от цены с одинаковым лотом. После активации первого ордера, должен удаляться противоположный отложенный ордер. С этим все нормально работает. Потом сразу же должен выставиться противоположный открытому отложенный ордер (т.е такой же как первоначальный удаленный в том же направлении) с удвоенным лотом от открытого. Лот пока не трогаю, оставил такой же, но на этом моменте идет выставление отложки и сразу же его удаление. И так до бесконечности.
    Разбил эти части по внешним функциям, тоже самое происходит. Этот вариант без тех внешних функций. Прилагаю код бота и еще его файлы.
    Компилятор не ругается, но выдает предупреждение - return value of 'OrderSend' should be checked
    Может это как то связано с этим.
    Надеюсь, что понятно изъяснился.
    Заранее благодарю за помощь.

    Спойлер


    // внешние переменные
    extern double Lots = 0.1;
    extern int Diap = 150;
    extern int Slippage = 0;
    extern int Magic = 1234;
    extern int MaxOrders = 5;
    extern double Multipler = 2;

    int ticket, otype;
    double SLS_TPB,SLB_TPS, PriceSell,PriceBuy, type, cnt;
    //-----------------------------------
    int OnInit()
    {
    // проверка на количество знаков
    if (Digits ==3 || Digits==5)
    {
    Diap *= 10;
    Slippage *= 10;
    }
    return(INIT_SUCCEEDED);
    }
    //-----------------------------------
    void OnDeinit(const int reason)
    {

    }
    //-----------------------------------
    void OnTick()
    {
    int res;
    double BuyPrice=Ask+Diap*Point;
    double SellPrice=Bid-Diap*Point;
    double TP_Buy=Ask+(Diap*3)*Point;
    double TP_Sell=Bid-(Diap*3)*Point;
    //первое условие ++++++++++++++++++++++++++++++++++
    if (CountTrades() == 0 && CountTradesByStop()==0)
    {
    //1й блок выставляет два отложенных ордера от текущей цены
    res=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,Slippage,TP_Sell,TP_Buy,"",Magic,0,Blue);
    res=OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,Slippage,TP_Buy,TP_Sell,"",Magic,0,Red );
    //
    }
    //второе условие +++++++++++++++++++++++++++++++++
    if (CountTrades() == 1)
    //2й блок если один из ордеров открылся, то удаляем оставшийся отложенный ордер
    {
    for(int i=0; i {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
    {
    int OrderTupe = OrderType();
    if(OrderType()==OP_BUYSTOP)
    {
    bool ord_close=OrderDelete(OrderTicket(),clrNONE);
    if(!ord_close) i--;
    }
    if(OrderType()==OP_SELLSTOP)
    {
    bool ord_close=OrderDelete(OrderTicket(),clrNONE);
    if(!ord_close) i--;
    }
    }
    }
    }
    // ---------------------------
    if (CountTrades() >=1) // проверяем есть ли уже ордера в рынке, далее необходимо выбрать последний ордер
    // и выставить противоположный отложенный ордер
    {
    otype = FindLastOrderType(); //вычисляем тип последнего ордера
    if (otype == OP_BUY)
    {
    double price = FindLastBuyPrice(); //
    OrderSend (Symbol(), OP_SELLSTOP, Lots, price-SellPrice, Slippage, price-SellPrice+TP_Buy,price-SellPrice+TP_Sell, "", Magic, 0, Blue); // открываем следующий ордер
    }
    else if (otype == OP_SELL)
    {
    double price = FindLastSellPrice();//
    OrderSend (Symbol(), OP_BUYSTOP, Lots, price+BuyPrice, Slippage, price+BuyPrice-TP_Sell,price+BuyPrice+TP_Buy, "", Magic, 0, Red); // открываем следующий ордер
    }

    }
    }
    //описываем количество открытых ордеров в рынке
    int CountTrades()
    {
    int count = 0;
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    {
    if (OrderType() == OP_BUY || OrderType() == OP_SELL)
    count++;
    }
    }
    }
    return(count);
    }
    //определяем количество отложенных Стоп ордеров
    //--------------------------------------------------------
    int CountTradesByStop()
    {
    int count = 0;
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    {
    if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
    count++;
    }
    }
    }
    return(count);
    }
    //функция нахождения типа последнего ордера
    //+------------------------------------------------------------------+
    int FindLastOrderType()
    {
    int oticket, ticketnumber = 0, OType=-1;
    for (int i = OrdersTotal() -1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    {
    oticket = OrderTicket();
    if (oticket > ticketnumber)
    {
    ticketnumber = oticket;
    OType = OrderType();
    }
    }
    }
    }
    return(OType);
    }
    //функция по какой цене открыт последний ордер BUY
    //+------------------------------------------------------------------+
    double FindLastBuyPrice()
    {
    int oticket, ticketnumber = 0;
    double oprice=0;
    for (int i = OrdersTotal() -1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
    {
    oticket = OrderTicket();
    if (oticket > ticketnumber)
    {
    ticketnumber = oticket;
    oprice = OrderOpenPrice();
    }
    }
    }
    }
    return(oprice);
    }
    //функция по какой цене открыт последний ордер SELL
    //+------------------------------------------------------------------+
    double FindLastSellPrice()
    {
    int oticket, ticketnumber = 0;
    double oprice=0;
    for (int i = OrdersTotal() -1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
    {
    oticket = OrderTicket();
    if (oticket > ticketnumber)
    {
    ticketnumber = oticket;
    oprice = OrderOpenPrice();
    }
    }
    }
    }
    return(oprice);
    }

    bot_kanal.mq4
    bot_kanal.ex4

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

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

    В четвертом уроке "Пишем советника на Мартингейле" у меня отрываются или только на продажу, или только на покупку. Это у меня где-то ошибка или же мы данное условие вносили при написании кода?

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

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

    Компилятор не ругается, но выдает предупреждение - return value of 'OrderSend' should be checked
    Может это как то связано с этим.

    return value of 'OrderSend' should be checked это просто предупреждение что нужно проверить OrderSend, что оно возвращает и ни как не влияет на отложеный ордер. Просто проверьте оператором if - if(OrderSend(.......)==false) {}
    или присвойте int tiket=OrderSend(.......);


    Добавлено: 15-11-2016 02:18:59


    В четвертом уроке "Пишем советника на Мартингейле" у меня отрываются или только на продажу, или только на покупку. Это у меня где-то ошибка или же мы данное условие вносили при написании кода?



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

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

    Спасибо, vitek01
    И снова нужна помощь по этому же уроку.
    В Дом.Зад. нужно, чтобы советник закрывал все открытые им ордера при достижении определенного убытка в пунктах.
    Подскажите, как это реализовать, или хотя бы откуда начинать "копать"?

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

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

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

    волотильность.mq4

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

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

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

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

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

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

    Войти

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

    Войти

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


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

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