Ugar
Гуру форума
В принципе, почти правильно. Но:Сложновато. Пытался.
Вот обрывки мыслей. Как все это правильно сложить, не знаю.
Может попроще задачу, ну или как эта решается?
Код:#property strict //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() // Напишите скрипт, который запишет в двухмерный массив цены открытия, цены закрытия, лоты, // прибыль в валюте депозита с учётом свопов и комиссий, всех исторических ордеров счёта. // После этого, напечатает в лог всё что в массиве. Построчно. Каждый ордер в отдельной строке. // В конце напечатает среднюю прибыль в валюте депозита по всем ордерам. { double info[][4]; for(int i=0;i<OrdersHistoryTotal();i++) // считаем все исторические ордера на счете { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) // если ордер не выбран, то... { Print("Ошибка при доступе к исторической базе (",GetLastError(),")"); // выводим сообщение об ошибке и... break; // прерываем подсчет ордеров } else { info[i][0]=OrderLots(); info[i][1]=AccountProfit() + OrderSwap() + OrderCommission(); info[i][2]=OrderClosePrice(); info[i][3]=OrderOpenPrice(); } } Print("Лот = " info[i][0] ,"Профит = " info[i][1], "Цена закрытия = " info[i][2], "Цена открытия = " info[i][3])
1. Перед использованием динамического массива, надо установить размер в 0 измерении, в данном случае он равен количеству исторических ордеров. ArrayResize
2. Желательно инициализировать массив, заполнив его нулями ArrayInitialize
3. Принт надо перенести внутрь цикла.
4. Создать 2 переменных. В одной считать суммарную прибыль, в другой количество только Buy, Sell ордеров. Так как только они могут иметь прибыль. Потом, уже вне цикла, с помощью данных в этих переменных, посчитать и напечатать среднюю прибыль.
Последнее редактирование: