Пост создан по результатам обсуждения в одноименной ветке: https://www.mql5.com/ru/forum/279476
Основные вопросы:
Есть ряд Российских брокеров с депозитом в рублях, у многих других брокеров можно открывать депозиты в EUR, AUD и прочих валютах.
Собственно отсюда два основных вопроса:
1. Насколько корректно тестер стратегий работает с такими депозитами?
2. Насколько корректно тестер работает, если например депозит в рублях, а в тестере в качестве валюты выбраны евро?
Какие известны тонкости и подводные камни при таких ситуациях?
Насколько тестер является мультивалютным в плане валют депозита?-------------------
При депозитах не в долларе тестер пытается подгружать множество связанных инструментов. Есть опасения что тут будут многочисленные нестыковки.
Например при тестировании простейшего советника по инструменту EURGBP на рублёвом депозите подгружаются 5 инструментов и не все из них удачно.
На скрине видно, что инструмент EURUSD в обзоре рынка появился, но котировок по нему нет. Основной ответ.
Какие именно инструменты подгружаются - это понятно и вопросов не вызывает.
Вопросы возникают по поводу корректности подгрузки котировок требующихся для конвертации или даже их неподгрузки вовсе.
Да, такое случается, и довольно постоянно.
Я у себя в 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().
Выражаю признательность за возможную конструктивную критику.