Jump to content

Общие вопросы по языку MQL


Recommended Posts

kazakov.v

 

 

Можно ли как-то этого избежать?

 

Вряд ли это история столько отъедает. Минутки за 1 год по одному инструменту весят где-то 23 Мб.


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

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

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

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

Secret Looser

Вряд ли это история столько отъедает. Минутки за 1 год по одному инструменту весят где-то 23 Мб.

 

Советник пишет, какую пару он обработал. Когда запускаю тест, терминал начинает откусывать по 200-300 МБ с каждой новой парой. Очевидно, он зачем-то подгружает всю историю М1. Примерно одинаково ест оперативы, даже если за неделю тестить. Просто когда больше, чем полгода, там видать ещё что-то помимо истории съедает, вот и не хватает.

Edited by Secret Looser
Link to post
Share on other sites
Ugar68

Здравствуйте. Пишу на MQL4 мультивалютного советника,

Советник использует индикаторы, вызываемые по iCustom?


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
  • 2 weeks later...
ToB. CyxoB

Кто-нибудь знает, почему описание объекта, записанное в TOOLTIP при перезагрузке терминала заменяется на имя этого объекта (т.е. подсказка как бы отсутствует и автоматически формируется терминалом)?

 

 

 

 

П.С. ChartSetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,0,value)) - не используется.

Link to post
Share on other sites
ToB. CyxoB

Кто-нибудь знает, почему описание объекта, записанное в TOOLTIP при перезагрузке терминала заменяется на имя этого объекта (т.е. подсказка как бы отсутствует и автоматически формируется терминалом)?

 

П.С. ChartSetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,0,value)) - не используется.

 

TOOLTIP  не запоминаются. тчк.

Полагаться на них нельзя. тчк.

Но в некоторых случаях, их можно переназначитьб тчк.

Link to post
Share on other sites
  • 3 weeks later...
FSB

Всех приветствую!

 

Пример, есть история сделок:

1. EUR\USD sell magic1

2. EUR\USD buy magic5

3. EUR\USD sell magic3

4. EUR\USD sell magic2

5. EUR\USD buy magic4

 

Вопрос, как выбрать последний закрытый ордер с определённым магиком, например EUR\USD sell magic3, который по факту закрылся не последним? 

 

Интересует реализация на языке mql4

Edited by FSB

Не зная ни сна и ни отдыха; При лунном и солнечном свете; Мы делаем деньги из воздуха; Чтоб снова спустить их на ветер!

Link to post
Share on other sites
ZeleBoba

Всех приветствую!

 

Пример, есть история сделок:

1. EUR\USD sell magic1

2. EUR\USD buy magic5

3. EUR\USD sell magic3

4. EUR\USD sell magic2

5. EUR\USD buy magic4

 

Вопрос, как выбрать последний закрытый ордер с определённым магиком, например EUR\USD sell magic3, который по факту закрылся не последним? 

 

Интересует реализация на языке mql4

в цикле по pointer          
    { if( OrderSelect( pointer, SELECT_BY_POS, MODE_HISTORY ))
        { if( OrderMagicNumber() == magicX && OrderType() == _order_type )
            {
               ... код по обработке выбранного ордера
            }
        }
      else
       { ... обработка отсутствия искомого ордера
       } 
   }
 
можете также добавить проверку по времени закрытия ордера
Edited by ZeleBoba
  • Thanks 1

Лучше маленький профит, чем большие рога.

Link to post
Share on other sites
FSB

 

в цикле по pointer          
    { if( OrderSelect( pointer, SELECT_BY_POS, MODE_HISTORY ))
        { if( OrderMagicNumber() == magicX && OrderType() == _order_type )
            {
               ... код по обработке выбранного ордера
            }
        }
      else
       { ... обработка отсутствия искомого ордера
       } 
   }
 
можете также добавить проверку по времени закрытия ордера

 

 

Спасибо огромное!


Не зная ни сна и ни отдыха; При лунном и солнечном свете; Мы делаем деньги из воздуха; Чтоб снова спустить их на ветер!

