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

 
    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)) // Нет позиций по инструменту и эксперту

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

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

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

 
День добрый!
Подскажите, пожалуйста, как можно записать матрицу в файл csv ? 
 
Alexey Viktorov #:

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

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

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

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

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

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

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

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

Магик с тикетом не путаю.

У меня были варианты с трейлингстопом и замками. Там я делал отдельные функции. А тут правила проще, все основное в OnTick.

Спасибо. Я переставил строку получения тикета в голову цикла. По графикам вижу, что условие открытия позиции есть, но не открываются...

Если можете посоветовать, как эффективно проверять ошибки, был бы очень благодарен. Принты печатаются через один или вообще не печатаются.

 
maxvoronin74 #:
Принты печатаются через один или вообще не печатаются

Как говорил мой первый наставник по электронике (да, да, по электронике - ничего не путаю!), так вот, он говорил: ЧУДЕС НА СВЕТЕ НЕ БЫВАЕТ!!! )) К чему весь этот спич? Значит в какие-то моменты у Вас, просто на просто, выполнение программы не доходит до печати принтов. Ищите у себя в коде проблемы. И, да! Попробуйте освоить отладчик в метаэдиторе. Отличный инструмент для того, чтобы избавляться от чудес. ))

С уважением, Владимир.

 
Возможно их просто не видно во вкладке терминала. Откройте файл с логами и увидите принты. 
Причина обращения: