Отправлено: 16.10.14 08:37. Заголовок: Помогите еще раз дорогой мастер?!
Добрый день уважаемый Игорь! Я еще к вам по просьбу. Короче, есть индикатор корреляции и его коде использован формулу типа FastMA - SlowMA, но я хотел изменить его на FastMA / SlowMA. Сам попробовал но ни как не получилось(в принципе похоже элементарно легкий но у меня не получилось). Пожалуйста, покажите как заменит формулу?!
Отправлено: 02.01.15 18:57. Заголовок: Доброго времени суто..
Доброго времени суток.
Вы прислали свою старую версию. В итоге то, что я исправлял, придется заново исправлять. Так мы с Вами не сдвинемся с места Давайте уже оперировать одним и тем же кодом: после внесения правок в него мною правки вносите Вы. И так далее по очереди, пока не доведем код до кондиции.
Итак, изначально ошибка в самом подходе к решению задачи. В коде нет разложения задачи на составляющие: каждая функция выполняет не одну конкретную задачу, а множество общих. В итоге идея размывается, а исправление ошибок с ростом кода экспоненциально затрудняется. К примеру, в коде существует 11 (!!!) мест, выполняющих последовательный перебор истории. Мало того, что они занимают много места в коде, так еще и приводят к нерациональной трате ресурсов. Все это легко заменяется на один цикл обращения к списку ордеров и один цикл обращения к истории счета. В этих циклах необходимо собрать все данные, необходимые для дальнейшей обработки.
Чтобы комфортно работать с сетками ордеров, я уже рекомендовал Вам использовать разметку при помощи Magic Number. Без нее здесь никак не обойтись, т. к. иначе все ордера будут как близнецы-братья. Поэтому сразу берем на вооружение функции кодировки и декодировки Magic Number:
цитата:
#define MAX_ORDERS_IN_SERIES 1000 // Максимальное количество ордеров одного направления, поддерживаемое экспертом
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Синтез значения Magic Number | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ int GetMagicNumber(int id, int masterSign, int seriesIndex, int orderIndex) { return id * MAX_ORDERS_IN_SERIES + orderIndex; } //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ //| Анализ значения Magic Number | //+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ int GetOrderIndexAndID(int mn, int &id) { id = mn / MAX_ORDERS_IN_SERIES ; return mn % MAX_ORDERS_IN_SERIES; }
Далее. Так как в каждой серии у нас по шесть ордеров (три - Buy и три - Sell), то необходимо организовать два массива, в которые на каждом тике собирается информация о рабочих ордерах. Причем удобство этих массивов будет в том, что мы сразу же будем знать, какие ордера из сетки уже установлены, а какие - нет:
цитата:
#define ORDERS_IN_SERIES 3
int g_buyCnt, g_sellCnt;
int g_buyTicket[ORDERS_IN_SERIES], g_sellTicket[ORDERS_IN_SERIES];
void FindExpertOrders() { int id, orderIndex;
g_buyCnt = 0; g_sellCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS)) continue;
if (OrderSymbol() != Symbol()) continue;
orderIndex = GetOrderIndexAndID(OrderMagicNumber(), id); if (id != i_magicNumber) continue;
if (orderIndex < 0 || orderIndex >= ORDERS_IN_SERIES) continue;
Функцию поиска своих ордеров необходимо вызвать сразу же при входе в OnTick.
Код, который я привел - здесь. Осмыслите его и попытайтесь самостоятельно написать функцию просмотра истории по аналогии. А также подумайте над тем, где и как она должна использоваться. Потом продолжим.
Отправлено: 10.04.15 18:27. Заголовок: Вечер добрый Игорь с..
Вечер добрый Игорь с наступающими вас праздниками помогите пожалуйста переделать простой тралл в пунктах так чтобы он траллил в валюте депозита тоесть в параметhs указывались в валюте депозита а то никак неполучается немогу сообразить
цитата:
void SimpleTrailing(string sy="",int op=-1,int mn=-1, int tstop=0, bool IPT=false, int tstep=0)export { //timec=TimeCurrent(); double po,pp; int i,k=OrdersTotal(); string Autor;
Этот код необходимо исполнять на каждом тике, т. к. на символах кроссов (там, где нет валюты депозита) стоимость пункта будет изменяться на каждом новом тике. Полученное значение points подставляйте в условия сравнения вместо величины трейлинга.
Отправлено: 04.05.15 11:44. Заголовок: Добрый день мастер! ..
Добрый день мастер! Еще раз помогите с кодам пожалуйста?! С каким кодам мы получаем количество дневной прибыл или лосс по пунктам(daily pips profit or loss) в mql5(МТ5) языке? То есть pips profit\loss in history. Спасибо за ранее!!!
Отправлено: 04.05.15 21:42. Заголовок: Добрый день. Подсче..
Добрый день.
Подсчет общего количества пунктов, которые дали закрытые сделки, имеет смысл только в том случае, если за текущий день велась торговля только по одному символу. Если символов несколько, то будем складывать свиней с гусями.
На MQL5 программирую мало. Поэтому нижеприведенный код вряд ли можно взять за образец решения поставленной задачи. Но по нему, как минимум, можно понять логику подсчета:
цитата:
// Получение даты/времени открытия текущего дня datetime time[1]; if (CopyTime(_Symbol, PERIOD_D1, 0, 1, time) < 0) return;
// Загрузка истории за сегодняшний день if (!HistorySelect(time[0], TimeCurrent())) return;
// Подсчет общего количества пунктов int total = HistoryDealsTotal(); // Общее количество сделок в истории сегодняшнего дня int totalPoints = 0; // Общее количество закрытых пунктов for (int i = 0; i < total; i++) { // Попытка выбора сделки из списка ulong ticket = HistoryDealGetTicket(i); if (ticket == 0) continue;
// Определение типа сделки. Интересуют только Buy и Sell. Другие операции отбрасываются ENUM_DEAL_TYPE dealType = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE); if (dealType != DEAL_TYPE_BUY && dealType != DEAL_TYPE_SELL) continue;
// Прибыль/убыток, которую принесла сделка. Интересуют только операции закрытия double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); if (profit == 0.0) continue;
// Получение информации о свойствах символа, по которому открыта/закрыта сделка string symbol = HistoryDealGetString(ticket, DEAL_SYMBOL); double point = SymbolInfoDouble(symbol, SYMBOL_POINT); double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE); double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); if (point == 0.0 || tickSize == 0.0 || tickValue == 0.0) continue;
// Количество закрытых пунктов totalPoints += (int)MathRound((profit * tickSize) / (tickValue * volume) / point); }
Alert("Total points = ", totalPoints);
Так как история сделок в МТ5 представлена двумя строками (открытие и закрытие), а не одной, как в МТ4, то установить четкое соответствие между моментом начального открытия и полного закрытия позиции можно, основательно прошерстив списки не только сделок, но и ордеров. А это уже задача посложнее. В данном случае выбрал более простой путь: в списке находятся "закрывающие" сделки и по их прибыли вычисляется (примерно), сколько пунктов прибыли/убытка было закрыто.
Отправлено: 05.05.15 00:09. Заголовок: И вот появилось еще ..
И вот появилось еще другой вопросик: можно ли определить прибыльный позиции(или ордер) среди нескольких открытых ордеров? То есть хочу такое условие - закрыть прибыльный позицию среди нескольких открытых, но если его прибыл больше "x" от баланса("х"$). Помогите с кодам(для mql4)?! Спасибо еще раз!!!
Отправлено: 06.05.15 08:51. Заголовок: Husanboy пишет: То ..
Husanboy пишет:
цитата:
То есть хочу такое условие - закрыть прибыльный позицию среди нескольких открытых, но если его прибыл больше "x" от баланса("х"$)
Наверное имелось в виду, что X указывается в процентах от баланса? Ведь если Х указывается в валюте, то значение баланса для такой операции не нужно. Код достаточно простой:
цитата:
input double i_targetProfitPercents = 10.0; // Целевая прибыль в процентах от баланса
... int ticket = GetTargetProfitOrder(); if (ticket < 0) return;
Алгоритм следующий: 1. Расчет величины целевой прибыли (targetProfit), исходя из текущего значения баланса депозита. 2. Поиск ордера Buy или Sell. 3. Определение, достаточна ли прибыль этого ордера для закрытия. 4. Если прибыль достаточна, то функция GetTargetProfitOrder возвращает тикет такого ордера. Зная тикет ордера, с ним можно делать все, что угодно.
Все даты в формате GMT
2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет