Похоже на то, что Вы своего советника гоняли в тестере. Попробуйте на демосчёте, предварительно подгрузив историю по всем задействованным торговым инструментам по всех таймфреймах.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день.
При написании мултивалютного советника столкнулся с проблемой получения данных при испоьзовании стандартных функций типа iLowest , iLow, iHighest, iHigh.
Для установки СЛ на наименьшем/наибольшем лоу/хай с последних Н баров написал фунцию
double GetStop(int dir,int i, int set) { RefreshRates(); string symbol=symbols[i]; int digits=MarketInfo(symbol,MODE_DIGITS); Print("calculate SL "+IntegerToString(dir)+" "+symbol+" "+IntegerToString(set)); int k=0; double price=0; if(set==1 || set==2) { if(Type_SL_JVS1==jvs1sl1) { price=GetSLBand(dir,symbol,SL_TF_JVS1); Print(symbol+" SL bund "+DoubleToStr(price,digits)); } else { if(dir==0) { k=iLowest(symbol,SL_TF_JVS1,MODE_LOW,SL_Number_Candles_JVS1,1); price=iLow(symbol,SL_TF_JVS1,k); Print(symbol+" SL buy "+IntegerToString(k)+" "+DoubleToStr(price,digits)); if(price==0) { Print("error sfter call iLow "+IntegerToString(GetLastError())); } } else { k=iHighest(symbol,SL_TF_JVS1,MODE_HIGH,SL_Number_Candles_JVS1,1); price=iHigh(symbol,SL_TF_JVS1,k); Print(symbol+" SL sell "+IntegerToString(k)+" "+DoubleToStr(price,digits)); if(price==0) { Print("error sfter call iHigh "+IntegerToString(GetLastError())); } } } } return(price); }В некоторых случаях функция возвращала значение 0, добавил распечатку и выяснилось что в некоторых сучаях функции iLowest и iHighest возвращают -1 (минус 1) , тогда добавил вычисление наибольшего/наименьшего "в ручную" путем перебора Н значений и если бы это не помогло приписал брать значение с первого закрытого бара и стало
RefreshRates(); string symbol=symbols[i]; int digits=MarketInfo(symbol,MODE_DIGITS); Print("calculate SL "+IntegerToString(dir)+" "+symbol+" "+IntegerToString(set)); int k=0; double price=0; if(set==1 || set==2) { if(Type_SL_JVS1==jvs1sl1) { price=GetSLBand(dir,symbol,SL_TF_JVS1); Print(symbol+" SL bund "+DoubleToStr(price,digits)); } else { if(dir==0) { k=iLowest(symbol,SL_TF_JVS1,MODE_LOW,SL_Number_Candles_JVS1,1); if(k<=0) k=GetNumberHighLowBar(symbol,SL_TF_JVS1,SL_Number_Candles_JVS1,1); if(k<=0) k=1; price=iLow(symbol,SL_TF_JVS1,k); Print(symbol+" SL buy "+IntegerToString(k)+" "+DoubleToStr(price,digits)); if(price==0) { Print("error sfter call iLow "+IntegerToString(GetLastError())); } } else { k=iHighest(symbol,SL_TF_JVS1,MODE_HIGH,SL_Number_Candles_JVS1,1); if(k<=0) k=GetNumberHighLowBar(symbol,SL_TF_JVS1,SL_Number_Candles_JVS1,2); if(k<=0) k=1; price=iHigh(symbol,SL_TF_JVS1,k); Print(symbol+" SL sell "+IntegerToString(k)+" "+DoubleToStr(price,digits)); if(price==0) { Print("error sfter call iHigh "+IntegerToString(GetLastError())); } } } } return(price);К сожалению и это не помогло, функция снова возвратила 0.
Массив инструментов готовится при запуске программы и продится проверка на наличие инструмента в Market Watch, таймфрейм и колличество баров задаются в инпуте программы.
Что может быть причиной и что можна сделать что исправить проблему?
Спасибо