собственно вопрос в коде
Точка говорит нам буквально следующее: то, что справа от неё, является членом класса\структуры слева от неё. mag не может быть членом строки или дабла даже через перегрузку (точку нельзя перегрузить).
Поскольку множественное наследование не поддерживается в мкл, можно сделать класс Mag членом Profit (или унаследованного от Profit класса).
Точка говорит нам буквально следующее: то, что справа от неё, является членом класса\структуры слева от неё. mag не может быть членом строки или дабла даже через перегрузку (точку нельзя перегрузить).
Поскольку множественное наследование не поддерживается в мкл, можно сделать класс Mag членом Profit (или унаследованного от Profit класса).
class Mag{ public: int mag; }; class Profit{ public: Mag sym ; Mag profit; };Но кажется все должно быть совсем не так. А как- неизвестно, потому что неизвестно что нужно.
#property script_show_inputs //--- input datetime from_date = __DATE__ - 60 * 60 * 24 * 27; input datetime to_date = __DATE__ + 60 * 60 * 24 * 1; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class Profit { public: string sym ; double profit; int mag[]; Profit() { sym = ""; profit = 0 ; } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ Profit p[]; double sum = 0; void OnStart() { HistorySelect(from_date, to_date); ulong ticket = 0; long position_id = 0; string sym = ""; for(int i = HistoryDealsTotal() - 1; i >= 0 ; i--) { ticket = HistoryDealGetTicket(i); //Print (ticket); sym = HistoryDealGetString(ticket, DEAL_SYMBOL); long mag1 = HistoryDealGetInteger(ticket, DEAL_MAGIC); bool flag = false; for(int y = ArraySize(p) - 1; y >= 0; y--) { if(p[y].sym == sym) { flag = true; p[y].profit += HistoryDealGetDouble(ticket, DEAL_COMMISSION) + HistoryDealGetDouble(ticket, DEAL_SWAP) + HistoryDealGetDouble(ticket, DEAL_PROFIT); break; } } if(!flag) { ArrayResize(p, ArraySize(p) + 1); p[ArraySize(p) - 1].sym = sym; p[ArraySize(p) - 1].profit += HistoryDealGetDouble(ticket, DEAL_COMMISSION) + HistoryDealGetDouble(ticket, DEAL_SWAP) + HistoryDealGetDouble(ticket, DEAL_PROFIT); } } double sum1 = 0; for(int i = 0 ; i < ArraySize(p) - 1; i++) { sum1 += p[i].profit; Print(p[i].sym, " -> ", DoubleToString(p[i].profit, 2)) ; } Print("<--- Profit for all Symbols ---> ", DoubleToString(sum1, 2)); } //+------------------------------------------------------------------+
Вообщем то весь код.
ОН высчитывает прибыль по каждому символу.
Хотелось бы еще по каждому символу получить детализацию по всем магикам и желательно за один проход по всем сделкам.
Как это сделать ?
При этом количество символов как и количество магиков неизвестное, но символов и магиков ну скажем не более 20-ти.
Чтобы за один проход, надо хэш-мэп использовать, но это не рационально, вряд ли будет какой-то выигрыш, скорее наоборот.
Рационально - написать функцию с двумя параметрами: символом и магиком. Но универсально - если символ пустой, это значит все символы, если магик -1 - то все магики.
Еще одну функцию - собирающую из истории все пары магик-символ.
***
Или так: пройти один раз по истории, собрать в массив все сделки (массив структур с полями: символ, магик, профит). Потом из этого массива выбирать по нудному символу и магику.Я бы использовал структуру.
Одно поле - магик, другое - профит.
Или даже класс, содержащий эти два класса внутри.
Я бы использовал структуру.
Одно поле - магик, другое - профит.
Или даже класс, содержащий эти два класса внутри.
А как сделать класс с двумя классами внутри ?
А как сделать класс с двумя классами внутри ?
struct pData{ datetime _OpenTime; // Время последней открытой int _Count; // Общее количество int _CountComm; // Количество по комментарию int _OpenType; // Тип последней открытой double _OpenPrice; // Цена последней открытой double _StopLoss; // Цена StopLoss double _TakeProfit; // Цена TakeProfit double _Profit; // Profit последней открытой double _AllProfit; // Общий текущий Profit double _Lot; // Лот последней открытой double _Lots; // Общий лот double _NearestDist; // Дистанция до ближайшей от цены (пп) double _LongestDist; // Дистанция до дальней от цены (пп) bool _TradeToDay; // Флаг торгов сегодня }; struct sPos{ pData Buy; // Buy pData Sell; // Sell pData BS; // Buy/Sell }; sPos _GetP; //== ... // BUY if(__Type==OP_BUY) { _GetP.Buy._Count++; // Количество _GetP.Buy._Lots+=__OL; // Общий лот BUY _GetP.Buy._Profit=__OPR; // Profit последней открытой позиции ...
А как сделать класс с двумя классами внутри ?
Рано Вам ещё это. Для начала книжки почитайте.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
собственно вопрос в коде