Насколько корректно работает тестер стратегий при депозите не в USD?

Насколько корректно работает тестер стратегий при депозите не в USD?

22 сентября 2018, 08:32
Natalja Romancheva
0
134

Пост создан по результатам обсуждения в одноименной ветке: https://www.mql5.com/ru/forum/279476

Основные вопросы:

Есть ряд Российских брокеров с депозитом в рублях, у многих других брокеров можно открывать депозиты в EUR, AUD и прочих валютах.

Собственно отсюда два основных вопроса:

1. Насколько корректно тестер стратегий работает с такими депозитами?

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

Какие известны тонкости и подводные камни при таких ситуациях?

Насколько тестер является мультивалютным в плане валют депозита?

-------------------

При депозитах не в долларе тестер пытается подгружать множество связанных инструментов. Есть опасения что тут будут многочисленные нестыковки.

Тестер001

Например при тестировании простейшего советника по инструменту EURGBP на рублёвом депозите подгружаются 5 инструментов и не все из них удачно.

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


Основной ответ.

Vitaly Muzichenko 2018.09.16 23:00   RU
Natalja Romancheva:

Какие именно инструменты подгружаются - это понятно и вопросов не вызывает.

Вопросы возникают по поводу корректности подгрузки котировок требующихся для конвертации или даже их неподгрузки вовсе.

Да, такое случается, и довольно постоянно.

Я у себя в OnInit() прописал вот такую конструкцию, и сейчас история всегда загружается корректно:

  // Потрогаем символ в тестере,иначе не грузит историю
  if(TESTER) iClose(SymbTrade[i],PERIOD_CURRENT,1);

Как это использовать в вашем случае - нужно подумать, у меня символы прописаны в массиве

Реализация.

Функция для опроса инструментов связанных с тестируемым через USD и валюту депозита.
//=== v4.304 ================================================================================== MQL5 ===
// iCloseCallSymbol() - Опрос связанных инструментов по iClose()
//------------------------------------------------------------------------------------------------------
void iCloseCallSymbol(string  iSymbol,
                      string  iDepoCurrency,
                      string  iSuffix)
{
   //Определим вид инструмента (прамой котир USDXXX, обратный котир ZZZUSD, кросс-курс ZZZXXX) и опрашиваем соответствующие инструменты по iClose().
   {switch(CheckSymbolQuotaType(iSymbol))
   {
      case QUOTA_TYPE_FORWARD://USDXXX депо ZZZ
         {
            //USDXXX
            iClose(iSymbol,PERIOD_CURRENT,1);
            //USDZZZ
            {if(iDepoCurrency!="USD")
            {
               {if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
               {
                  iClose(iDepoCurrency+"USD"+iSuffix,PERIOD_CURRENT,1);
               }}//if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
            }}//if(iDepoCurrency!="USD")
            break;
         }
      case QUOTA_TYPE_BACKWARD://XXXUSD депо ZZZ
         {
            //XXXUSD
            iClose(iSymbol,PERIOD_CURRENT,1);
            //USDZZZ
            {if(iDepoCurrency!="USD")
            {
               {if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
               {
                  iClose(iDepoCurrency+"USD"+iSuffix,PERIOD_CURRENT,1);
               }}//if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
            }}//if(iDepoCurrency!="USD")
            break;
         }
      case QUOTA_TYPE_CROSS://XXXYYY депо ZZZ
         {
            //XXXYYY  
            iClose(iSymbol,PERIOD_CURRENT,1);
            //YYYUSD или USDYYY
            {if(iClose(StringSubstr(iSymbol,3,3)+"USD"+iSuffix,PERIOD_CURRENT,1)<=0)
            {
               iClose("USD"+StringSubstr(iSymbol,3,3)+iSuffix,PERIOD_CURRENT,1);
            }}//if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
            //XXXUSD или USDXXX
            {if(iClose(StringSubstr(iSymbol,0,3)+"USD"+iSuffix,PERIOD_CURRENT,1)<=0)
            {
               iClose("USD"+StringSubstr(iSymbol,0,3)+iSuffix,PERIOD_CURRENT,1);
            }}//if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
            {if(iDepoCurrency!="USD")
            {
               //XXXZZZ или ZZZXXX
               {if(iClose(StringSubstr(iSymbol,0,3)+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
               {
                  iClose(iDepoCurrency+StringSubstr(iSymbol,0,3)+iSuffix,PERIOD_CURRENT,1);
               }}//if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
               //USDZZZ или ZZZUSD
               iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1);
               {if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
               {
                  iClose(iDepoCurrency+"USD"+iSuffix,PERIOD_CURRENT,1);
               }}//if(iClose("USD"+iDepoCurrency+iSuffix,PERIOD_CURRENT,1)<=0)
            }}//if(iDepoCurrency!="USD")
            break;
         }   
      default:
         {
            break;
         }
   }}//switch(CheckSymbolQuotaType(iSymbol))
   return;
}//iCloseCallSymbol()

Функция для определения котировки инструмента по отношению к USD.

//=== v3.304 ================================================================================ MQL4/5 ===
// CheckSymbolQuotaType()
//------------------------------------------------------------------------------------------------------
ENUM_QUOTA_TYPE CheckSymbolQuotaType(  string   iSymbol)
{
   string
      BaseCurrency=StringSubstr(iSymbol,0,3),
      CotirCurrency=StringSubstr(iSymbol,3,3),
      OilCurrency=StringSubstr(iSymbol,2,3);
   {if(BaseCurrency=="USD")//USDYYY - Прямая котировка, Базовая валюта доллар США, стоимость лота $ContractSize
   {
      return(QUOTA_TYPE_FORWARD);
   }else{//if(BaseCurrency!="USD") Базовая валюта НЕ доллар США
      {if((CotirCurrency=="USD")||(OilCurrency=="Oil"))//XXXUSD или UxOil (фактически USOUSD) Обратная котировка, Валюта котировки доллар США, стоимость лота $ContractSize*PriceXXX
      {
         return(QUOTA_TYPE_BACKWARD);
      }else{//XXXYYY //if((CotirCurrency!="USD") Кросс-курс, Базовая валюта НЕ доллар США, Валюта котировки НЕ доллар США, стоимость лота $ContractSize*PriceXXXUSD
         return(QUOTA_TYPE_CROSS);
      }}//if((CotirCurrency=="USD")||(OilCurrency=="Oil"))
   }}//if(BaseCurrency=="USD")
   return(QUOTA_TYPE_CROSS);
}//CheckSymbolQuotaType()

Вызов функции

iCloseCallSymbol()

целесообразно размещать в OnInit().

Выражаю признательность за возможную конструктивную критику.