Пожелания для МТ5 - страница 14

 
stringo:
Разобрались и исправили. Спасибо.

 

   do
     {
      rates_total=CopyRates(Symbol(),PERIOD_M1,time1,time2,rates);
      err++;
     }

Спасибо за исправление, почти хорошо, почему почти...

 В хелпе написано

start_time  [in]  Время бара, соответствующее первому элементу.

А первый элемент 0. 

А вот с последним элементом порядок.

Если так задумано, исправте хелп.

 
vdv2001:

 

Спасибо за исправление, почти хорошо, почему почти...

 В хелпе написано

start_time  [in]  Время бара, соответствующее первому элементу.

А первый элемент 0. 

А вот с последним элементом порядок.

Если так задумано, исправте хелп.

Ситуация такова, что start_time и stop_time в варианте от даты до даты могут быть любыми - в любом случае они образуют диапазон. Попробуем поточнее отобразить это в документации
 
stringo:
Ситуация такова, что start_time и stop_time в варианте от даты до даты могут быть любыми - в любом случае они образуют диапазон. Попробуем поточнее отобразить это в документации

Т.е. Вы хотитете сказать, что функции Copy* будут в случае от даты до даты возвращать все элементы кроме стартового? Таким образом мне необходимо записать выражение так:

   do
     {
      rates_total=CopyRates(Symbol(),PERIOD_M1,time1-PeriodSeconds(PERIOD_M1),time2,rates);
      err++;
     }

для меня этот вопрос очень важен.

 

Обращаю Ваше внимание на то, что при переходе на новый день происходит такая весчь:

После обновления все становится на место.

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

 

Билд 252.

Главное Меню: <ГРАФИКИ> - <ГРАФИЧЕСКИЕ ИНСТРУМЕНТЫ> вылезают таймфреймы.

 
uncleVic:

К сожалению, последняя версия CAccountInfo не попала в билд.

В прикрепленном файле, Вы  найдете метод FreeMarginCheck (правда пока только для SYMBOL_CALC_MODE_FOREX).

Если возникнут замечания и(или) соображения, прошу писать.

Обнаружил, что метод FreeMarginCheck требует доработки.

1. Рассмотрим case SYMBOL_CALC_MODE_FOREX:

         work=SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN)+Currency();
         bid=SymbolInfoDouble(work,SYMBOL_BID);
         margin=bid*volume*contract_size/leverage;
         margin=free_margin-margin;
         break; 

Если значения двух слагаемых SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN) и Currency() оказываются равными, то переменная bid получает значение 0, а переменная margin получает значение free_margin.

Для исправления ситуации сделал так:

case SYMBOL_CALC_MODE_FOREX:

        bid=1.0;

        if (SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN)!=Currency()) 

           {

             work=SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN)+Currency();
             bid=SymbolInfoDouble(work,SYMBOL_BID);
            }

         margin=bid*volume*contract_size/leverage;
         margin=free_margin-margin;
         break; 

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

Можно узнать когда нормально заработают функции Copy*()?

В каждом новом билде они перестают работать, неужели их никто не использует? 

 
vdv2001:

 

Спасибо за исправление, почти хорошо, почему почти...

 В хелпе написано

start_time  [in]  Время бара, соответствующее первому элементу.

А первый элемент 0. 

А вот с последним элементом порядок.

Если так задумано, исправте хелп.

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

 

Файлы:
 
Yedelkin:

Обнаружил, что метод FreeMarginCheck требует доработки.

Спасибо за замечание. Исправлено.
 
Yedelkin:

Обнаружил, что метод FreeMarginCheck требует доработки.

2. Другая проблема заключается в следующем. Вновь расссмотрим case SYMBOL_CALC_MODE_FOREX:
         work=SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN)+Currency();
         bid=SymbolInfoDouble(work,SYMBOL_BID);

Если у переменной  symbol в качестве базовой валюты окажется валюта, не имеющая прямой котировки (например, CADJPY), то SymbolInfoDouble(work,SYMBOL_BID) выдаст значение 0.

2.1. Кроме того, не понятно, почему при вычислении второй переменной (bid) используется цена BID. Ведь нам необходимо обеспечить приобретение валюты, в которой вычисляются залоговые средства, за счёт валюты депозита, т.е. "валюту маржи купить, валюту депозита - продать". И если в конкретной валютной паре валюта депозита находится на втором месте, то для осуществления указанной операции придётся использовать цену ASK.

Для исправления ситуации сделал так:

double course;
//---
   switch(SymbolInfoInteger(symbol,SYMBOL_TRADE_CALC_MODE))
     {
      case SYMBOL_CALC_MODE_FOREX:
         course=1.0;

         //---Проверим, не является ли валюта депозита базовой валютой у текущей валютной
         //пары. Если является, то значение переменной course останется равным 1.0
         if(SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN)!=Currency())
           {
            work=SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN)+Currency();

            //---Проверим, существует ли валютная пара, базовая валюта которой совпадает с
            //базовой валютой текущей пары, а валюта котировки совпадает с валютой депозита 
            //(т.е., если депозит в USD, то проверяем наличие прямой котировки).
            if(SymbolInfoDouble(work,SYMBOL_ASK)!=0)
               course=SymbolInfoDouble(work,SYMBOL_ASK);

            //---При невыполнении указанного выше условия меняем последовательность символов
            //валют в переменной work и получаем валютную пару, базовая валюта которой
            //совпадает с валютой депозита, а валюта котировки совпадает с базовой валютой
            //текущей пары (если депозит в USD, то получаем валютную пару с обратной котировкой).
            else
              {
               work=Currency()+SymbolInfoString(symbol,SYMBOL_CURRENCY_MARGIN);
               course=1/SymbolInfoDouble(work,SYMBOL_BID);
              }
           }
         margin=course*volume*contract_size/leverage;
         margin=free_margin-margin;
         break;

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
Причина обращения: