АвторСообщение



Сообщение: 6
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 16.10.14 08:37. Заголовок: Помогите еще раз дорогой мастер?!


Добрый день уважаемый Игорь! Я еще к вам по просьбу. Короче, есть индикатор корреляции и его коде использован формулу типа FastMA - SlowMA, но я хотел изменить его на FastMA / SlowMA. Сам попробовал но ни как не получилось(в принципе похоже элементарно легкий но у меня не получилось). Пожалуйста, покажите как заменит формулу?!

Вот индикатор: http://file.qip.ru/arch/ZHX5cSTK/Correlations.html или http://qclk.ru/kF/Rm2b

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 61 , стр: 1 2 3 4 5 All [только новые]







Сообщение: 1077
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 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;

if (OrderType() % 2 == OP_BUY)
{
g_buyTicket[orderIndex] = OrderTicket();
g_buyCnt++;
}
else
{
g_sellTicket[orderIndex] = OrderTicket();
g_sellCnt++;
}
}
}



Функцию поиска своих ордеров необходимо вызвать сразу же при входе в OnTick.

Код, который я привел - здесь. Осмыслите его и попытайтесь самостоятельно написать функцию просмотра истории по аналогии. А также подумайте над тем, где и как она должна использоваться. Потом продолжим.


Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 23
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 02.01.15 19:12. Заголовок: Добрый день! Нету фа..


Добрый день! Нету файл в вашем ссылку.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1080
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 02.01.15 19:55. Заголовок: Husanboy пишет: Нет..


Husanboy пишет:

 цитата:
Нету файл в вашем ссылку.


Да, что-то там поломалось . Дублирую.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 24
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 03.01.15 05:06. Заголовок: Scriptong пишет: Да..


Scriptong пишет:

 цитата:
Да, что-то там поломалось . Дублирую.


Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 25
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 03.02.15 18:58. Заголовок: ­Добрый вечер! Еще ра..


*PRIVAT*

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1173
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 04.02.15 13:31. Заголовок: Husanboy пишет: ..


Husanboy пишет:

 цитата:



Снимите, пожалуйста, галку "показывать только модераторам". Иначе никто, кроме администратора, Ваше сообщение не увидит.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 26
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 05.02.15 10:29. Заголовок: Добрый день! Отправи..


Добрый день! Отправил лс, пожалуйста проверите.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1181
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 06.02.15 19:31. Заголовок: Husanboy пишет: Отп..


Husanboy пишет:

 цитата:
Отправил лс, пожалуйста проверите.


Ответ смотрите в личке.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 2
Зарегистрирован: 05.12.14
Репутация: 0
ссылка на сообщение  Отправлено: 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;

if(sy=="0") sy=Symbol();
if( tstop==0) tstop=MarketInfo(Symbol(),MODE_STOPLEVEL);
for(i=0;i<k;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
{
po=MarketInfo(OrderSymbol(),MODE_POINT);
if(mn<0 || OrderMagicNumber()==mn)
{
if(OrderType()==OP_BUY)
{
pp=MarketInfo(OrderSymbol(),MODE_BID);
if((!IPT && OrderProfit()>0) || pp-OrderOpenPrice()>tstop*po)
{
if(OrderStopLoss()<pp-(tstop+tstep-1)*po)
{
ModifyOrder(-1,pp-tstop*po,-1);
}
}
}
if(OrderType()==OP_SELL)
{
pp=MarketInfo(OrderSymbol(),MODE_ASK);
if((!IPT && OrderProfit()>0) || OrderOpenPrice()-pp>tstop*po)
{
if(OrderStopLoss()>pp+(tstop+tstep-1)*po || OrderStopLoss()==0)
{
ModifyOrder(-1,pp+tstop*po,-1,TimeCurrent());
}
}
}
}
}
}
}

}



Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1460
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 10.04.15 19:12. Заголовок: Если параметр, котор..


Если параметр, указывающий величину в валюте депозита, на которую следует отступать стопу от текущей цены:

 цитата:
input double i_trailCurrencySize = 100.0;


то для расчета количества пунктов, которые соответствуют этой величине, необходимо использовать такой код:

 цитата:

double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
if (tickValue == 0.0 || tickSize == 0.0 || point == 0.0)
return;

double ticksAmount = i_trailCurrencySize / (tickValue * <объем ордера>);
int points = (int)MathCeil(ticksAmount * tickSize / point);



Этот код необходимо исполнять на каждом тике, т. к. на символах кроссов (там, где нет валюты депозита) стоимость пункта будет изменяться на каждом новом тике.
Полученное значение points подставляйте в условия сравнения вместо величины трейлинга.

Спасибо: 2 
ПрофильЦитата Ответить



Сообщение: 27
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 04.05.15 11:44. Заголовок: Добрый день мастер! ..


Добрый день мастер! Еще раз помогите с кодам пожалуйста?! С каким кодам мы получаем количество дневной прибыл или лосс по пунктам(daily pips profit or loss) в mql5(МТ5) языке? То есть pips profit\loss in history. Спасибо за ранее!!!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1522
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 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;

// Получение объема сделки
double volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
if (volume == 0.0)
continue;

// Количество закрытых пунктов
totalPoints += (int)MathRound((profit * tickSize) / (tickValue * volume) / point);
}

Alert("Total points = ", totalPoints);



Так как история сделок в МТ5 представлена двумя строками (открытие и закрытие), а не одной, как в МТ4, то установить четкое соответствие между моментом начального открытия и полного закрытия позиции можно, основательно прошерстив списки не только сделок, но и ордеров. А это уже задача посложнее.
В данном случае выбрал более простой путь: в списке находятся "закрывающие" сделки и по их прибыли вычисляется (примерно), сколько пунктов прибыли/убытка было закрыто.

Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 28
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 04.05.15 22:45. Заголовок: Scriptong пишет: ..



 цитата:
Scriptong пишет:



Добрый вечер! Да, вы абсолютно "Master MQL" и самый лучший из них!!! Это работает как я хотел и спросил. Спасибо еще раз и бесконечно!!!

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 29
Зарегистрирован: 20.02.14
Репутация: 0
ссылка на сообщение  Отправлено: 05.05.15 00:09. Заголовок: И вот появилось еще ..


И вот появилось еще другой вопросик: можно ли определить прибыльный позиции(или ордер) среди нескольких открытых ордеров? То есть хочу такое условие - закрыть прибыльный позицию среди нескольких открытых, но если его прибыл больше "x" от баланса("х"$). Помогите с кодам(для mql4)?! Спасибо еще раз!!!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 1525
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 06.05.15 08:51. Заголовок: Husanboy пишет: То ..


Husanboy пишет:

 цитата:
То есть хочу такое условие - закрыть прибыльный позицию среди нескольких открытых, но если его прибыл больше "x" от баланса("х"$)


Наверное имелось в виду, что X указывается в процентах от баланса? Ведь если Х указывается в валюте, то значение баланса для такой операции не нужно.
Код достаточно простой:

 цитата:
input double i_targetProfitPercents = 10.0; // Целевая прибыль в процентах от баланса

...
int ticket = GetTargetProfitOrder();
if (ticket < 0)
return;

// Закрытие ордера ticket
// ...

int GetTargetProfitOrder()
{
double targetProfit = AccountInfoDouble(ACCOUNT_BALANCE) * i_targetProfitPercents / 100.0;

for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;

if (OrderType() != OP_BUY && OrderType() != OP_SELL)
continue;

double profit = OrderProfit() + OrderSwap() + OrderCommission();
if (profit >= targetProfit)
return OrderTicket();
}

return -1;
}



Алгоритм следующий:
1. Расчет величины целевой прибыли (targetProfit), исходя из текущего значения баланса депозита.
2. Поиск ордера Buy или Sell.
3. Определение, достаточна ли прибыль этого ордера для закрытия.
4. Если прибыль достаточна, то функция GetTargetProfitOrder возвращает тикет такого ордера. Зная тикет ордера, с ним можно делать все, что угодно.

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 61 , стр: 1 2 3 4 5 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет