Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1517

 
AkaEdie #:
учитывает ли конечный резульатт в прибыль в оптимизации параметров в тестере стратегий снятые деньги через TesterWithdrawal или это не зафиксированная прибыль на момент окончания тестов за период которые были еще в расходе

Минусует, на сколько я помню, и всю статистику меняет с учётом этого снятия. Пару лет назад использовал, но чет мне не понравилось, как считается статистика, поэтому перестал использовать, может сейчас что поменялось.

 
grezky EventSetTimer(3600); // 3600 секунд = 60 минут

это означает, что следующая проверка значения терминальной переменной произойдет через 60 минут.
Но в тестере с визуализацией 60 минут пройдут за несколько секунд, а индикатор проверит значения через 60 минут.
Или советник в тестере и индикатор в отдельном окне должны быть как-то "синхронизированы" по времени? - Т.е. если эксперт отправляет значение в терминальную переменную через несколько секунд, то и индикатор будет вызывать проверку значения терминальной переменной тоже через несколько секунд?
Кто-нибудь сталкивался с подобным, как это решается?

Нет!
 
а есть какая то статья с исходником просчета кривой в тестере стратегий кроме той что я давал несколько постов ранее, она некомпилируется и знаиий моих мало
 
как в советнике добавить индикатор на график и перерисовывать его
 
    currentTF = Period();
    // Получаем ID текущего графика
    long chart_id = ChartID();
    // Создаем дескриптор индикатора Alligator
    int indicator_handle_Alligator = iAlligator(_Symbol, currentTF, jawPeriod, teethPeriod, lipsPeriod, jawShift, teethShift, lipsShift, maMethod, ProfitPriceAlligator);

    // Добавляем индикатор в основное окно (sub_window = 0) текущего графика
    if(!ChartIndicatorAdd(chart_id, 0, indicator_handle_Alligator))
    {
        Print("Ошибка при добавлении Alligator: ", GetLastError());
    }
    else
    {
        Print("Alligator успешно добавлен на график");
    }

как удалить индикаторы с графика в советнике если я их вот так обьявил в OnInit

 

и при обновлении советника почемуто еще раз добавляется один из индикаторов такимже образом а старые не удаляются

не спрятать а удалить

 
AkaEdie #:

и при обновлении советника почемуто еще раз добавляется один из индикаторов такимже образом а старые не удаляются

не спрятать а удалить

Я думаю лучше перед добавлением индикатора проверить его существование на графике…

 

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

ну или получения существующего и его добавление если его нет

в мануале это частями я незнаю как это скомпоновать
 
Alexey Viktorov #:

По поводу проверки магика, я говорил о другом. Ведь можно проверить на равенство и неравенство… Так вот кому-то нравится проверять на неравенство и принудительно начинать новую итерацию цикла. А мне такой подход просто противен… Я предпочитаю проверку на равенство. Если это тот магик который мне нужен, то выполняются все команды заключённые в кривые скобки после условия. Если магик чужой, то и без дополнительных напрягов начнётся новая итерация цикла.

Организация цикла может быть любой. Главное чтобы перебор был полным… Этот вариант работает без ошибок так же как и тот который во всех примерах документации. Вам просто надо в отладке пройти цикл организованный так и как в примерах документации и последить за изменением счётчика цикла. Тогда будет всё понятно.

Благодарю.

Чтобы проверять на равенство, надо точно знать и перечислить все возможные номера магиков. Я, конечно, не могу их знать. Тем более, заранее, какие роботы, с какими магиками у меня еще будут.

В любом случае, и в варианте, который предложили Вы, и в варианте, который я взял из статьи, на которую ссылался выше, мои роботы просто перестали работать. Не открывают позиции и все. Хотя по графикам я вижу, что условие открытия присутствует. Я делал принты, чтобы понять, чему равны значения переменных. Но и принты не печатаются в лог файл. Когда-то я нашел на форумах информацию об этом. Люди писали, что в документации указано, что принты при большом их количестве могут не печататься. Иначе говоря, не все и не обязательно принты печатаются. Но у меня не печатается почти ничего. Я так и не смог пока в этом разобраться.

Было бы хорошо, если бы иметь какие-то надежные способы проверки ошибок.

Сейчас предварительное условие, при котором робот должен начать оценку условий для открытия позиций, у меня следующие:

   int         total            = PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      long   m_position_magic        = k_pos.Magic();
      string m_position_symbol       = k_pos.Symbol();
      ulong  mposition_ticket        = k_pos.SelectByIndex(i);
      Print("total = ",(string)total,", mposition_ticket = ",(string)mposition_ticket,", m_position_magic = ",(string)m_position_magic);
      if(total == 0 || !(mposition_ticket > 0 && m_position_symbol == _Symbol && m_position_magic == Magic_m)) // Нет позиций по инструменту и эксперту

И второй вариант:

   int         total            = PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      string position_symbol       = PositionGetString(POSITION_SYMBOL);
      ulong  position_ticket       = PositionGetTicket(i);
      Print("total = ",(string)total,", position_ticket = ",(string)position_ticket,", magic = ",(string)magic);
      if(total == 0 || !(position_ticket > 0 && position_symbol == _Symbol && magic == Magic_m)) // Нет позиций по инструменту и эксперту

magic и k_pos у меня глобальные переменные. Поэтому, в примерах их объявления нет.

Изменения я внес только в эту часть кода. Раньше предварительное условие выглядело так:

if(!PositionSelect(Symbol())

Но эксперты работали поочереди. Кто первый успел открыть позицию. того позиция и работала.

 
maxvoronin74 #:

Благодарю.

Чтобы проверять на равенство, надо точно знать и перечислить все возможные номера магиков. Я, конечно, не могу их знать. Тем более, заранее, какие роботы, с какими магиками у меня еще будут.

А вы точно не путаете магик с тикетом???

Магик вы устанавливаете какой захотите. В каждый советник назначается свой магик и все ордера и позиции идентифицированы этим магиком. Поэтому, если в советнике вы назначили Magic = 123; то все позиции открытые этим советником будут иметь  Magic 123.

Следовательно перебирая все позиции вы СНАЧАЛА получаете тикет позиции, тем самым выбирая позицию для работы с её свойствами

      ulong  position_ticket       = PositionGetTicket(i);

И только потом начинаете проверять магик. Если среди открытых позиций такой есть, то возвращаете запрет на открытие позиции — false. Если же перебрав все позиции такого магика не обнаружено, то функция проверки должна вернуть разрешение на открытие позиции — true.

Даже если взять ваш вариант

   int         total            = PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      long   m_position_magic        = k_pos.Magic();
      string m_position_symbol       = k_pos.Symbol();
      ulong  mposition_ticket        = k_pos.SelectByIndex(i);
      Print("total = ",(string)total,", mposition_ticket = ",(string)mposition_ticket,", m_position_magic = ",(string)m_position_magic);
      if(total == 0 || !(mposition_ticket > 0 && m_position_symbol == _Symbol && m_position_magic == Magic_m)) // Нет позиций по инструменту и эксперту

то у вас нарушена последовательность действий.

Получение тикета позиции и выбор её для работы с ней должны быть первой строкой в цикле.

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