Link to post
Share on other sites
  • 2 weeks later...
GRACHEV_KONSTANTIN

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

Link to post
Share on other sites
Snower88

Добрый день!


Подскажите пожалуйста, есть кусок кода:



void watch_breakout() {
if(active != true) return;
int ticket = get_ticket();
if(Ask >= NormalizeDouble(channel_top, Digits)) {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, SLIPPAGE, NormalizeDouble(Ask-Stoploss*Point,Digits), 0, "LONG", MAGIC, clrNONE);
}
if(Bid ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, SLIPPAGE, NormalizeDouble(Bid+Stoploss*Point,Digits), 0, "SHORT", MAGIC, clrNONE);
}
}

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


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


Link to post
Share on other sites
ZeleBoba

 

Добрый день!

Подскажите пожалуйста, есть кусок кода:

void watch_breakout() {
  if(active != true) return;
    int ticket = get_ticket();
  if(Ask >= NormalizeDouble(channel_top, Digits)) {
    ticket   = OrderSend(Symbol(), OP_BUY, Lots, Ask, SLIPPAGE, NormalizeDouble(Ask-Stoploss*Point,Digits), 0, "LONG", MAGIC, clrNONE); 
       }
  if(Bid <= NormalizeDouble(channel_bottom, Digits)) {
    ticket   = OrderSend(Symbol(), OP_SELL, Lots, Bid, SLIPPAGE, NormalizeDouble(Bid+Stoploss*Point,Digits), 0, "SHORT", MAGIC, clrNONE);
       } 
    }

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

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

 

В приведенном коде Вы анализируете пробой текущей ценой. А надо хаем или лоу предыдущего бара.

надо проанализировать бар осуществивший пробой. если попадает в категорию "пин", то - необходимое действие. 

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

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

отношение длин теней должно быть не менее ... (параметр номер два)

и опять же по тому какая тень длиннее, определяем какой это пин.

дерзайте.

ПЫСЫ. Совсем забыл. Надо еще проверить его (пина) отношение с предыдущим баром. Находится ли его тело (поглощено) телом предыдущего бара и чтобы он был того же направления.

Edited by ZeleBoba

Лучше маленький профит, чем большие рога.

Link to post
Share on other sites
AntFX

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

OrderType()==6


1

Link to post
Share on other sites
GRACHEV_KONSTANTIN

OrderType()==6

Антон спасибо за "секретную" функцию . Прям заговор какой-то  :)

  • Thanks 1
Link to post
Share on other sites
AntFX

Антон спасибо за "секретную" функцию . Прям заговор какой-то  :)

В МТ5 балансовые сделки уже прописаны в констандах, а в МТ4 все ещё секрет, заговор и все такое :)


1

Link to post
Share on other sites
  • 1 month later...
ИМН

Подскажите пжл, можно ли при обработке текущего тика функцией OnTick, при наступлении некоторого события начать её исполнение сначала, не дожидаясь окончания обработки текущего тика? Иными словами, есть ли некий аналог оператора continue для этой функции? Благодарю.


Лёгкие деньги бывают только там же, где и бесплатный сыр.

Link to post
Share on other sites
ZeleBoba

если по аналогии с continue, то этот оператор завершает текущую итерацию цикла и запускает следующую.

Вы можете просто завершить OnTick оператором return. А далее работа по следующему тику.

А вот если Вы не хотите дожидаться след.тика, то это надо организовать уже самому внутри OnTick.

  • Thanks 2

Лучше маленький профит, чем большие рога.

Link to post
Share on other sites
AntFX

Подскажите пжл, можно ли при обработке текущего тика функцией OnTick, при наступлении некоторого события начать её исполнение сначала, не дожидаясь окончания обработки текущего тика? Иными словами, есть ли некий аналог оператора continue для этой функции? Благодарю.

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

1

Link to post
Share on other sites
ИМН

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

Благодарю за желание помочь, выше уже Зелебоба исчерпывающе и, главное, точно ответил на мой вопрос, ура оператору return!

Есть другой вопрос, связанный с этим же оператором:

Если в функции, которая должна возвращать какое-либо значение, нет чётко указанного оператора return в конце функции, то будет выдана ошибка, что не все контрольные пути возвращают значения. Причём - что меня озадачило более всего - эта ошибка выдаётся даже и тогда, когда все возможные варианты значений применяемых в функции переменных "учтены" в теле функции и для каждого определённого сочетания этих значений в теле есть свои return'ы. Так вот компилятору этих внутренних return'ов мало, ему ещё и общий, явно указанный, подавай. Я прав в этом утверждении?

Могу кратенько набросать схему моей функции:

uint  some_function(bool dir)

{

   if (a[0] == 0 && a[1] == 0) return (233);              Массив a[ ] типа uint, поэтому отрицательных значений быть не может.

   if (a[0] > 0 && a[1] == 0) return (456);                В теле перебраны все 4 возможных комбинации значений задействованных

   if (a[0] == 0 && a[1] > 0) return (3452);              переменных и для каждой свой return. Но скомпилировать текст программы

   if (a[0] > 0 && a[1] > 0) return (2342);                мне не удалось, пока я не убрал последний оператор if, не добавил else и

[если здесь не будет "своего" return'a, будет ошибка]                             "общий" return, обусловив его этим самым else'ом.

}

Edited by ИМН

Лёгкие деньги бывают только там же, где и бесплатный сыр.

Link to post
Share on other sites
AntFX

Есть другой вопрос, связанный с этим же оператором:

В конце последнего оператора if поставьте else return(0) и все будет хорошо :) Edited by AntFX
  • Thanks 1

1

Link to post
Share on other sites
ИМН

В конце последнего оператора if поставьте else return(0) и все будет хорошо :)

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


Лёгкие деньги бывают только там же, где и бесплатный сыр.

Link to post
Share on other sites
AntFX

Открытием для меня явилось то, что компил не отслеживает это дело. Не зная этого, я вывихнул себе мозги, не понимая, где я "забыл" вернуть значение.

Нет, не ошиблись (если a[] имеет тип unsigned). Очевидно компилятор просто не отслеживает сложные последовательные условия.

1

Link to post
Share on other sites
  • 2 weeks later...
SIBARIT

Как прописать: если Low на предыдущих 4 свечах убывающие, то функция true???5a951a4c2f6c4_eurusdm5alpariinternationa

Link to post
Share on other sites
ZeleBoba

Как прописать: если Low на предыдущих 4 свечах убывающие, то функция true???5a951a4c2f6c4_eurusdm5alpariinternationa

if( iLow( NULL, 0, 1 ) > iLow( NULL, 0, 2 ) &&
    iLow( NULL, 0, 2 ) < iLow( NULL, 0, 3 ) &&
    iLow( NULL, 0, 3 ) < iLow( NULL, 0, 4 ) &&
    iLow( NULL, 0, 4 ) < iLow( NULL, 0, 5 ) )    flag = true;

Лучше маленький профит, чем большие рога.

Link to post
Share on other sites
  • 2 weeks later...
FX Plaza

Здравствуйте, уважаемые программисты и Модератор!

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

 

MQL4

MarketInfo(_Symbol,MODE_MARGINREQUIRED) работает на парах USD*, GBP*, NZD*,AUD*. (Лот рассчитывается правильно)

И НЕ работает на парах EUR*  (Хочу рассчитать Лот - получаю "Деление на 0")!

Какие варианты решения? (кроме перехода на MQL5, в котором работает функция OrderCalcMargin())

Link to post
Share on other sites
FX Plaza

Здравствуйте, уважаемые программисты и Модератор!

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

 

MQL4

MarketInfo(_Symbol,MODE_MARGINREQUIRED) работает на парах USD*, GBP*, NZD*,AUD*. (Лот рассчитывается правильно)

И НЕ работает на парах EUR*  (Хочу рассчитать Лот - получаю "Деление на 0")!

Какие варианты решения? (кроме перехода на MQL5, в котором работает функция OrderCalcMargin())

Для проверки: Сервер Alpari-Pro.ECN-Demo

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...