Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 112
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте. Написал в своем советнике расчет лота таким вот образом:
lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2);
Цель - при заданных рисках и стоп лоссе получать корректную величину лота вне зависимости от валюты счета и пары. risk задается как доля потерь при срабатывании стоп лосса. Стоп лосс SL в пунктах ( где пункт – минимальное возможное изменение цены пары). Собираюсь запускать данный советник на реальном счету. Но, есть сомнения. Если кто-нибудь, из более опытных программистов подскажет, какие могут возникнуть ошибки, буду очень благодарен.Сначала тестер стратегий. Затем демо-счет. И только потом реал. Для проверки формулы напишите скрипт. Или просто на бумажке посчитайте. Взял баланс=100, риск=0,1 СЛ=100, Тик=0,00001 Лот=100*0,1 / (100*0,00001) = 10 / 0,001 = 10000 лот больше баланса? Может плечо учесть?
MarketInfo(Symbol(),MODE_TICKVALUE)) возвращает не размер минимального тика. В справке написано:
Размер минимального изменения цены инструмента в валюте депозита.
Но на деле получается стоимость минимального изменения цены инструмента в валюте депозита 1 лота контракта.
В приведенном вами примере MarketInfo(Symbol(),MODE_TICKVALUE)) вернет 1. И тогда все получается верно. Проверял скриптом на реальных долларовых и рублевых счетах, все работает. Вот скрипт которым проверял:
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property show_inputs
extern double risk=0.10;
extern int sl=1000;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
Alert(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
//+------------------------------------------------------------------+
Вы правы. Проверка скриптом - быстрее и надежнее
Еще нужно точность в функции NormaliseDouble поставить в зависимость от минимального разрешенного лота. А то, если в функцию OrderSend передать лот к примеру 0,11, а инструмент торгуется только лотами кратными 0,1 - будет ошибка.
здравствуйте! Не могу понять почему не все сразу удаляются открытые сделки, тоесть советник удаляет некоторые, а на остальных несколько раз выдает ошибку orderdelete 4108, market order cannot be deleted, и только потом удаляет. хотя до начала цикла удаления они уже были открытыми.
здравствуйте! Не могу понять почему не все сразу удаляются открытые сделки, тоесть советник удаляет некоторые, а на остальных несколько раз выдает ошибку orderdelete 4108, market order cannot be deleted, и только потом удаляет. хотя до начала цикла удаления они уже были открытыми.
Вот на этой странице объяснено, как удалять. У Вас 2 ошибки.
При запуске постоянно ошибка array out of range in 'expert1.0.mq4' (69,25)... Понял что дело с массивом. А что делать не вдуплю.
Нужно смотреть код, или его кусок обрабатывающий данный массив.
Телепаты, сегодня отдыхают.
Нужно смотреть код, или его кусок обрабатывающий данный массив.
Телепаты, сегодня отдыхают.
}
Вот функция.
Я просто подумал что проблема не в коде так как в стандартном режиме ошибок нет.