Я перекинул в эксперт метод (из класса) и вызываю уже из эксперта данную функцию. Разницы нет. В логе тоже самое. Значения попадают в функцию не верные. Теже 1 и 0. Почему?
Может, неверно печатается? Можно "расширить" печатаемое:
Print ("fOrderSend(); DToS(fd_Price) = ", DToS (fd_Price), ", fd_Price = ", fd_Price, ", digits = ", SSym.gi_Digits);
Если нет, то далее логично с помощью распечатываний сужать диапазон кода, в котором возникает несоответствие, до момента, когда уже не уткнуться в ошибку будет невозможно.
В общем, я тут копался как обычно. Принтовал всё до самого самого косяка. Нашёл где трабл.
А косяк в том, что по каким-то мне не понятным причинам не возможно использовать библиотечную функцию. Хотя раньше пользовался без проблем всегда. Функция простая как дважды два. В общем, описываю ситуацию ниже.
Функция вот начало библиотеки:
#property library #property copyright "hoz" #property link "" #property version "1.00" #property strict //---- //========================================================================================================================================= // 1.1a Нормализация числа с плавающей запятой по Digits. ================================================================================= double ND (double v) export { return (NormalizeDouble (v, SSym.gi_Digits)); } //========================================================================================================================================= // 1.1b Нормализация числа с плавающей запятой до целого. ================================================================================= /*double ND0 (double v) export { return (NormalizeDouble (v, 0)); }*/ //========================================================================================================================================= // 1.2 Преобразование числа типа double в текстовую строку string, содержащую символьное представление числа в указанном формате точности. string DToS (double v) export // DSD { return (DoubleToStr (v, SSym.gi_Digits)); }
В эксперте вызываю нужные мне функции библиотеки:
#import "LDataConvertion.ex4" double ND (double v); string DToS (double v); string IToS (int v); string DToSByLots(double v); #import
Вот функция, где получаю значения TP и SL. На ней и остановимся...
void GetTPiSL (double& fd_SL, double& fd_TP, int fi_Type) { if (fi_Type == OP_BUY) { if (id_SL != 0) fd_SL = ND (Bid - id_SL * SSym.gd_Pt); Print ("GetTPiSL: fd_SL = ", fd_SL); Print ("GetTPiSL: ND (fd_SL) = ", ND (fd_SL)); if (id_TP != 0) fd_TP = ND (Ask + id_TP * SSym.gd_Pt); Print ("GetTPiSL: fd_TP = ", fd_TP); Print ("GetTPiSL: ND (fd_TP) = ", ND (fd_TP)); } if (fi_Type == OP_SELL) { if (id_SL != 0) fd_SL = Ask + id_SL * SSym.gd_Pt; Print ("GetTPiSL: fd_SL = ", fd_SL); Print ("GetTPiSL: ND (fd_SL) = ", ND (fd_SL)); /* fd_SL = ND (Ask + id_SL * SSym.gd_Pt); Print ("GetTPiSL: fd_SL = ", fd_SL);*/ if (id_TP != 0) fd_TP = Bid - id_TP * SSym.gd_Pt; Print ("GetTPiSL: fd_TP = ", fd_TP); Print ("GetTPiSL: ND (fd_TP) = ", ND (fd_TP)); /* fd_TP = ND (Bid - id_TP * SSym.gd_Pt); Print ("GetTPiSL: fd_TP = ", fd_TP);*/ } }
А вот и лог в этой функции:
2014.08.16 23:44:32.225 2014.06.20 00:05 RSI EURUSD,M5: GetTPiSL: ND (fd_TP) = 1.0 2014.08.16 23:44:32.225 2014.06.20 00:05 RSI EURUSD,M5: GetTPiSL: fd_TP = 1.35959 2014.08.16 23:44:32.225 2014.06.20 00:05 RSI EURUSD,M5: GetTPiSL: ND (fd_SL) = 0.0 2014.08.16 23:44:32.225 2014.06.20 00:05 RSI EURUSD,M5: GetTPiSL: fd_SL = 0.0 2014.08.16 23:44:32.225 2014.06.20 00:05 RSI EURUSD,M5: fi_signal == SIGNAL_SELL 2014.08.16 23:44:32.225 2014.06.20 00:05 RSI EURUSD,M5: SSym.gi_Digits = 5
Чётко видно, что если значения не нормализовать, т.е. не использовать библиотечную функцию ND(), то значения остаются такими какими и должны быть. А вот если использовать библиотечную функцию ND(), то данное значения каким-то чудесным образом превращается в 0 или в 1.
Вот почему так происходит, я что-то в втыкаю. Есть предложения?
В общем, я тут копался как обычно. Принтовал всё до самого самого косяка. Нашёл где трабл.
А косяк в том, что по каким-то мне не понятным причинам не возможно использовать библиотечную функцию. Хотя раньше пользовался без проблем всегда. Функция простая как дважды два. В общем, описываю ситуацию ниже.
Функция вот начало библиотеки:
В эксперте вызываю нужные мне функции библиотеки:
Вот функция, где получаю значения TP и SL. На ней и остановимся...
А вот и лог в этой функции:
Чётко видно, что если значения не нормализовать, т.е. не использовать библиотечную функцию ND(), то значения остаются такими какими и должны быть. А вот если использовать библиотечную функцию ND(), то данное значения каким-то чудесным образом превращается в 0 или в 1.
Вот почему так происходит, я что-то в втыкаю. Есть предложения?
Есть. Значение SSym.gi_Digits "в библиотеке" равно 0. Ведь именно в этом случае NormalizeDouble вернёт то, что она возвращает в реальности. Имеет смысл распечатать его прямо оттуда:
// 1.1a Нормализация числа с плавающей запятой по Digits. ================================================================================= double ND (double v) export { Print ("SSym.gi_Digits = ", SSym.gi_Digits); return (NormalizeDouble (v, SSym.gi_Digits)); }
И посмотреть на результат. Формат вывода в логе, возможно, "испортится", но оно того стоит, чтобы узнать правду.
Тестирую некоторые классы. Взял инюк RSI и на нём накатал сов сугубо для обкатки класссов. Обнаружил, что в класс передаются значение рыночных данных одни, а на выходе выходят другие, а точнее сплошные еденицы. Почему так?...
Такое случаетcя, когда вместо типа double используется тип int.
Я так понял, что для мультивалютника библиотеку не написать удобную. По-любому придётся передавать параметров туда много. Хотел чисто количество знаков выбранного инструмента с класса туда посылать, но не вышло.. Если поставить _Digits всё работает.
Следует передавать всю информацию функциям только через параметры и никак иначе. Никаких глобальных переменных и прочих исключений из данного правила.
Необязательно передавать много параметров: можно собрать их в классе и передать туда объект этого класса по ссылке. Класс должен скрывать сами данные (private), а доступ к ним должен быть организован с помощью открытых (public) методов.
В самой библиотечной функции следует вызывать методы класса переданного объекта для доступа к нужным данным.
Тогда получится написать библиотеку, в том числе, удобную.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Тестирую некоторые классы. Взял инюк RSI и на нём накатал сов сугубо для обкатки класссов. Обнаружил, что в класс передаются значение рыночных данных одни, а на выходе выходят другие, а точнее сплошные еденицы. Почему так? Я распринтовал всё, что б было видно, что куда идёт в коде ниже. Выложу места, которые учавствуют в данным ситуациях.
Вот так в эксперте посылаю ордер:
Вот код начала метода вызываемого класса ( весь не публикую, дабы не принуждать ни кого ломать свой мозг ). Да и не нужно весь, там на входе принты показали, что параметры не так передаются :
Вот библиотечные функции, которые применяются в принтах:
А вот самое главное, лог:
Здесь чётко видно, как я с эксперта в функции bool Trade (int fi_signal) вызываю метод CPosMan.fOrderSend () и принтуются соответствующие входящие данные, в том числе, и АСК с БИДом. Потом попадаю в метод класса, эти данные почему-то стали еденицами и нулями. Как это происходит.. ЧТо это вообще такое? Прошу пояснить. Я уже замудохался.